diff --git a/Timeline/Log_Entry.C b/Timeline/Log_Entry.C index 4feb176..fe92aab 100644 --- a/Timeline/Log_Entry.C +++ b/Timeline/Log_Entry.C @@ -103,62 +103,82 @@ Log_Entry::parse_alist( const char *s ) int tl = strlen( s ); char **r = (char**)malloc( sizeof( char* ) * tl ); -// const char *e = s + tl; - + bool quote = false; + bool value = false; const char *c = NULL; int i = 0; for ( ; ; s++ ) { - -/* if ( *s == '\n' ) */ -/* break; */ - -// if ( *s == ':' || s == e ) - if ( *s == ':' || *s == '\0' ) + switch ( *s ) { - if ( c ) - { - int l = s - c; + case '\0': + case ' ': + if ( ! quote && c ) + { + if ( ! value ) + { + value = true; + break; + } - char *pair = (char*)malloc( l + 1 ); + int l = s - c; - /* remove trailing space */ - if ( c[ l - 1 ] == ' ' ) - --l; + char *pair = (char*)malloc( l + 1 ); - strncpy( pair, c, l ); + /* remove trailing space */ + if ( c[ l - 1 ] == ' ' ) + --l; - pair[ l ] = '\0'; + strncpy( pair, c, l ); - r[ i++ ] = pair; + pair[ l ] = '\0'; - /* split */ + r[ i++ ] = pair; - strtok( pair, " " ); + /* split */ - /* remove quotes */ - char *v = pair + strlen( pair ) + 1; + strtok( pair, " " ); - unescape( v ); + /* remove quotes */ + char *v = pair + strlen( pair ) + 1; - if ( *v == '"' ) - { -// v++; - if ( v[ strlen( v ) - 1 ] != '"' ) - WARNING( "invalid quoting in log entry!" ); - else + unescape( v ); + + if ( *v == '"' ) { - v[ strlen( v ) - 1 ] = '\0'; - memmove( v, v + 1, strlen( v ) + 1 ); +// 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; + printf( "%s\n", v ); - if ( *s == '\0' ) + c = NULL; + } + break; + case ':': /* this is a key */ + if ( ! quote && ! c ) + { + c = s; + value = false; + } + break; + case '"': + quote = !quote; + break; + case '\\': + s++; break; } + + if ( *s == '\0' ) + break; + } r[ i ] = NULL;