void jsvStringIteratorNew(JsvStringIterator *it, JsVar *str, size_t startIdx) { assert(jsvHasCharacterData(str)); it->var = jsvLockAgain(str); it->charsInVar = jsvGetCharactersInVar(str); if (jsvIsFlatString(str)) { /* Flat strings use the first var to store the size, and subsequent vars to store the actual data, so we tweak charIdx to handle this */ it->varIndex = -sizeof(JsVar); it->charsInVar += sizeof(JsVar); it->charIdx = sizeof(JsVar)+startIdx; } else { it->varIndex = 0; it->charIdx = startIdx; } while (it->charIdx>0 && it->charIdx >= it->charsInVar) { it->charIdx -= it->charsInVar; it->varIndex += it->charsInVar; if (it->var) { if (jsvGetLastChild(it->var)) { JsVar *next = jsvLock(jsvGetLastChild(it->var)); jsvUnLock(it->var); it->var = next; it->charsInVar = jsvGetCharactersInVar(it->var); } else { jsvUnLock(it->var); it->var = 0; it->charsInVar = 0; it->varIndex = startIdx - it->charIdx; return; // at end of string - get out of loop } } } }
void jsvStringIteratorNew(JsvStringIterator *it, JsVar *str, size_t startIdx) { assert(jsvHasCharacterData(str)); it->var = jsvLockAgain(str); it->varIndex = 0; it->charsInVar = jsvGetCharactersInVar(str); it->charIdx = startIdx; if (jsvIsFlatString(str)) { it->ptr = jsvGetFlatStringPointer(it->var); } else if (jsvIsNativeString(str)) { it->ptr = (char*)it->var->varData.nativeStr.ptr; } else{ it->ptr = &it->var->varData.str[0]; } while (it->charIdx>0 && it->charIdx >= it->charsInVar) { it->charIdx -= it->charsInVar; it->varIndex += it->charsInVar; if (it->var) { if (jsvGetLastChild(it->var)) { JsVar *next = jsvLock(jsvGetLastChild(it->var)); jsvUnLock(it->var); it->var = next; it->ptr = &next->varData.str[0]; it->charsInVar = jsvGetCharactersInVar(it->var); } else { jsvUnLock(it->var); it->var = 0; it->ptr = 0; it->charsInVar = 0; it->varIndex = startIdx - it->charIdx; return; // at end of string - get out of loop } } } }
void jsvStringIteratorNew(JsvStringIterator *it, JsVar *str, size_t startIdx) { assert(jsvHasCharacterData(str)); it->var = jsvLockAgain(str); it->charsInVar = jsvGetCharactersInVar(str); it->charIdx = startIdx; it->varIndex = 0; while (it->charIdx>0 && it->charIdx >= it->charsInVar) { it->charIdx -= it->charsInVar; it->varIndex += it->charsInVar; if (it->var) { if (jsvGetLastChild(it->var)) { JsVar *next = jsvLock(jsvGetLastChild(it->var)); jsvUnLock(it->var); it->var = next; it->charsInVar = jsvGetCharactersInVar(it->var); } else { jsvUnLock(it->var); it->var = 0; it->charsInVar = 0; it->varIndex = startIdx - it->charIdx; return; // at end of string - get out of loop } } } it->varIndex = startIdx - it->charIdx; }
void jsvIteratorNew(JsvIterator *it, JsVar *obj) { if (jsvIsArray(obj) || jsvIsObject(obj) || jsvIsFunction(obj)) { it->type = JSVI_OBJECT; jsvObjectIteratorNew(&it->it.obj, obj); } else if (jsvIsArrayBuffer(obj)) { it->type = JSVI_ARRAYBUFFER; jsvArrayBufferIteratorNew(&it->it.buf, obj, 0); } else if (jsvHasCharacterData(obj)) { it->type = JSVI_STRING; jsvStringIteratorNew(&it->it.str, obj, 0); } else assert(0); }
void jsvIteratorNew(JsvIterator *it, JsVar *obj, JsvIteratorFlags flags) { if (jsvIsArray(obj) || jsvIsObject(obj) || jsvIsFunction(obj) || jsvIsGetterOrSetter(obj)) { it->type = JSVI_OBJECT; if (jsvIsArray(obj) && (flags&JSIF_EVERY_ARRAY_ELEMENT)) { it->type = JSVI_FULLARRAY; it->it.obj.index = 0; it->it.obj.var = jsvLockAgain(obj); } jsvObjectIteratorNew(&it->it.obj.it, obj); } else if (jsvIsArrayBuffer(obj)) { it->type = JSVI_ARRAYBUFFER; jsvArrayBufferIteratorNew(&it->it.buf, obj, 0); } else if (jsvHasCharacterData(obj)) { it->type = JSVI_STRING; jsvStringIteratorNew(&it->it.str, obj, 0); } else assert(0); }