diff options
author | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2012-06-29 11:11:24 +0000 |
---|---|---|
committer | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2012-06-29 11:11:24 +0000 |
commit | 40776e2fed2be58eac1f682fdc86ddec59f85148 (patch) | |
tree | 327d16aff28f5925d3472c5650103f94c4b34ae9 /epan | |
parent | a8eea83c37c445687c64a392aa6cdfe915a3bd4c (diff) |
Add len() function to dfilter. For now only support FT_STRING*
Note: it returns bytes-length, not number of UTF-8 characters.
svn path=/trunk/; revision=43541
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dfilter/dfunctions.c | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/epan/dfilter/dfunctions.c b/epan/dfilter/dfunctions.c index ffddee49bb..f3edfafed4 100644 --- a/epan/dfilter/dfunctions.c +++ b/epan/dfilter/dfunctions.c @@ -104,7 +104,38 @@ df_func_upper(GList* arg1list, GList *arg2junk _U_, GList **retval) return string_walk(arg1list, retval, string_ascii_to_upper); } -/* For upper() and lower(), checks that the parameter passed to +/* dfilter function: len() */ +static gboolean +df_func_len(GList* arg1list, GList *arg2junk _U_, GList **retval) +{ + GList *arg1; + fvalue_t *arg_fvalue; + fvalue_t *ft_len; + + arg1 = arg1list; + while (arg1) { + arg_fvalue = (fvalue_t *)arg1->data; + switch (fvalue_ftype(arg_fvalue)->ftype) { + case FT_STRING: + case FT_STRINGZ: + case FT_UINT_STRING: + ft_len = fvalue_new(FT_UINT32); + fvalue_set_uinteger(ft_len, (guint) strlen(fvalue_get(arg_fvalue))); + *retval = g_list_append(*retval, ft_len); + break; + + /* XXX - it would be nice to handle other types */ + + default: + break; + } + arg1 = arg1->next; + } + + return TRUE; +} + +/* For upper(), lower() and len(), checks that the parameter passed to * it is an FT_STRING */ static void ul_semcheck_params(int param_num, stnode_t *st_node) @@ -122,12 +153,12 @@ ul_semcheck_params(int param_num, stnode_t *st_node) ftype = hfinfo->type; if (ftype != FT_STRING && ftype != FT_STRINGZ && ftype != FT_UINT_STRING) { - dfilter_fail("Only strings can be used in upper() or lower()"); + dfilter_fail("Only strings can be used in upper() or lower() or len()"); THROW(TypeError); } break; default: - dfilter_fail("Only string-type fields can be used in upper() or lower()"); + dfilter_fail("Only string-type fields can be used in upper() or lower() or len()"); THROW(TypeError); } } @@ -141,6 +172,7 @@ static df_func_def_t df_functions[] = { { "lower", df_func_lower, FT_STRING, 1, 1, ul_semcheck_params }, { "upper", df_func_upper, FT_STRING, 1, 1, ul_semcheck_params }, + { "len", df_func_len, FT_UINT32, 1, 1, ul_semcheck_params }, { NULL, NULL, 0, 0, 0, NULL } }; |