diff --git a/contrib/openddlparser/code/DDLNode.cpp b/contrib/openddlparser/code/DDLNode.cpp index e57119587..5d3fd03f9 100644 --- a/contrib/openddlparser/code/DDLNode.cpp +++ b/contrib/openddlparser/code/DDLNode.cpp @@ -153,7 +153,7 @@ Property *DDLNode::findPropertyByName( const std::string &name ) { } Property *current( m_properties ); while( ddl_nullptr != current ) { - int res = strncmp( current->m_id->m_buffer, name.c_str(), name.size() ); + int res = strncmp( current->m_key->m_text.m_buffer, name.c_str(), name.size() ); if( 0 == res ) { return current; } diff --git a/contrib/openddlparser/code/OpenDDLParser.cpp b/contrib/openddlparser/code/OpenDDLParser.cpp index 3587dcb6f..bc85ec4ab 100644 --- a/contrib/openddlparser/code/OpenDDLParser.cpp +++ b/contrib/openddlparser/code/OpenDDLParser.cpp @@ -87,7 +87,7 @@ static DDLNode *createDDLNode( Identifier *id, OpenDDLParser *parser ) { return ddl_nullptr; } - const std::string type( id->m_buffer ); + const std::string type( id->m_text.m_buffer ); DDLNode *parent( parser->top() ); DDLNode *node = DDLNode::create( type, "", parent ); @@ -191,8 +191,6 @@ bool OpenDDLParser::parse() { normalizeBuffer( m_buffer ); - std::cout << &m_buffer[0] << std::endl; - m_context = new Context; m_context->m_root = DDLNode::create( "root", "", ddl_nullptr ); pushNode( m_context->m_root ); @@ -217,7 +215,7 @@ char *OpenDDLParser::parseNextNode( char *in, char *end ) { static void dumpId( Identifier *id ) { if( ddl_nullptr != id ) { - std::cout << id->m_buffer << std::endl; + std::cout << id->m_text.m_buffer << std::endl; } } @@ -277,7 +275,7 @@ char *OpenDDLParser::parseHeader( char *in, char *end ) { Name *name( ddl_nullptr ); in = OpenDDLParser::parseName( in, end, &name ); if( ddl_nullptr != name ) { - const std::string nodeName( name->m_id->m_buffer ); + const std::string nodeName( name->m_id->m_text.m_buffer ); node->setName( nodeName ); } } @@ -500,10 +498,8 @@ char *OpenDDLParser::parseIdentifier( char *in, char *end, Identifier **id ) { idLen++; } - const size_t len( idLen + 1 ); - Identifier *newId = new Identifier( len, new char[ len ] ); - ::strncpy( newId->m_buffer, start, newId->m_len-1 ); - newId->m_buffer[ newId->m_len - 1 ] = '\0'; + const size_t len( idLen ); + Identifier *newId = new Identifier( start, len ); *id = newId; return in; @@ -714,7 +710,7 @@ char *OpenDDLParser::parseStringLiteral( char *in, char *end, Value **stringData static void createPropertyWithData( Identifier *id, Value *primData, Property **prop ) { if( ddl_nullptr != primData ) { ( *prop ) = new Property( id ); - ( *prop )->m_primData = primData; + ( *prop )->m_value = primData; } } diff --git a/contrib/openddlparser/include/openddlparser/OpenDDLCommon.h b/contrib/openddlparser/include/openddlparser/OpenDDLCommon.h index ab6d003b3..c84df7593 100644 --- a/contrib/openddlparser/include/openddlparser/OpenDDLCommon.h +++ b/contrib/openddlparser/include/openddlparser/OpenDDLCommon.h @@ -77,41 +77,83 @@ enum NameType { LocalName }; -struct Token { -public: - Token( const char *token ) - : m_token( token ) - , m_size( 0 ){ - if( ddl_nullptr != token ) { - m_size = strlen( m_token ); +struct Text { + size_t m_capacity; + size_t m_len; + char *m_buffer; + + Text( const char *buffer, size_t numChars ) + : m_capacity( 0 ) + , m_len( 0 ) + , m_buffer( ddl_nullptr ) { + set( buffer, numChars ); + } + + ~Text() { + clear(); + } + + void clear() { + delete[] m_buffer; + m_buffer = ddl_nullptr; + m_capacity = 0; + m_len = 0; + } + + void set( const char *buffer, size_t numChars ) { + clear(); + if( numChars > 0 ) { + m_len = numChars; + m_capacity = m_len + 1; + m_buffer = new char[ m_capacity ]; + strncpy( m_buffer, buffer, numChars ); + m_buffer[ numChars ] = '\0'; } } - - ~Token() { - // empty + + bool operator == ( const std::string &name ) const { + if( m_len != name.size() ) { + return false; + } + const int res( strncmp( m_buffer, name.c_str(), name.size() ) ); + return ( 0 == res ); + } - size_t length() const { - return m_size; - } - - bool operator == ( const Token &rhs ) const { - if( m_size != rhs.m_size ) { + bool operator == ( const Text &rhs ) const { + if( m_len != rhs.m_len ) { return false; } - const int res( strncmp( m_token, rhs.m_token, m_size ) ); - return ( res == 0 ); + const int res ( strncmp( m_buffer, rhs.m_buffer, m_len ) ); + return ( 0 == res ); } private: - Token(); - Token( const Token & ); - Token &operator = ( const Token & ); + Text( const Text & ); + Text &operator = ( const Text & ); +}; + +struct Identifier { + Text m_text; + + Identifier( char buffer[], size_t len ) + : m_text( buffer, len ) { + // empty + } + + Identifier( char buffer[] ) + : m_text( buffer, strlen( buffer ) ) { + // empty + } + + bool operator == ( const Identifier &rhs ) const { + return m_text == rhs.m_text; + } private: - const char *m_token; - size_t m_size; + Identifier( const Identifier & ); + Identifier &operator = ( const Identifier & ); }; struct Name { @@ -154,30 +196,15 @@ private: Reference &operator = ( const Reference & ); }; -struct Identifier { - size_t m_len; - char *m_buffer; - - Identifier( size_t len, char buffer[] ) - : m_len( len ) - , m_buffer( buffer ) { - // empty - } - -private: - Identifier( const Identifier & ); - Identifier &operator = ( const Identifier & ); -}; - struct Property { - Identifier *m_id; - Value *m_primData; + Identifier *m_key; + Value *m_value; Reference *m_ref; Property *m_next; Property( Identifier *id ) - : m_id( id ) - , m_primData( ddl_nullptr ) + : m_key( id ) + , m_value( ddl_nullptr ) , m_ref( ddl_nullptr ) , m_next( ddl_nullptr ) { // empty