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); 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 } } } }
static bool fileGetFromVar(JsFile *file, JsVar *parent) { bool ret = false; JsVar *fHandle = jsvObjectGetChild(parent, JS_FS_DATA_NAME, 0); if (fHandle && jsvIsFlatString(fHandle)) { file->data = (JsFileData*)jsvGetFlatStringPointer(fHandle); file->fileVar = parent; if(file->data->state == FS_OPEN) {// return false if the file has been closed. ret = true; } } jsvUnLock(fHandle); return ret; }