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

📄 objistrxml.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            return '<';        default:            return c;        }    }}void CObjectIStreamXml::EndTag(void){    char c = SkipWS();    if (m_Attlist) {        if (c == '=') {            m_Input.SkipChar();            c = SkipWS();            if (c == '\"') {                m_Input.SkipChar();                return;            }        }        if (c == '\"') {            m_Input.SkipChar();            m_TagState = eTagInsideOpening;            return;        }        if (c == '/' && m_Input.PeekChar(1) == '>' ) {            m_Input.SkipChars(2);            m_TagState = eTagInsideOpening;            Found_slash_gt();            return;        }    }    if ( c != '>' ) {        c = ReadUndefinedAttributes();        if ( c != '>' ) {            ThrowError(fFormatError, "'>' expected");        }    }    m_Input.SkipChar();    Found_gt();}bool CObjectIStreamXml::EndOpeningTagSelfClosed(void){    if (TopFrame().GetNotag()) {        return SelfClosedTag();    }    _ASSERT(InsideOpeningTag());    char c = SkipWS();    if (m_Attlist) {        return false;    }    if ( c == '/' && m_Input.PeekChar(1) == '>' ) {        // end of self closed tag        m_Input.SkipChars(2);        Found_slash_gt();        return true;    }    if ( c != '>' ) {        c = ReadUndefinedAttributes();        if ( c == '/' && m_Input.PeekChar(1) == '>' ) {            // end of self closed tag            m_Input.SkipChars(2);            Found_slash_gt();            return true;        }        if ( c != '>' )            ThrowError(fFormatError, "end of tag expected");    }    // end of open tag    m_Input.SkipChar(); // '>'    Found_gt();    return false;}char CObjectIStreamXml::BeginOpeningTag(void){    BeginData();    // find beginning '<'    char c = SkipWSAndComments();    if ( c != '<' )        ThrowError(fFormatError, "'<' expected");    c = m_Input.PeekChar(1);    if ( c == '/' )        ThrowError(fFormatError, "unexpected '</'");    m_Input.SkipChar();    Found_lt();    return c;}char CObjectIStreamXml::BeginClosingTag(void){    BeginData();    // find beginning '<'    char c = SkipWSAndComments();    if ( c != '<' || m_Input.PeekChar(1) != '/' )        ThrowError(fFormatError, "'</' expected");    m_Input.SkipChars(2);    Found_lt_slash();    return m_Input.PeekChar();}CLightString CObjectIStreamXml::ReadName(char c){    _ASSERT(InsideTag());    if ( !IsFirstNameChar(c) )        ThrowError(fFormatError,            "Name begins with an invalid character: #"            +NStr::UIntToString(c));    // find end of tag name    size_t i = 1, iColon = 0;    while ( IsNameChar(c = m_Input.PeekChar(i)) ) {        if (c == ':') {            iColon = i+1;        }        ++i;    }    // save beginning of tag name    const char* ptr = m_Input.GetCurrentPos();    // check end of tag name    m_Input.SkipChars(i);    if (c == '\n' || c == '\r') {        m_Input.SkipChar();        m_Input.SkipEndOfLine(c);    }    m_LastTag = CLightString(ptr+iColon, i-iColon);    if (iColon > 1) {        string ns_prefix( CLightString(ptr, iColon-1));        if (ns_prefix == "xmlns") {            string value;            ReadAttributeValue(value, true);            if (m_LastTag == m_CurrNsPrefix) {                if (FetchFrameFromTop(1).HasTypeInfo()) {                    TTypeInfo type = FetchFrameFromTop(1).GetTypeInfo();                    type->SetNamespacePrefix(m_CurrNsPrefix);                    type->SetNamespaceName(value);                }            }            m_NsPrefixToName[m_LastTag] = value;            m_NsNameToPrefix[value] = m_LastTag;            char ch = SkipWS();            return IsEndOfTagChar(ch) ? CLightString() : ReadName(ch);        } else if (ns_prefix == "xml") {            iColon = 0;        } else {            if (m_Attlist) {                if (m_CurrNsPrefix != ns_prefix) {                    string value;                    ReadAttributeValue(value, true);                    char ch = SkipWS();                    return IsEndOfTagChar(ch) ? CLightString() : ReadName(ch);                }            } else {                m_CurrNsPrefix = ns_prefix;            }        }    } else {        m_CurrNsPrefix.erase();    }#if defined(NCBI_SERIAL_IO_TRACE)    cout << ", Read= " << m_LastTag;#endif    return CLightString(ptr+iColon, i-iColon);}CLightString CObjectIStreamXml::RejectedName(void){    _ASSERT(!m_RejectedTag.empty());    m_LastTag = m_RejectedTag;    m_RejectedTag.erase();    m_TagState = eTagInsideOpening;#if defined(NCBI_SERIAL_IO_TRACE)    cout << ", Redo= " << m_LastTag;#endif    return m_LastTag;}void CObjectIStreamXml::SkipAttributeValue(char c){    _ASSERT(InsideOpeningTag());    m_Input.SkipChar();    m_Input.FindChar(c);    m_Input.SkipChar();}void CObjectIStreamXml::SkipQDecl(void){    _ASSERT(InsideOpeningTag());    m_Input.SkipChar();    CLightString tagName;    tagName = ReadName( SkipWS());//    _ASSERT(tagName == "xml");    for (;;) {        char ch = SkipWS();        if (ch == '?') {            break;        }        tagName = ReadName(ch);        string value;        ReadAttributeValue(value);        if (tagName == "encoding") {            if (value == "UTF-8") {                m_Encoding = eEncoding_UTF8;            } else if (value == "ISO-8859-1") {                m_Encoding = eEncoding_ISO8859_1;            } else if (value == "Windows-1252") {                m_Encoding = eEncoding_Windows_1252;            } else {                ThrowError(fFormatError, "unknown encoding: " + value);            }            break;        }    }    for ( ;; ) {        m_Input.FindChar('?');        if ( m_Input.PeekChar(1) == '>' ) {            // ?>            m_Input.SkipChars(2);            Found_gt();            return;        }        else            m_Input.SkipChar();    }}string CObjectIStreamXml::ReadFileHeader(void){    for ( ;; ) {        switch ( BeginOpeningTag() ) {        case '?':            SkipQDecl();            break;        case '!':            {                m_Input.SkipChar();                CLightString tagName = ReadName(m_Input.PeekChar());                if ( tagName == "DOCTYPE" ) {                    CLightString docType = ReadName(SkipWS());                    string typeName = docType;                    // skip the rest of !DOCTYPE                    for ( ;; ) {                        char c = SkipWS();                        if ( c == '>' ) {                            m_Input.SkipChar();                            Found_gt();                            return typeName;                        }                        else if ( c == '"' || c == '\'' ) {                            SkipAttributeValue(c);                        }                        else {                            ReadName(c);                        }                    }                }                else {                    // unknown tag                    ThrowError(fFormatError,                        "unknown tag in file header: "+string(tagName));                }            }        default:            {                string typeName = ReadName(m_Input.PeekChar());                UndoClassMember();                return typeName;            }/*            m_Input.UngetChar('<');            Back_lt();            ThrowError(fFormatError, "unknown DOCTYPE");*/        }    }    return NcbiEmptyString;}string CObjectIStreamXml::PeekNextTypeName(void){    if (!m_RejectedTag.empty()) {        return m_RejectedTag;    }    string typeName = ReadName(BeginOpeningTag());    UndoClassMember();    return typeName;}void CObjectIStreamXml::x_EndTypeNamespace(void){    if (x_IsStdXml()) {        if (TopFrame().HasTypeInfo()) {            TTypeInfo type = TopFrame().GetTypeInfo();            if (type->HasNamespaceName()) {                string nsName = type->GetNamespaceName();                string nsPrefix = m_NsNameToPrefix[nsName];// not sure about it - should we erase them or not?//                m_NsNameToPrefix.erase(nsName);//                m_NsPrefixToName.erase(nsPrefix);            }        }        if (GetStackDepth() <= 2) {            m_NsNameToPrefix.clear();            m_NsPrefixToName.clear();        }    }}int CObjectIStreamXml::ReadEscapedChar(char endingChar, bool* encoded){    char c = m_Input.PeekChar();    if (encoded) {        *encoded = false;    }    if ( c == '&' ) {        if (encoded) {            *encoded = true;        }        m_Input.SkipChar();        const size_t limit = 32;        size_t offset = m_Input.PeekFindChar(';', limit);        if ( offset >= limit )            ThrowError(fFormatError, "entity reference is too long");        const char* p = m_Input.GetCurrentPos(); // save entity string pointer        m_Input.SkipChars(offset + 1); // skip it        if ( offset == 0 )            ThrowError(fFormatError, "invalid entity reference");        if ( *p == '#' ) {            const char* end = p + offset;            ++p;            // char ref            if ( p == end )                ThrowError(fFormatError, "invalid char reference");            unsigned v = 0;            if ( *p == 'x' ) {                // hex                if ( ++p == end )                    ThrowError(fFormatError, "invalid char reference");                do {                    c = *p++;                    if ( c >= '0' && c <= '9' )                        v = v * 16 + (c - '0');                    else if ( c >= 'A' && c <='F' )                        v = v * 16 + (c - 'A' + 0xA);                    else if ( c >= 'a' && c <='f' )                        v = v * 16 + (c - 'a' + 0xA);                    else                        ThrowError(fFormatError,                            "invalid symbol in char reference");                } while ( p < end );            }            else {                // dec                if ( p == end )                    ThrowError(fFormatError, "invalid char reference");                do {                    c = *p++;                    if ( c >= '0' && c <= '9' )                        v = v * 10 + (c - '0');                    else                        ThrowError(fFormatError,                            "invalid symbol in char reference");                } while ( p < end );            }            return v & 0xFF;        }        else {            CLightString e(p, offset);            if ( e == "lt" )                return '<';            if ( e == "gt" )                return '>';            if ( e == "amp" )                return '&';            if ( e == "apos" )                return '\'';            if ( e == "quot" )                return '"';            ThrowError(fFormatError, "unknown entity name: " + string(e));        }    }    else if ( c == endingChar ) {        return -1;    }    if ((c & 0x80) != 0) {        if (m_Encoding == eEncoding_UTF8 || m_Encoding == eEncoding_Unknown) {            Uint1 ch = c;            Uint1 chRes = (ch & 0x1F);            m_Input.SkipChar();            ch = m_Input.PeekChar();            chRes = (chRes << 6) | (ch & 0x3F);            c = chRes;        }    }    m_Input.SkipChar();    return c & 0xFF;}CLightString CObjectIStreamXml::ReadAttributeName(void){    if ( OutsideTag() )        ThrowError(fFormatError, "attribute expected");    return ReadName(SkipWS());}void CObjectIStreamXml::ReadAttributeValue(string& value, bool skipClosing){    if ( SkipWS() != '=' )        ThrowError(fFormatError, "'=' expected");    m_Input.SkipChar(); // '='    char startChar = SkipWS();    if ( startChar != '\'' && startChar != '\"' )        ThrowError(fFormatError, "attribute value must start with ' or \"");    m_Input.SkipChar();    for ( ;; ) {        int c = ReadEscapedChar(startChar);        if ( c < 0 )            break;        value += char(c);    }    if (!m_Attlist || skipClosing) {        m_Input.SkipChar();    }}char CObjectIStreamXml::ReadUndefinedAttributes(void){    char c;    m_Attlist = true;    for (;;) {        c = SkipWS();        if (IsEndOfTagChar(c)) {            m_Attlist = false;            break;        }        CLightString tagName = ReadName(c);        if (tagName.GetLength()) {            string value;            ReadAttributeValue(value, true);        }    }    return c;}bool CObjectIStreamXml::ReadBool(void)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -