]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
datatype: Enhance symbolic_constant_parse()
authorAlvaro Neira <alvaroneay@gmail.com>
Tue, 30 Sep 2014 15:21:39 +0000 (17:21 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 9 Oct 2014 11:22:55 +0000 (13:22 +0200)
With this patch, this function finds the symbol inside the table. If the symbol
doesn't exist we use the basetype to parse it and create the constant
expression. Otherwise, return an error message.

This a refactorization to reuse this code in a follow up patch.

Signed-off-by: Alvaro Neira Ayuso <alvaroneay@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/datatype.c

index fdfee54a753cc5a6fe20e358679e0fe78de08b43..7090b0ba7fb415a9602522cff280a4391971597c 100644 (file)
@@ -112,6 +112,7 @@ struct error_record *symbolic_constant_parse(const struct expr *sym,
 {
        const struct symbolic_constant *s;
        const struct datatype *dtype;
+       struct error_record *erec;
 
        for (s = tbl->symbols; s->identifier != NULL; s++) {
                if (!strcmp(sym->identifier, s->identifier))
@@ -119,8 +120,16 @@ struct error_record *symbolic_constant_parse(const struct expr *sym,
        }
 
        dtype = sym->dtype;
-       if (s->identifier == NULL)
+       if (s->identifier == NULL) {
+               *res = NULL;
+               erec = sym->dtype->basetype->parse(sym, res);
+               if (erec != NULL)
+                       return erec;
+               if (*res)
+                       return NULL;
+
                return error(&sym->location, "Could not parse %s", dtype->desc);
+       }
 
        *res = constant_expr_alloc(&sym->location, dtype,
                                   dtype->byteorder, dtype->size,
@@ -660,25 +669,6 @@ static void mark_type_print(const struct expr *expr)
 static struct error_record *mark_type_parse(const struct expr *sym,
                                            struct expr **res)
 {
-       struct error_record *erec;
-       const struct symbolic_constant *s;
-
-       for (s = mark_tbl->symbols; s->identifier != NULL; s++) {
-               if (!strcmp(sym->identifier, s->identifier)) {
-                       *res = constant_expr_alloc(&sym->location, sym->dtype,
-                                                  sym->dtype->byteorder,
-                                                  sym->dtype->size,
-                                                  &s->value);
-                       return NULL;
-               }
-       }
-
-       *res = NULL;
-       erec = sym->dtype->basetype->parse(sym, res);
-       if (erec != NULL)
-               return erec;
-       if (*res)
-               return NULL;
        return symbolic_constant_parse(sym, mark_tbl, res);
 }