diff options
author | João Valverde <j@v6e.pt> | 2022-04-06 14:58:10 +0100 |
---|---|---|
committer | João Valverde <j@v6e.pt> | 2022-04-06 18:11:27 +0100 |
commit | a6f37323e612ff9b391cf0a3b3268c20d7971b22 (patch) | |
tree | 3a2ef87de2a334ecedb82198a9b8db4229f1125c /epan/dfilter | |
parent | 6057d1a6e2cb51c1a451af9d60c026dfa370c4fa (diff) |
dfilter: Clean up lexical scanning
Diffstat (limited to 'epan/dfilter')
-rw-r--r-- | epan/dfilter/dfilter-int.h | 3 | ||||
-rw-r--r-- | epan/dfilter/dfilter.c | 14 | ||||
-rw-r--r-- | epan/dfilter/scanner.l | 36 | ||||
-rw-r--r-- | epan/dfilter/syntax-tree.c | 3 |
4 files changed, 21 insertions, 35 deletions
diff --git a/epan/dfilter/dfilter-int.h b/epan/dfilter/dfilter-int.h index b73cb77ffc..fc8657e79b 100644 --- a/epan/dfilter/dfilter-int.h +++ b/epan/dfilter/dfilter-int.h @@ -123,9 +123,6 @@ DfilterTrace(FILE *TraceFILE, char *zTracePrompt); header_field_info * dfilter_resolve_unparsed(dfwork_t *dfw, const char *name); -char * -dfilter_literal_normalized(const char *token); - const char *tokenstr(int token); #endif diff --git a/epan/dfilter/dfilter.c b/epan/dfilter/dfilter.c index 1be1bfb924..62d42077db 100644 --- a/epan/dfilter/dfilter.c +++ b/epan/dfilter/dfilter.c @@ -86,9 +86,6 @@ dfilter_resolve_unparsed(dfwork_t *dfw, const char *name) { header_field_info *hfinfo; - if (*name == '.') - name += 1; - hfinfo = proto_registrar_get_byname(name); if (hfinfo != NULL) { /* It's a field name */ @@ -106,17 +103,6 @@ dfilter_resolve_unparsed(dfwork_t *dfw, const char *name) return NULL; } -char * -dfilter_literal_normalized(const char *token) -{ - if (*token == '<') { - char *end = strchr(token, '>'); - return g_strndup(token + 1, end - (token + 1)); - } - - return g_strdup(token); -} - /* Initialize the dfilter module */ void dfilter_init(void) diff --git a/epan/dfilter/scanner.l b/epan/dfilter/scanner.l index cd63e08e7e..a969ef1be0 100644 --- a/epan/dfilter/scanner.l +++ b/epan/dfilter/scanner.l @@ -364,7 +364,7 @@ v6-cidr-prefix \/[[:digit:]]{1,3} /* None of the patterns below can match ".." anywhere in the token string. */ {MacAddress}|{QuadMacAddress} { - /* MAC Address literal. */ + /* MAC Address. */ return set_lval_str(TOKEN_UNPARSED, yytext); } @@ -378,27 +378,31 @@ v6-cidr-prefix \/[[:digit:]]{1,3} return set_lval_str(TOKEN_UNPARSED, yytext); } -:?[[:xdigit:]]+:[[:xdigit:]:]* { +[[:xdigit:]]+:[[:xdigit:]:]* { /* Bytes. */ - if (yytext[0] == ':') { - /* Skip leading colon. */ - return set_lval_str(TOKEN_LITERAL, yytext + 1); - } return set_lval_str(TOKEN_UNPARSED, yytext); } -"<"[^>=]+">" { - /* Literal in-between angle brackets (cannot be parsed as a protocol field). */ - return set_lval_str(TOKEN_LITERAL, yytext); +:[[:xdigit:]:-]+(\.[[:xdigit:]:-]+)* { + /* Literal starting with colon. Bytes, integer or float. */ + /* Skip leading colon. */ + return set_lval_str(TOKEN_LITERAL, yytext + 1); } -[:.]?[[:alnum:]_]{WORD_CHAR}*(\.{WORD_CHAR}+)* { - /* Identifier or literal or unparsed. */ - if (yytext[0] == '.') - return set_lval_str(TOKEN_IDENTIFIER, yytext); - if (yytext[0] == ':') { - /* Skip leading colon. */ - return set_lval_str(TOKEN_LITERAL, yytext + 1); +"<"[^>=]+">" { + /* Literal in-between angle brackets (cannot be parsed as a protocol field). */ + /* Strip brackets. */ + char *end = strchr(yytext, '>'); + *end = '\0'; + df_lval->value = g_strdup(yytext + 1); + return TOKEN_LITERAL; +} + +\.?[[:alnum:]_]{WORD_CHAR}*(\.{WORD_CHAR}+)* { + /* Identifier or unparsed. */ + if (yytext[0] == '.') { + /* Skip leading dot. */ + return set_lval_str(TOKEN_IDENTIFIER, yytext + 1); } return set_lval_str(TOKEN_UNPARSED, yytext); } diff --git a/epan/dfilter/syntax-tree.c b/epan/dfilter/syntax-tree.c index fec54d5ba0..4f20c86295 100644 --- a/epan/dfilter/syntax-tree.c +++ b/epan/dfilter/syntax-tree.c @@ -185,8 +185,7 @@ stnode_new_unparsed(const char *str, char *token) stnode_t * stnode_new_literal(const char *str, char *token) { - char *value = dfilter_literal_normalized(str); - return stnode_new(STTYPE_LITERAL, value, token); + return stnode_new(STTYPE_LITERAL, g_strdup(str), token); } stnode_t * |