static void scArrayContains(const CFunctionsScopePtr &c, void *data) { CScriptVarPtr obj = c->getArgument("obj"); CScriptVarPtr arr = c->getArgument("this"); int l = arr->getArrayLength(); CScriptVarPtr equal = c->constScriptVar(Undefined); for (int i=0;i<l;i++) { equal = obj->mathsOp(arr->getArrayIndex(i), LEX_EQUAL); if(equal->toBoolean()) { c->setReturnVar(c->constScriptVar(true)); return; } } c->setReturnVar(c->constScriptVar(false)); }
static void scArrayRemove(const CFunctionsScopePtr &c, void *data) { CScriptVarPtr obj = c->getArgument("obj"); CScriptVarPtr arr = c->getArgument("this"); int i; vector<int> removedIndices; int l = arr->getArrayLength(); CScriptVarPtr equal = c->constScriptVar(Undefined); for (i=0;i<l;i++) { equal = obj->mathsOp(arr->getArrayIndex(i), LEX_EQUAL); if(equal->toBoolean()) { removedIndices.push_back(i); } } if(removedIndices.size()) { vector<int>::iterator remove_it = removedIndices.begin(); int next_remove = *remove_it; int next_insert = *remove_it++; for (i=next_remove;i<l;i++) { CScriptVarLinkPtr link = arr->findChild(int2string(i)); if(i == next_remove) { if(link) arr->removeLink(link); if(remove_it != removedIndices.end()) next_remove = *remove_it++; } else { if(link) { arr->setArrayIndex(next_insert++, link); arr->removeLink(link); } } } } }
static void scStringCharCodeAt(const CFunctionsScopePtr &c, void *) { string str = this2string(c); int p = c->getArgument("pos")->toNumber().toInt32(); if (p>=0 && p<(int)str.length()) c->setReturnVar(c->newScriptVar((unsigned char)str.at(p))); else c->setReturnVar(c->constScriptVar(NaN)); }
static void scArrayPop(const CFunctionsScopePtr &c, void *data) { CScriptVarPtr arr = c->getArgument("this"); uint32_t len = c->getLength(arr); if(len) { c->setReturnVar(c->getPropertyValue(arr, len-1)); arr->removeChild(int2string(len-1)); } else c->setReturnVar(c->constScriptVar(Undefined)); }
static void scStringMatch(const CFunctionsScopePtr &c, void *) { string str = this2string(c); string flags="flags", substr, newsubstr, match; bool global, ignoreCase, sticky; CScriptVarRegExpPtr RegExp = getRegExpData(c, "regexp", true, "flags", substr, global, ignoreCase, sticky); if(!global) { if(!RegExp) RegExp = ::newScriptVar(c->getContext(), substr, flags); if(RegExp) { try { c->setReturnVar(RegExp->exec(str)); } catch(regex_error e) { c->throwError(SyntaxError, string(e.what())+" - "+CScriptVarRegExp::ErrorStr(e.code())); } } } else { try { CScriptVarArrayPtr retVar = c->newScriptVar(Array); int idx=0; string::size_type offset=0; global = global && substr.length(); string::const_iterator search_begin=str.begin(), match_begin, match_end; if(regex_search(str, search_begin, substr, ignoreCase, sticky, match_begin, match_end)) { do { offset = match_begin-str.begin(); retVar->addChild(int2string(idx++), c->newScriptVar(string(match_begin, match_end))); #if 1 /* Fix from "vcmpeq" (see Issue 14) currently untested */ if (match_begin == match_end) { if (search_begin != str.end()) ++search_begin; else break; } else { search_begin = match_end; } #else search_begin = match_end; #endif } while(global && regex_search(str, search_begin, substr, ignoreCase, sticky, match_begin, match_end)); } if(idx) { retVar->addChild("input", c->newScriptVar(str)); retVar->addChild("index", c->newScriptVar((int)offset)); c->setReturnVar(retVar); } else c->setReturnVar(c->constScriptVar(Null)); } catch(regex_error e) { c->throwError(SyntaxError, string(e.what())+" - "+CScriptVarRegExp::ErrorStr(e.code())); } } }
static void scStringSplit(const CFunctionsScopePtr &c, void *) { const string str = this2string(c); string seperator; bool global, ignoreCase, sticky; #ifndef NO_REGEXP CScriptVarRegExpPtr RegExp = getRegExpData(c, "separator", true, 0, seperator, global, ignoreCase, sticky); #else getRegExpData(c, "separator", true, 0, seperator, global, ignoreCase, sticky); #endif CScriptVarPtr sep_var = c->getArgument("separator"); CScriptVarPtr limit_var = c->getArgument("limit"); int limit = limit_var->isUndefined() ? 0x7fffffff : limit_var->toNumber().toInt32(); CScriptVarPtr result(c->newScriptVar(Array)); c->setReturnVar(result); if(limit == 0) return; else if(!str.size() || sep_var->isUndefined()) { result->addChild("0", c->newScriptVar(str)); return; } if(seperator.size() == 0) { for(int i=0; i<min((int)str.size(), limit); ++i) result->addChild(i, c->newScriptVar(str.substr(i,1))); return; } int length = 0; string::const_iterator search_begin=str.begin(), match_begin, match_end; #ifndef NO_REGEXP smatch match; #endif bool found=true; while(found) { #ifndef NO_REGEXP if(RegExp) { try { found = regex_search(str, search_begin, seperator, ignoreCase, sticky, match_begin, match_end, match); } catch(regex_error e) { c->throwError(SyntaxError, string(e.what())+" - "+CScriptVarRegExp::ErrorStr(e.code())); } } else /* NO_REGEXP */ #endif found = string_search(str, search_begin, seperator, ignoreCase, sticky, match_begin, match_end); string f; if(found) { result->addChild(length++, c->newScriptVar(string(search_begin, match_begin))); if(length>=limit) break; #ifndef NO_REGEXP for(uint32_t i=1; i<match.size(); i++) { if(match[i].matched) result->addChild(length++, c->newScriptVar(string(match[i].first, match[i].second))); else result->addChild(length++, c->constScriptVar(Undefined)); if(length>=limit) break; } if(length>=limit) break; #endif search_begin = match_end; } else { result->addChild(length++, c->newScriptVar(string(search_begin,str.end()))); if(length>=limit) break; } } }