summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/runstring.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/asymptote/runstring.cc')
-rw-r--r--Build/source/utils/asymptote/runstring.cc602
1 files changed, 602 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/runstring.cc b/Build/source/utils/asymptote/runstring.cc
new file mode 100644
index 00000000000..af900a9be49
--- /dev/null
+++ b/Build/source/utils/asymptote/runstring.cc
@@ -0,0 +1,602 @@
+/***** Autogenerated from runstring.in; changes will be overwritten *****/
+
+#line 1 "runtimebase.in"
+/*****
+ * runtimebase.in
+ * Andy Hammerlindl 2009/07/28
+ *
+ * Common declarations needed for all code-generating .in files.
+ *
+ *****/
+
+
+#line 1 "runstring.in"
+/*****
+ * runstring.in
+ *
+ * Runtime functions for string operations.
+ *
+ *****/
+
+#line 1 "runtimebase.in"
+#include "stack.h"
+#include "types.h"
+#include "builtin.h"
+#include "entry.h"
+#include "errormsg.h"
+#include "array.h"
+#include "triple.h"
+#include "callable.h"
+
+using vm::stack;
+using vm::error;
+using vm::array;
+using vm::callable;
+using types::formal;
+using types::function;
+using camp::triple;
+
+#define PRIMITIVE(name,Name,asyName) using types::prim##Name;
+#include <primitives.h>
+#undef PRIMITIVE
+
+typedef double real;
+
+void unused(void *);
+
+namespace run {
+array *copyArray(array *a);
+array *copyArray2(array *a);
+array *copyArray3(array *a);
+
+double *copyArrayC(const array *a, size_t dim=0);
+double *copyArray2C(const array *a, bool square=true, size_t dim2=0);
+
+triple *copyTripleArrayC(const array *a, size_t dim=0);
+triple *copyTripleArray2C(const array *a, bool square=true, size_t dim2=0);
+double *copyTripleArray2Components(array *a, bool square=true, size_t dim2=0);
+}
+
+function *realRealFunction();
+
+// Return the component of vector v perpendicular to a unit vector u.
+inline triple perp(triple v, triple u)
+{
+ return v-dot(v,u)*u;
+}
+
+#define CURRENTPEN processData().currentpen
+
+#line 10 "runstring.in"
+#include <cfloat>
+#include <string.h>
+#include <algorithm>
+
+#include "array.h"
+
+using namespace camp;
+using namespace vm;
+using namespace settings;
+
+typedef array stringarray;
+typedef array stringarray2;
+
+using types::stringArray;
+using types::stringArray2;
+
+namespace types {
+extern const char *names[];
+}
+
+namespace run {
+extern string emptystring;
+}
+
+static const string defaulttimeformat=string("%a %b %d %T %Z %Y");
+#ifdef HAVE_STRFTIME
+static const size_t nTime=256;
+static char Time[nTime];
+#endif
+
+void checkformat(const char *ptr, bool intformat)
+{
+ while(*ptr != '\0') {
+ if(*ptr != '%') /* While we have regular characters, print them. */
+ ptr++;
+ else { /* We've got a format specifier. */
+ ptr++;
+
+ while(*ptr && strchr ("-+ #0'I", *ptr)) /* Move past flags. */
+ *ptr++;
+
+ if(*ptr == '*')
+ ptr++;
+ else while(isdigit(*ptr)) /* Handle explicit numeric value. */
+ ptr++;
+
+ if(*ptr == '.') {
+ *ptr++; /* Go past the period. */
+ if(*ptr == '*') {
+ ptr++;
+ } else
+ while(isdigit(*ptr)) /* Handle explicit numeric value. */
+ *ptr++;
+ }
+ while(*ptr && strchr ("hlL", *ptr))
+ *ptr++;
+
+ if(*ptr == '%') ++ptr;
+ else if(*ptr != '\0') {
+ if(intformat) {
+ switch(*ptr) {
+ case 'd':
+ case 'i':
+ case 'o':
+ case 'u':
+ case 'x':
+ case 'X':
+ case 'c':
+ break;
+ default:
+ ostringstream buf;
+ buf << "Invalid format '" << *ptr << "' for type "
+ << types::names[types::ty_Int];
+ error(buf);
+ break;
+ }
+ } else {
+ switch(*ptr) {
+ case 'f':
+ case 'F':
+ case 'e':
+ case 'E':
+ case 'g':
+ case 'G':
+ break;
+ default:
+ ostringstream buf;
+ buf << "Invalid format '" << *ptr << "' for type "
+ << types::names[types::ty_real];
+ error(buf);
+ break;
+ }
+ }
+ }
+ } /* End of else statement */
+ }
+}
+
+// Autogenerated routines:
+
+
+
+namespace run {
+// String operations
+#line 112 "runstring.in"
+void emptyString(stack *Stack)
+{
+#line 113 "runstring.in"
+ {Stack->push<string>(emptystring); return;}
+}
+
+#line 118 "runstring.in"
+// Int length(string *s);
+void gen_runstring1(stack *Stack)
+{
+ string * s=vm::pop<string *>(Stack);
+#line 119 "runstring.in"
+ {Stack->push<Int>((Int) s->length()); return;}
+}
+
+#line 123 "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 124 "runstring.in"
+ size_t n=s->find(t,pos);
+ {Stack->push<Int>(n == string::npos ? (Int) -1 : (Int) n); return;}
+}
+
+#line 129 "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 130 "runstring.in"
+ size_t n=s->rfind(t,pos);
+ {Stack->push<Int>(n == string::npos ? (Int) -1 : (Int) n); return;}
+}
+
+#line 135 "runstring.in"
+// string reverse(string s);
+void gen_runstring4(stack *Stack)
+{
+ string s=vm::pop<string>(Stack);
+#line 136 "runstring.in"
+ reverse(s.begin(),s.end());
+ {Stack->push<string>(s); return;}
+}
+
+#line 141 "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 142 "runstring.in"
+ if ((size_t) pos < s.length())
+ {Stack->push<string>(s.insert(pos,t)); return;}
+ {Stack->push<string>(s); return;}
+}
+
+#line 148 "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 149 "runstring.in"
+ if ((size_t) pos < s->length())
+ {Stack->push<string>(s->substr(pos,n)); return;}
+ {Stack->push<string>(emptystring); return;}
+}
+
+#line 155 "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 156 "runstring.in"
+ if ((size_t) pos < s.length())
+ {Stack->push<string>(s.erase(pos,n)); return;}
+ {Stack->push<string>(s); return;}
+}
+
+#line 162 "runstring.in"
+// string downcase(string s);
+void gen_runstring8(stack *Stack)
+{
+ string s=vm::pop<string>(Stack);
+#line 163 "runstring.in"
+ std::transform(s.begin(),s.end(),s.begin(),tolower);
+ {Stack->push<string>(s); return;}
+}
+
+#line 168 "runstring.in"
+// string upcase(string s);
+void gen_runstring9(stack *Stack)
+{
+ string s=vm::pop<string>(Stack);
+#line 169 "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 176 "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 177 "runstring.in"
+ size_t size=checkArray(translate);
+ for(size_t i=0; i < size; i++) {
+ array *a=read<array*>(translate,i);
+ checkArray(a);
+ }
+ const char *p=S->c_str();
+ ostringstream buf;
+ while(*p) {
+ for(size_t i=0; i < size;) {
+ array *a=read<array*>(translate,i);
+ string* from=read<string*>(a,0);
+ size_t len=from->length();
+ if(strncmp(p,from->c_str(),len) != 0) {i++; continue;}
+ buf << read<string>(a,1);
+ p += len;
+ if(*p == 0) {Stack->push<string>(buf.str()); return;}
+ i=0;
+ }
+ buf << *(p++);
+ }
+ {Stack->push<string>(buf.str()); return;}
+}
+
+#line 201 "runstring.in"
+// string format(string *format, Int x);
+void gen_runstring11(stack *Stack)
+{
+ Int x=vm::pop<Int>(Stack);
+ string * format=vm::pop<string *>(Stack);
+#line 202 "runstring.in"
+ const char *f=format->c_str();
+
+ checkformat(f,true);
+
+ Int size=snprintf(NULL,0,f,x)+1;
+ if(size < 1) size=255; // Workaround for non-C99 compliant systems.
+ char *buf=new char[size];
+ snprintf(buf,size,f,x);
+ string s=string(buf);
+ delete[] buf;
+ {Stack->push<string>(s); return;}
+}
+
+#line 216 "runstring.in"
+// string format(string *format, real x, string locale=emptystring);
+void gen_runstring12(stack *Stack)
+{
+ string locale=vm::pop<string>(Stack,emptystring);
+ real x=vm::pop<real>(Stack);
+ string * format=vm::pop<string *>(Stack);
+#line 217 "runstring.in"
+ bool tex=getSetting<string>("tex") != "none";
+ bool texify=false;
+ ostringstream out;
+
+ checkformat(format->c_str(),false);
+
+ const char *phantom="\\phantom{+}";
+ const char *p0=format->c_str();
+
+ const char *p=p0;
+ const char *start=NULL;
+ char prev=0;
+ while(*p != 0) {
+ char curr=*p;
+ if(tex && curr == '$' && prev != '\\') texify=true;
+ prev=curr;
+ if(curr == '%') {
+ p++;
+ if(*p != '%') {start=p-1; break;}
+ }
+ out << *(p++);
+ }
+
+ if(!start) {Stack->push<string>(out.str()); return;}
+
+ // Allow at most 1 argument
+ while(*p != 0) {
+ if(*p == '*' || *p == '$') {Stack->push<string>(out.str()); return;}
+ if(isupper(*p) || islower(*p)) {p++; break;}
+ p++;
+ }
+
+ const char *tail=p;
+ string f=format->substr(start-p0,tail-start);
+
+ const char *oldlocale=NULL;
+ if(!locale.empty()) {
+ oldlocale=setlocale(LC_ALL,NULL);
+ if(oldlocale) oldlocale=StrdupNoGC(oldlocale);
+ setlocale(LC_ALL,locale.c_str());
+ }
+
+ Int size=snprintf(NULL,0,f.c_str(),x)+1;
+ if(size < 1) size=255; // Workaround for non-C99 compliant systems.
+ char *buf=new char[size];
+ snprintf(buf,size,f.c_str(),x);
+
+ if(oldlocale) {
+ setlocale(LC_ALL,oldlocale);
+ delete[] oldlocale;
+ }
+
+ bool trailingzero=f.find("#") < string::npos;
+ bool plus=f.find("+") < string::npos;
+ bool space=f.find(" ") < string::npos;
+
+ char *q=buf; // beginning of formatted number
+
+ if(*q == ' ') {
+ out << phantom;
+ q++;
+ }
+
+ const char decimal=*(localeconv()->decimal_point);
+
+ // Remove any spurious sign
+ if(*q == '-' || *q == '+') {
+ p=q+1;
+ bool zero=true;
+ while(*p != 0) {
+ if(!isdigit(*p) && *p != decimal) break;
+ if(isdigit(*p) && *p != '0') {zero=false; break;}
+ p++;
+ }
+ if(zero) {
+ q++;
+ if(plus || space) out << phantom;
+ }
+ }
+
+ const char *r=p=q;
+ bool dp=false;
+ while(*r != 0 && (isdigit(*r) || *r == decimal || *r == '+' || *r == '-')) {
+ if(*r == decimal) dp=true;
+ r++;
+ }
+ if(dp) { // Remove trailing zeros and/or decimal point
+ r--;
+ unsigned n=0;
+ while(r > q && *r == '0') {r--; n++;}
+ if(*r == decimal) {r--; n++;}
+ while(q <= r) out << *(q++);
+ if(!trailingzero) q += n;
+ }
+
+ bool zero=(r == p && *r == '0') && !trailingzero;
+
+ // Translate "E+/E-/e+/e-" exponential notation to TeX
+ while(*q != 0) {
+ if(texify && (*q == 'E' || *q == 'e') &&
+ (*(q+1) == '+' || *(q+1) == '-')) {
+ if(!zero) out << "\\!\\times\\!10^{";
+ bool plus=(*(q+1) == '+');
+ q++;
+ if(plus) q++;
+ if(*q == '-') out << *(q++);
+ while(*q == '0' && (zero || isdigit(*(q+1)))) q++;
+ while(isdigit(*q)) out << *(q++);
+ if(!zero)
+ out << "}";
+ break;
+ }
+ out << *(q++);
+ }
+
+ while(*tail != 0)
+ out << *(tail++);
+
+ delete[] buf;
+
+ {Stack->push<string>(out.str()); return;}
+}
+
+#line 341 "runstring.in"
+// Int hex(string s);
+void gen_runstring13(stack *Stack)
+{
+ string s=vm::pop<string>(Stack);
+#line 342 "runstring.in"
+ istringstream is(s);
+ is.setf(std::ios::hex,std::ios::basefield);
+ Int value;
+ if(is && is >> value && ((is >> std::ws).eof())) {Stack->push<Int>(value); return;}
+ ostringstream buf;
+ buf << "invalid hexidecimal cast from string \"" << s << "\"";
+ error(buf);
+}
+
+#line 352 "runstring.in"
+// string string(Int x);
+void gen_runstring14(stack *Stack)
+{
+ Int x=vm::pop<Int>(Stack);
+#line 353 "runstring.in"
+ ostringstream buf;
+ buf << x;
+ {Stack->push<string>(buf.str()); return;}
+}
+
+#line 359 "runstring.in"
+// string string(real x, Int digits=DBL_DIG);
+void gen_runstring15(stack *Stack)
+{
+ Int digits=vm::pop<Int>(Stack,DBL_DIG);
+ real x=vm::pop<real>(Stack);
+#line 360 "runstring.in"
+ ostringstream buf;
+ buf.precision(digits);
+ buf << x;
+ {Stack->push<string>(buf.str()); return;}
+}
+
+#line 367 "runstring.in"
+// string time(string format=defaulttimeformat);
+void gen_runstring16(stack *Stack)
+{
+ string format=vm::pop<string>(Stack,defaulttimeformat);
+#line 368 "runstring.in"
+#ifdef HAVE_STRFTIME
+ const time_t bintime=time(NULL);
+ if(!strftime(Time,nTime,format.c_str(),localtime(&bintime))) {Stack->push<string>(""); return;}
+ {Stack->push<string>(Time); return;}
+#else
+ {Stack->push<string>(format); return;}
+#endif
+}
+
+#line 378 "runstring.in"
+// string time(Int seconds, string format=defaulttimeformat);
+void gen_runstring17(stack *Stack)
+{
+ string format=vm::pop<string>(Stack,defaulttimeformat);
+ Int seconds=vm::pop<Int>(Stack);
+#line 379 "runstring.in"
+#ifdef HAVE_STRFTIME
+ const time_t bintime=seconds;
+ if(!strftime(Time,nTime,format.c_str(),localtime(&bintime))) {Stack->push<string>(""); return;}
+ {Stack->push<string>(Time); return;}
+#else
+// Avoid unused variable warning messages
+ unused(&seconds);
+ {Stack->push<string>(format); return;}
+#endif
+}
+
+#line 391 "runstring.in"
+// Int seconds(string t=emptystring, string format=emptystring);
+void gen_runstring18(stack *Stack)
+{
+ string format=vm::pop<string>(Stack,emptystring);
+ string t=vm::pop<string>(Stack,emptystring);
+#line 392 "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
+}
+
+} // namespace run
+
+namespace trans {
+
+void gen_runstring_venv(venv &ve)
+{
+#line 111 "runstring.in"
+ REGISTER_BLTIN(run::emptyString,"emptyString");
+#line 118 "runstring.in"
+ addFunc(ve, run::gen_runstring1, primInt(), "length", formal(primString(), "s", false, false));
+#line 123 "runstring.in"
+ addFunc(ve, run::gen_runstring2, primInt(), "find", formal(primString(), "s", false, false), formal(primString() , "t", false, false), formal(primInt(), "pos", true, false));
+#line 129 "runstring.in"
+ addFunc(ve, run::gen_runstring3, primInt(), "rfind", formal(primString(), "s", false, false), formal(primString() , "t", false, false), formal(primInt(), "pos", true, false));
+#line 135 "runstring.in"
+ addFunc(ve, run::gen_runstring4, primString() , "reverse", formal(primString() , "s", false, false));
+#line 141 "runstring.in"
+ addFunc(ve, run::gen_runstring5, primString() , "insert", formal(primString() , "s", false, false), formal(primInt(), "pos", false, false), formal(primString() , "t", false, false));
+#line 148 "runstring.in"
+ addFunc(ve, run::gen_runstring6, primString() , "substr", formal(primString(), "s", false, false), formal(primInt(), "pos", false, false), formal(primInt(), "n", true, false));
+#line 155 "runstring.in"
+ addFunc(ve, run::gen_runstring7, primString() , "erase", formal(primString() , "s", false, false), formal(primInt(), "pos", false, false), formal(primInt(), "n", false, false));
+#line 162 "runstring.in"
+ addFunc(ve, run::gen_runstring8, primString() , "downcase", formal(primString() , "s", false, false));
+#line 168 "runstring.in"
+ addFunc(ve, run::gen_runstring9, primString() , "upcase", formal(primString() , "s", false, false));
+#line 174 "runstring.in"
+ addFunc(ve, run::gen_runstring10, primString() , "replace", formal(primString(), "s", false, false), formal(stringArray2(), "translate", false, false));
+#line 201 "runstring.in"
+ addFunc(ve, run::gen_runstring11, primString() , "format", formal(primString(), "format", false, false), formal(primInt(), "x", false, false));
+#line 216 "runstring.in"
+ addFunc(ve, run::gen_runstring12, primString() , "format", formal(primString(), "format", false, false), formal(primReal(), "x", false, false), formal(primString() , "locale", true, false));
+#line 341 "runstring.in"
+ addFunc(ve, run::gen_runstring13, primInt(), "hex", formal(primString() , "s", false, false));
+#line 352 "runstring.in"
+ addFunc(ve, run::gen_runstring14, primString() , "string", formal(primInt(), "x", false, false));
+#line 359 "runstring.in"
+ addFunc(ve, run::gen_runstring15, primString() , "string", formal(primReal(), "x", false, false), formal(primInt(), "digits", true, false));
+#line 367 "runstring.in"
+ addFunc(ve, run::gen_runstring16, primString() , "time", formal(primString() , "format", true, false));
+#line 378 "runstring.in"
+ addFunc(ve, run::gen_runstring17, primString() , "time", formal(primInt(), "seconds", false, false), formal(primString() , "format", true, false));
+#line 391 "runstring.in"
+ addFunc(ve, run::gen_runstring18, primInt(), "seconds", formal(primString() , "t", true, false), formal(primString() , "format", true, false));
+}
+
+} // namespace trans