diff options
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dfilter/grammar.lemon | 17 | ||||
-rw-r--r-- | epan/dfilter/scanner.l | 77 | ||||
-rw-r--r-- | epan/dfilter/semcheck.c | 136 | ||||
-rw-r--r-- | epan/dfilter/sttype-string.c | 10 | ||||
-rw-r--r-- | epan/dfilter/syntax-tree.h | 3 | ||||
-rw-r--r-- | epan/ftypes/ftype-bytes.c | 32 | ||||
-rw-r--r-- | epan/ftypes/ftype-double.c | 10 | ||||
-rw-r--r-- | epan/ftypes/ftype-integer.c | 41 | ||||
-rw-r--r-- | epan/ftypes/ftype-ipv4.c | 10 | ||||
-rw-r--r-- | epan/ftypes/ftype-none.c | 3 | ||||
-rw-r--r-- | epan/ftypes/ftype-string.c | 9 | ||||
-rw-r--r-- | epan/ftypes/ftype-time.c | 10 | ||||
-rw-r--r-- | epan/ftypes/ftype-tvbuff.c | 5 | ||||
-rw-r--r-- | epan/ftypes/ftypes-int.h | 4 | ||||
-rw-r--r-- | epan/ftypes/ftypes.c | 19 | ||||
-rw-r--r-- | epan/ftypes/ftypes.h | 6 |
16 files changed, 298 insertions, 94 deletions
diff --git a/epan/dfilter/grammar.lemon b/epan/dfilter/grammar.lemon index e252b496a8..35310adf7d 100644 --- a/epan/dfilter/grammar.lemon +++ b/epan/dfilter/grammar.lemon @@ -1,4 +1,4 @@ -/* $Id: grammar.lemon,v 1.4 2001/06/22 16:29:13 gram Exp $ */ +/* $Id: grammar.lemon,v 1.5 2003/07/25 03:44:01 gram Exp $ */ %include { #ifdef HAVE_CONFIG_H @@ -71,6 +71,10 @@ any "error" symbols are shifted, if possible. */ dfilter_fail("The string \"%s\" was unexpected in this context.", stnode_data(TOKEN)); break; + case STTYPE_UNPARSED: + dfilter_fail("\"%s\" was unexpected in this context.", + stnode_data(TOKEN)); + break; case STTYPE_INTEGER: dfilter_fail("The integer %u was unexpected in this context.", stnode_value(TOKEN)); @@ -150,18 +154,9 @@ logical_test(T) ::= FIELD(F). /* Entities, or things that can be compared/tested/checked */ entity(E) ::= FIELD(F). { E = F; } entity(E) ::= STRING(S). { E = S; } +entity(E) ::= UNPARSED(U). { E = U; } entity(E) ::= range(R). { E = R; } -/* CIDR: ADDRESS/NET */ -entity(E) ::= STRING(A) SLASH STRING(N). -{ - E = stnode_new(STTYPE_STRING, g_strjoin("/", stnode_data(A), - stnode_data(N), NULL)); - - stnode_free(A); - stnode_free(N); -} - /* Ranges */ range(R) ::= FIELD(F) LBRACKET drnode_list(L) RBRACKET. diff --git a/epan/dfilter/scanner.l b/epan/dfilter/scanner.l index c65c12dcc9..ca23626457 100644 --- a/epan/dfilter/scanner.l +++ b/epan/dfilter/scanner.l @@ -1,6 +1,6 @@ %{ /* - * $Id: scanner.l,v 1.7 2002/04/29 07:55:32 guy Exp $ + * $Id: scanner.l,v 1.8 2003/07/25 03:44:01 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -46,12 +46,15 @@ static int set_lval(int token, gpointer data); static int set_lval_int(int token, char *s); static int simple(int token); static gboolean str_to_guint32(char *s, guint32* pint); +GString* quoted_string = NULL; + +#define SCAN_FAILED 0 %} %x RANGE_INT %x RANGE_PUNCT - +%x DQUOTE %% @@ -61,7 +64,6 @@ static gboolean str_to_guint32(char *s, guint32* pint); "(" return simple(TOKEN_LPAREN); ")" return simple(TOKEN_RPAREN); -"/" return simple(TOKEN_SLASH); "==" return simple(TOKEN_TEST_EQ); "eq" return simple(TOKEN_TEST_EQ); @@ -94,6 +96,7 @@ static gboolean str_to_guint32(char *s, guint32* pint); BEGIN(RANGE_PUNCT); return set_lval_int(TOKEN_INTEGER, yytext); } + <RANGE_INT>[+-]?0x[[:xdigit:]]+ { BEGIN(RANGE_PUNCT); return set_lval_int(TOKEN_INTEGER, yytext); @@ -119,13 +122,65 @@ static gboolean str_to_guint32(char *s, guint32* pint); return simple(TOKEN_RBRACKET); } +\" { + /* start quote */ + /* The example of how to scan for strings was taken from + the flex 2.5.4 manual, from the section "Start Conditions". + See: + http://www.gnu.org/manual/flex-2.5.4/html_node/flex_11.html */ + + BEGIN(DQUOTE); + g_assert(!quoted_string); + quoted_string = g_string_new(""); +} + +<DQUOTE>\" { + /* end quote */ + char *my_string = g_strdup(quoted_string->str); + BEGIN(INITIAL); + g_string_free(quoted_string, TRUE); + quoted_string = NULL; + return set_lval(TOKEN_STRING, my_string); +} -\"[^"]*\" { - return set_lval(TOKEN_STRING, g_substrdup(yytext, 1, -2)); +<DQUOTE>\\[0-7]{1,3} { + /* octal sequence */ + unsigned int result; + sscanf(yytext + 1, "%o", &result); + if (result > 0xff) { + g_string_free(quoted_string, TRUE); + quoted_string = NULL; + dfilter_fail("%s is larger than 255.", yytext); + return SCAN_FAILED; + } + g_string_append_c(quoted_string, result); } +<DQUOTE>\\x[[:xdigit:]]{1,2} { + /* hex sequence */ + unsigned int result; + sscanf(yytext + 2, "%x", &result); + g_string_append_c(quoted_string, result); +} +<DQUOTE>\\. { + /* escaped character */ + g_string_append_c(quoted_string, yytext[1]); +} + +<DQUOTE>[^\\\"]+ { + /* non-escaped string */ + g_string_append(quoted_string, yytext); +} + + + +[-[:alnum:]_\.]+\/[[:digit:]]+ { + /* CIDR */ + return set_lval(TOKEN_UNPARSED, g_strdup(yytext)); +} + [-[:alnum:]_.:]+ { /* Is it a field name? */ header_field_info *hfinfo; @@ -136,14 +191,14 @@ static gboolean str_to_guint32(char *s, guint32* pint); return set_lval(TOKEN_FIELD, hfinfo); } else { - /* No, so treat it as a string */ - return set_lval(TOKEN_STRING, g_strdup(yytext)); + /* No, so treat it as an unparsed string */ + return set_lval(TOKEN_UNPARSED, g_strdup(yytext)); } } . { /* Default */ - return set_lval(TOKEN_STRING, g_strdup(yytext)); + return set_lval(TOKEN_UNPARSED, g_strdup(yytext)); } @@ -160,7 +215,6 @@ simple(int token) case TOKEN_COLON: case TOKEN_COMMA: case TOKEN_HYPHEN: - case TOKEN_SLASH: case TOKEN_TEST_EQ: case TOKEN_TEST_NE: case TOKEN_TEST_GT: @@ -189,6 +243,9 @@ set_lval(int token, gpointer data) case TOKEN_FIELD: type_id = STTYPE_FIELD; break; + case TOKEN_UNPARSED: + type_id = STTYPE_UNPARSED; + break; default: g_assert_not_reached(); } @@ -204,7 +261,7 @@ set_lval_int(int token, char *s) guint32 val; if (!str_to_guint32(s, &val)) { - return 0; + return SCAN_FAILED; } switch (token) { diff --git a/epan/dfilter/semcheck.c b/epan/dfilter/semcheck.c index 123864b7ff..faba2942d4 100644 --- a/epan/dfilter/semcheck.c +++ b/epan/dfilter/semcheck.c @@ -1,5 +1,5 @@ /* - * $Id: semcheck.c,v 1.17 2003/06/13 07:39:26 guy Exp $ + * $Id: semcheck.c,v 1.18 2003/07/25 03:44:01 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -47,15 +47,15 @@ compatible_ftypes(ftenum_t a, ftenum_t b) switch (a) { case FT_NONE: case FT_PROTOCOL: - case FT_FLOAT: - case FT_DOUBLE: + case FT_FLOAT: /* XXX - should be able to compare with INT */ + case FT_DOUBLE: /* XXX - should be able to compare with INT */ case FT_ABSOLUTE_TIME: case FT_RELATIVE_TIME: case FT_IPv4: case FT_IPv6: case FT_IPXNET: - case FT_INT64: - case FT_UINT64: + case FT_INT64: /* XXX - should be able to compare with INT */ + case FT_UINT64: /* XXX - should be able to compare with INT */ return a == b; case FT_ETHER: @@ -187,7 +187,7 @@ mk_fvalue_from_val_string(header_field_info *hfinfo, char *s) return mk_uint32_fvalue(FALSE); } else { - dfilter_fail("\"%s\" cannot be found among the possible values for %s.", + dfilter_fail("\"%s\" cannot be found among the possible values for %s.", s, hfinfo->abbrev); return NULL; } @@ -256,9 +256,11 @@ is_bytes_type(enum ftenum type) return FALSE; } +/* If the LHS of a relation test is a FIELD, run some checks + * and possibly some modifications of syntax tree nodes. */ static void -check_relation_LHS_FIELD(FtypeCanFunc can_func, stnode_t *st_node, - stnode_t *st_arg1, stnode_t *st_arg2) +check_relation_LHS_FIELD(const char *relation_string, FtypeCanFunc can_func, + stnode_t *st_node, stnode_t *st_arg1, stnode_t *st_arg2) { stnode_t *new_st; sttype_id_t type1, type2; @@ -275,8 +277,9 @@ check_relation_LHS_FIELD(FtypeCanFunc can_func, stnode_t *st_node, ftype1 = hfinfo1->type; if (!can_func(ftype1)) { - dfilter_fail("%s (type=%s) cannot participate in specified comparison.", - hfinfo1->abbrev, ftype_pretty_name(ftype1)); + dfilter_fail("%s (type=%s) cannot participate in '%s' comparison.", + hfinfo1->abbrev, ftype_pretty_name(ftype1), + relation_string); THROW(TypeError); } @@ -313,6 +316,21 @@ check_relation_LHS_FIELD(FtypeCanFunc can_func, stnode_t *st_node, sttype_test_set2_args(st_node, st_arg1, new_st); stnode_free(st_arg2); } + else if (type2 == STTYPE_UNPARSED) { + s = stnode_data(st_arg2); + fvalue = fvalue_from_unparsed(ftype1, s, dfilter_fail); + if (!fvalue) { + /* check value_string */ + fvalue = mk_fvalue_from_val_string(hfinfo1, s); + if (!fvalue) { + THROW(TypeError); + } + } + + new_st = stnode_new(STTYPE_FVALUE, fvalue); + sttype_test_set2_args(st_node, st_arg1, new_st); + stnode_free(st_arg2); + } else if (type2 == STTYPE_RANGE) { if (!is_bytes_type(ftype1)) { if (!ftype_can_slice(ftype1)) { @@ -393,6 +411,60 @@ check_relation_LHS_STRING(FtypeCanFunc can_func _U_, stnode_t *st_node, } } +static void +check_relation_LHS_UNPARSED(FtypeCanFunc can_func _U_, stnode_t *st_node, + stnode_t *st_arg1, stnode_t *st_arg2) +{ + stnode_t *new_st; + sttype_id_t type1, type2; + header_field_info *hfinfo2; + ftenum_t ftype2; + fvalue_t *fvalue; + char *s; + + type1 = stnode_type_id(st_arg1); + type2 = stnode_type_id(st_arg2); + + if (type2 == STTYPE_FIELD) { + hfinfo2 = stnode_data(st_arg2); + ftype2 = hfinfo2->type; + + s = stnode_data(st_arg1); + fvalue = fvalue_from_unparsed(ftype2, s, dfilter_fail); + if (!fvalue) { + /* check value_string */ + fvalue = mk_fvalue_from_val_string(hfinfo2, s); + if (!fvalue) { + THROW(TypeError); + } + } + + new_st = stnode_new(STTYPE_FVALUE, fvalue); + sttype_test_set2_args(st_node, new_st, st_arg2); + stnode_free(st_arg1); + } + else if (type2 == STTYPE_STRING) { + /* Well now that's silly... */ + dfilter_fail("Neither \"%s\" nor \"%s\" are field or protocol names.", + stnode_data(st_arg1), + stnode_data(st_arg2)); + THROW(TypeError); + } + else if (type2 == STTYPE_RANGE) { + s = stnode_data(st_arg1); + fvalue = fvalue_from_unparsed(FT_BYTES, s, dfilter_fail); + if (!fvalue) { + THROW(TypeError); + } + new_st = stnode_new(STTYPE_FVALUE, fvalue); + sttype_test_set2_args(st_node, new_st, st_arg2); + stnode_free(st_arg1); + } + else { + g_assert_not_reached(); + } +} + struct check_drange_sanity_args { drange_node* err_node; }; @@ -515,6 +587,16 @@ check_relation_LHS_RANGE(FtypeCanFunc can_func _U_, stnode_t *st_node, sttype_test_set2_args(st_node, st_arg1, new_st); stnode_free(st_arg2); } + else if (type2 == STTYPE_UNPARSED) { + s = stnode_data(st_arg2); + fvalue = fvalue_from_unparsed(FT_BYTES, s, dfilter_fail); + if (!fvalue) { + THROW(TypeError); + } + new_st = stnode_new(STTYPE_FVALUE, fvalue); + sttype_test_set2_args(st_node, st_arg1, new_st); + stnode_free(st_arg2); + } else if (type2 == STTYPE_RANGE) { check_drange_sanity(st_arg2); /* XXX - check lengths of both ranges */ @@ -525,13 +607,14 @@ check_relation_LHS_RANGE(FtypeCanFunc can_func _U_, stnode_t *st_node, } +/* Check the semantics of any relational test. */ static void -check_relation(FtypeCanFunc can_func, stnode_t *st_node, +check_relation(const char *relation_string, FtypeCanFunc can_func, stnode_t *st_node, stnode_t *st_arg1, stnode_t *st_arg2) { switch (stnode_type_id(st_arg1)) { case STTYPE_FIELD: - check_relation_LHS_FIELD(can_func, st_node, st_arg1, st_arg2); + check_relation_LHS_FIELD(relation_string, can_func, st_node, st_arg1, st_arg2); break; case STTYPE_STRING: check_relation_LHS_STRING(can_func, st_node, st_arg1, st_arg2); @@ -539,6 +622,9 @@ check_relation(FtypeCanFunc can_func, stnode_t *st_node, case STTYPE_RANGE: check_relation_LHS_RANGE(can_func, st_node, st_arg1, st_arg2); break; + case STTYPE_UNPARSED: + check_relation_LHS_UNPARSED(can_func, st_node, st_arg1, st_arg2); + break; case STTYPE_UNINITIALIZED: case STTYPE_TEST: @@ -549,6 +635,7 @@ check_relation(FtypeCanFunc can_func, stnode_t *st_node, } } +/* Check the semantics of any type of TEST */ static void check_test(stnode_t *st_node) { @@ -577,34 +664,33 @@ check_test(stnode_t *st_node) break; case TEST_OP_EQ: - check_relation(ftype_can_eq, st_node, st_arg1, st_arg2); + check_relation("==", ftype_can_eq, st_node, st_arg1, st_arg2); break; case TEST_OP_NE: - check_relation(ftype_can_ne, st_node, st_arg1, st_arg2); + check_relation("!=", ftype_can_ne, st_node, st_arg1, st_arg2); break; case TEST_OP_GT: - check_relation(ftype_can_gt, st_node, st_arg1, st_arg2); + check_relation(">", ftype_can_gt, st_node, st_arg1, st_arg2); break; case TEST_OP_GE: - check_relation(ftype_can_ge, st_node, st_arg1, st_arg2); + check_relation(">=", ftype_can_ge, st_node, st_arg1, st_arg2); break; case TEST_OP_LT: - check_relation(ftype_can_lt, st_node, st_arg1, st_arg2); + check_relation("<", ftype_can_lt, st_node, st_arg1, st_arg2); break; case TEST_OP_LE: - check_relation(ftype_can_le, st_node, st_arg1, st_arg2); + check_relation("<=", ftype_can_le, st_node, st_arg1, st_arg2); break; } } +/* Check the entire syntax tree. */ static void semcheck(stnode_t *st_node) { - const char *name; - - name = stnode_type_name(st_node); - + /* The parser assures that the top-most syntax-tree + * node will be a TEST node, no matter what. So assert that. */ switch (stnode_type_id(st_node)) { case STTYPE_TEST: check_test(st_node); @@ -615,9 +701,15 @@ semcheck(stnode_t *st_node) } +/* Check the syntax tree for semantic errors, and convert + * some of the nodes into the form they need to be in order to + * later generate the DFVM bytecode. */ gboolean dfw_semcheck(dfwork_t *dfw) { + /* Instead of having to check for errors at every stage of + * the semantic-checking, the semantic-checking code will + * throw an exception if a problem is found. */ TRY { semcheck(dfw->st_root); } diff --git a/epan/dfilter/sttype-string.c b/epan/dfilter/sttype-string.c index 4bd8cbc0b1..160fce82d7 100644 --- a/epan/dfilter/sttype-string.c +++ b/epan/dfilter/sttype-string.c @@ -1,5 +1,5 @@ /* - * $Id: sttype-string.c,v 1.3 2002/08/28 20:40:56 jmayer Exp $ + * $Id: sttype-string.c,v 1.4 2003/07/25 03:44:01 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> @@ -46,5 +46,13 @@ sttype_register_string(void) string_free, }; + static sttype_t unparsed_type = { + STTYPE_UNPARSED, + "UNPARSED", + string_new, + string_free, + }; + sttype_register(&string_type); + sttype_register(&unparsed_type); } diff --git a/epan/dfilter/syntax-tree.h b/epan/dfilter/syntax-tree.h index 88c273b38d..f421609a60 100644 --- a/epan/dfilter/syntax-tree.h +++ b/epan/dfilter/syntax-tree.h @@ -1,5 +1,5 @@ /* - * $Id: syntax-tree.h,v 1.4 2002/08/28 20:40:56 jmayer Exp $ + * $Id: syntax-tree.h,v 1.5 2003/07/25 03:44:01 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> @@ -30,6 +30,7 @@ typedef enum { STTYPE_UNINITIALIZED, STTYPE_TEST, + STTYPE_UNPARSED, STTYPE_STRING, STTYPE_FIELD, STTYPE_FVALUE, diff --git a/epan/ftypes/ftype-bytes.c b/epan/ftypes/ftype-bytes.c index 28329f7295..25c2f445ec 100644 --- a/epan/ftypes/ftype-bytes.c +++ b/epan/ftypes/ftype-bytes.c @@ -1,5 +1,5 @@ /* - * $Id: ftype-bytes.c,v 1.15 2003/06/11 21:24:53 gram Exp $ + * $Id: ftype-bytes.c,v 1.16 2003/07/25 03:44:02 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -129,7 +129,7 @@ is_byte_sep(guint8 c) } static gboolean -val_from_string(fvalue_t *fv, char *s, LogFunc logfunc) +val_from_unparsed(fvalue_t *fv, char *s, LogFunc logfunc) { GByteArray *bytes; guint8 val; @@ -226,7 +226,7 @@ val_from_string(fvalue_t *fv, char *s, LogFunc logfunc) } static gboolean -ether_from_string(fvalue_t *fv, char *s, LogFunc logfunc) +ether_from_unparsed(fvalue_t *fv, char *s, LogFunc logfunc) { guint8 *mac; @@ -235,7 +235,7 @@ ether_from_string(fvalue_t *fv, char *s, LogFunc logfunc) * up as an Ethernet host name if it does, and if that fails, * we'll log a message. */ - if (val_from_string(fv, s, NULL)) { + if (val_from_unparsed(fv, s, NULL)) { return TRUE; } @@ -251,7 +251,7 @@ ether_from_string(fvalue_t *fv, char *s, LogFunc logfunc) } static gboolean -ipv6_from_string(fvalue_t *fv, char *s, LogFunc logfunc) +ipv6_from_unparsed(fvalue_t *fv, char *s, LogFunc logfunc) { guint8 buffer[16]; @@ -265,7 +265,7 @@ ipv6_from_string(fvalue_t *fv, char *s, LogFunc logfunc) } static gboolean -u64_from_string(fvalue_t *fv, char *s, LogFunc logfunc) +u64_from_unparsed(fvalue_t *fv, char *s, LogFunc logfunc) { guint8 buffer[8]; @@ -279,7 +279,7 @@ u64_from_string(fvalue_t *fv, char *s, LogFunc logfunc) } static gboolean -i64_from_string(fvalue_t *fv, char *s, LogFunc logfunc) +i64_from_unparsed(fvalue_t *fv, char *s, LogFunc logfunc) { guint8 buffer[8]; @@ -587,7 +587,8 @@ ftype_register_bytes(void) 0, /* wire_size */ bytes_fvalue_new, /* new_value */ bytes_fvalue_free, /* free_value */ - val_from_string, /* val_from_string */ + val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ bytes_to_repr, /* val_to_string_repr */ bytes_repr_len, /* len_string_repr */ @@ -616,7 +617,8 @@ ftype_register_bytes(void) 0, /* wire_size */ bytes_fvalue_new, /* new_value */ bytes_fvalue_free, /* free_value */ - val_from_string, /* val_from_string */ + val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ bytes_to_repr, /* val_to_string_repr */ bytes_repr_len, /* len_string_repr */ @@ -645,7 +647,8 @@ ftype_register_bytes(void) ETHER_LEN, /* wire_size */ bytes_fvalue_new, /* new_value */ bytes_fvalue_free, /* free_value */ - ether_from_string, /* val_from_string */ + ether_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ bytes_to_repr, /* val_to_string_repr */ bytes_repr_len, /* len_string_repr */ @@ -674,7 +677,8 @@ ftype_register_bytes(void) IPv6_LEN, /* wire_size */ bytes_fvalue_new, /* new_value */ bytes_fvalue_free, /* free_value */ - ipv6_from_string, /* val_from_string */ + ipv6_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ @@ -703,7 +707,8 @@ ftype_register_bytes(void) U64_LEN, /* wire_size */ bytes_fvalue_new, /* new_value */ bytes_fvalue_free, /* free_value */ - u64_from_string, /* val_from_string */ + u64_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ @@ -732,7 +737,8 @@ ftype_register_bytes(void) U64_LEN, /* wire_size */ bytes_fvalue_new, /* new_value */ bytes_fvalue_free, /* free_value */ - i64_from_string, /* val_from_string */ + i64_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ diff --git a/epan/ftypes/ftype-double.c b/epan/ftypes/ftype-double.c index 2091bda846..5ee3aee44d 100644 --- a/epan/ftypes/ftype-double.c +++ b/epan/ftypes/ftype-double.c @@ -1,5 +1,5 @@ /* - * $Id: ftype-double.c,v 1.8 2003/02/08 04:22:37 gram Exp $ + * $Id: ftype-double.c,v 1.9 2003/07/25 03:44:02 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -48,7 +48,7 @@ value_get_floating(fvalue_t *fv) } static gboolean -val_from_string(fvalue_t *fv, char *s, LogFunc logfunc) +val_from_unparsed(fvalue_t *fv, char *s, LogFunc logfunc) { char *endptr = NULL; @@ -123,7 +123,8 @@ ftype_register_double(void) 0, double_fvalue_new, NULL, - val_from_string, + val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ @@ -152,7 +153,8 @@ ftype_register_double(void) 0, double_fvalue_new, NULL, - val_from_string, + val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ diff --git a/epan/ftypes/ftype-integer.c b/epan/ftypes/ftype-integer.c index d170dec129..818b6cce7a 100644 --- a/epan/ftypes/ftype-integer.c +++ b/epan/ftypes/ftype-integer.c @@ -1,5 +1,5 @@ /* - * $Id: ftype-integer.c,v 1.13 2003/06/11 21:24:53 gram Exp $ + * $Id: ftype-integer.c,v 1.14 2003/07/25 03:44:02 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -49,7 +49,7 @@ get_integer(fvalue_t *fv) } static gboolean -val_from_string(fvalue_t *fv, char *s, LogFunc logfunc) +val_from_unparsed(fvalue_t *fv, char *s, LogFunc logfunc) { char *endptr; @@ -78,7 +78,7 @@ val_from_string(fvalue_t *fv, char *s, LogFunc logfunc) } static gboolean -ipxnet_from_string(fvalue_t *fv, char *s, LogFunc logfunc) +ipxnet_from_unparsed(fvalue_t *fv, char *s, LogFunc logfunc) { guint32 val; gboolean known; @@ -88,7 +88,7 @@ ipxnet_from_string(fvalue_t *fv, char *s, LogFunc logfunc) * up as an IPX network name if it does, and if that fails, * we'll log a message. */ - if (val_from_string(fv, s, NULL)) { + if (val_from_unparsed(fv, s, NULL)) { return TRUE; } @@ -223,7 +223,8 @@ ftype_register_integers(void) 1, /* wire_size */ int_fvalue_new, /* new_value */ NULL, /* free_value */ - val_from_string, /* val_from_string */ + val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ @@ -251,7 +252,8 @@ ftype_register_integers(void) 2, /* wire_size */ int_fvalue_new, /* new_value */ NULL, /* free_value */ - val_from_string, /* val_from_string */ + val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ @@ -279,7 +281,8 @@ ftype_register_integers(void) 3, /* wire_size */ int_fvalue_new, /* new_value */ NULL, /* free_value */ - val_from_string, /* val_from_string */ + val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ @@ -307,7 +310,8 @@ ftype_register_integers(void) 4, /* wire_size */ int_fvalue_new, /* new_value */ NULL, /* free_value */ - val_from_string, /* val_from_string */ + val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ @@ -335,7 +339,8 @@ ftype_register_integers(void) 1, /* wire_size */ int_fvalue_new, /* new_value */ NULL, /* free_value */ - val_from_string, /* val_from_string */ + val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ @@ -363,7 +368,8 @@ ftype_register_integers(void) 2, /* wire_size */ int_fvalue_new, /* new_value */ NULL, /* free_value */ - val_from_string, /* val_from_string */ + val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ @@ -391,7 +397,8 @@ ftype_register_integers(void) 3, /* wire_size */ int_fvalue_new, /* new_value */ NULL, /* free_value */ - val_from_string, /* val_from_string */ + val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ @@ -419,7 +426,8 @@ ftype_register_integers(void) 4, /* wire_size */ int_fvalue_new, /* new_value */ NULL, /* free_value */ - val_from_string, /* val_from_string */ + val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ @@ -447,7 +455,8 @@ ftype_register_integers(void) 0, /* wire_size */ boolean_fvalue_new, /* new_value */ NULL, /* free_value */ - val_from_string, /* val_from_string */ + val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ boolean_to_repr, /* val_to_string_repr */ boolean_repr_len, /* len_string_repr */ @@ -476,7 +485,8 @@ ftype_register_integers(void) 4, /* wire_size */ int_fvalue_new, /* new_value */ NULL, /* free_value */ - ipxnet_from_string, /* val_from_string */ + ipxnet_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ @@ -505,7 +515,8 @@ ftype_register_integers(void) 4, /* wire_size */ int_fvalue_new, /* new_value */ NULL, /* free_value */ - val_from_string, /* val_from_string */ + val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ diff --git a/epan/ftypes/ftype-ipv4.c b/epan/ftypes/ftype-ipv4.c index ad978a7915..e583f17aa0 100644 --- a/epan/ftypes/ftype-ipv4.c +++ b/epan/ftypes/ftype-ipv4.c @@ -1,5 +1,5 @@ /* - * $Id: ftype-ipv4.c,v 1.10 2003/02/08 04:22:37 gram Exp $ + * $Id: ftype-ipv4.c,v 1.11 2003/07/25 03:44:02 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -45,7 +45,7 @@ value_get(fvalue_t *fv) } static gboolean -val_from_string(fvalue_t *fv, char *s, LogFunc logfunc) +val_from_unparsed(fvalue_t *fv, char *s, LogFunc logfunc) { guint32 addr; unsigned int nmask_bits; @@ -98,7 +98,8 @@ val_from_string(fvalue_t *fv, char *s, LogFunc logfunc) return FALSE; } - nmask_fvalue = fvalue_from_string(FT_UINT32, net_str, logfunc); + /* XXX - this is inefficient */ + nmask_fvalue = fvalue_from_unparsed(FT_UINT32, net_str, logfunc); g_free(s_copy); if (!nmask_fvalue) { return FALSE; @@ -167,7 +168,8 @@ ftype_register_ipv4(void) 4, NULL, NULL, - val_from_string, + val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ diff --git a/epan/ftypes/ftype-none.c b/epan/ftypes/ftype-none.c index 864c8a6b9a..bf6cd400eb 100644 --- a/epan/ftypes/ftype-none.c +++ b/epan/ftypes/ftype-none.c @@ -1,5 +1,5 @@ /* - * $Id: ftype-none.c,v 1.5 2003/02/08 04:22:37 gram Exp $ + * $Id: ftype-none.c,v 1.6 2003/07/25 03:44:03 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> @@ -39,6 +39,7 @@ ftype_register_none(void) NULL, NULL, NULL, + NULL, NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ diff --git a/epan/ftypes/ftype-string.c b/epan/ftypes/ftype-string.c index 312d1baa02..f1d529709a 100644 --- a/epan/ftypes/ftype-string.c +++ b/epan/ftypes/ftype-string.c @@ -1,5 +1,5 @@ /* - * $Id: ftype-string.c,v 1.9 2003/06/11 21:24:53 gram Exp $ + * $Id: ftype-string.c,v 1.10 2003/07/25 03:44:03 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -154,6 +154,7 @@ ftype_register_string(void) 0, /* wire_size */ string_fvalue_new, /* new_value */ string_fvalue_free, /* free_value */ + val_from_string, /* val_from_unparsed */ val_from_string, /* val_from_string */ string_to_repr, /* val_to_string_repr */ string_repr_len, /* len_string_repr */ @@ -182,7 +183,8 @@ ftype_register_string(void) 0, string_fvalue_new, string_fvalue_free, - val_from_string, + val_from_string, /* val_from_unparsed */ + val_from_string, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ @@ -210,7 +212,8 @@ ftype_register_string(void) 0, string_fvalue_new, string_fvalue_free, - val_from_string, + val_from_string, /* val_from_unparsed */ + val_from_string, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ diff --git a/epan/ftypes/ftype-time.c b/epan/ftypes/ftype-time.c index f35483da7b..818467a380 100644 --- a/epan/ftypes/ftype-time.c +++ b/epan/ftypes/ftype-time.c @@ -1,5 +1,5 @@ /* - * $Id: ftype-time.c,v 1.18 2003/02/08 04:22:37 gram Exp $ + * $Id: ftype-time.c,v 1.19 2003/07/25 03:44:03 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -167,7 +167,7 @@ get_nsecs(char *startp, int *nsecs) } static gboolean -relative_val_from_string(fvalue_t *fv, char *s, LogFunc logfunc) +relative_val_from_unparsed(fvalue_t *fv, char *s, LogFunc logfunc) { char *curptr, *endptr; @@ -307,7 +307,8 @@ ftype_register_time(void) 0, time_fvalue_new, NULL, - absolute_val_from_string, + absolute_val_from_string, /* val_from_unparsed */ + absolute_val_from_string, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ @@ -334,7 +335,8 @@ ftype_register_time(void) 0, time_fvalue_new, NULL, - relative_val_from_string, + relative_val_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ diff --git a/epan/ftypes/ftype-tvbuff.c b/epan/ftypes/ftype-tvbuff.c index f051fd3094..43050f9f9f 100644 --- a/epan/ftypes/ftype-tvbuff.c +++ b/epan/ftypes/ftype-tvbuff.c @@ -1,5 +1,5 @@ /* - * $Id: ftype-tvbuff.c,v 1.8 2003/02/08 04:22:37 gram Exp $ + * $Id: ftype-tvbuff.c,v 1.9 2003/07/25 03:44:03 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -84,7 +84,8 @@ ftype_register_tvbuff(void) 0, value_new, NULL, - NULL, + NULL, /* val_from_unparsed */ + NULL, /* val_from_string */ NULL, /* val_to_string_repr */ NULL, /* len_string_repr */ diff --git a/epan/ftypes/ftypes-int.h b/epan/ftypes/ftypes-int.h index cda64a1862..d6922ef7c9 100644 --- a/epan/ftypes/ftypes-int.h +++ b/epan/ftypes/ftypes-int.h @@ -1,5 +1,5 @@ /* - * $Id: ftypes-int.h,v 1.8 2003/06/11 21:24:54 gram Exp $ + * $Id: ftypes-int.h,v 1.9 2003/07/25 03:44:03 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -29,6 +29,7 @@ typedef void (*FvalueNewFunc)(fvalue_t*); typedef void (*FvalueFreeFunc)(fvalue_t*); +typedef gboolean (*FvalueFromUnparsed)(fvalue_t*, char*, LogFunc); typedef gboolean (*FvalueFromString)(fvalue_t*, char*, LogFunc); typedef void (*FvalueToStringRepr)(fvalue_t*, ftrepr_t, char*); typedef int (*FvalueStringReprLen)(fvalue_t*, ftrepr_t); @@ -52,6 +53,7 @@ struct _ftype_t { int wire_size; FvalueNewFunc new_value; FvalueFreeFunc free_value; + FvalueFromUnparsed val_from_unparsed; FvalueFromString val_from_string; FvalueToStringRepr val_to_string_repr; FvalueStringReprLen len_string_repr; diff --git a/epan/ftypes/ftypes.c b/epan/ftypes/ftypes.c index fb07b1a738..aa2239397f 100644 --- a/epan/ftypes/ftypes.c +++ b/epan/ftypes/ftypes.c @@ -1,5 +1,5 @@ /* - * $Id: ftypes.c,v 1.9 2003/06/11 21:24:54 gram Exp $ + * $Id: ftypes.c,v 1.10 2003/07/25 03:44:03 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -235,7 +235,24 @@ fvalue_free(fvalue_t *fv) g_mem_chunk_free(gmc_fvalue, fv); } +fvalue_t* +fvalue_from_unparsed(ftenum_t ftype, char *s, LogFunc logfunc) +{ + fvalue_t *fv; + fv = fvalue_new(ftype); + if (fv->ftype->val_from_unparsed) { + if (fv->ftype->val_from_unparsed(fv, s, logfunc)) { + return fv; + } + } + else { + logfunc("\"%s\" cannot be converted to %s.", + s, ftype_pretty_name(ftype)); + } + fvalue_free(fv); + return NULL; +} fvalue_t* fvalue_from_string(ftenum_t ftype, char *s, LogFunc logfunc) diff --git a/epan/ftypes/ftypes.h b/epan/ftypes/ftypes.h index 9ddac05bb6..1e224cbf53 100644 --- a/epan/ftypes/ftypes.h +++ b/epan/ftypes/ftypes.h @@ -1,7 +1,7 @@ /* ftypes.h * Definitions for field types * - * $Id: ftypes.h,v 1.17 2003/06/11 21:24:54 gram Exp $ + * $Id: ftypes.h,v 1.18 2003/07/25 03:44:04 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -73,6 +73,7 @@ enum ftrepr { typedef enum ftrepr ftrepr_t; + /* Initialize the ftypes subsytem. Called once. */ void ftypes_initialize(void); @@ -151,6 +152,9 @@ fvalue_free(fvalue_t *fv); typedef void (*LogFunc)(char*,...); fvalue_t* +fvalue_from_unparsed(ftenum_t ftype, char *s, LogFunc log); + +fvalue_t* fvalue_from_string(ftenum_t ftype, char *s, LogFunc log); /* Returns the length of the string required to hold the |