{BOOL_TRUE} {yylval.boolean = 1; return (TRUE);}
{BOOL_FALSE} {yylval.boolean = 0; return (FALSE);}
-{QUOTED_STRING} {yylval.string = strdup (yytext); return (QUOTED_STRING);}
-{UNQUOTED_STRING} {yylval.string = strdup (yytext); return (UNQUOTED_STRING);}
+{QUOTED_STRING} {yylval.string = yytext; return (QUOTED_STRING);}
+{UNQUOTED_STRING} {yylval.string = yytext; return (UNQUOTED_STRING);}
%%
-/*
-static char *unquote (const char *orig)
-{
- char *ret = strdup (orig);
- int len;
- int i;
-
- if (ret == NULL)
- return (NULL);
-
- len = strlen (ret);
- for (i = 0; i < len; i++)
- {
- if (ret[i] == '\\')
- {
- memmove (ret + i; ret + (i + 1); len - (i + 1));
- len--;
- }
- }
-
- return (ret);
-}
-*/
};
typedef struct argument_list_s argument_list_t;
+static char *unquote (const char *orig);
static void dump_ci (oconfig_item_t *ci, int shift);
%}
%%
string:
- QUOTED_STRING {$$ = $1;}
- | UNQUOTED_STRING {$$ = $1;}
+ QUOTED_STRING {$$ = unquote ($1);}
+ | UNQUOTED_STRING {$$ = strdup ($1);}
;
argument:
;
identifier:
- UNQUOTED_STRING {$$ = $1;}
+ UNQUOTED_STRING {$$ = strdup ($1);}
;
option:
block_begin statement_list block_end
{
if (strcmp ($1.key, $3) != 0)
- yyerror ("Block %s not closed..\n", $1);
+ {
+ printf ("block_begin = %s; block_end = %s;\n", $1.key, $3);
+ yyerror ("Block not closed..\n");
+ exit (1);
+ }
$$ = $1;
$$.children = $2.statement;
$$.children_num = $2.statement_num;
statement:
option {$$ = $1;}
| block {$$ = $1;}
- | EOL {/* ignore */}
+ | EOL {$$.values_num = 0;}
;
statement_list:
statement_list statement
{
$$ = $1;
- $$.statement_num++;
- $$.statement = realloc ($$.statement, $$.statement_num * sizeof (oconfig_item_t));
- $$.statement[$$.statement_num-1] = $2;
+ if ($2.values_num > 0)
+ {
+ $$.statement_num++;
+ $$.statement = realloc ($$.statement, $$.statement_num * sizeof (oconfig_item_t));
+ $$.statement[$$.statement_num-1] = $2;
+ }
}
| statement
{
- $$.statement = malloc (sizeof (oconfig_item_t));
- $$.statement[0] = $1;
- $$.statement_num = 1;
+ if ($1.values_num > 0)
+ {
+ $$.statement = malloc (sizeof (oconfig_item_t));
+ $$.statement[0] = $1;
+ $$.statement_num = 1;
+ }
+ else
+ {
+ $$.statement = NULL;
+ $$.statement_num = 0;
+ }
}
;
return (0);
}
+static char *unquote (const char *orig)
+{
+ char *ret = strdup (orig);
+ int len;
+ int i;
+
+ if (ret == NULL)
+ return (NULL);
+
+ len = strlen (ret);
+
+ if ((len < 2) || (ret[0] != '"') || (ret[len - 1] != '"'))
+ return (ret);
+
+ ret++;
+ len -= 2;
+ ret[len] = '\0';
+
+ for (i = 0; i < len; i++)
+ {
+ if (ret[i] == '\\')
+ {
+ memmove (ret + i, ret + (i + 1), len - i);
+ len--;
+ }
+ }
+
+ return (ret);
+} /* char *unquote */
+
static void dump_ci (oconfig_item_t *ci, int shift)
{
int i;