static JsVar *matchfound(JsvStringIterator *txtIt, matchInfo info) { JsVar *rmatch = jsvNewEmptyArray(); size_t endIndex = jsvStringIteratorGetIndex(txtIt); JsVar *matchStr = jsvNewFromStringVar(info.sourceStr, info.startIndex, endIndex-info.startIndex); jsvSetArrayItem(rmatch, 0, matchStr); jsvUnLock(matchStr); int i; for (i=0;i<info.groups;i++) { matchStr = jsvNewFromStringVar(info.sourceStr, info.groupStart[i], info.groupEnd[i]-info.groupStart[i]); jsvSetArrayItem(rmatch, i+1, matchStr); jsvUnLock(matchStr); } jsvObjectSetChildAndUnLock(rmatch, "index", jsvNewFromInteger((JsVarInt)info.startIndex)); jsvObjectSetChild(rmatch, "input", info.sourceStr); return rmatch; }
JsVar *jsvIteratorSetValue(JsvIterator *it, JsVar *value) { switch (it->type) { case JSVI_FULLARRAY: if (jsvIsIntegerish(it->it.obj.it.var) && jsvGetInteger(it->it.obj.it.var) == it->it.obj.index) jsvObjectIteratorSetValue(&it->it.obj.it, value); jsvSetArrayItem(it->it.obj.var, it->it.obj.index, value); break; case JSVI_OBJECT : jsvObjectIteratorSetValue(&it->it.obj.it, value); break; case JSVI_STRING : jsvStringIteratorSetChar(&it->it.str, (char)(jsvIsString(value) ? value->varData.str[0] : (char)jsvGetInteger(value))); break; case JSVI_ARRAYBUFFER : jsvArrayBufferIteratorSetValueAndRewind(&it->it.buf, value); break; default: assert(0); break; } return value; }