aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
Diffstat (limited to 'epan')
-rw-r--r--epan/dfilter/grammar.lemon17
-rw-r--r--epan/dfilter/scanner.l77
-rw-r--r--epan/dfilter/semcheck.c136
-rw-r--r--epan/dfilter/sttype-string.c10
-rw-r--r--epan/dfilter/syntax-tree.h3
-rw-r--r--epan/ftypes/ftype-bytes.c32
-rw-r--r--epan/ftypes/ftype-double.c10
-rw-r--r--epan/ftypes/ftype-integer.c41
-rw-r--r--epan/ftypes/ftype-ipv4.c10
-rw-r--r--epan/ftypes/ftype-none.c3
-rw-r--r--epan/ftypes/ftype-string.c9
-rw-r--r--epan/ftypes/ftype-time.c10
-rw-r--r--epan/ftypes/ftype-tvbuff.c5
-rw-r--r--epan/ftypes/ftypes-int.h4
-rw-r--r--epan/ftypes/ftypes.c19
-rw-r--r--epan/ftypes/ftypes.h6
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