diff options
author | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2013-07-01 09:46:50 +0000 |
---|---|---|
committer | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2013-07-01 09:46:50 +0000 |
commit | 7dc10daffebe93bf3512fce97b43b669e0184c2e (patch) | |
tree | 43f4804d7d15caf860bce1790aaf193d16f681a7 | |
parent | 6394e93dcba522e8dd37bc197855af2a0d10334f (diff) |
Rewrite hfinfo_numeric_value_format as a special case for _hfinfo_number_value_format
cleanup some functions.
svn path=/trunk/; revision=50290
-rw-r--r-- | epan/proto.c | 220 |
1 files changed, 63 insertions, 157 deletions
diff --git a/epan/proto.c b/epan/proto.c index 10812f5b38..261d528546 100644 --- a/epan/proto.c +++ b/epan/proto.c @@ -146,10 +146,10 @@ static void fill_label_int64(field_info *fi, gchar *label_str); static const char *hfinfo_number_vals_format(const header_field_info *hfinfo, char buf[32], guint32 value); static const char *hfinfo_number_value_format(const header_field_info *hfinfo, char buf[32], guint32 value); +static const char *hfinfo_numeric_value_format(const header_field_info *hfinfo, char buf[32], guint32 value); static const char* hfinfo_uint64_format(const header_field_info *hfinfo); static const char* hfinfo_int64_format(const header_field_info *hfinfo); -static const char* hfinfo_numeric_value_format(const header_field_info *hfinfo); static proto_item * proto_tree_add_node(proto_tree *tree, field_info *fi); @@ -3748,6 +3748,9 @@ proto_custom_set(proto_tree* tree, const int field_id, gint occurrence, header_field_info* hfinfo; const gchar *abbrev = NULL; + char number_buf[32]; + const char *number_out; + g_assert(field_id >= 0); hfinfo = proto_registrar_get_nth((guint)field_id); @@ -3884,21 +3887,18 @@ proto_custom_set(proto_tree* tree, const int field_id, gint occurrence, g_snprintf(result+offset_r, size-offset_r, "%u", u_integer); } else { - char buf[32]; - const char *out; - - out = hfinfo_number_value_format(hfinfo, buf, u_integer); + number_out = hfinfo_number_value_format(hfinfo, number_buf, u_integer); - g_strlcpy(result+offset_r, out, size-offset_r); + g_strlcpy(result+offset_r, number_out, size-offset_r); } if (hfinfo->strings && (hfinfo->display & BASE_DISPLAY_E_MASK) == BASE_NONE) { g_snprintf(expr+offset_e, size-offset_e, "\"%s\"", result+offset_r); } else { - g_snprintf(expr+offset_e, size-offset_e, - hfinfo_numeric_value_format(hfinfo), - u_integer); + number_out = hfinfo_numeric_value_format(hfinfo, number_buf, u_integer); + + g_strlcpy(expr+offset_e, number_out, size-offset_e); } offset_r = (int)strlen(result); @@ -3946,20 +3946,17 @@ proto_custom_set(proto_tree* tree, const int field_id, gint occurrence, g_snprintf(result+offset_r, size-offset_r, "%d", integer); } else { - char buf[32]; - const char *out; + number_out = hfinfo_number_value_format(hfinfo, number_buf, integer); - out = hfinfo_number_value_format(hfinfo, buf, integer); - - g_strlcpy(result+offset_r, out, size-offset_r); + g_strlcpy(result+offset_r, number_out, size-offset_r); } if (hfinfo->strings && (hfinfo->display & BASE_DISPLAY_E_MASK) == BASE_NONE) { g_snprintf(expr+offset_e, size-offset_e, "\"%s\"", result+offset_r); } else { - g_snprintf(expr+offset_e, size-offset_e, - hfinfo_numeric_value_format(hfinfo), - integer); + number_out = hfinfo_numeric_value_format(hfinfo, number_buf, (guint32) integer); + + g_strlcpy(expr+offset_e, number_out, size-offset_e); } offset_r = (int)strlen(result); @@ -5753,17 +5750,47 @@ _hfinfo_number_value_format(const header_field_info *hfinfo, int display, char b static const char * hfinfo_number_value_format(const header_field_info *hfinfo, char buf[32], guint32 value) { + int display = hfinfo->display; + if (hfinfo->type == FT_FRAMENUM) { - char *ptr = &buf[31]; + /* + * Frame numbers are always displayed in decimal. + */ + display = BASE_DEC; + } + + return _hfinfo_number_value_format(hfinfo, display, buf, value); +} + +static const char * +hfinfo_numeric_value_format(const header_field_info *hfinfo, char buf[32], guint32 value) +{ + /* Get the underlying BASE_ value */ + int display = hfinfo->display & BASE_DISPLAY_E_MASK; - *ptr = '\0'; + if (hfinfo->type == FT_FRAMENUM) { /* * Frame numbers are always displayed in decimal. */ - return uint_to_str_back(ptr, value); + display = BASE_DEC; } - return _hfinfo_number_value_format(hfinfo, hfinfo->display, buf, value); + switch (display) { + case BASE_NONE: + /* case BASE_DEC: */ + case BASE_DEC_HEX: + case BASE_OCT: /* XXX, why we're changing BASE_OCT to BASE_DEC? */ + case BASE_CUSTOM: + display = BASE_DEC; + break; + + /* case BASE_HEX: */ + case BASE_HEX_DEC: + display = BASE_HEX; + break; + } + + return _hfinfo_number_value_format(hfinfo, display, buf, value); } static const char * @@ -6417,13 +6444,6 @@ hfinfo_numeric_format(const header_field_info *hfinfo) { const char *format = NULL; - /* Pick the proper format string */ - if (hfinfo->type == FT_FRAMENUM) { - /* - * Frame numbers are always displayed in decimal. - */ - format = "%s == %u"; - } else { /* Get the underlying BASE_ value */ switch (hfinfo->display & BASE_DISPLAY_E_MASK) { case BASE_DEC: @@ -6431,21 +6451,9 @@ hfinfo_numeric_format(const header_field_info *hfinfo) case BASE_OCT: /* I'm lazy */ case BASE_CUSTOM: switch (hfinfo->type) { - case FT_UINT8: - case FT_UINT16: - case FT_UINT24: - case FT_UINT32: - format = "%s == %u"; - break; case FT_UINT64: format = "%s == %" G_GINT64_MODIFIER "u"; break; - case FT_INT8: - case FT_INT16: - case FT_INT24: - case FT_INT32: - format = "%s == %d"; - break; case FT_INT64: format = "%s == %" G_GINT64_MODIFIER "d"; break; @@ -6457,22 +6465,6 @@ hfinfo_numeric_format(const header_field_info *hfinfo) case BASE_HEX: case BASE_HEX_DEC: switch (hfinfo->type) { - case FT_UINT8: - case FT_INT8: - format = "%s == 0x%02x"; - break; - case FT_UINT16: - case FT_INT16: - format = "%s == 0x%04x"; - break; - case FT_UINT24: - case FT_INT24: - format = "%s == 0x%06x"; - break; - case FT_UINT32: - case FT_INT32: - format = "%s == 0x%08x"; - break; case FT_UINT64: case FT_INT64: format = "%s == 0x%016" G_GINT64_MODIFIER "x"; @@ -6486,86 +6478,6 @@ hfinfo_numeric_format(const header_field_info *hfinfo) DISSECTOR_ASSERT_NOT_REACHED(); ; } - } - return format; -} - -static const char * -hfinfo_numeric_value_format(const header_field_info *hfinfo) -{ - const char *format = NULL; - - /* Pick the proper format string */ - if (hfinfo->type == FT_FRAMENUM) { - /* - * Frame numbers are always displayed in decimal. - */ - format = "%u"; - } else { - /* Get the underlying BASE_ value */ - switch (hfinfo->display & BASE_DISPLAY_E_MASK) { - case BASE_NONE: - case BASE_DEC: - case BASE_DEC_HEX: - case BASE_OCT: /* I'm lazy */ - case BASE_CUSTOM: - switch (hfinfo->type) { - case FT_UINT8: - case FT_UINT16: - case FT_UINT24: - case FT_UINT32: - format = "%u"; - break; - case FT_UINT64: - format = "%" G_GINT64_MODIFIER "u"; - break; - case FT_INT8: - case FT_INT16: - case FT_INT24: - case FT_INT32: - format = "%d"; - break; - case FT_INT64: - format = "%" G_GINT64_MODIFIER "d"; - break; - default: - DISSECTOR_ASSERT_NOT_REACHED(); - ; - } - break; - case BASE_HEX: - case BASE_HEX_DEC: - switch (hfinfo->type) { - case FT_UINT8: - case FT_INT8: - format = "0x%02x"; - break; - case FT_UINT16: - case FT_INT16: - format = "0x%04x"; - break; - case FT_UINT24: - case FT_INT24: - format = "0x%06x"; - break; - case FT_UINT32: - case FT_INT32: - format = "0x%08x"; - break; - case FT_UINT64: - case FT_INT64: - format = "0x%016" G_GINT64_MODIFIER "x"; - break; - default: - DISSECTOR_ASSERT_NOT_REACHED(); - ; - } - break; - default: - DISSECTOR_ASSERT_NOT_REACHED(); - ; - } - } return format; } @@ -6585,7 +6497,6 @@ construct_match_selected_string(field_info *finfo, epan_dissect_t *edt, int abbrev_len; char *ptr; int buf_len; - const char *format; int dfilter_len, i; gint start, length, length_remaining; guint8 c; @@ -6659,34 +6570,29 @@ construct_match_selected_string(field_info *finfo, epan_dissect_t *edt, case FT_UINT16: case FT_UINT24: case FT_UINT32: - if (filter != NULL) { - format = hfinfo_numeric_format(hfinfo); - if (is_signed_num) { - *filter = ep_strdup_printf(format, - hfinfo->abbrev, - fvalue_get_sinteger(&finfo->value)); - } else { - *filter = ep_strdup_printf(format, - hfinfo->abbrev, - fvalue_get_uinteger(&finfo->value)); - } - } - break; - case FT_FRAMENUM: - DISSECTOR_ASSERT(!is_signed_num); if (filter != NULL) { - format = hfinfo_numeric_format(hfinfo); - *filter = ep_strdup_printf(format, - hfinfo->abbrev, - fvalue_get_uinteger(&finfo->value)); + guint32 number; + + char buf[32]; + const char *out; + + if (is_signed_num) + number = fvalue_get_sinteger(&finfo->value); + else + number = fvalue_get_uinteger(&finfo->value); + + out = hfinfo_numeric_value_format(hfinfo, buf, number); + + *filter = ep_strdup_printf("%s == %s", hfinfo->abbrev, out); } break; case FT_INT64: case FT_UINT64: if (filter != NULL) { - format = hfinfo_numeric_format(hfinfo); + const char *format = hfinfo_numeric_format(hfinfo); + *filter = ep_strdup_printf(format, hfinfo->abbrev, fvalue_get_integer64(&finfo->value)); |