summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlvaro Neira <alvaroneay@gmail.com>2014-09-30 17:21:39 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2014-10-09 13:22:55 +0200
commit67094206871b3dbaabd48894bc171e67010762c4 (patch)
tree0ce9375f32d334fa5876a3b62e8d0c21e4eaa8b0 /src
parentffac724a876d1fb3ae08b7da727d251a6762358c (diff)
datatype: Enhance symbolic_constant_parse()
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>
Diffstat (limited to 'src')
-rw-r--r--src/datatype.c30
1 files changed, 10 insertions, 20 deletions
diff --git a/src/datatype.c b/src/datatype.c
index fdfee54a..7090b0ba 100644
--- a/src/datatype.c
+++ b/src/datatype.c
@@ -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);
}