openddl-parser: latest greatest.

Signed-off-by: Kim Kulling <kim.kulling@googlemail.com>
pull/547/head
Kim Kulling 2015-04-29 11:57:13 +02:00
parent eb1ee61420
commit ce939b5126
3 changed files with 76 additions and 53 deletions

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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