⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objistrasn.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
            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 + -