📄 objistrasn.cpp
字号:
if (to != '}' && c == ',') { return; } else if (c == '\"' || c == '{') { ReadAnyContent(value); continue; } } if (c == to) { value += c; m_Input.SkipChar(); return; } if (c == '\"' || c == '{') { ReadAnyContent(value); continue; } value += c; m_Input.SkipChar(); }}void CObjectIStreamAsn::ReadAnyContentObject(CAnyContentObject& obj){ CLightString id = ReadMemberId(SkipWhiteSpace()); obj.SetName( id); string value; ReadAnyContent(value); obj.SetValue(value);}void CObjectIStreamAsn::SkipAnyContentObject(void){ CAnyContentObject obj; ReadAnyContentObject(obj);}string CObjectIStreamAsn::ReadFileHeader(){ CLightString id = ReadTypeId(SkipWhiteSpace()); string s(id); if ( SkipWhiteSpace() == ':' && m_Input.PeekCharNoEOF(1) == ':' && m_Input.PeekCharNoEOF(2) == '=' ) { m_Input.SkipChars(3); } else ThrowError(fFormatError, "'::=' expected"); return s;}TEnumValueType CObjectIStreamAsn::ReadEnum(const CEnumeratedTypeValues& values){ // not integer CLightString id = ReadLCaseId(SkipWhiteSpace()); if ( !id.Empty() ) { // enum element by name return values.FindValue(id); } // enum element by value TEnumValueType value = m_Input.GetInt4(); if ( !values.IsInteger() ) // check value values.FindName(value, false); return value;}bool CObjectIStreamAsn::ReadBool(void){ switch ( SkipWhiteSpace() ) { case 'T': if ( m_Input.PeekCharNoEOF(1) == 'R' && m_Input.PeekCharNoEOF(2) == 'U' && m_Input.PeekCharNoEOF(3) == 'E' && !IdChar(m_Input.PeekCharNoEOF(4)) ) { m_Input.SkipChars(4); return true; } break; case 'F': if ( m_Input.PeekCharNoEOF(1) == 'A' && m_Input.PeekCharNoEOF(2) == 'L' && m_Input.PeekCharNoEOF(3) == 'S' && m_Input.PeekCharNoEOF(4) == 'E' && !IdChar(m_Input.PeekCharNoEOF(5)) ) { m_Input.SkipChars(5); return false; } break; } ThrowError(fFormatError, "TRUE or FALSE expected"); return false;}char CObjectIStreamAsn::ReadChar(void){ string s; ReadString(s); if ( s.size() != 1 ) { ThrowError(fFormatError, "\"" + s + "\": one char string expected"); } return s[0];}Int4 CObjectIStreamAsn::ReadInt4(void){ SkipWhiteSpace(); return m_Input.GetInt4();}Uint4 CObjectIStreamAsn::ReadUint4(void){ SkipWhiteSpace(); return m_Input.GetUint4();}Int8 CObjectIStreamAsn::ReadInt8(void){ SkipWhiteSpace(); return m_Input.GetInt8();}Uint8 CObjectIStreamAsn::ReadUint8(void){ SkipWhiteSpace(); return m_Input.GetUint8();}double CObjectIStreamAsn::ReadDouble(void){ Expect('{', true); CLightString mantissaStr = ReadNumber(); size_t mantissaLength = mantissaStr.GetLength(); char buffer[128]; if ( mantissaLength >= sizeof(buffer) - 1 ) ThrowError(fFormatError, "buffer overflow"); memcpy(buffer, mantissaStr.GetString(), mantissaLength); buffer[mantissaLength] = '\0'; char* endptr; double mantissa = strtod(buffer, &endptr); if ( *endptr != 0 ) ThrowError(fFormatError, "bad double in line " + NStr::UIntToString(m_Input.GetLine())); Expect(',', true); unsigned base = ReadUint4(); Expect(',', true); int exp = ReadInt4(); Expect('}', true); if ( base != 2 && base != 10 ) ThrowError(fFormatError, "illegal REAL base (must be 2 or 10)"); if ( base == 10 ) { /* range checking only on base 10, for doubles */ if ( exp > DBL_MAX_10_EXP ) /* exponent too big */ ThrowError(fOverflow, "double overflow"); else if ( exp < DBL_MIN_10_EXP ) /* exponent too small */ return 0; } return mantissa * pow(double(base), exp);}void CObjectIStreamAsn::BadStringChar(size_t startLine, char c){ ThrowError(fFormatError, "bad char in string starting at line "+ NStr::UIntToString(startLine)+": "+ NStr::IntToString(c));}void CObjectIStreamAsn::UnendedString(size_t startLine){ ThrowError(fFormatError, "unclosed string starts at line "+ NStr::UIntToString(startLine));}inlinevoid CObjectIStreamAsn::AppendStringData(string& s, size_t count, EFixNonPrint fix_method, size_t line){ const char* data = m_Input.GetCurrentPos(); if ( fix_method != eFNP_Allow ) { size_t done = 0; for ( size_t i = 0; i < count; ++i ) { char c = data[i]; if ( !GoodVisibleChar(c) ) { if ( i > done ) { s.append(data + done, i - done); } FixVisibleChar(c, fix_method, line); s += c; done = i + 1; } } if ( done < count ) { s.append(data + done, count - done); } } else { s.append(data, count); } if ( count > 0 ) { m_Input.SkipChars(count); }}void CObjectIStreamAsn::AppendLongStringData(string& s, size_t count, EFixNonPrint fix_method, size_t line){ // Reserve extra-space to reduce heap reallocation if ( s.empty() ) { s.reserve(count*2); } else if ( s.capacity() < (s.size()+1)*1.1 ) { s.reserve(s.size()*2); } AppendStringData(s, count, fix_method, line);}void CObjectIStreamAsn::ReadStringValue(string& s, EFixNonPrint fix_method){ Expect('\"', true); size_t startLine = m_Input.GetLine(); size_t i = 0; s.erase(); try { for (;;) { char c = m_Input.PeekChar(i); switch ( c ) { case '\r': case '\n': // flush string AppendLongStringData(s, i, fix_method, startLine); m_Input.SkipChar(); // '\r' or '\n' i = 0; // skip end of line SkipEndOfLine(c); break; case '\"': s.reserve(s.size() + i); AppendStringData(s, i, fix_method, startLine); m_Input.SkipChar(); // quote if ( m_Input.PeekCharNoEOF() != '\"' ) { // end of string return; } else { // double quote -> one quote i = 1; } break; default: // ok: append char if ( ++i == 128 ) { // too long string -> flush it AppendLongStringData(s, i, fix_method, startLine); i = 0; } break; } } } catch ( CEofException& ) { UnendedString(startLine); throw; }}void CObjectIStreamAsn::ReadString(string& s, EStringType type){ ReadStringValue(s, type == eStringTypeUTF8? eFNP_Allow: m_FixMethod);}void CObjectIStreamAsn::SkipBool(void){ switch ( SkipWhiteSpace() ) { case 'T': if ( m_Input.PeekCharNoEOF(1) == 'R' && m_Input.PeekCharNoEOF(2) == 'U' && m_Input.PeekCharNoEOF(3) == 'E' && !IdChar(m_Input.PeekCharNoEOF(4)) ) { m_Input.SkipChars(4); return; } break; case 'F': if ( m_Input.PeekCharNoEOF(1) == 'A' && m_Input.PeekCharNoEOF(2) == 'L' && m_Input.PeekCharNoEOF(3) == 'S' && m_Input.PeekCharNoEOF(4) == 'E' && !IdChar(m_Input.PeekCharNoEOF(5)) ) { m_Input.SkipChars(5); return; } break; } ThrowError(fFormatError, "TRUE or FALSE expected");}void CObjectIStreamAsn::SkipChar(void){ // TODO: check string length to be 1 SkipString();}void CObjectIStreamAsn::SkipSNumber(void){ size_t i; char c = SkipWhiteSpace(); switch ( c ) { case '-': case '+': c = m_Input.PeekChar(1); // next char i = 2; break; default: // next char i = 1; break; } if ( c < '0' || c > '9' ) { ThrowError(fFormatError, "bad signed integer in line " + NStr::UIntToString(m_Input.GetLine())); } while ( (c = m_Input.PeekChar(i)) >= '0' && c <= '9' ) { ++i; } m_Input.SkipChars(i);}void CObjectIStreamAsn::SkipUNumber(void){ size_t i; char c = SkipWhiteSpace(); switch ( c ) { case '+': c = m_Input.PeekChar(1); // next char i = 2; break; default: // next char i = 1; break; } if ( c < '0' || c > '9' ) { ThrowError(fFormatError, "bad unsigned integer in line " + NStr::UIntToString(m_Input.GetLine())); } while ( (c = m_Input.PeekCharNoEOF(i)) >= '0' && c <= '9' ) { ++i; } m_Input.SkipChars(i);}void CObjectIStreamAsn::SkipFNumber(void){ Expect('{', true); SkipSNumber(); Expect(',', true); unsigned base = ReadUint4(); Expect(',', true); SkipSNumber(); Expect('}', true); if ( base != 2 && base != 10 ) ThrowError(fFormatError, "illegal REAL base (must be 2 or 10)");}void CObjectIStreamAsn::SkipString(EStringType type){ Expect('\"', true); size_t startLine = m_Input.GetLine(); size_t i = 0; try { for (;;) { char c = m_Input.PeekChar(i); switch ( c ) { case '\r': case '\n': // flush string m_Input.SkipChars(i + 1); i = 0; // skip end of line SkipEndOfLine(c); break; case '\"': if ( m_Input.PeekChar(i + 1) == '\"' ) { // double quote -> one quote m_Input.SkipChars(i + 2); i = 0; } else { // end of string m_Input.SkipChars(i + 1); return; } break; default: if (type == eStringTypeVisible) { FixVisibleChar(c, m_FixMethod, startLine); } // ok: skip char if ( ++i == 128 ) { // too long string -> flush it m_Input.SkipChars(i); i = 0; } break; } } } catch ( CEofException& ) { UnendedString(startLine);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -