diff options
Diffstat (limited to 'graphics/asymptote/runstring.cc')
-rw-r--r-- | graphics/asymptote/runstring.cc | 158 |
1 files changed, 87 insertions, 71 deletions
diff --git a/graphics/asymptote/runstring.cc b/graphics/asymptote/runstring.cc index a9c557af78..537f70d5af 100644 --- a/graphics/asymptote/runstring.cc +++ b/graphics/asymptote/runstring.cc @@ -1,6 +1,6 @@ /***** Autogenerated from runstring.in; changes will be overwritten *****/ -#line 1 "runtimebase.in" +#line 1 "./runtimebase.in" /***** * runtimebase.in * Andy Hammerlindl 2009/07/28 @@ -10,7 +10,7 @@ *****/ -#line 1 "runstring.in" +#line 1 "./runstring.in" /***** * runstring.in * @@ -18,7 +18,7 @@ * *****/ -#line 1 "runtimebase.in" +#line 23 "./runtimebase.in" #include "stack.h" #include "types.h" #include "builtin.h" @@ -64,6 +64,9 @@ function *realRealFunction(); #line 10 "runstring.in" #include <cfloat> #include <cstring> +#include <iomanip> +#include <ctime> +#include <chrono> #include <algorithm> #include "array.h" @@ -171,124 +174,124 @@ void checkformat(const char *ptr, bool intformat) #endif namespace run { // String operations -#line 113 "runstring.in" +#line 116 "./runstring.in" void emptyString(stack *Stack) { -#line 114 "runstring.in" +#line 117 "./runstring.in" {Stack->push<string>(emptystring); return;} } -#line 119 "runstring.in" +#line 122 "./runstring.in" // Int length(string *s); void gen_runstring1(stack *Stack) { string * s=vm::pop<string *>(Stack); -#line 120 "runstring.in" +#line 123 "./runstring.in" {Stack->push<Int>((Int) s->length()); return;} } -#line 124 "runstring.in" +#line 127 "./runstring.in" // Int find(string *s, string t, Int pos=0); void gen_runstring2(stack *Stack) { Int pos=vm::pop<Int>(Stack,0); string t=vm::pop<string>(Stack); string * s=vm::pop<string *>(Stack); -#line 125 "runstring.in" +#line 128 "./runstring.in" size_t n=s->find(t,pos); {Stack->push<Int>(n == string::npos ? (Int) -1 : (Int) n); return;} } -#line 130 "runstring.in" +#line 133 "./runstring.in" // Int rfind(string *s, string t, Int pos=-1); void gen_runstring3(stack *Stack) { Int pos=vm::pop<Int>(Stack,-1); string t=vm::pop<string>(Stack); string * s=vm::pop<string *>(Stack); -#line 131 "runstring.in" +#line 134 "./runstring.in" size_t n=s->rfind(t,pos); {Stack->push<Int>(n == string::npos ? (Int) -1 : (Int) n); return;} } -#line 136 "runstring.in" +#line 139 "./runstring.in" // string reverse(string s); void gen_runstring4(stack *Stack) { string s=vm::pop<string>(Stack); -#line 137 "runstring.in" +#line 140 "./runstring.in" reverse(s.begin(),s.end()); {Stack->push<string>(s); return;} } -#line 142 "runstring.in" +#line 145 "./runstring.in" // string insert(string s, Int pos, string t); void gen_runstring5(stack *Stack) { string t=vm::pop<string>(Stack); Int pos=vm::pop<Int>(Stack); string s=vm::pop<string>(Stack); -#line 143 "runstring.in" +#line 146 "./runstring.in" if ((size_t) pos < s.length()) {Stack->push<string>(s.insert(pos,t)); return;} {Stack->push<string>(s); return;} } -#line 149 "runstring.in" +#line 152 "./runstring.in" // string substr(string* s, Int pos, Int n=-1); void gen_runstring6(stack *Stack) { Int n=vm::pop<Int>(Stack,-1); Int pos=vm::pop<Int>(Stack); string* s=vm::pop<string*>(Stack); -#line 150 "runstring.in" +#line 153 "./runstring.in" if ((size_t) pos < s->length()) {Stack->push<string>(s->substr(pos,n)); return;} {Stack->push<string>(emptystring); return;} } -#line 156 "runstring.in" +#line 159 "./runstring.in" // string erase(string s, Int pos, Int n); void gen_runstring7(stack *Stack) { Int n=vm::pop<Int>(Stack); Int pos=vm::pop<Int>(Stack); string s=vm::pop<string>(Stack); -#line 157 "runstring.in" +#line 160 "./runstring.in" if ((size_t) pos < s.length()) {Stack->push<string>(s.erase(pos,n)); return;} {Stack->push<string>(s); return;} } -#line 163 "runstring.in" +#line 166 "./runstring.in" // string downcase(string s); void gen_runstring8(stack *Stack) { string s=vm::pop<string>(Stack); -#line 164 "runstring.in" +#line 167 "./runstring.in" std::transform(s.begin(),s.end(),s.begin(),tolower); {Stack->push<string>(s); return;} } -#line 169 "runstring.in" +#line 172 "./runstring.in" // string upcase(string s); void gen_runstring9(stack *Stack) { string s=vm::pop<string>(Stack); -#line 170 "runstring.in" +#line 173 "./runstring.in" std::transform(s.begin(),s.end(),s.begin(),toupper); {Stack->push<string>(s); return;} } // returns a string constructed by translating all occurrences of the string // from in an array of string pairs {from,to} to the string to in string s. -#line 177 "runstring.in" +#line 180 "./runstring.in" // string replace(string *S, stringarray2 *translate); void gen_runstring10(stack *Stack) { stringarray2 * translate=vm::pop<stringarray2 *>(Stack); string * S=vm::pop<string *>(Stack); -#line 178 "runstring.in" +#line 181 "./runstring.in" size_t size=checkArray(translate); for(size_t i=0; i < size; i++) { array *a=read<array*>(translate,i); @@ -318,14 +321,14 @@ void gen_runstring10(stack *Stack) {Stack->push<string>(buf.str()); return;} } -#line 208 "runstring.in" +#line 211 "./runstring.in" // string format(string *format, Int x, string locale=emptystring); void gen_runstring11(stack *Stack) { string locale=vm::pop<string>(Stack,emptystring); Int x=vm::pop<Int>(Stack); string * format=vm::pop<string *>(Stack); -#line 209 "runstring.in" +#line 212 "./runstring.in" ostringstream out; const char *p0=format->c_str(); checkformat(p0,true); @@ -379,7 +382,7 @@ void gen_runstring11(stack *Stack) {Stack->push<string>(out.str()); return;} } -#line 263 "runstring.in" +#line 266 "./runstring.in" // string format(string *format, bool forcemath=false, string separator, real x, string locale=emptystring); void gen_runstring12(stack *Stack) { @@ -388,7 +391,7 @@ void gen_runstring12(stack *Stack) string separator=vm::pop<string>(Stack); bool forcemath=vm::pop<bool>(Stack,false); string * format=vm::pop<string *>(Stack); -#line 265 "runstring.in" +#line 268 "./runstring.in" if(*format == "%") {Stack->push<string>(""); return;} // Temporary workaround for github Issue #29. bool tex=getSetting<string>("tex") != "none"; @@ -515,12 +518,12 @@ void gen_runstring12(stack *Stack) {Stack->push<string>(out.str()); return;} } -#line 392 "runstring.in" +#line 395 "./runstring.in" // Int hex(string s); void gen_runstring13(stack *Stack) { string s=vm::pop<string>(Stack); -#line 393 "runstring.in" +#line 396 "./runstring.in" istringstream is(s); is.setf(std::ios::hex,std::ios::basefield); Int value; @@ -530,45 +533,45 @@ void gen_runstring13(stack *Stack) error(buf); } -#line 403 "runstring.in" +#line 406 "./runstring.in" // Int ascii(string s); void gen_runstring14(stack *Stack) { string s=vm::pop<string>(Stack); -#line 404 "runstring.in" +#line 407 "./runstring.in" {Stack->push<Int>(s.empty() ? -1 : (unsigned char) s[0]); return;} } -#line 408 "runstring.in" +#line 411 "./runstring.in" // string string(Int x); void gen_runstring15(stack *Stack) { Int x=vm::pop<Int>(Stack); -#line 409 "runstring.in" +#line 412 "./runstring.in" ostringstream buf; buf << x; {Stack->push<string>(buf.str()); return;} } -#line 415 "runstring.in" +#line 418 "./runstring.in" // string string(real x, Int digits=DBL_DIG); void gen_runstring16(stack *Stack) { Int digits=vm::pop<Int>(Stack,DBL_DIG); real x=vm::pop<real>(Stack); -#line 416 "runstring.in" +#line 419 "./runstring.in" ostringstream buf; buf.precision(digits); buf << x; {Stack->push<string>(buf.str()); return;} } -#line 423 "runstring.in" +#line 426 "./runstring.in" // string time(string format=defaulttimeformat); void gen_runstring17(stack *Stack) { string format=vm::pop<string>(Stack,defaulttimeformat); -#line 424 "runstring.in" +#line 427 "./runstring.in" #ifdef HAVE_STRFTIME const time_t bintime=time(NULL); if(!strftime(Time,nTime,format.c_str(),localtime(&bintime))) {Stack->push<string>(""); return;} @@ -578,13 +581,13 @@ void gen_runstring17(stack *Stack) #endif } -#line 434 "runstring.in" +#line 437 "./runstring.in" // string time(Int seconds, string format=defaulttimeformat); void gen_runstring18(stack *Stack) { string format=vm::pop<string>(Stack,defaulttimeformat); Int seconds=vm::pop<Int>(Stack); -#line 435 "runstring.in" +#line 438 "./runstring.in" #ifdef HAVE_STRFTIME const time_t bintime=seconds; if(!strftime(Time,nTime,format.c_str(),localtime(&bintime))) {Stack->push<string>(""); return;} @@ -596,21 +599,34 @@ void gen_runstring18(stack *Stack) #endif } -#line 447 "runstring.in" +#line 450 "./runstring.in" // Int seconds(string t=emptystring, string format=emptystring); void gen_runstring19(stack *Stack) { string format=vm::pop<string>(Stack,emptystring); string t=vm::pop<string>(Stack,emptystring); -#line 448 "runstring.in" -#if defined(HAVE_STRPTIME) - const time_t bintime=time(NULL); - tm tm=*localtime(&bintime); - if(t != "" && !strptime(t.c_str(),format.c_str(),&tm)) {Stack->push<Int>(-1); return;} - {Stack->push<Int>((Int) mktime(&tm)); return;} -#else - {Stack->push<Int>(-1); return;} -#endif +#line 451 "./runstring.in" + if (t == "") + { + auto clock = std::chrono::system_clock::now(); + {Stack->push<Int>(static_cast<Int>( + std::chrono::duration_cast<std::chrono::seconds>( + clock.time_since_epoch() + ).count() + )); return;} + } + + std::tm tmObj = {}; + istringstream instream(t); + instream.imbue(std::locale("")); + instream >> std::get_time(&tmObj,format.c_str()); + + if(instream.fail()) + { + {Stack->push<Int>(-1); return;} + } + + {Stack->push<Int>(static_cast<Int>(std::mktime(&tmObj))); return;} } } // namespace run @@ -619,45 +635,45 @@ namespace trans { void gen_runstring_venv(venv &ve) { -#line 112 "runstring.in" +#line 115 "./runstring.in" REGISTER_BLTIN(run::emptyString,"emptyString"); -#line 119 "runstring.in" +#line 122 "./runstring.in" addFunc(ve, run::gen_runstring1, primInt(), SYM(length), formal(primString(), SYM(s), false, false)); -#line 124 "runstring.in" +#line 127 "./runstring.in" addFunc(ve, run::gen_runstring2, primInt(), SYM(find), formal(primString(), SYM(s), false, false), formal(primString(), SYM(t), false, false), formal(primInt(), SYM(pos), true, false)); -#line 130 "runstring.in" +#line 133 "./runstring.in" addFunc(ve, run::gen_runstring3, primInt(), SYM(rfind), formal(primString(), SYM(s), false, false), formal(primString(), SYM(t), false, false), formal(primInt(), SYM(pos), true, false)); -#line 136 "runstring.in" +#line 139 "./runstring.in" addFunc(ve, run::gen_runstring4, primString(), SYM(reverse), formal(primString(), SYM(s), false, false)); -#line 142 "runstring.in" +#line 145 "./runstring.in" addFunc(ve, run::gen_runstring5, primString(), SYM(insert), formal(primString(), SYM(s), false, false), formal(primInt(), SYM(pos), false, false), formal(primString(), SYM(t), false, false)); -#line 149 "runstring.in" +#line 152 "./runstring.in" addFunc(ve, run::gen_runstring6, primString(), SYM(substr), formal(primString(), SYM(s), false, false), formal(primInt(), SYM(pos), false, false), formal(primInt(), SYM(n), true, false)); -#line 156 "runstring.in" +#line 159 "./runstring.in" addFunc(ve, run::gen_runstring7, primString(), SYM(erase), formal(primString(), SYM(s), false, false), formal(primInt(), SYM(pos), false, false), formal(primInt(), SYM(n), false, false)); -#line 163 "runstring.in" +#line 166 "./runstring.in" addFunc(ve, run::gen_runstring8, primString(), SYM(downcase), formal(primString(), SYM(s), false, false)); -#line 169 "runstring.in" +#line 172 "./runstring.in" addFunc(ve, run::gen_runstring9, primString(), SYM(upcase), formal(primString(), SYM(s), false, false)); -#line 175 "runstring.in" +#line 178 "./runstring.in" addFunc(ve, run::gen_runstring10, primString(), SYM(replace), formal(primString(), SYM(s), false, false), formal(stringArray2(), SYM(translate), false, false)); -#line 208 "runstring.in" +#line 211 "./runstring.in" addFunc(ve, run::gen_runstring11, primString(), SYM(format), formal(primString(), SYM(format), false, false), formal(primInt(), SYM(x), false, false), formal(primString(), SYM(locale), true, false)); -#line 263 "runstring.in" +#line 266 "./runstring.in" addFunc(ve, run::gen_runstring12, primString(), SYM(format), formal(primString(), SYM(format), false, false), formal(primBoolean(), SYM(forcemath), true, false), formal(primString(), SYM(separator), false, false), formal(primReal(), SYM(x), false, false), formal(primString(), SYM(locale), true, false)); -#line 392 "runstring.in" +#line 395 "./runstring.in" addFunc(ve, run::gen_runstring13, primInt(), SYM(hex), formal(primString(), SYM(s), false, false)); -#line 403 "runstring.in" +#line 406 "./runstring.in" addFunc(ve, run::gen_runstring14, primInt(), SYM(ascii), formal(primString(), SYM(s), false, false)); -#line 408 "runstring.in" +#line 411 "./runstring.in" addFunc(ve, run::gen_runstring15, primString(), SYM(string), formal(primInt(), SYM(x), false, false)); -#line 415 "runstring.in" +#line 418 "./runstring.in" addFunc(ve, run::gen_runstring16, primString(), SYM(string), formal(primReal(), SYM(x), false, false), formal(primInt(), SYM(digits), true, false)); -#line 423 "runstring.in" +#line 426 "./runstring.in" addFunc(ve, run::gen_runstring17, primString(), SYM(time), formal(primString(), SYM(format), true, false)); -#line 434 "runstring.in" +#line 437 "./runstring.in" addFunc(ve, run::gen_runstring18, primString(), SYM(time), formal(primInt(), SYM(seconds), false, false), formal(primString(), SYM(format), true, false)); -#line 447 "runstring.in" +#line 450 "./runstring.in" addFunc(ve, run::gen_runstring19, primInt(), SYM(seconds), formal(primString(), SYM(t), true, false), formal(primString(), SYM(format), true, false)); } |