parser.y: Fix segfaults due to wrong allocation size.
authorFlorian Forster <sifnfors@faui02k.informatik.uni-erlangen.de>
Wed, 7 Feb 2007 11:33:17 +0000 (12:33 +0100)
committerFlorian Forster <sifnfors@faui02k.informatik.uni-erlangen.de>
Wed, 7 Feb 2007 11:33:17 +0000 (12:33 +0100)
src/parser.y

index 911363c..a4ebce0 100644 (file)
@@ -3,15 +3,6 @@
 #include <string.h>
 #include "oconfig.h"
 
 #include <string.h>
 #include "oconfig.h"
 
-static oconfig_item_t *ci_root;
-static oconfig_item_t *ci_current;
-
-static oconfig_item_t  *statement_list;
-static int              statement_list_num;
-
-static oconfig_value_t *argument_list;
-static int              argument_list_num;
-
 struct statement_list_s
 {
        oconfig_item_t *statement;
 struct statement_list_s
 {
        oconfig_item_t *statement;
@@ -36,7 +27,6 @@ static void dump_ci (oconfig_item_t *ci, int shift);
        int     boolean;
        char   *string;
        oconfig_value_t  cv;
        int     boolean;
        char   *string;
        oconfig_value_t  cv;
-       oconfig_value_t *cvp;
        oconfig_item_t   ci;
        argument_list_t  al;
        statement_list_t sl;
        oconfig_item_t   ci;
        argument_list_t  al;
        statement_list_t sl;
@@ -49,11 +39,14 @@ static void dump_ci (oconfig_item_t *ci, int shift);
 
 %type <string> string
 %type <string> identifier
 
 %type <string> string
 %type <string> identifier
-%type <string> block_end
+/* arguments */
 %type <cv> argument
 %type <al> argument_list
 %type <cv> argument
 %type <al> argument_list
+/* blocks */
 %type <ci> block_begin
 %type <ci> block
 %type <ci> block_begin
 %type <ci> block
+%type <string> block_end
+/* statements */
 %type <ci> option
 %type <ci> statement
 %type <sl> statement_list
 %type <ci> option
 %type <ci> statement
 %type <sl> statement_list
@@ -76,12 +69,12 @@ argument_list:
        {
         $$ = $1;
         $$.argument_num++;
        {
         $$ = $1;
         $$.argument_num++;
-        $$.argument = realloc ($$.argument, $$.argument_num * sizeof (argument_list_t));
+        $$.argument = realloc ($$.argument, $$.argument_num * sizeof (oconfig_value_t));
         $$.argument[$$.argument_num-1] = $2;
        }
        | argument
        {
         $$.argument[$$.argument_num-1] = $2;
        }
        | argument
        {
-        $$.argument = malloc (sizeof (argument_list_t));
+        $$.argument = malloc (sizeof (oconfig_value_t));
         $$.argument[0] = $1;
         $$.argument_num = 1;
        }
         $$.argument[0] = $1;
         $$.argument_num = 1;
        }
@@ -98,7 +91,6 @@ option:
         $$.key = $1;
         $$.values = $2.argument;
         $$.values_num = $2.argument_num;
         $$.key = $1;
         $$.values = $2.argument;
         $$.values_num = $2.argument_num;
-        printf ("Option `%s' has %i arguments\n", $$.key, $$.values_num);
        }
        ;
 
        }
        ;
 
@@ -109,12 +101,14 @@ block_begin:
         $$.key = $2;
         $$.values = $3.argument;
         $$.values_num = $3.argument_num;
         $$.key = $2;
         $$.values = $3.argument;
         $$.values_num = $3.argument_num;
-        printf ("Begin block `%s'\n", $2);
        }
        ;
 
 block_end:
        }
        ;
 
 block_end:
-       OPENBRAC SLASH identifier CLOSEBRAC EOL {$$ = $3; printf ("End block `%s'\n", $3);}
+       OPENBRAC SLASH identifier CLOSEBRAC EOL
+       {
+        $$ = $3;
+       }
        ;
 
 block:
        ;
 
 block:
@@ -124,6 +118,7 @@ block:
                yyerror ("Block %s not closed..\n", $1);
         $$ = $1;
         $$.children = $2.statement;
                yyerror ("Block %s not closed..\n", $1);
         $$ = $1;
         $$.children = $2.statement;
+        $$.children_num = $2.statement_num;
        }
        ;
 
        }
        ;
 
@@ -138,13 +133,12 @@ statement_list:
        {
         $$ = $1;
         $$.statement_num++;
        {
         $$ = $1;
         $$.statement_num++;
-        $$.statement = realloc ($$.statement, $$.statement_num * sizeof (statement_list_t));
+        $$.statement = realloc ($$.statement, $$.statement_num * sizeof (oconfig_item_t));
         $$.statement[$$.statement_num-1] = $2;
         $$.statement[$$.statement_num-1] = $2;
-        printf ("statement_list: length = %i\n", $$.statement_num);
        }
        | statement
        {
        }
        | statement
        {
-        $$.statement = malloc (sizeof (statement_list_t));
+        $$.statement = malloc (sizeof (oconfig_item_t));
         $$.statement[0] = $1;
         $$.statement_num = 1;
        }
         $$.statement[0] = $1;
         $$.statement_num = 1;
        }
@@ -185,7 +179,7 @@ static void dump_ci (oconfig_item_t *ci, int shift)
        int i;
 
        if (shift > 0)
        int i;
 
        if (shift > 0)
-               printf ("%*s", "", shift);
+               printf ("%*s", shift, "");
 
        printf ("%s", ci->key);
        for (i = 0; i < ci->values_num; i++)
 
        printf ("%s", ci->key);
        for (i = 0; i < ci->values_num; i++)