Element* CXML::ParseBinary( std::istream& stream, Element* parent ) { Element* pE = 0; int type = 0; stream.read( (char*)&type, sizeof(type) ); switch( type ) { case TYPE_ELEMENT: pE = new Element; break; case TYPE_CDATA_ELEMENT: pE = new DataElement; break; case TYPE_COMMENT: pE = new CommentElement; break; default: return 0; } pE->ParseBinary( stream ); parent->AddSubElement( pE ); int num = 0; //读子节点 stream.read((char*)&num,sizeof(num)); for( int i=0; i<num; i++ ) { ParseBinary(stream, pE); } return pE; }
const Number IntegerLiteralParser::Parse() { // Assert( NotAtEnd() && InClass(CharClass::NUMBER_HEAD) ) char c = GetChar(); IntegerBuilder integerBuilder; if (c == '0') { Advance(); if (AtEnd()) { return Number::ZERO(); } switch (GetChar()) { case 'b' : return ParseBinary(); case 'x' : return ParseHexadecimal(); } if (NotInClass(CharClass::DECIMAL)) { return Number::ZERO(); } // if (config_.parse_octal) { return ParseOctal(); } } else if (c == '-') { integerBuilder.SetNegative(); Advance(); if (AtEnd() || NotInClass(CharClass::DECIMAL)) { ThrowError("Decimal digit expected"); } } // Assert( NotAtEnd() && InClass(CharClass::DECIMAL) ) do { integerBuilder.OnDecimalDigit(GetChar() - '0'); Advance(); } while (NotAtEnd() && InClass(CharClass::DECIMAL)); return integerBuilder.Release(); }
void CXML::ParseBinary( std::istream& stream ) { this->Clear( ); stream.seekg(0); std::streamsize len = 0; std::string value; stream.read((char*)&len,sizeof(std::streamsize)); value.resize(len); stream.read(&value[0],len); m_head.attrib.push_back( Attribute("encoding",value) ); if(stream.good()) ParseBinary( stream, &m_root ); }
const Number FloatLiteralParser::Parse() { // Assert( NotAtEnd() && InClass(CharClass::NUMBER_HEAD) ) char c = GetChar(); NumberBuilder numberBuilder; if (c == '0') { Advance(); if (AtEnd()) { return Number::ZERO(); } switch (GetChar()) { case '.' : return ParseFractional(numberBuilder); case 'e' : case 'E' : return ParseExponent(numberBuilder); case 'b' : return config_.parse_binary ? ParseBinary() : Number::ZERO(); case 'x' : return config_.parse_hexadecimal ? ParseHexadecimal() : Number::ZERO(); } if (NotInClass(CharClass::DECIMAL)) { return Number::ZERO(); } if (config_.parse_octal) { return ParseOctal(); } } else if (c == '-') { numberBuilder.SetNegative(); Advance(); if (AtEnd() || NotInClass(CharClass::DECIMAL)) { ThrowError("Decimal digit expected"); } } // Assert( NotAtEnd() && InClass(CharClass::DECIMAL) ) do { numberBuilder.OnIntegerDigit(GetChar() - '0'); Advance(); if (AtEnd()) { return numberBuilder.Release(); } } while (InClass(CharClass::DECIMAL)); if (GetChar() == '.') { return ParseFractional(numberBuilder); } else if (GetChar() == 'e' || GetChar() == 'E') { return ParseExponent(numberBuilder); } return numberBuilder.Release(); }