4 * A single-file Javascript-alike engine
\r
6 * - Useful language functions
\r
8 * Authored By Gordon Williams <gw@pur3.co.uk>
\r
10 * Copyright (C) 2009 Pur3 Ltd
\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
31 #include "TinyJS_Functions.h"
\r
36 using namespace std;
\r
37 // ----------------------------------------------- Actual Functions
\r
38 void scTrace(CScriptVar *c, void *userdata) {
\r
39 CTinyJS *js = (CTinyJS*)userdata;
\r
43 void scObjectDump(CScriptVar *c, void *) {
\r
44 c->getParameter("this")->trace("> ");
\r
47 void scObjectClone(CScriptVar *c, void *) {
\r
48 CScriptVar *obj = c->getParameter("this");
\r
49 c->getReturnVar()->copyValue(obj);
\r
52 void scMathRand(CScriptVar *c, void *) {
\r
53 c->getReturnVar()->setDouble((double)rand()/RAND_MAX);
\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
63 void scCharToInt(CScriptVar *c, void *) {
\r
64 string str = c->getParameter("ch")->getString();;
\r
67 val = (int)str.c_str()[0];
\r
68 c->getReturnVar()->setInt(val);
\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
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
85 if (l>0 && lo>=0 && lo+l<=(int)str.length())
\r
86 c->getReturnVar()->setString(str.substr(lo, l));
\r
88 c->getReturnVar()->setString("");
\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
97 c->getReturnVar()->setString("");
\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
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
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
124 result->setArrayIndex(length++, new CScriptVar(str));
\r
127 void scStringFromCharCode(CScriptVar *c, void *) {
\r
129 str[0] = c->getParameter("char")->getInt();
\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
144 if (str.length()==1)
\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
173 if (v->var->equals(obj)) {
\r
177 v = v->nextSibling;
\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
188 v = c->getParameter("this")->firstChild;
\r
190 if (v->var->equals(obj)) {
\r
191 removedIndices.push_back(v->getIntName());
\r
193 v = v->nextSibling;
\r
196 v = c->getParameter("this")->firstChild;
\r
198 int n = v->getIntName();
\r
200 for (size_t i=0;i<removedIndices.size();i++)
\r
201 if (n>=removedIndices[i])
\r
204 v->setIntName(newn);
\r
205 v = v->nextSibling;
\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
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