Wireshark-dev: [Wireshark-dev] [PATCH] proto_tree_add_item and range_string
From: Sebastien Tandel <sebastien@xxxxxxxxx>
Date: Tue, 16 Jan 2007 20:53:45 +0100
Hi, Here is an updated patch for proto_tree_add_item and the range_string structure. The new macro RVALS() can be used as the macro VALS() in the declaration of your hf_register_info with another structure (range_string). Be aware that you *have to* ORed the value of the field display with BASE_RANGE_STRING constant and it can 'only' be used with FT_(U)INT* types in a header_field_info. static const range_string rs_value[] = { { 0, 49, "Little" }, { 50, 99, "Some" }, {100,199, "Considerable" }, {200,255, "High" }, { 0, 0, NULL } }; proto_tree_add_item(tree, hf_proto_value, tvb, offset, 1, FALSE); static hf_register_info hf[] = { { &hf_proto_value, { "Value", "proto.value", FT_UINT8, BASE_RANGE_STRING | BASE_DEC, RVALS(&rs_value), 0x0, "How much is it worth", HFILL }} }; + Frame + Ethernet II + IP + TCP + Proto Value: High (220) Regards, Sebastien Tandel
Index: epan/proto.c =================================================================== --- epan/proto.c (révision 20453) +++ epan/proto.c (copie de travail) @@ -4023,9 +4023,15 @@ value = fvalue_get_integer(&fi->value); /* Fill in the textual info */ - ret = g_snprintf(label_str, ITEM_LABEL_LENGTH, + if (hfinfo->display & BASE_RANGE_STRING) { + ret = g_snprintf(label_str, ITEM_LABEL_LENGTH, format, hfinfo->name, + rval_to_str(value, hfinfo->strings, "Unknown"), value); + } else { + ret = g_snprintf(label_str, ITEM_LABEL_LENGTH, + format, hfinfo->name, val_to_str(value, cVALS(hfinfo->strings), "Unknown"), value); + } if ((ret == -1) || (ret >= ITEM_LABEL_LENGTH)) label_str[ITEM_LABEL_LENGTH - 1] = '\0'; } @@ -4091,9 +4097,15 @@ value = fvalue_get_integer(&fi->value); /* Fill in the textual info */ - ret = g_snprintf(label_str, ITEM_LABEL_LENGTH, + if (hfinfo->display & BASE_RANGE_STRING) { + ret = g_snprintf(label_str, ITEM_LABEL_LENGTH, format, hfinfo->name, + rval_to_str(value, hfinfo->strings, "Unknown"), value); + } else { + ret = g_snprintf(label_str, ITEM_LABEL_LENGTH, + format, hfinfo->name, val_to_str(value, cVALS(hfinfo->strings), "Unknown"), value); + } if ((ret == -1) || (ret >= ITEM_LABEL_LENGTH)) label_str[ITEM_LABEL_LENGTH - 1] = '\0'; } @@ -4187,7 +4199,9 @@ { const char *format = NULL; - switch(hfinfo->display) { + /* bit operation to reset the potential BASE_RANGE_STRING (or others in + * the future?) */ + switch(hfinfo->display & BASE_STRUCTURE_RESET) { case BASE_DEC: case BASE_DEC_HEX: format = "%s: %s (%u)"; @@ -4311,7 +4325,9 @@ { const char *format = NULL; - switch(hfinfo->display) { + /* bit operation to reset the potential BASE_RANGE_STRING (or others in + * the future?)*/ + switch(hfinfo->display & BASE_STRUCTURE_RESET) { case BASE_DEC: case BASE_DEC_HEX: format = "%s: %s (%d)"; Index: epan/proto.h =================================================================== --- epan/proto.h (révision 20453) +++ epan/proto.h (copie de travail) @@ -65,6 +65,10 @@ /** Make a const true_false_string[] look like a _true_false_string pointer, used to set header_field_info.strings */ #define TFS(x) (const struct true_false_string*)(x) +/** Make a const value_string[] look like a _value_string pointer, used to set + * header_field_info.strings */ +#define RVALS(x) (const struct _value_string*)(x) + struct _protocol; /** Structure for information about a protocol */ @@ -129,6 +133,14 @@ ep_strdup_printf("%s:%u: failed assertion \"%s\"", \ file, lineno, __DISSECTOR_ASSERT_STRINGIFY(expression)))) +/* BASE_STRUCTURE_RESET constant is used in proto.c to reset the bits + * identifying special structures used in translation of value for display. + * Its value means that we may have at most 16 base_display_e values */ +#define BASE_STRUCTURE_RESET 0x0F +/* Following constants have to be ORed with a base_display_e when dissector + * want to use specials MACROs (for the moment, only RVALS) for a + * header_field_info */ +#define BASE_RANGE_STRING 0x10 /** radix for decimal values, used in header_field_info.display */ typedef enum { BASE_NONE, /**< none */
- Prev by Date: Re: [Wireshark-dev] Define dissector port
- Next by Date: [Wireshark-dev] [PATCH] new dissector : Homeplug
- Previous by thread: [Wireshark-dev] GUI update interval
- Next by thread: [Wireshark-dev] [PATCH] new dissector : Homeplug
- Index(es):