6 struct statement_list_s
8 oconfig_item_t *statement;
11 typedef struct statement_list_s statement_list_t;
13 struct argument_list_s
15 oconfig_value_t *argument;
18 typedef struct argument_list_s argument_list_t;
20 static char *unquote (const char *orig);
21 static void dump_ci (oconfig_item_t *ci, int shift);
36 %token <number> NUMBER
37 %token <boolean> TRUE FALSE
38 %token <string> QUOTED_STRING UNQUOTED_STRING
39 %token SLASH OPENBRAC CLOSEBRAC EOL
42 %type <string> identifier
45 %type <al> argument_list
47 %type <ci> block_begin
49 %type <string> block_end
53 %type <sl> statement_list
57 QUOTED_STRING {$$ = unquote ($1);}
58 | UNQUOTED_STRING {$$ = strdup ($1);}
62 NUMBER {$$.value.number = $1; $$.type = OCONFIG_TYPE_NUMBER;}
63 | TRUE {$$.value.boolean = 1; $$.type = OCONFIG_TYPE_BOOLEAN;}
64 | FALSE {$$.value.boolean = 0; $$.type = OCONFIG_TYPE_BOOLEAN;}
65 | string {$$.value.string = $1; $$.type = OCONFIG_TYPE_STRING;}
69 argument_list argument
73 $$.argument = realloc ($$.argument, $$.argument_num * sizeof (oconfig_value_t));
74 $$.argument[$$.argument_num-1] = $2;
78 $$.argument = malloc (sizeof (oconfig_value_t));
85 UNQUOTED_STRING {$$ = strdup ($1);}
89 identifier argument_list EOL
91 memset (&$$, '\0', sizeof ($$));
93 $$.values = $2.argument;
94 $$.values_num = $2.argument_num;
99 OPENBRAC identifier argument_list CLOSEBRAC EOL
101 memset (&$$, '\0', sizeof ($$));
103 $$.values = $3.argument;
104 $$.values_num = $3.argument_num;
109 OPENBRAC SLASH identifier CLOSEBRAC EOL
116 block_begin statement_list block_end
118 if (strcmp ($1.key, $3) != 0)
120 printf ("block_begin = %s; block_end = %s;\n", $1.key, $3);
121 yyerror ("Block not closed..\n");
125 $$.children = $2.statement;
126 $$.children_num = $2.statement_num;
133 | EOL {$$.values_num = 0;}
137 statement_list statement
140 if ($2.values_num > 0)
143 $$.statement = realloc ($$.statement, $$.statement_num * sizeof (oconfig_item_t));
144 $$.statement[$$.statement_num-1] = $2;
149 if ($1.values_num > 0)
151 $$.statement = malloc (sizeof (oconfig_item_t));
152 $$.statement[0] = $1;
153 $$.statement_num = 1;
158 $$.statement_num = 0;
167 for (i = 0; i < $1.statement_num; i++)
168 dump_ci ($1.statement + i, 0);
176 void yyerror (char *s)
178 fprintf (stderr, "%s\n", s);
183 return (getc (stdin));
187 int main (int argc, char **argv)
193 static char *unquote (const char *orig)
195 char *ret = strdup (orig);
204 if ((len < 2) || (ret[0] != '"') || (ret[len - 1] != '"'))
211 for (i = 0; i < len; i++)
215 memmove (ret + i, ret + (i + 1), len - i);
221 } /* char *unquote */
223 static void dump_ci (oconfig_item_t *ci, int shift)
228 printf ("%*s", shift, "");
230 printf ("%s", ci->key);
231 for (i = 0; i < ci->values_num; i++)
233 oconfig_value_t cv = ci->values[i];
235 if (cv.type == OCONFIG_TYPE_STRING)
236 printf (" `%s'", cv.value.string);
237 else if (cv.type == OCONFIG_TYPE_NUMBER)
238 printf (" %lf", cv.value.number);
239 else if (cv.type == OCONFIG_TYPE_BOOLEAN)
240 printf (" %s", cv.value.boolean ? "true" : "false");
242 printf ("<unknown type %i>", cv.type);
246 for (i = 0; i < ci->children_num; i++)
247 dump_ci (ci->children + i, shift + 1);