//************************************ // Method: getRegExpData // FullName: getRegExpData // Access: public static // Returns: bool true if regexp-param=RegExp-Object / other false // Qualifier: // Parameter: const CFunctionsScopePtr & c // Parameter: const string & regexp - parameter name of the regexp // Parameter: bool noUndefined - true an undefined regexp aims in "" else in "undefined" // Parameter: const string & flags - parameter name of the flags // Parameter: string & substr - rgexp.source // Parameter: bool & global // Parameter: bool & ignoreCase // Parameter: bool & sticky //************************************ static CScriptVarPtr getRegExpData(const CFunctionsScopePtr &c, const string ®exp, bool noUndefined, const char *flags_argument, string &substr, bool &global, bool &ignoreCase, bool &sticky) { CScriptVarPtr regexpVar = c->getArgument(regexp); if(regexpVar->isRegExp()) { #ifndef NO_REGEXP CScriptVarRegExpPtr RegExp(regexpVar); substr = RegExp->Regexp(); ignoreCase = RegExp->IgnoreCase(); global = RegExp->Global(); sticky = RegExp->Sticky(); return RegExp; #endif /* NO_REGEXP */ } else { substr.clear(); if(!noUndefined || !regexpVar->isUndefined()) substr = regexpVar->toString(); CScriptVarPtr flagVar; if(flags_argument && (flagVar = c->getArgument(flags_argument)) && !flagVar->isUndefined()) { string flags = flagVar->toString(); string::size_type pos = flags.find_first_not_of("gimy"); if(pos != string::npos) { c->throwError(SyntaxError, string("invalid regular expression flag ")+flags[pos]); } global = flags.find_first_of('g')!=string::npos; ignoreCase = flags.find_first_of('i')!=string::npos; sticky = flags.find_first_of('y')!=string::npos; } else global = ignoreCase = sticky = false; } return CScriptVarPtr(); }
static void scArrayFill(const CFunctionsScopePtr &c, void *data) { CScriptVarPtr arr = c->getArgument("this"); uint32_t len = c->getLength(arr); CNumber startNumber=0, endNumber=len; CScriptVarPtr value = c->getArgument(0); CScriptVarPtr startVar = c->getArgument(1); CScriptVarPtr endVar = c->getArgument(2); c->setReturnVar(arr); if(!startVar->isUndefined()) startNumber = startVar->toNumber(); if(!endVar->isUndefined()) endNumber = endVar->toNumber(); uint32_t start = (startNumber.sign()<0 ? startNumber+len : startNumber).clamp(0, len).toUInt32(); uint32_t end = (endNumber.sign()<0 ? endNumber+len : endNumber).clamp(0, len).toUInt32(); for(; start < end; ++start) c->setProperty(arr, start, value); }