]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: parser: Handle else statements
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 31 May 2019 05:08:32 +0000 (06:08 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 31 May 2019 05:08:32 +0000 (06:08 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/parser/grammar.y
src/libpakfire/parser/scanner.l

index 66ae57c6adbfce56cfa6525cfd6991f65c564daa..8121f4e39190e7de161e6e217eca528a4df802fd 100644 (file)
@@ -63,16 +63,17 @@ static PakfireParser new_parser(PakfireParser parent);
 static PakfireParser merge_parsers(PakfireParser p1, PakfireParser p2);
 
 static PakfireParser make_if_stmt(PakfireParser parser, const enum operator op,
-       const char* val1, const char* val2, PakfireParser block);
+       const char* val1, const char* val2, PakfireParser if_block, PakfireParser else_block);
 
 %}
 
 %token                                                 T_APPEND
 %token                                                 T_ASSIGN
-%token <string>                                        T_DEFINE
-%token <string>                                        T_END
-%token <string>                                        T_EQUALS
-%token <string>                                        T_IF
+%token                                                 T_DEFINE
+%token                                                 T_END
+%token                                                         T_EQUALS
+%token                                                 T_IF
+%token                                                 T_ELSE
 %token                                                 T_EOL
 %token <string>                                        T_WORD
 
@@ -172,10 +173,18 @@ text                                              : text line
 
 end                                                    : T_END T_EOL;
 
-if_stmt                                                : T_IF T_WORD T_EQUALS T_WORD T_EOL block_assignments end
+else                                           : T_ELSE T_EOL;
+
+if_stmt                                                : T_IF T_WORD T_EQUALS T_WORD T_EOL block_assignments else block_assignments end
+                                                       {
+                                                               $$ = make_if_stmt(parser, OP_EQUALS, $2, $4, $6, $8);
+                                                               //pakfire_parser_unref($6);
+                                                               //pakfire_parser_unref($8);
+                                                       }
+                                                       | T_IF T_WORD T_EQUALS T_WORD T_EOL block_assignments end
                                                        {
-                                                               $$ = make_if_stmt(parser, OP_EQUALS, $2, $4, $6);
-                                                               pakfire_parser_unref($6);
+                                                               $$ = make_if_stmt(parser, OP_EQUALS, $2, $4, $6, NULL);
+                                                               //pakfire_parser_unref($6);
                                                        };
 
 block_opening                          : variable T_EOL
@@ -355,7 +364,7 @@ static PakfireParser merge_parsers(PakfireParser p1, PakfireParser p2) {
 }
 
 static PakfireParser make_if_stmt(PakfireParser parser, const enum operator op,
-               const char* val1, const char* val2, PakfireParser block) {
+               const char* val1, const char* val2, PakfireParser if_block, PakfireParser else_block) {
        Pakfire pakfire = pakfire_parser_get_pakfire(parser);
 
        switch (op) {
@@ -364,20 +373,22 @@ static PakfireParser make_if_stmt(PakfireParser parser, const enum operator op,
                        break;
        }
 
-       const char* namespace = current_block;
+       const char* namespace = (current_block) ? current_block : "";
 
        // Expand values
        char* v1 = pakfire_parser_expand(parser, namespace, val1);
        char* v2 = pakfire_parser_expand(parser, namespace, val2);
 
-       PakfireParser result = NULL;
+       PakfireParser result;
 
        switch (op) {
                case OP_EQUALS:
                        DEBUG(pakfire, "  '%s' == '%s'?\n", v1, v2);
 
                        if (strcmp(v1, v2) == 0)
-                               result = block;
+                               result = if_block;
+                       else
+                               result = else_block;
 
                        break;
        }
@@ -388,6 +399,8 @@ static PakfireParser make_if_stmt(PakfireParser parser, const enum operator op,
 
        if (result)
                result = pakfire_parser_ref(result);
+       else
+               result = new_parser(parser);
 
        return result;
 }
index d9c384c2961393ca9a8a6b95a77e8fe9699ff4a8..a83222fb02a7ab0a281db695963fa48cfca5a889 100644 (file)
@@ -134,6 +134,8 @@ template            {whitespace}template.*$
 <INITIAL>"+="  { return T_APPEND; }
 
 <INITIAL>"if"  { return T_IF; }
+<INITIAL>"else"        { return T_ELSE; }
+
 <INITIAL>"define" {
                                        BEGIN(DEFINE);
                                        return T_DEFINE;