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