Implemented quoted string options, comments and empty lines.
authorFlorian Forster <sifnfors@faui02h.informatik.uni-erlangen.de>
Wed, 7 Feb 2007 13:56:26 +0000 (14:56 +0100)
committerFlorian Forster <sifnfors@faui02h.informatik.uni-erlangen.de>
Wed, 7 Feb 2007 13:56:26 +0000 (14:56 +0100)
src/parser.lex
src/parser.y

index 3a7c466..1d23805 100644 (file)
@@ -23,30 +23,7 @@ COMMENT #.*
 {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);
-}
-*/
index a4ebce0..82e89a9 100644 (file)
@@ -17,6 +17,7 @@ struct argument_list_s
 };
 typedef struct argument_list_s argument_list_t;
 
+static char *unquote (const char *orig);
 static void dump_ci (oconfig_item_t *ci, int shift);
 %}
 
@@ -53,8 +54,8 @@ 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:
@@ -81,7 +82,7 @@ argument_list:
        ;
 
 identifier:
-       UNQUOTED_STRING                 {$$ = $1;}
+       UNQUOTED_STRING                 {$$ = strdup ($1);}
        ;
 
 option:
@@ -115,7 +116,11 @@ block:
        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;
@@ -125,22 +130,33 @@ block:
 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;
+        }
        }
        ;
 
@@ -174,6 +190,36 @@ int main (int argc, char **argv)
        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;