| @@ -103,62 +103,82 @@ Log_Entry::parse_alist( const char *s ) | |||||
| int tl = strlen( s ); | int tl = strlen( s ); | ||||
| char **r = (char**)malloc( sizeof( char* ) * tl ); | char **r = (char**)malloc( sizeof( char* ) * tl ); | ||||
| // const char *e = s + tl; | |||||
| bool quote = false; | |||||
| bool value = false; | |||||
| const char *c = NULL; | const char *c = NULL; | ||||
| int i = 0; | int i = 0; | ||||
| for ( ; ; s++ ) | 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; | break; | ||||
| } | } | ||||
| if ( *s == '\0' ) | |||||
| break; | |||||
| } | } | ||||
| r[ i ] = NULL; | r[ i ] = NULL; | ||||