bool SimpleParser::FindNextString( SimpleString *sourcePtr, SimpleString *currentPtr, SimpleString *findPtr, SimpleString *resultStringPtr) { bool result = false; SInt32 length = 0; do { if (NULL == sourcePtr) break; if (NULL == currentPtr) break; if (NULL == findPtr) break; if (NULL == sourcePtr->fTheString) break; if (NULL == currentPtr->fTheString) break; SimpleString tempSource(NULL); length = currentPtr->fTheString - sourcePtr->fTheString; if (length < 0) break; if (length > sourcePtr->fLen) break; length = sourcePtr->fLen - (length + currentPtr->fLen); // the remaining length to search tempSource.SetString(¤tPtr->fTheString[currentPtr->fLen], length); // step past the end of current with remaining length result = FindString(&tempSource, findPtr, resultStringPtr); } while (false); return result; }
bool SimpleParser::GetNextThing(SimpleString *sourcePtr, SimpleString *currentPtr, char *findChars, SimpleString *resultStringPtr) { bool result = false; do { if (NULL == sourcePtr) break; if (NULL == currentPtr) break; if (NULL == findChars) break; if ( (PointerSizedInt) currentPtr->fTheString < (PointerSizedInt) sourcePtr->fTheString) break; if (NULL == sourcePtr->fTheString) { //qtss_printf("NULL sourcePtr->fTheString in GetNextThing \n"); break; } if (NULL == currentPtr->fTheString) { //qtss_printf("NULL currentPtr->fTheString in GetNextThing \n"); break; } PointerSizedInt endSource = (PointerSizedInt) &sourcePtr->fTheString[sourcePtr->fLen]; PointerSizedInt endCurrent = (PointerSizedInt) ¤tPtr->fTheString[currentPtr->fLen]; if (endCurrent > endSource) break; SimpleString tempSource(NULL); UInt32 searchLen = endSource - endCurrent; tempSource.SetString(¤tPtr->fTheString[currentPtr->fLen], searchLen); // step past the end of current with remaining length result = FindDelimeter(&tempSource, findChars,resultStringPtr); } while (false); return result; }
document_ptr Document::Create(const char* id, script_object_ptr obj, sequence_type seqNum, bool incrementRev) { const char* oldRev = obj->getString("_rev", false); const char* newRev = nullptr; DocumentRevision::RevString newRevString; if (incrementRev || oldRev == nullptr) { // TODO: strtoul is unsafe auto oldVersion = oldRev != nullptr ? std::strtoul(oldRev, nullptr, 10) : 0; auto nextVersion = oldVersion + 1; rs::scriptobject::ScriptObjectHash digest; obj->CalculateHash(digest, &Document::ValidateHashField); DocumentRevision::FormatRevision(nextVersion, digest, newRevString); newRev = newRevString.data(); } document_ptr doc; if (obj->getType("_id") == rs::scriptobject::ScriptObjectType::String && oldRev != nullptr && obj->setString("_id", id) && (newRev == nullptr || obj->setString("_rev", newRev))) { doc = boost::make_shared<document_ptr::element_type>(obj, seqNum); } else { rs::scriptobject::utils::ObjectVector tempDefn = { std::make_pair("_id", rs::scriptobject::utils::VectorValue(id)), std::make_pair("_rev", rs::scriptobject::utils::VectorValue(newRev ? newRev : oldRev)) }; rs::scriptobject::utils::ScriptObjectVectorSource tempSource(tempDefn); auto tempObj = rs::scriptobject::ScriptObjectFactory::CreateObject(tempSource); auto newObj = rs::scriptobject::ScriptObject::Merge(obj, tempObj, rs::scriptobject::ScriptObject::MergeStrategy::Front); doc = boost::make_shared<document_ptr::element_type>(newObj, seqNum); } return doc; }