X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fliboconfig%2Fparser.y;h=5b7aa94a9e4deec315c5175f8503a4900536e3c1;hb=5ad3a491af300d7336112607e20b0364d1f3f2bb;hp=ea6ed0a099a2a822bd119dc6c16ebadcad594c25;hpb=5afa2f82d43e2a7952d8f347f6f40b5778c59db8;p=collectd.git diff --git a/src/liboconfig/parser.y b/src/liboconfig/parser.y index ea6ed0a0..5b7aa94a 100644 --- a/src/liboconfig/parser.y +++ b/src/liboconfig/parser.y @@ -1,6 +1,6 @@ /** * oconfig - src/parser.y - * Copyright (C) 2007 Florian octo Forster + * Copyright (C) 2007,2008 Florian octo Forster * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -30,6 +30,7 @@ extern int yylineno; extern char *yytext; extern oconfig_item_t *ci_root; +extern char *c_file; %} %start entire_file @@ -45,7 +46,7 @@ extern oconfig_item_t *ci_root; } %token NUMBER -%token TRUE FALSE +%token BTRUE BFALSE %token QUOTED_STRING UNQUOTED_STRING %token SLASH OPENBRAC CLOSEBRAC EOL @@ -64,6 +65,9 @@ extern oconfig_item_t *ci_root; %type statement_list %type entire_file +/* pass an verbose, specific error message to yyerror() */ +%error-verbose + %% string: QUOTED_STRING {$$ = unquote ($1);} @@ -72,8 +76,8 @@ string: argument: NUMBER {$$.value.number = $1; $$.type = OCONFIG_TYPE_NUMBER;} - | TRUE {$$.value.boolean = 1; $$.type = OCONFIG_TYPE_BOOLEAN;} - | FALSE {$$.value.boolean = 0; $$.type = OCONFIG_TYPE_BOOLEAN;} + | BTRUE {$$.value.boolean = 1; $$.type = OCONFIG_TYPE_BOOLEAN;} + | BFALSE {$$.value.boolean = 0; $$.type = OCONFIG_TYPE_BOOLEAN;} | string {$$.value.string = $1; $$.type = OCONFIG_TYPE_STRING;} ; @@ -108,6 +112,12 @@ option: ; block_begin: + OPENBRAC identifier CLOSEBRAC EOL + { + memset (&$$, '\0', sizeof ($$)); + $$.key = $2; + } + | OPENBRAC identifier argument_list CLOSEBRAC EOL { memset (&$$, '\0', sizeof ($$)); @@ -150,7 +160,7 @@ statement_list: statement_list statement { $$ = $1; - if ($2.values_num > 0) + if (($2.values_num > 0) || ($2.children_num > 0)) { $$.statement_num++; $$.statement = realloc ($$.statement, $$.statement_num * sizeof (oconfig_item_t)); @@ -159,7 +169,7 @@ statement_list: } | statement { - if ($1.values_num > 0) + if (($1.values_num > 0) || ($1.children_num > 0)) { $$.statement = malloc (sizeof (oconfig_item_t)); $$.statement[0] = $1; @@ -186,7 +196,15 @@ entire_file: %% static int yyerror (const char *s) { - fprintf (stderr, "Error in line %i near `%s': %s\n", yylineno, yytext, s); + char *text; + + if (*yytext == '\n') + text = ""; + else + text = yytext; + + fprintf (stderr, "Parse error in file `%s', line %i near `%s': %s\n", + c_file, yylineno, text, s); return (-1); } /* int yyerror */ @@ -204,8 +222,8 @@ static char *unquote (const char *orig) if ((len < 2) || (ret[0] != '"') || (ret[len - 1] != '"')) return (ret); - ret++; len -= 2; + memmove (ret, ret + 1, len); ret[len] = '\0'; for (i = 0; i < len; i++)