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

📄 objostrxml.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
void CObjectOStreamXml::SetRealValueFormat(    CObjectOStreamXml::ERealValueFormat fmt){    m_RealFmt = fmt;}void CObjectOStreamXml::SetEnforcedStdXml(bool set){    m_EnforcedStdXml = set;    if (m_EnforcedStdXml) {        m_StdXml = false;    }}string CObjectOStreamXml::GetPosition(void) const{    return "line "+NStr::UIntToString(m_Output.GetLine());}static string GetPublicModuleName(TTypeInfo type){    const string& s = type->GetModuleName();    string name;    for ( string::const_iterator i = s.begin(); i != s.end(); ++i ) {        char c = *i;        if ( !isalnum(c) )            name += ' ';        else            name += c;    }    return name;}string CObjectOStreamXml::GetModuleName(TTypeInfo type){    string name;    if( !m_DTDFileName.empty() ) {        name = m_DTDFileName;    }    else {        const string& s = type->GetModuleName();        for ( string::const_iterator i = s.begin(); i != s.end(); ++i ) {            char c = *i;            if ( c == '-' )                name += '_';            else                name += c;        }    }    return name;}void CObjectOStreamXml::WriteFileHeader(TTypeInfo type){    m_Output.PutString("<?xml version=\"1.0");    switch (m_Encoding) {    default:        break;    case eEncoding_UTF8:        m_Output.PutString("\" encoding=\"UTF-8");        break;    case eEncoding_ISO8859_1:        m_Output.PutString("\" encoding=\"ISO-8859-1");           break;    case eEncoding_Windows_1252:        m_Output.PutString("\" encoding=\"Windows-1252");           break;    }    m_Output.PutString("\"?>");    m_Output.PutEol();    if (!m_UseSchemaRef && m_UseDTDRef) {        m_Output.PutString("<!DOCTYPE ");        m_Output.PutString(type->GetName());            if (m_UsePublicId) {            m_Output.PutString(" PUBLIC \"");            if (m_PublicId.empty()) {                m_Output.PutString("-//NCBI//");                m_Output.PutString(GetPublicModuleName(type));                m_Output.PutString("/EN");            } else {                m_Output.PutString(m_PublicId);            }            m_Output.PutString("\"");        } else {            m_Output.PutString(" SYSTEM");        }        m_Output.PutString(" \"");        m_Output.PutString(GetDTDFilePrefix() + GetModuleName(type));        m_Output.PutString(".dtd\">");        m_Output.PutEol();    }    m_LastTagAction = eTagClose;}void CObjectOStreamXml::x_WriteClassNamespace(TTypeInfo type){    OpenTagEndBack();    if (m_UseSchemaLoc) {        m_Output.PutEol();        m_Output.PutString("   ");    }    m_Output.PutString(" xmlns");    if (!m_CurrNsPrefix.empty()) {       m_Output.PutChar(':');       m_Output.PutString(m_CurrNsPrefix);    }    m_Output.PutString("=\"");    string ns_name( m_NsPrefixToName[m_CurrNsPrefix]);    if (ns_name.empty()) {        ns_name = GetDefaultSchemaNamespace();    }    m_Output.PutString(ns_name + "\"");    if (m_UseSchemaLoc) {        m_Output.PutEol();        string xs_name("http://www.w3.org/2001/XMLSchema-instance");        string xs_prefix("xs");        if (m_NsNameToPrefix.find(xs_name) == m_NsNameToPrefix.end()) {            for (char a='a';                m_NsPrefixToName.find(xs_prefix) != m_NsPrefixToName.end(); ++a) {                xs_prefix += a;            }            m_NsPrefixToName[xs_prefix] = xs_name;            m_NsNameToPrefix[xs_name] = xs_prefix;            m_Output.PutString("    xmlns:");            m_Output.PutString(xs_prefix + "=\"");            m_Output.PutString(xs_name + "\"");            m_Output.PutEol();            m_Output.PutString("    ");            m_Output.PutString(xs_prefix);            m_Output.PutString(":schemaLocation=\"");            m_Output.PutString(ns_name + " ");            m_Output.PutString(GetDTDFilePrefix() + GetModuleName(type));            m_Output.PutString(".xsd\"");            m_Output.PutEol();        }    }    OpenTagEnd();}bool CObjectOStreamXml::x_ProcessTypeNamespace(TTypeInfo type){    if (m_UseSchemaRef) {        string nsName;        if (type->HasNamespaceName()) {            nsName = type->GetNamespaceName();        } else if (m_NsPrefixes.empty()) {            nsName = GetDefaultSchemaNamespace();        }        return x_BeginNamespace(nsName,type->GetNamespacePrefix());    }    return false;}void CObjectOStreamXml::x_EndTypeNamespace(void){    if (m_UseSchemaRef) {        if (TopFrame().HasTypeInfo()) {            TTypeInfo type = TopFrame().GetTypeInfo();            if (type->HasNamespaceName()) {                x_EndNamespace(type->GetNamespaceName());            }        }    }}bool CObjectOStreamXml::x_BeginNamespace(const string& ns_name,                                         const string& ns_prefix){    if (!m_UseSchemaRef || ns_name.empty()) {        return false;    }    string nsPrefix(ns_prefix);    if (m_NsNameToPrefix.find(ns_name) == m_NsNameToPrefix.end()) {        for (char a='a';            m_NsPrefixToName.find(nsPrefix) != m_NsPrefixToName.end(); ++a) {            nsPrefix += a;        }        m_CurrNsPrefix = nsPrefix;        m_NsNameToPrefix[ns_name] = nsPrefix;        m_NsPrefixToName[nsPrefix] = ns_name;        m_NsPrefixes.push(nsPrefix);        return true;    } else {        m_CurrNsPrefix = m_NsNameToPrefix[ns_name];        m_NsPrefixes.push(m_CurrNsPrefix);    }    return false;}void CObjectOStreamXml::x_EndNamespace(const string& ns_name){    if (!m_UseSchemaRef || ns_name.empty()) {        return;    }    string nsPrefix = m_NsNameToPrefix[ns_name];// not sure about it - should we erase them or not?//    m_NsNameToPrefix.erase(ns_name);//    m_NsPrefixToName.erase(nsPrefix);    m_NsPrefixes.pop();    m_CurrNsPrefix = m_NsPrefixes.empty() ? kEmptyStr : m_NsPrefixes.top();    if (!m_Attlist && GetStackDepth() <= 2) {        m_NsNameToPrefix.clear();        m_NsPrefixToName.clear();    }}void CObjectOStreamXml::WriteEnum(const CEnumeratedTypeValues& values,                                  TEnumValueType value,                                  const string& valueName){    if ( !values.GetName().empty() ) {        // global enum        OpenTagStart();        m_Output.PutString(values.GetName());        if ( !valueName.empty() ) {            m_Output.PutString(" value=\"");            m_Output.PutString(valueName);            m_Output.PutChar('\"');        }        if ( values.IsInteger() ) {            OpenTagEnd();            m_Output.PutInt4(value);            CloseTagStart();            m_Output.PutString(values.GetName());            CloseTagEnd();        }        else {            _ASSERT(!valueName.empty());            SelfCloseTagEnd();            m_LastTagAction = eTagClose;        }    }    else {        // local enum (member, variant or element)        if ( valueName.empty() ) {            _ASSERT(values.IsInteger());            m_Output.PutInt4(value);        }        else {            if (m_LastTagAction == eAttlistTag) {                m_Output.PutString(valueName);            } else {                OpenTagEndBack();                m_Output.PutString(" value=\"");                m_Output.PutString(valueName);                m_Output.PutChar('"');                if ( values.IsInteger() ) {                    OpenTagEnd();                    m_Output.PutInt4(value);                }                else {                    SelfCloseTagEnd();                }            }        }    }}void CObjectOStreamXml::WriteEnum(const CEnumeratedTypeValues& values,                                  TEnumValueType value){    WriteEnum(values, value, values.FindName(value, values.IsInteger()));}void CObjectOStreamXml::CopyEnum(const CEnumeratedTypeValues& values,                                 CObjectIStream& in){    TEnumValueType value = in.ReadEnum(values);    WriteEnum(values, value, values.FindName(value, values.IsInteger()));}void CObjectOStreamXml::WriteEscapedChar(char c){//  http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char    switch ( c ) {    case '&':        m_Output.PutString("&amp;");        break;    case '<':        m_Output.PutString("&lt;");        break;    case '>':        m_Output.PutString("&gt;");        break;    case '\'':        m_Output.PutString("&apos;");        break;    case '"':        m_Output.PutString("&quot;");        break;    default:        if ((unsigned int)c < 0x20) {            m_Output.PutString("&#x");            Uint1 ch = c;            unsigned hi = ch >> 4;            unsigned lo = ch & 0xF;            if ( hi ) {                m_Output.PutChar("0123456789abcdef"[hi]);            }            m_Output.PutChar("0123456789abcdef"[lo]);            m_Output.PutChar(';');        } else if ((unsigned int)c >= 0x80) {            if ( m_Encoding == eEncoding_UTF8 ||                 m_Encoding == eEncoding_Unknown ) {                Uint1 ch = c;                m_Output.PutChar((ch >> 6) | 0xC0);                m_Output.PutChar((ch & 0x3F) | 0x80);            } else {                m_Output.PutChar(c);            }        } else {            m_Output.PutChar(c);        }        break;    }}void CObjectOStreamXml::WriteBool(bool data){    OpenTagEndBack();    if ( data )        m_Output.PutString(" value=\"true\"");    else        m_Output.PutString(" value=\"false\"");    SelfCloseTagEnd();}void CObjectOStreamXml::WriteChar(char data){    WriteEscapedChar(data);}void CObjectOStreamXml::WriteInt4(Int4 data){    m_Output.PutInt4(data);}void CObjectOStreamXml::WriteUint4(Uint4 data){    m_Output.PutUint4(data);}void CObjectOStreamXml::WriteInt8(Int8 data){    m_Output.PutInt8(data);}void CObjectOStreamXml::WriteUint8(Uint8 data){    m_Output.PutUint8(data);}void CObjectOStreamXml::WriteDouble2(double data, size_t digits){    if (isnan(data)) {        ThrowError(fInvalidData, "invalid double: not a number");    }    if (!finite(data)) {        ThrowError(fInvalidData, "invalid double: infinite");    }    char buffer[512];    SIZE_TYPE width;    if (m_RealFmt == eRealFixedFormat) {        int shift = int(ceil(log10(fabs(data))));        int precision = int(digits - shift);        if ( precision < 0 )            precision = 0;        if ( precision > 64 ) // limit precision of data            precision = 64;        width = NStr::DoubleToString(data, (unsigned int)precision,                                    buffer, sizeof(buffer));        if (precision != 0) {            while (buffer[width-1] == '0') {                --width;            }            if (buffer[width-1] == '.') {                --width;            }        }    } else {        width = sprintf(buffer, "%.*g", digits, data);    }    m_Output.PutString(buffer, width);}void CObjectOStreamXml::WriteDouble(double data){    WriteDouble2(data, DBL_DIG);}void CObjectOStreamXml::WriteFloat(float data){    WriteDouble2(data, FLT_DIG);}

⌨️ 快捷键说明

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