From 6a324b45c3ac617424affd80093150288b332509 Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Tue, 3 Jun 2008 22:34:36 -0500 Subject: [PATCH] Split more of Log_Entry out. --- Timeline/Log_Entry.C | 114 +++++++++++++++++++++++++++++++++++++++++ Timeline/Log_Entry.H | 3 ++ Timeline/Loggable.C | 117 +------------------------------------------ 3 files changed, 119 insertions(+), 115 deletions(-) diff --git a/Timeline/Log_Entry.C b/Timeline/Log_Entry.C index 2c2d48e..412f92f 100644 --- a/Timeline/Log_Entry.C +++ b/Timeline/Log_Entry.C @@ -36,6 +36,15 @@ Log_Entry::Log_Entry ( char **sa ) } +Log_Entry::Log_Entry ( const char *s ) +{ + _i = 0; + _sa = s ? parse_alist( s ) : NULL; + + if ( _sa ) + while ( _sa[ _i ] ) ++_i; +} + Log_Entry::~Log_Entry ( ) { if ( ! _sa ) @@ -49,6 +58,111 @@ Log_Entry::~Log_Entry ( ) free( _sa ); } + +/** remove escapes from string /s/ in-place */ +static void +unescape ( char *s ) +{ + char *r = s; + for ( ; *s; s++, r++ ) + { + if ( '\\' == *s ) + { + switch ( *(++s) ) + { + case 'n': + *r = '\n'; + break; + case '"': + *r = '"'; + break; + default: + break; + } + } + else + *r = *s; + } + + *r = '\0'; +} + +/** sigh. parse a string of ":name value :name value" pairs into an + * array of strings, one per pair */ +// FIXME: doesn't handle the case of :name ":foo bar", nested quotes +// or other things it should. +char ** +Log_Entry::parse_alist( const char *s ) +{ + +// FIXME: bogus over allocation... + + int tl = strlen( s ); + char **r = (char**)malloc( sizeof( char* ) * tl ); + +// const char *e = s + tl; + + const char *c = NULL; + int i = 0; + for ( ; ; s++ ) + { + +/* if ( *s == '\n' ) */ +/* break; */ + +// if ( *s == ':' || s == e ) + if ( *s == ':' || *s == '\0' ) + { + if ( c ) + { + int l = s - c; + + char *pair = (char*)malloc( l + 1 ); + + /* remove trailing space */ + if ( c[ l - 1 ] == ' ' ) + --l; + + strncpy( pair, c, l ); + + pair[ l ] = '\0'; + + r[ i++ ] = pair; + + /* split */ + + strtok( pair, " " ); + + /* remove quotes */ + char *v = pair + strlen( pair ) + 1; + + unescape( v ); + + if ( *v == '"' ) + { +// v++; + if ( v[ strlen( v ) - 1 ] != '"' ) + WARNING( "invalid quoting in log entry!" ); + else + { + v[ strlen( v ) - 1 ] = '\0'; + memmove( v, v + 1, strlen( v ) + 1 ); + } + } + } + + c = s; + + if ( *s == '\0' ) + break; + } + } + + r[ i ] = NULL; + + return r; +} + void Log_Entry::grow ( ) { diff --git a/Timeline/Log_Entry.H b/Timeline/Log_Entry.H index e88865a..3d2bc32 100644 --- a/Timeline/Log_Entry.H +++ b/Timeline/Log_Entry.H @@ -32,10 +32,13 @@ class Log_Entry Log_Entry ( const Log_Entry &rhs ); Log_Entry & operator= ( const Log_Entry &rhs ); + static char ** parse_alist ( const char *s ); + public: Log_Entry ( ); Log_Entry ( char **sa ); + Log_Entry ( const char *s ); ~Log_Entry ( ); /****************/ diff --git a/Timeline/Loggable.C b/Timeline/Loggable.C index 6692c78..255f6ca 100644 --- a/Timeline/Loggable.C +++ b/Timeline/Loggable.C @@ -18,9 +18,7 @@ /*******************************************************************************/ -#define _LOGGABLE_C #include "Loggable.H" -#undef _LOGABLE_C #include #include @@ -160,110 +158,7 @@ Loggable::escape ( const char *s ) return r; } -/** remove escapes from string /s/ in-place */ -static void -unescape ( char *s ) -{ - char *r = s; - for ( ; *s; s++, r++ ) - { - if ( '\\' == *s ) - { - switch ( *(++s) ) - { - case 'n': - *r = '\n'; - break; - case '"': - *r = '"'; - break; - default: - break; - } - } - else - *r = *s; - } - - *r = '\0'; -} - -/** sigh. parse a string of ":name value :name value" pairs into an - * array of strings, one per pair */ -// FIXME: doesn't handle the case of :name ":foo bar", nested quotes -// or other things it should. -static -char ** -parse_alist( const char *s ) -{ - -// FIXME: bogus over allocation... - - int tl = strlen( s ); - char **r = (char**)malloc( sizeof( char* ) * tl ); - -// const char *e = s + tl; - - const char *c = NULL; - int i = 0; - for ( ; ; s++ ) - { - -/* if ( *s == '\n' ) */ -/* break; */ - -// if ( *s == ':' || s == e ) - if ( *s == ':' || *s == '\0' ) - { - if ( c ) - { - int l = s - c; - - char *pair = (char*)malloc( l + 1 ); - - /* remove trailing space */ - if ( c[ l - 1 ] == ' ' ) - --l; - strncpy( pair, c, l ); - - pair[ l ] = '\0'; - - r[ i++ ] = pair; - - /* split */ - - strtok( pair, " " ); - - /* remove quotes */ - char *v = pair + strlen( pair ) + 1; - - unescape( v ); - - if ( *v == '"' ) - { -// v++; - if ( v[ strlen( v ) - 1 ] != '"' ) - WARNING( "invalid quoting in log entry!" ); - else - { - v[ strlen( v ) - 1 ] = '\0'; - memmove( v, v + 1, strlen( v ) + 1 ); - } - } - } - - c = s; - - if ( *s == '\0' ) - break; - } - } - - r[ i ] = NULL; - - return r; -} static @@ -322,9 +217,7 @@ Loggable::do_this ( const char *s, bool reverse ) { // printf( "got set command (%s).\n", arguments ); - char **sa = parse_alist( arguments ); - - Log_Entry e( sa ); + Log_Entry e( arguments ); l->log_start(); l->set( e ); @@ -332,13 +225,7 @@ Loggable::do_this ( const char *s, bool reverse ) } else if ( ! strcmp( command, create ) ) { - char **sa = NULL; - - if ( arguments ) - sa = parse_alist( arguments ); - - Log_Entry e( sa ); - + Log_Entry e( arguments ); ASSERT( _class_map[ std::string( classname ) ], "Journal contains an object of class \"%s\", but I don't know how to create such objects.", classname );