formatting 90% done; encapsulated everything in the TinyJS namespace, and renamed...
[tinyjs-rewrite.git] / .svn / pristine / a7 / a7b674191cf81d0e511d5f588cf081bf0ff80234.svn-base
blob8a66994ae9629f701404d0a97d41ac34e4fb5d77
1 /*\r
2  * TinyJS\r
3  *\r
4  * A single-file Javascript-alike engine\r
5  *\r
6  * - Useful language functions\r
7  *\r
8  * Authored By Gordon Williams <gw@pur3.co.uk>\r
9  *\r
10  * Copyright (C) 2009 Pur3 Ltd\r
11  *\r
12  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
13  * this software and associated documentation files (the "Software"), to deal in\r
14  * the Software without restriction, including without limitation the rights to\r
15  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\r
16  * of the Software, and to permit persons to whom the Software is furnished to do\r
17  * so, subject to the following conditions:\r
19  * The above copyright notice and this permission notice shall be included in all\r
20  * copies or substantial portions of the Software.\r
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
23  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
24  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
25  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
26  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
27  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
28  * SOFTWARE.\r
29  */\r
31 #include "TinyJS_Functions.h"\r
32 #include <math.h>\r
33 #include <cstdlib>\r
34 #include <sstream>\r
36 using namespace std;\r
37 // ----------------------------------------------- Actual Functions\r
38 void scTrace(CScriptVar *c, void *userdata) {\r
39     CTinyJS *js = (CTinyJS*)userdata;\r
40     js->root->trace();\r
41 }\r
43 void scObjectDump(CScriptVar *c, void *) {\r
44     c->getParameter("this")->trace("> ");\r
45 }\r
47 void scObjectClone(CScriptVar *c, void *) {\r
48     CScriptVar *obj = c->getParameter("this");\r
49     c->getReturnVar()->copyValue(obj);\r
50 }\r
52 void scMathRand(CScriptVar *c, void *) {\r
53     c->getReturnVar()->setDouble((double)rand()/RAND_MAX);\r
54 }\r
56 void scMathRandInt(CScriptVar *c, void *) {\r
57     int min = c->getParameter("min")->getInt();\r
58     int max = c->getParameter("max")->getInt();\r
59     int val = min + (int)(rand()%(1+max-min));\r
60     c->getReturnVar()->setInt(val);\r
61 }\r
63 void scCharToInt(CScriptVar *c, void *) {\r
64     string str = c->getParameter("ch")->getString();;\r
65     int val = 0;\r
66     if (str.length()>0)\r
67         val = (int)str.c_str()[0];\r
68     c->getReturnVar()->setInt(val);\r
69 }\r
71 void scStringIndexOf(CScriptVar *c, void *) {\r
72     string str = c->getParameter("this")->getString();\r
73     string search = c->getParameter("search")->getString();\r
74     size_t p = str.find(search);\r
75     int val = (p==string::npos) ? -1 : p;\r
76     c->getReturnVar()->setInt(val);\r
77 }\r
79 void scStringSubstring(CScriptVar *c, void *) {\r
80     string str = c->getParameter("this")->getString();\r
81     int lo = c->getParameter("lo")->getInt();\r
82     int hi = c->getParameter("hi")->getInt();\r
84     int l = hi-lo;\r
85     if (l>0 && lo>=0 && lo+l<=(int)str.length())\r
86       c->getReturnVar()->setString(str.substr(lo, l));\r
87     else\r
88       c->getReturnVar()->setString("");\r
89 }\r
91 void scStringCharAt(CScriptVar *c, void *) {\r
92     string str = c->getParameter("this")->getString();\r
93     int p = c->getParameter("pos")->getInt();\r
94     if (p>=0 && p<(int)str.length())\r
95       c->getReturnVar()->setString(str.substr(p, 1));\r
96     else\r
97       c->getReturnVar()->setString("");\r
98 }\r
100 void scStringCharCodeAt(CScriptVar *c, void *) {\r
101     string str = c->getParameter("this")->getString();\r
102     int p = c->getParameter("pos")->getInt();\r
103     if (p>=0 && p<(int)str.length())\r
104       c->getReturnVar()->setInt(str.at(p));\r
105     else\r
106       c->getReturnVar()->setInt(0);\r
109 void scStringSplit(CScriptVar *c, void *) {\r
110     string str = c->getParameter("this")->getString();\r
111     string sep = c->getParameter("separator")->getString();\r
112     CScriptVar *result = c->getReturnVar();\r
113     result->setArray();\r
114     int length = 0;\r
116     size_t pos = str.find(sep);\r
117     while (pos != string::npos) {\r
118       result->setArrayIndex(length++, new CScriptVar(str.substr(0,pos)));\r
119       str = str.substr(pos+1);\r
120       pos = str.find(sep);\r
121     }\r
123     if (str.size()>0)\r
124       result->setArrayIndex(length++, new CScriptVar(str));\r
127 void scStringFromCharCode(CScriptVar *c, void *) {\r
128     char str[2];\r
129     str[0] = c->getParameter("char")->getInt();\r
130     str[1] = 0;\r
131     c->getReturnVar()->setString(str);\r
134 void scIntegerParseInt(CScriptVar *c, void *) {\r
135     string str = c->getParameter("str")->getString();\r
136     int val = strtol(str.c_str(),0,0);\r
137     c->getReturnVar()->setInt(val);\r
140 void scIntegerValueOf(CScriptVar *c, void *) {\r
141     string str = c->getParameter("str")->getString();\r
143     int val = 0;\r
144     if (str.length()==1)\r
145       val = str[0];\r
146     c->getReturnVar()->setInt(val);\r
149 void scJSONStringify(CScriptVar *c, void *) {\r
150     std::ostringstream result;\r
151     c->getParameter("obj")->getJSON(result);\r
152     c->getReturnVar()->setString(result.str());\r
155 void scExec(CScriptVar *c, void *data) {\r
156     CTinyJS *tinyJS = (CTinyJS *)data;\r
157     std::string str = c->getParameter("jsCode")->getString();\r
158     tinyJS->execute(str);\r
161 void scEval(CScriptVar *c, void *data) {\r
162     CTinyJS *tinyJS = (CTinyJS *)data;\r
163     std::string str = c->getParameter("jsCode")->getString();\r
164     c->setReturnVar(tinyJS->evaluateComplex(str).var);\r
167 void scArrayContains(CScriptVar *c, void *data) {\r
168   CScriptVar *obj = c->getParameter("obj");\r
169   CScriptVarLink *v = c->getParameter("this")->firstChild;\r
171   bool contains = false;\r
172   while (v) {\r
173       if (v->var->equals(obj)) {\r
174         contains = true;\r
175         break;\r
176       }\r
177       v = v->nextSibling;\r
178   }\r
180   c->getReturnVar()->setInt(contains);\r
183 void scArrayRemove(CScriptVar *c, void *data) {\r
184   CScriptVar *obj = c->getParameter("obj");\r
185   vector<int> removedIndices;\r
186   CScriptVarLink *v;\r
187   // remove\r
188   v = c->getParameter("this")->firstChild;\r
189   while (v) {\r
190       if (v->var->equals(obj)) {\r
191         removedIndices.push_back(v->getIntName());\r
192       }\r
193       v = v->nextSibling;\r
194   }\r
195   // renumber\r
196   v = c->getParameter("this")->firstChild;\r
197   while (v) {\r
198       int n = v->getIntName();\r
199       int newn = n;\r
200       for (size_t i=0;i<removedIndices.size();i++)\r
201         if (n>=removedIndices[i])\r
202           newn--;\r
203       if (newn!=n)\r
204         v->setIntName(newn);\r
205       v = v->nextSibling;\r
206   }\r
209 void scArrayJoin(CScriptVar *c, void *data) {\r
210   string sep = c->getParameter("separator")->getString();\r
211   CScriptVar *arr = c->getParameter("this");\r
213   ostringstream sstr;\r
214   int l = arr->getArrayLength();\r
215   for (int i=0;i<l;i++) {\r
216     if (i>0) sstr << sep;\r
217     sstr << arr->getArrayIndex(i)->getString();\r
218   }\r
220   c->getReturnVar()->setString(sstr.str());\r
223 // ----------------------------------------------- Register Functions\r
224 void registerFunctions(CTinyJS *tinyJS) {\r
225     tinyJS->addNative("function exec(jsCode)", scExec, tinyJS); // execute the given code\r
226     tinyJS->addNative("function eval(jsCode)", scEval, tinyJS); // execute the given string (an expression) and return the result\r
227     tinyJS->addNative("function trace()", scTrace, tinyJS);\r
228     tinyJS->addNative("function Object.dump()", scObjectDump, 0);\r
229     tinyJS->addNative("function Object.clone()", scObjectClone, 0);\r
230     tinyJS->addNative("function Math.rand()", scMathRand, 0);\r
231     tinyJS->addNative("function Math.randInt(min, max)", scMathRandInt, 0);\r
232     tinyJS->addNative("function charToInt(ch)", scCharToInt, 0); //  convert a character to an int - get its value\r
233     tinyJS->addNative("function String.indexOf(search)", scStringIndexOf, 0); // find the position of a string in a string, -1 if not\r
234     tinyJS->addNative("function String.substring(lo,hi)", scStringSubstring, 0);\r
235     tinyJS->addNative("function String.charAt(pos)", scStringCharAt, 0);\r
236     tinyJS->addNative("function String.charCodeAt(pos)", scStringCharCodeAt, 0);\r
237     tinyJS->addNative("function String.fromCharCode(char)", scStringFromCharCode, 0);\r
238     tinyJS->addNative("function String.split(separator)", scStringSplit, 0);\r
239     tinyJS->addNative("function Integer.parseInt(str)", scIntegerParseInt, 0); // string to int\r
240     tinyJS->addNative("function Integer.valueOf(str)", scIntegerValueOf, 0); // value of a single character\r
241     tinyJS->addNative("function JSON.stringify(obj, replacer)", scJSONStringify, 0); // convert to JSON. replacer is ignored at the moment\r
242     // JSON.parse is left out as you can (unsafely!) use eval instead\r
243     tinyJS->addNative("function Array.contains(obj)", scArrayContains, 0);\r
244     tinyJS->addNative("function Array.remove(obj)", scArrayRemove, 0);\r
245     tinyJS->addNative("function Array.join(separator)", scArrayJoin, 0);\r