From 80f16015e2af296fb5ab8f676979bfed9731171f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Valverde?= Date: Thu, 21 Jul 2022 12:44:49 +0100 Subject: [PATCH] epan: Refactor floating point display types Remove the redundant BASE_FLOAT field display type. The name BASE_FLOAT is meaningless and the value aliased to BASE_NONE. Require BASE_NONE instead of BASE_FLOAT (corresponding to the printf() %g format). Add new float display types using BASE_DEC, BASE_HEX and BASE_EXP corresponfing to %f, %a and %e respectively. Add support for BASE_CUSTOM with floats. --- doc/README.dissector | 6 + docbook/release-notes.adoc | 4 + epan/dissectors/packet-btatt.c | 48 ++++---- epan/dissectors/packet-ieee802154.c | 8 +- epan/dissectors/packet-someip.c | 4 +- epan/dissectors/packet-woww.c | 22 ++-- epan/introspection-enums.c | 2 +- epan/proto.c | 140 ++++++++++++---------- epan/proto.h | 20 ++-- plugins/epan/profinet/packet-pn-rtc-one.c | 2 +- 10 files changed, 143 insertions(+), 113 deletions(-) diff --git a/doc/README.dissector b/doc/README.dissector index 73c7d7af05..cf1f0b7b78 100644 --- a/doc/README.dissector +++ b/doc/README.dissector @@ -162,6 +162,12 @@ FIELDDISPLAY --For FT_UINT{8,16,24,32,40,48,56,64} and BASE_NONE can be used in the same way as with FT_UINT8. + --For FT_FLOAT, FT_DOUBLE: + BASE_NONE, BASE_DEC, BASE_HEX, BASE_EXP or BASE_CUSTOM. + + BASE_NONE uses BASE_DEC or BASE_EXP, similarly to the + %g double format for the printf() function. + --For FT_ABSOLUTE_TIME: ABSOLUTE_TIME_LOCAL, ABSOLUTE_TIME_UTC, or diff --git a/docbook/release-notes.adoc b/docbook/release-notes.adoc index f219149412..52a340ec66 100644 --- a/docbook/release-notes.adoc +++ b/docbook/release-notes.adoc @@ -281,6 +281,10 @@ Too many protocols have been updated to list here. * proto.h: The field display types "STR_ASCII" and "STR_UNICODE" have been removed. Use "BASE_NONE" instead. +* proto.h: The field display types for floats have been extended and refactored. + The type BASE_FLOAT has been removed. Use BASE_NONE instead. New display + types for floats are BASE_DEC, BASE_HEX, BASE_EXP and BASE_CUSTOM. + == Getting Wireshark Wireshark source code and installation packages are available from diff --git a/epan/dissectors/packet-btatt.c b/epan/dissectors/packet-btatt.c index b75d998d4f..43d57e2ef8 100644 --- a/epan/dissectors/packet-btatt.c +++ b/epan/dissectors/packet-btatt.c @@ -13931,12 +13931,12 @@ proto_register_btatt(void) }, {&hf_btatt_glucose_measurement_glucose_concentration_kg_per_l, {"Glucose Concentration [kg/l]", "btatt.glucose_measurement.glucose_concentration.kg_per_l", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_glucose_measurement_glucose_concentration_mol_per_l, {"Glucose Concentration [mol/l]", "btatt.glucose_measurement.glucose_concentration.mol_per_l", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_glucose_measurement_type_and_sample_location, @@ -14186,12 +14186,12 @@ proto_register_btatt(void) }, {&hf_btatt_temperature_measurement_value_celsius, {"Value [Celsius]", "btatt.temperature_measurement.value.celsius", - FT_IEEE_11073_FLOAT, BASE_FLOAT, NULL, 0x00, + FT_IEEE_11073_FLOAT, BASE_NONE, NULL, 0x00, NULL, HFILL} }, {&hf_btatt_temperature_measurement_value_fahrenheit, {"Value [Fahrenheit]", "btatt.temperature_measurement.value.fahrenheit", - FT_IEEE_11073_FLOAT, BASE_FLOAT, NULL, 0x00, + FT_IEEE_11073_FLOAT, BASE_NONE, NULL, 0x00, NULL, HFILL} }, {&hf_btatt_temperature_measurement_timestamp, @@ -14266,7 +14266,7 @@ proto_register_btatt(void) }, {&hf_btatt_glucose_measurement_context_carbohydrate_kg, {"Carbohydrate [kg]", "btatt.glucose_measurement_context.carbohydrate.kg", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_glucose_measurement_context_meal, @@ -14306,17 +14306,17 @@ proto_register_btatt(void) }, {&hf_btatt_glucose_measurement_context_medication_l, {"Medication [l]", "btatt.glucose_measurement_context.medication.l", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_glucose_measurement_context_medication_kg, {"Medication [kg]", "btatt.glucose_measurement_context.medication.kg", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_glucose_measurement_context_hba1c, {"HbA1c", "btatt.glucose_measurement_context.hba1c", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_blood_pressure_measurement_flags, @@ -14356,32 +14356,32 @@ proto_register_btatt(void) }, {&hf_btatt_blood_pressure_measurement_compound_value_systolic_kpa, {"Systolic [kPa]", "btatt.blood_pressure_measurement.compound_value.systolic.kpa", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_blood_pressure_measurement_compound_value_diastolic_kpa, {"Diastolic [kPa]", "btatt.blood_pressure_measurement.compound_value.diastolic.kpa", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_blood_pressure_measurement_compound_value_mean_arterial_pressure_kpa, {"Arterial Pressure [kPa]", "btatt.blood_pressure_measurement.compound_value.arterial_pressure.kpa", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_blood_pressure_measurement_compound_value_systolic_mmhg, {"Systolic [mmHg]", "btatt.blood_pressure_measurement.compound_value.systolic.mmhg", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_blood_pressure_measurement_compound_value_diastolic_mmhg, {"Diastolic [mmHg]", "btatt.blood_pressure_measurement.compound_value.diastolic.mmhg", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_blood_pressure_measurement_compound_value_mean_arterial_pressure_mmhg, {"Arterial Pressure [mmHg]", "btatt.blood_pressure_measurement.compound_value.arterial_pressure.mmhg", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_blood_pressure_measurement_timestamp, @@ -14391,7 +14391,7 @@ proto_register_btatt(void) }, {&hf_btatt_blood_pressure_measurement_pulse_rate, {"Pulse Rate", "btatt.blood_pressure_measurement.pulse_rate", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_blood_pressure_measurement_user_id, @@ -15798,7 +15798,7 @@ proto_register_btatt(void) }, {&hf_btatt_cgm_measurement_glucose_concentration, {"Glucose Concentration", "btatt.cgm_measurement.glucose_concentration", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_cgm_measurement_time_offset, @@ -15938,12 +15938,12 @@ proto_register_btatt(void) }, {&hf_btatt_cgm_measurement_trend_information, {"Trend Information", "btatt.cgm_measurement.trend_information", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_cgm_measurement_quality, {"Quality", "btatt.cgm_measurement.quality", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_cgm_e2e_crc, @@ -16098,7 +16098,7 @@ proto_register_btatt(void) }, {&hf_btatt_cgm_specific_ops_control_point_calibration_glucose_concentration, {"Calibration Glucose Concentration", "btatt.cgm_specific_ops_control_point.operand.calibration_glucose_concentration", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_cgm_specific_ops_control_point_calibration_time, @@ -16148,12 +16148,12 @@ proto_register_btatt(void) }, {&hf_btatt_cgm_specific_ops_control_point_operand_alert_level, {"Alert Level [mg/dL]", "btatt.cgm_specific_ops_control_point.operand.alert_level", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_cgm_specific_ops_control_point_operand_alert_level_rate, {"Alert Level Rate [mg/dL/min]", "btatt.cgm_specific_ops_control_point.operand.alert_level_rate", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_cgm_specific_ops_control_point_request_opcode, @@ -16573,12 +16573,12 @@ proto_register_btatt(void) }, {&hf_btatt_plx_spo2, {"SpO2", "btatt.plxs.spot_check_measurement.spo2", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_plx_pulse_rate, {"Pulse Rate", "btatt.plxs.spot_check_measurement.pulse_rate", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_plx_spot_check_measurement_timestamp, @@ -16743,7 +16743,7 @@ proto_register_btatt(void) }, {&hf_btatt_plx_pulse_amplitude_index, {"Pulse Amplitude Index", "btatt.plxs.spot_check_measurement.pulse_amplitude_index", - FT_IEEE_11073_SFLOAT, BASE_FLOAT, NULL, 0x0, + FT_IEEE_11073_SFLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_btatt_plx_spo2pr_spot_check, diff --git a/epan/dissectors/packet-ieee802154.c b/epan/dissectors/packet-ieee802154.c index 5c4815a745..8536d62bb5 100644 --- a/epan/dissectors/packet-ieee802154.c +++ b/epan/dissectors/packet-ieee802154.c @@ -6618,7 +6618,7 @@ void proto_register_ieee802154(void) NULL, HFILL }}, { &hf_ieee802154_tap_rss, - { "RSS", "wpan-tap.rss", FT_FLOAT, BASE_FLOAT|BASE_UNIT_STRING, &units_dbm, 0x0, + { "RSS", "wpan-tap.rss", FT_FLOAT, BASE_NONE|BASE_UNIT_STRING, &units_dbm, 0x0, NULL, HFILL }}, { &hf_ieee802154_ch_num, @@ -6690,11 +6690,11 @@ void proto_register_ieee802154(void) NULL, HFILL }}, { &hf_ieee802154_chplan_start, - { "Channel0 freq", "wpan-tap.chplan.start", FT_FLOAT, BASE_FLOAT|BASE_UNIT_STRING, &units_khz, 0x0, + { "Channel0 freq", "wpan-tap.chplan.start", FT_FLOAT, BASE_NONE|BASE_UNIT_STRING, &units_khz, 0x0, "Channel 0 center frequency", HFILL }}, { &hf_ieee802154_chplan_spacing, - { "Spacing", "wpan-tap.chplan.spacing", FT_FLOAT, BASE_FLOAT|BASE_UNIT_STRING, &units_khz, 0x0, + { "Spacing", "wpan-tap.chplan.spacing", FT_FLOAT, BASE_NONE|BASE_UNIT_STRING, &units_khz, 0x0, "Channel spacing", HFILL }}, { &hf_ieee802154_chplan_channels, @@ -6702,7 +6702,7 @@ void proto_register_ieee802154(void) "Number of channels", HFILL }}, { &hf_ieee802154_ch_freq, - { "Frequency", "wpan-tap.ch_freq", FT_FLOAT, BASE_FLOAT|BASE_UNIT_STRING, &units_khz, 0x0, + { "Frequency", "wpan-tap.ch_freq", FT_FLOAT, BASE_NONE|BASE_UNIT_STRING, &units_khz, 0x0, "Channel center frequency", HFILL }}, { &hf_ieee802154_frame_start_offset, diff --git a/epan/dissectors/packet-someip.c b/epan/dissectors/packet-someip.c index 7e56fe7497..2e131e86f9 100644 --- a/epan/dissectors/packet-someip.c +++ b/epan/dissectors/packet-someip.c @@ -2319,10 +2319,10 @@ get_param_attributes(guint8 data_type, guint32 id_ref) { ret.type = FT_INT64; } else if (g_strcmp0(tmp->data_type, "float32") == 0) { ret.type = FT_FLOAT; - ret.display_base = BASE_FLOAT; + ret.display_base = BASE_NONE; } else if (g_strcmp0(tmp->data_type, "float64") == 0) { ret.type = FT_DOUBLE; - ret.display_base = BASE_FLOAT; + ret.display_base = BASE_NONE; } else { ret.type = FT_NONE; } diff --git a/epan/dissectors/packet-woww.c b/epan/dissectors/packet-woww.c index 444a377d89..786ab0b2d4 100644 --- a/epan/dissectors/packet-woww.c +++ b/epan/dissectors/packet-woww.c @@ -5128,22 +5128,22 @@ proto_register_woww(void) }, { &hf_woww_character_position_x, { "Position X", "woww.character.position.x", - FT_FLOAT, BASE_FLOAT, NULL, 0, + FT_FLOAT, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_woww_character_position_y, { "Position Y", "woww.character.position.y", - FT_FLOAT, BASE_FLOAT, NULL, 0, + FT_FLOAT, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_woww_character_position_z, { "Position Z", "woww.character.position.z", - FT_FLOAT, BASE_FLOAT, NULL, 0, + FT_FLOAT, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_woww_character_orientation, { "Orientation", "woww.character.orientation", - FT_FLOAT, BASE_FLOAT, NULL, 0, + FT_FLOAT, BASE_NONE, NULL, 0, "Heading in degrees, with 0 being north", HFILL } }, { &hf_woww_character_guild_id, @@ -5213,37 +5213,37 @@ proto_register_woww(void) }, { &hf_woww_movement_swim_pitch, { "Swim Pitch", "woww.movement.swim_pitch", - FT_FLOAT, BASE_FLOAT, NULL, 0, + FT_FLOAT, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_woww_movement_fallen_time, { "Fallen Time", "woww.movement.fallen_time", - FT_FLOAT, BASE_FLOAT, NULL, 0, + FT_FLOAT, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_woww_movement_jump_velocity, { "Jump Velocity", "woww.movement.jump.velocity", - FT_FLOAT, BASE_FLOAT, NULL, 0, + FT_FLOAT, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_woww_movement_jump_cos_anchor_pitch, { "Jump Cos Anchor", "woww.movement.jump.cos_anchor", - FT_FLOAT, BASE_FLOAT, NULL, 0, + FT_FLOAT, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_woww_movement_jump_sin_anchor_pitch, { "Jump Sin Anchor", "woww.movement.jump.sin_anchor", - FT_FLOAT, BASE_FLOAT, NULL, 0, + FT_FLOAT, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_woww_movement_jump_current_speed, { "Jump Current Speed", "woww.movement.jump.current_speed", - FT_FLOAT, BASE_FLOAT, NULL, 0, + FT_FLOAT, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_woww_movement_fall_start_elevation, { "Fall Start Elevation", "woww.movement.fall.start_elevation", - FT_FLOAT, BASE_FLOAT, NULL, 0, + FT_FLOAT, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_woww_timestamp, diff --git a/epan/introspection-enums.c b/epan/introspection-enums.c index cb6d996b8d..7742ca2bad 100644 --- a/epan/introspection-enums.c +++ b/epan/introspection-enums.c @@ -44,8 +44,8 @@ static ws_enum_t all_enums[] = { ENUM(BASE_CUSTOM), ENUM(BASE_DEC), ENUM(BASE_DEC_HEX), + ENUM(BASE_EXP), ENUM(BASE_EXT_STRING), - ENUM(BASE_FLOAT), ENUM(BASE_HEX), ENUM(BASE_HEX_DEC), ENUM(BASE_NETMASK), diff --git a/epan/proto.c b/epan/proto.c index d315e68732..2596556579 100644 --- a/epan/proto.c +++ b/epan/proto.c @@ -230,6 +230,9 @@ static void fill_label_char(field_info *fi, gchar *label_str); static void fill_label_number(field_info *fi, gchar *label_str, gboolean is_signed); static void fill_label_number64(field_info *fi, gchar *label_str, gboolean is_signed); +static size_t fill_display_label_float(field_info *fi, gchar *label_str); +static void fill_label_float(field_info *fi, gchar *label_str); + static const char *hfinfo_char_value_format_display(int display, char buf[7], guint32 value); static const char *hfinfo_number_value_format_display(const header_field_info *hfinfo, int display, char buf[32], guint32 value); static const char *hfinfo_number_value_format_display64(const header_field_info *hfinfo, int display, char buf[48], guint64 value); @@ -6679,29 +6682,8 @@ proto_item_fill_display_label(field_info *finfo, gchar *display_label_str, const break; case FT_FLOAT: - if (hfinfo->display & BASE_UNIT_STRING) { - double d_value = fvalue_get_floating(&finfo->value); - snprintf(display_label_str, label_str_size, - "%." G_STRINGIFY(FLT_DIG) "g%s", d_value, - unit_name_string_get_double(d_value, (const unit_name_string*)hfinfo->strings)); - } else { - snprintf(display_label_str, label_str_size, - "%." G_STRINGIFY(FLT_DIG) "g", fvalue_get_floating(&finfo->value)); - } - label_len = (int)strlen(display_label_str); - break; - case FT_DOUBLE: - if (hfinfo->display & BASE_UNIT_STRING) { - double d_value = fvalue_get_floating(&finfo->value); - snprintf(display_label_str, label_str_size, - "%." G_STRINGIFY(DBL_DIG) "g%s", d_value, - unit_name_string_get_double(d_value, (const unit_name_string*)hfinfo->strings)); - } else { - snprintf(display_label_str, label_str_size, - "%." G_STRINGIFY(DBL_DIG) "g", fvalue_get_floating(&finfo->value)); - } - label_len = (int)strlen(display_label_str); + label_len = (int)fill_display_label_float(finfo, display_label_str); break; case FT_STRING: @@ -8306,7 +8288,6 @@ static const value_string hf_display[] = { { BASE_DEC_HEX|BASE_VAL64_STRING, "BASE_DEC_HEX|BASE_VAL64_STRING" }, { BASE_HEX_DEC|BASE_VAL64_STRING, "BASE_HEX_DEC|BASE_VAL64_STRING" }, { BASE_CUSTOM|BASE_VAL64_STRING, "BASE_CUSTOM|BASE_VAL64_STRING" }, - /* Alias: BASE_NONE { BASE_FLOAT, "BASE_FLOAT" }, */ { ABSOLUTE_TIME_LOCAL, "ABSOLUTE_TIME_LOCAL" }, { ABSOLUTE_TIME_UTC, "ABSOLUTE_TIME_UTC" }, { ABSOLUTE_TIME_DOY_UTC, "ABSOLUTE_TIME_DOY_UTC" }, @@ -8364,7 +8345,7 @@ tmp_fld_check_assert(header_field_info *hfinfo) /* These types of fields are allowed to have value_strings, * true_false_strings or a protocol_t struct */ - if (hfinfo->strings != NULL) { + if (hfinfo->strings != NULL && FIELD_DISPLAY(hfinfo->display) != BASE_CUSTOM) { switch (hfinfo->type) { /* @@ -8781,19 +8762,26 @@ tmp_fld_check_assert(header_field_info *hfinfo) break; case FT_FLOAT: case FT_DOUBLE: - if (FIELD_DISPLAY(hfinfo->display) != BASE_NONE) { - tmp_str = val_to_str_wmem(NULL, hfinfo->display, hf_display, "(Bit count: %d)"); - REPORT_DISSECTOR_BUG("Field '%s' (%s) is an %s but is being displayed as %s instead of BASE_NONE", - hfinfo->name, hfinfo->abbrev, - ftype_name(hfinfo->type), - tmp_str); - wmem_free(NULL, tmp_str); + switch (FIELD_DISPLAY(hfinfo->display)) { + case BASE_NONE: + case BASE_DEC: + case BASE_HEX: + case BASE_EXP: + case BASE_CUSTOM: + break; + default: + tmp_str = val_to_str_wmem(NULL, hfinfo->display, hf_display, "(Unknown: 0x%x)"); + REPORT_DISSECTOR_BUG("Field '%s' (%s) is a float value (%s)" + " but is being displayed as %s", + hfinfo->name, hfinfo->abbrev, + ftype_name(hfinfo->type), tmp_str); + wmem_free(NULL, tmp_str); } if (hfinfo->bitmask != 0) REPORT_DISSECTOR_BUG("Field '%s' (%s) is an %s but has a bitmask", hfinfo->name, hfinfo->abbrev, ftype_name(hfinfo->type)); - if ((hfinfo->strings != NULL) && (!(hfinfo->display & BASE_UNIT_STRING))) + if (FIELD_DISPLAY(hfinfo->display) != BASE_CUSTOM && (hfinfo->strings != NULL) && !(hfinfo->display & BASE_UNIT_STRING)) REPORT_DISSECTOR_BUG("Field '%s' (%s) is an %s but has a strings value", hfinfo->name, hfinfo->abbrev, ftype_name(hfinfo->type)); @@ -9277,36 +9265,9 @@ proto_item_fill_label(field_info *fi, gchar *label_str) break; case FT_FLOAT: - { - double d_value = fvalue_get_floating(&fi->value); - if (hfinfo->display & BASE_UNIT_STRING) { - snprintf(label_str, ITEM_LABEL_LENGTH, - "%s: %." G_STRINGIFY(FLT_DIG) "g%s", - hfinfo->name, d_value, - unit_name_string_get_double(d_value, (const unit_name_string*)hfinfo->strings)); - } else { - snprintf(label_str, ITEM_LABEL_LENGTH, - "%s: %." G_STRINGIFY(FLT_DIG) "g", - hfinfo->name, d_value); - } - break; - } - case FT_DOUBLE: - { - double d_value = fvalue_get_floating(&fi->value); - if (hfinfo->display & BASE_UNIT_STRING) { - snprintf(label_str, ITEM_LABEL_LENGTH, - "%s: %." G_STRINGIFY(DBL_DIG) "g%s", - hfinfo->name, d_value, - unit_name_string_get_double(d_value, (const unit_name_string*)hfinfo->strings)); - } else { - snprintf(label_str, ITEM_LABEL_LENGTH, - "%s: %." G_STRINGIFY(DBL_DIG) "g", - hfinfo->name, d_value); - } + fill_label_float(fi, label_str); break; - } case FT_ABSOLUTE_TIME: tmp = abs_time_to_str(NULL, fvalue_get_time(&fi->value), hfinfo->display, TRUE); @@ -9939,6 +9900,65 @@ fill_label_number64(field_info *fi, gchar *label_str, gboolean is_signed) } } +static size_t +fill_display_label_float(field_info *fi, gchar *label_str) +{ + int display; + int digits; + int n; + double value; + + display = FIELD_DISPLAY(fi->hfinfo->display); + value = fvalue_get_floating(&fi->value); + + if (display == BASE_CUSTOM) { + const custom_fmt_func_double_t fmtfunc = (const custom_fmt_func_double_t)fi->hfinfo->strings; + DISSECTOR_ASSERT(fmtfunc); + fmtfunc(label_str, value); + return strlen(label_str); + } + + switch (display) { + case BASE_NONE: + if (fi->hfinfo->type == FT_FLOAT) + digits = FLT_DIG; + else + digits = DBL_DIG; + + n = snprintf(label_str, ITEM_LABEL_LENGTH, "%.*g", digits, value); + break; + case BASE_DEC: + n = snprintf(label_str, ITEM_LABEL_LENGTH, "%f", value); + break; + case BASE_HEX: + n = snprintf(label_str, ITEM_LABEL_LENGTH, "%a", value); + break; + case BASE_EXP: + n = snprintf(label_str, ITEM_LABEL_LENGTH, "%e", value); + break; + default: + ws_assert_not_reached(); + } + if (n < 0) { + return 0; /* error */ + } + if (n > ITEM_LABEL_LENGTH) { + ws_warning("label length too small"); + return strlen(label_str); + } + + return n; +} + +void +fill_label_float(field_info *fi, gchar *label_str) +{ + gchar tmp[ITEM_LABEL_LENGTH]; + + fill_display_label_float(fi, tmp); + label_fill(label_str, 0, fi->hfinfo, tmp); +} + int hfinfo_bitshift(const header_field_info *hfinfo) { diff --git a/epan/proto.h b/epan/proto.h index b2323ce3a1..b6258b7b74 100644 --- a/epan/proto.h +++ b/epan/proto.h @@ -81,6 +81,8 @@ typedef void (*custom_fmt_func_t)(gchar *, guint32); typedef void (*custom_fmt_func_64_t)(gchar *, guint64); +typedef void (*custom_fmt_func_double_t)(gchar *, double); + /** Make a custom format function pointer look like a void pointer. Used to set header_field_info.strings. * * We cast to gsize first, which 1) is guaranteed to be wide enough to @@ -662,16 +664,14 @@ void proto_report_dissector_bug(const char *format, ...) typedef enum { BASE_NONE = 0, /**< none */ -/* Integral types */ - BASE_DEC = 1, /**< decimal */ - BASE_HEX = 2, /**< hexadecimal */ - BASE_OCT = 3, /**< octal */ - BASE_DEC_HEX = 4, /**< decimal (hexadecimal) */ - BASE_HEX_DEC = 5, /**< hexadecimal (decimal) */ - BASE_CUSTOM = 6, /**< call custom routine (in ->strings) to format */ - -/* Float types */ - BASE_FLOAT = BASE_NONE, /**< decimal-format float */ +/* Integral and float types */ + BASE_DEC = 1, /**< decimal [integer, float] */ + BASE_HEX = 2, /**< hexadecimal [integer, float] */ + BASE_OCT = 3, /**< octal [integer] */ + BASE_DEC_HEX = 4, /**< decimal (hexadecimal) [integer] */ + BASE_HEX_DEC = 5, /**< hexadecimal (decimal) [integer] */ + BASE_CUSTOM = 6, /**< call custom routine to format [integer, float] */ + BASE_EXP = 7, /**< exponential [float] */ /* Byte separators */ SEP_DOT = 8, /**< hexadecimal bytes with a period (.) between each byte */ diff --git a/plugins/epan/profinet/packet-pn-rtc-one.c b/plugins/epan/profinet/packet-pn-rtc-one.c index 0261188b07..668c3cc1a2 100644 --- a/plugins/epan/profinet/packet-pn-rtc-one.c +++ b/plugins/epan/profinet/packet-pn-rtc-one.c @@ -1316,7 +1316,7 @@ init_pn_io_rtc1(int proto) }, { &hf_pn_pa_profile_value_float, { "Value", "pn_io.pa.value", - FT_FLOAT, BASE_FLOAT, NULL, 0x0, + FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL } }, };