char CObjectIStreamJson::ReadEncodedChar( EStringType type /*= eStringTypeVisible*/, bool* encoded /*=0*/) { EEncoding enc_out( type == eStringTypeUTF8 ? eEncoding_UTF8 : m_StringEncoding); EEncoding enc_in(eEncoding_UTF8); if (enc_in != enc_out && enc_out != eEncoding_Unknown) { int c = ReadEscapedChar(encoded); TUnicodeSymbol chU = ReadUtf8Char(c); Uint1 ch = CStringUTF8::SymbolToChar( chU, enc_out); return ch & 0xFF; } return ReadEscapedChar(encoded); }
size_t StdCompilerINIRead::GetStringLength(RawCompileType eRawType) { // Excpect valid position if (!pPos) { notFound("String"); return 0; } // Skip whitespace SkipWhitespace(); // Save position const char *pStart = pPos; // Escaped? Go over '"' if (eRawType == RCT_Escaped && *pPos++ != '"') { notFound("Escaped string"); return 0; } // Search end of string size_t iLength = 0; while (!TestStringEnd(eRawType)) { // Read a character (we're just counting atm) if (eRawType == RCT_Escaped) ReadEscapedChar(); else pPos++; // Count it iLength++; } // Reset position, return the length pPos = pStart; return iLength; }
StdBuf StdCompilerINIRead::ReadString(size_t iLength, RawCompileType eRawType, bool fAppendNull) { // Excpect valid position if (!pPos) { notFound("String"); return StdBuf(); } // Skip whitespace SkipWhitespace(); // Escaped? Go over '"' if (eRawType == RCT_Escaped && *pPos++ != '"') { notFound("Escaped string"); return StdBuf(); } // Create buffer StdBuf OutBuf; OutBuf.New(iLength + (fAppendNull ? sizeof('\0') : 0)); // Read char *pOut = getMBufPtr<char>(OutBuf); while (iLength && !TestStringEnd(eRawType)) { // Read a character if (eRawType == RCT_Escaped) *pOut++ = ReadEscapedChar(); else *pOut++ = *pPos++; // Count it iLength--; } // Escaped: Go over '"' if (eRawType == RCT_Escaped) { while (*pPos != '"') { if (!*pPos || *pPos == '\n' || *pPos == '\r') { Warn("string not terminated!"); pPos--; break; } pPos++; } pPos++; } // Nothing read? Identifiers need to be non-empty if (pOut == OutBuf.getData() && (eRawType == RCT_Idtf || eRawType == RCT_ID)) { notFound("String"); return StdBuf(); } // Append null if (fAppendNull) *pOut = '\0'; // Shrink, if less characters were read OutBuf.Shrink(iLength); // Done return OutBuf; }