Adjust proto_tree_add_[float|double]_format_value calls to use unit string

Several calls to proto_tree_add_[float|double]_xxx could be better served
using BASE_UNIT_STRING with a "unit string" in hf_ field.

Added a few more "common" unit string values to unit_strings.[ch]

Change-Id: Id0da7b579403898d20c2667d6c4abcd59d5a48d4
Reviewed-on: https://code.wireshark.org/review/19241
Reviewed-by: Michael Mann <mmann78@netscape.net>
This commit is contained in:
Michael Mann 2016-12-12 13:22:05 -05:00
parent e150235ef1
commit a869ec6f55
10 changed files with 61 additions and 49 deletions

View File

@ -1643,9 +1643,14 @@ libwireshark.so.0 libwireshark0 #MINVER#
unit_name_string_get_value64@Base 2.3.0 unit_name_string_get_value64@Base 2.3.0
units_bit_bits@Base 2.3.0 units_bit_bits@Base 2.3.0
units_byte_bytes@Base 2.3.0 units_byte_bytes@Base 2.3.0
units_degree_degrees@Base 2.3.0
units_foot_feet@Base 2.3.0 units_foot_feet@Base 2.3.0
units_ghz@Base 2.3.0
units_hz@Base 2.3.0
units_hz_s@Base 2.3.0
units_millisecond_milliseconds@Base 2.3.0 units_millisecond_milliseconds@Base 2.3.0
units_milliseconds@Base 2.3.0 units_milliseconds@Base 2.3.0
units_nanosecond_nanoseconds@Base 2.3.0
units_second_seconds@Base 2.3.0 units_second_seconds@Base 2.3.0
units_seconds@Base 2.3.0 units_seconds@Base 2.3.0
units_word_words@Base 2.3.0 units_word_words@Base 2.3.0

View File

@ -217,15 +217,13 @@ dissect_mp4_mvhd_body(tvbuff_t *tvb, gint offset, gint len _U_,
rate = tvb_get_ntohs(tvb, offset); rate = tvb_get_ntohs(tvb, offset);
fract_dec = tvb_get_ntohs(tvb, offset+2); fract_dec = tvb_get_ntohs(tvb, offset+2);
rate += make_fract(fract_dec); rate += make_fract(fract_dec);
proto_tree_add_double_format_value(tree, hf_mp4_mvhd_rate, proto_tree_add_double(tree, hf_mp4_mvhd_rate, tvb, offset, 4, rate);
tvb, offset, 4, rate, "%f", rate);
offset += 4; offset += 4;
vol = tvb_get_guint8(tvb, offset); vol = tvb_get_guint8(tvb, offset);
fract_dec = tvb_get_guint8(tvb, offset+1); fract_dec = tvb_get_guint8(tvb, offset+1);
vol += make_fract(fract_dec); vol += make_fract(fract_dec);
proto_tree_add_double_format_value(tree, hf_mp4_mvhd_vol, proto_tree_add_double(tree, hf_mp4_mvhd_vol, tvb, offset, 4, vol);
tvb, offset, 4, vol, "%f", vol);
offset += 2; offset += 2;
offset += 2; /* 16 bits reserved */ offset += 2; /* 16 bits reserved */
@ -314,15 +312,13 @@ dissect_mp4_tkhd_body(tvbuff_t *tvb, gint offset, gint len _U_,
width = tvb_get_ntohs(tvb, offset); width = tvb_get_ntohs(tvb, offset);
fract_dec = tvb_get_ntohs(tvb, offset+2); fract_dec = tvb_get_ntohs(tvb, offset+2);
width += make_fract(fract_dec); width += make_fract(fract_dec);
proto_tree_add_double_format_value(tree, hf_mp4_tkhd_width, proto_tree_add_double(tree, hf_mp4_tkhd_width, tvb, offset, 4, width);
tvb, offset, 4, width, "%f", width);
offset += 4; offset += 4;
height = tvb_get_ntohs(tvb, offset); height = tvb_get_ntohs(tvb, offset);
fract_dec = tvb_get_ntohs(tvb, offset+2); fract_dec = tvb_get_ntohs(tvb, offset+2);
height += make_fract(fract_dec); height += make_fract(fract_dec);
proto_tree_add_double_format_value(tree, hf_mp4_tkhd_height, proto_tree_add_double(tree, hf_mp4_tkhd_height, tvb, offset, 4, height);
tvb, offset, 4, height, "%f", height);
offset += 4; offset += 4;
return offset-offset_start; return offset-offset_start;

View File

@ -386,43 +386,43 @@ dissect_png_chrm(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
gint offset = 0; gint offset = 0;
wx = tvb_get_ntohl(tvb, offset) / 100000.0f; wx = tvb_get_ntohl(tvb, offset) / 100000.0f;
proto_tree_add_float_format_value(tree, &hfi_png_chrm_white_x, proto_tree_add_float(tree, &hfi_png_chrm_white_x,
tvb, offset, 4, wx, "%f", wx); tvb, offset, 4, wx);
offset += 4; offset += 4;
wy = tvb_get_ntohl(tvb, offset) / 100000.0f; wy = tvb_get_ntohl(tvb, offset) / 100000.0f;
proto_tree_add_float_format_value(tree, &hfi_png_chrm_white_y, proto_tree_add_float(tree, &hfi_png_chrm_white_y,
tvb, offset, 4, wy, "%f", wy); tvb, offset, 4, wy);
offset += 4; offset += 4;
rx = tvb_get_ntohl(tvb, offset) / 100000.0f; rx = tvb_get_ntohl(tvb, offset) / 100000.0f;
proto_tree_add_float_format_value(tree, &hfi_png_chrm_red_x, proto_tree_add_float(tree, &hfi_png_chrm_red_x,
tvb, offset, 4, rx, "%f", rx); tvb, offset, 4, rx);
offset += 4; offset += 4;
ry = tvb_get_ntohl(tvb, offset) / 100000.0f; ry = tvb_get_ntohl(tvb, offset) / 100000.0f;
proto_tree_add_float_format_value(tree, &hfi_png_chrm_red_y, proto_tree_add_float(tree, &hfi_png_chrm_red_y,
tvb, offset, 4, ry, "%f", ry); tvb, offset, 4, ry);
offset += 4; offset += 4;
gx = tvb_get_ntohl(tvb, offset) / 100000.0f; gx = tvb_get_ntohl(tvb, offset) / 100000.0f;
proto_tree_add_float_format_value(tree, &hfi_png_chrm_green_x, proto_tree_add_float(tree, &hfi_png_chrm_green_x,
tvb, offset, 4, gx, "%f", gx); tvb, offset, 4, gx);
offset += 4; offset += 4;
gy = tvb_get_ntohl(tvb, offset) / 100000.0f; gy = tvb_get_ntohl(tvb, offset) / 100000.0f;
proto_tree_add_float_format_value(tree, &hfi_png_chrm_green_y, proto_tree_add_float(tree, &hfi_png_chrm_green_y,
tvb, offset, 4, gy, "%f", gy); tvb, offset, 4, gy);
offset += 4; offset += 4;
bx = tvb_get_ntohl(tvb, offset) / 100000.0f; bx = tvb_get_ntohl(tvb, offset) / 100000.0f;
proto_tree_add_float_format_value(tree, &hfi_png_chrm_blue_x, proto_tree_add_float(tree, &hfi_png_chrm_blue_x,
tvb, offset, 4, bx, "%f", bx); tvb, offset, 4, bx);
offset += 4; offset += 4;
by = tvb_get_ntohl(tvb, offset) / 100000.0f; by = tvb_get_ntohl(tvb, offset) / 100000.0f;
proto_tree_add_float_format_value(tree, &hfi_png_chrm_blue_y, proto_tree_add_float(tree, &hfi_png_chrm_blue_y,
tvb, offset, 4, by, "%f", by); tvb, offset, 4, by);
} }
static void static void
@ -431,8 +431,8 @@ dissect_png_gama(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
float gamma; float gamma;
gamma = tvb_get_ntohl(tvb, 0) / 100000.0f; gamma = tvb_get_ntohl(tvb, 0) / 100000.0f;
proto_tree_add_float_format_value(tree, &hfi_png_gama_gamma, proto_tree_add_float(tree, &hfi_png_gama_gamma,
tvb, 0, 4, gamma, "%f", gamma); tvb, 0, 4, gamma);
} }
static gint static gint

View File

@ -138,7 +138,7 @@ static header_field_info hfi_dbus_value_str DBUS_HFI_INIT =
{ "Value", "dbus.value.str", FT_STRING, BASE_NONE, NULL, 0x00, NULL, HFILL }; { "Value", "dbus.value.str", FT_STRING, BASE_NONE, NULL, 0x00, NULL, HFILL };
static header_field_info hfi_dbus_value_double DBUS_HFI_INIT = static header_field_info hfi_dbus_value_double DBUS_HFI_INIT =
{ "Value", "dbus.value.double", FT_DOUBLE, BASE_NONE, NULL, 0x00, NULL, HFILL }; { "DOUBLE", "dbus.value.double", FT_DOUBLE, BASE_NONE, NULL, 0x00, NULL, HFILL };
static int ett_dbus = -1; static int ett_dbus = -1;
@ -324,7 +324,7 @@ dissect_dbus_sig(tvbuff_t *tvb, dbus_info_t *dinfo, proto_tree *tree, int offset
val = dinfo->getdouble(tvb, offset); val = dinfo->getdouble(tvb, offset);
offset += 8; offset += 8;
proto_tree_add_double_format(tree, hfi_dbus_value_double.id, tvb, org_offset, offset - org_offset, val, "DOUBLE: %." G_STRINGIFY(DBL_DIG) "g", val); proto_tree_add_double(tree, hfi_dbus_value_double.id, tvb, org_offset, offset - org_offset, val);
/* XXX ret */ /* XXX ret */
return offset; return offset;
} }

View File

@ -749,14 +749,14 @@ proto_mpeg_descriptor_dissect_satellite_delivery(tvbuff_t *tvb, guint offset, pr
MPEG_SECT_BCD44_TO_DEC(tvb_get_guint8(tvb, offset+1)) / 10.0 + MPEG_SECT_BCD44_TO_DEC(tvb_get_guint8(tvb, offset+1)) / 10.0 +
MPEG_SECT_BCD44_TO_DEC(tvb_get_guint8(tvb, offset+2)) / 1000.0 + MPEG_SECT_BCD44_TO_DEC(tvb_get_guint8(tvb, offset+2)) / 1000.0 +
MPEG_SECT_BCD44_TO_DEC(tvb_get_guint8(tvb, offset+3)) / 100000.0; MPEG_SECT_BCD44_TO_DEC(tvb_get_guint8(tvb, offset+3)) / 100000.0;
proto_tree_add_double_format_value(tree, hf_mpeg_descr_satellite_delivery_frequency, proto_tree_add_double(tree, hf_mpeg_descr_satellite_delivery_frequency,
tvb, offset, 4, frequency, "%f GHz", frequency); tvb, offset, 4, frequency);
offset += 4; offset += 4;
orbital_position = MPEG_SECT_BCD44_TO_DEC(tvb_get_guint8(tvb, offset)) * 10.0f + orbital_position = MPEG_SECT_BCD44_TO_DEC(tvb_get_guint8(tvb, offset)) * 10.0f +
MPEG_SECT_BCD44_TO_DEC(tvb_get_guint8(tvb, offset+1)) / 10.0f; MPEG_SECT_BCD44_TO_DEC(tvb_get_guint8(tvb, offset+1)) / 10.0f;
proto_tree_add_float_format_value(tree, hf_mpeg_descr_satellite_delivery_orbital_position, proto_tree_add_float(tree, hf_mpeg_descr_satellite_delivery_orbital_position,
tvb, offset, 2, orbital_position, "%f degrees", orbital_position); tvb, offset, 2, orbital_position);
offset += 2; offset += 2;
modulation_system = tvb_get_guint8(tvb, offset) & MPEG_DESCR_SATELLITE_DELIVERY_MODULATION_SYSTEM_MASK; modulation_system = tvb_get_guint8(tvb, offset) & MPEG_DESCR_SATELLITE_DELIVERY_MODULATION_SYSTEM_MASK;
@ -3481,12 +3481,12 @@ proto_register_mpeg_descriptor(void)
/* 0x43 Satellite Delivery System Descriptor */ /* 0x43 Satellite Delivery System Descriptor */
{ &hf_mpeg_descr_satellite_delivery_frequency, { { &hf_mpeg_descr_satellite_delivery_frequency, {
"Frequency", "mpeg_descr.sat_delivery.freq", "Frequency", "mpeg_descr.sat_delivery.freq",
FT_DOUBLE, BASE_NONE, NULL, 0, NULL, HFILL FT_DOUBLE, BASE_NONE|BASE_UNIT_STRING, &units_ghz, 0, NULL, HFILL
} }, } },
{ &hf_mpeg_descr_satellite_delivery_orbital_position, { { &hf_mpeg_descr_satellite_delivery_orbital_position, {
"Orbital Position", "mpeg_descr.sat_delivery.orbital_pos", "Orbital Position", "mpeg_descr.sat_delivery.orbital_pos",
FT_FLOAT, BASE_NONE, NULL, 0, NULL, HFILL FT_FLOAT, BASE_NONE|BASE_UNIT_STRING, &units_degree_degrees, 0, NULL, HFILL
} }, } },
{ &hf_mpeg_descr_satellite_delivery_west_east_flag, { { &hf_mpeg_descr_satellite_delivery_west_east_flag, {

View File

@ -2403,9 +2403,8 @@ dissect_ptp_v2_timeInterval(tvbuff_t *tvb, guint16 *cur_offset, proto_tree *tree
proto_tree_add_uint64_format_value(ptptimeInterval_subtree, proto_tree_add_uint64_format_value(ptptimeInterval_subtree,
hf_ptp_v2_timeInterval_ns, tvb, *cur_offset, 6, time_ns, "Ns: %" G_GINT64_MODIFIER "d nanoseconds", time_ns); hf_ptp_v2_timeInterval_ns, tvb, *cur_offset, 6, time_ns, "Ns: %" G_GINT64_MODIFIER "d nanoseconds", time_ns);
proto_tree_add_double_format_value(ptptimeInterval_subtree, proto_tree_add_double(ptptimeInterval_subtree,
hf_ptp_v2_timeInterval_subns, tvb, *cur_offset+6, 2, (time_subns/65536.0), hf_ptp_v2_timeInterval_subns, tvb, *cur_offset+6, 2, (time_subns/65536.0));
"%f nanoseconds", (time_subns/65536.0));
*cur_offset = *cur_offset + 8; *cur_offset = *cur_offset + 8;
} }
@ -5032,7 +5031,7 @@ proto_register_ptp(void)
}, },
{ &hf_ptp_v2_correctionsubns, { &hf_ptp_v2_correctionsubns,
{ "correctionSubNs", "ptp.v2.correction.subns", { "correctionSubNs", "ptp.v2.correction.subns",
FT_DOUBLE, BASE_NONE, NULL, 0x00, FT_DOUBLE, BASE_NONE|BASE_UNIT_STRING, &units_nanosecond_nanoseconds, 0x00,
NULL, HFILL } NULL, HFILL }
}, },
{ &hf_ptp_v2_clockidentity, { &hf_ptp_v2_clockidentity,
@ -5933,7 +5932,7 @@ proto_register_ptp(void)
}, },
{ &hf_ptp_v2_mm_offset_subns, { &hf_ptp_v2_mm_offset_subns,
{ "SubNs", "ptp.v2.mm.offset.subns", { "SubNs", "ptp.v2.mm.offset.subns",
FT_DOUBLE, BASE_NONE, NULL, 0x00, FT_DOUBLE, BASE_NONE|BASE_UNIT_STRING, &units_nanosecond_nanoseconds, 0x00,
NULL, HFILL } NULL, HFILL }
}, },
{ &hf_ptp_v2_mm_pathDelay_ns, { &hf_ptp_v2_mm_pathDelay_ns,
@ -5943,7 +5942,7 @@ proto_register_ptp(void)
}, },
{ &hf_ptp_v2_mm_pathDelay_subns, { &hf_ptp_v2_mm_pathDelay_subns,
{ "SubNs", "ptp.v2.mm.pathDelay.subns", { "SubNs", "ptp.v2.mm.pathDelay.subns",
FT_DOUBLE, BASE_NONE, NULL, 0x00, FT_DOUBLE, BASE_NONE|BASE_UNIT_STRING, &units_nanosecond_nanoseconds, 0x00,
NULL, HFILL } NULL, HFILL }
}, },
{ &hf_ptp_v2_mm_PortNumber, { &hf_ptp_v2_mm_PortNumber,
@ -5968,7 +5967,7 @@ proto_register_ptp(void)
}, },
{ &hf_ptp_v2_mm_peerMeanPathDelay_subns, { &hf_ptp_v2_mm_peerMeanPathDelay_subns,
{ "SubNs", "ptp.v2.mm.peerMeanPathDelay.subns", { "SubNs", "ptp.v2.mm.peerMeanPathDelay.subns",
FT_DOUBLE, BASE_NONE, NULL, 0x00, FT_DOUBLE, BASE_NONE|BASE_UNIT_STRING, &units_nanosecond_nanoseconds, 0x00,
NULL, HFILL } NULL, HFILL }
}, },
{ &hf_ptp_v2_mm_logAnnounceInterval, { &hf_ptp_v2_mm_logAnnounceInterval,

View File

@ -965,17 +965,15 @@ static gint dissect_PHASORS(tvbuff_t *tvb, proto_tree *tree, config_block *block
static gint dissect_DFREQ(tvbuff_t *tvb, proto_tree *tree, config_block *block, gint offset) static gint dissect_DFREQ(tvbuff_t *tvb, proto_tree *tree, config_block *block, gint offset)
{ {
if (floating_point == block->format_fr) { if (floating_point == block->format_fr) {
gfloat tmp; proto_tree_add_item(tree, hf_synphasor_actual_frequency_value, tvb, offset, 4, ENC_BIG_ENDIAN);
offset += 4;
tmp = tvb_get_ntohieee_float(tvb, offset);
proto_tree_add_float_format_value(tree, hf_synphasor_actual_frequency_value, tvb, offset, 4, tmp, "%fHz", tmp); offset += 4;
/* The standard doesn't clearly say how to interpret this value, but /* The standard doesn't clearly say how to interpret this value, but
* http://www.pes-psrc.org/h/C37_118_H11_FAQ_Jan2008.pdf provides further information. * http://www.pes-psrc.org/h/C37_118_H11_FAQ_Jan2008.pdf provides further information.
* --> no scaling factor is applied to DFREQ * --> no scaling factor is applied to DFREQ
*/ */
tmp = tvb_get_ntohieee_float(tvb, offset); proto_tree_add_item(tree, hf_synphasor_rate_change_frequency, tvb, offset, 4, ENC_BIG_ENDIAN);
proto_tree_add_float_format_value(tree, hf_synphasor_rate_change_frequency, tvb, offset, 4, tmp, "%fHz/s", tmp); offset += 4; offset += 4;
} }
else { else {
gint16 tmp; gint16 tmp;
@ -1304,8 +1302,8 @@ void proto_register_synphasor(void)
{ &hf_synphasor_num_digital_status_words, { "Number of digital status words", "synphasor.num_digital_status_words", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_synphasor_num_digital_status_words, { "Number of digital status words", "synphasor.num_digital_status_words", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
{ &hf_synphasor_rate_of_transmission, { "Rate of transmission", "synphasor.rate_of_transmission", FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_synphasor_rate_of_transmission, { "Rate of transmission", "synphasor.rate_of_transmission", FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
{ &hf_synphasor_phasor, { "Phasor", "synphasor.phasor", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_synphasor_phasor, { "Phasor", "synphasor.phasor", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
{ &hf_synphasor_actual_frequency_value, { "Actual frequency value", "synphasor.actual_frequency_value", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_synphasor_actual_frequency_value, { "Actual frequency value", "synphasor.actual_frequency_value", FT_FLOAT, BASE_NONE|BASE_UNIT_STRING, &units_hz, 0x0, NULL, HFILL }},
{ &hf_synphasor_rate_change_frequency, { "Rate of change of frequency", "synphasor.rate_change_frequency", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_synphasor_rate_change_frequency, { "Rate of change of frequency", "synphasor.rate_change_frequency", FT_FLOAT, BASE_NONE|BASE_UNIT_STRING, &units_hz_s, 0x0, NULL, HFILL }},
{ &hf_synphasor_frequency_deviation_from_nominal, { "Frequency deviation from nominal", "synphasor.frequency_deviation_from_nominal", FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_synphasor_frequency_deviation_from_nominal, { "Frequency deviation from nominal", "synphasor.frequency_deviation_from_nominal", FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
{ &hf_synphasor_analog_value, { "Analog value", "synphasor.analog_value", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_synphasor_analog_value, { "Analog value", "synphasor.analog_value", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
{ &hf_synphasor_digital_status_word, { "Digital status word", "synphasor.digital_status_word", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, { &hf_synphasor_digital_status_word, { "Digital status word", "synphasor.digital_status_word", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},

View File

@ -2963,6 +2963,9 @@ proto_custom_set(proto_tree* tree, GSList *field_id,
#define proto_tree_add_uint(tree, hfinfo, tvb, start, length, value) \ #define proto_tree_add_uint(tree, hfinfo, tvb, start, length, value) \
proto_tree_add_uint(tree, (hfinfo)->id, tvb, start, length, value) proto_tree_add_uint(tree, (hfinfo)->id, tvb, start, length, value)
#define proto_tree_add_float(tree, hfinfo, tvb, start, length, value) \
proto_tree_add_float(tree, (hfinfo)->id, tvb, start, length, value)
#define proto_tree_add_float_format_value(tree, hfinfo, \ #define proto_tree_add_float_format_value(tree, hfinfo, \
tvb, start, length, value, format, ...) \ tvb, start, length, value, format, ...) \
proto_tree_add_float_format_value(tree, (hfinfo)->id, \ proto_tree_add_float_format_value(tree, (hfinfo)->id, \

View File

@ -54,6 +54,12 @@ const unit_name_string units_second_seconds = { " second", " seconds" };
const unit_name_string units_seconds = { "s", NULL }; const unit_name_string units_seconds = { "s", NULL };
const unit_name_string units_millisecond_milliseconds = { " millisecond", " milliseconds" }; const unit_name_string units_millisecond_milliseconds = { " millisecond", " milliseconds" };
const unit_name_string units_milliseconds = { "ms", NULL }; const unit_name_string units_milliseconds = { "ms", NULL };
const unit_name_string units_nanosecond_nanoseconds = { " nanosecond", " nanoseconds" };
const unit_name_string units_degree_degrees = { " degree", " degrees" };
const unit_name_string units_ghz = { "GHz", NULL };
const unit_name_string units_hz = { "Hz", NULL };
const unit_name_string units_hz_s = { "Hz/s", NULL };
/* /*
* Editor modelines * Editor modelines

View File

@ -54,6 +54,11 @@ WS_DLL_PUBLIC const unit_name_string units_second_seconds; // full unit name "se
WS_DLL_PUBLIC const unit_name_string units_seconds; //only seconds abbreviation "s" WS_DLL_PUBLIC const unit_name_string units_seconds; //only seconds abbreviation "s"
WS_DLL_PUBLIC const unit_name_string units_millisecond_milliseconds; // full unit name "millisecond[s?]" WS_DLL_PUBLIC const unit_name_string units_millisecond_milliseconds; // full unit name "millisecond[s?]"
WS_DLL_PUBLIC const unit_name_string units_milliseconds; //only seconds abbreviation "ms" WS_DLL_PUBLIC const unit_name_string units_milliseconds; //only seconds abbreviation "ms"
WS_DLL_PUBLIC const unit_name_string units_nanosecond_nanoseconds; // full unit name "nanosecond[s?]"
WS_DLL_PUBLIC const unit_name_string units_degree_degrees;
WS_DLL_PUBLIC const unit_name_string units_ghz;
WS_DLL_PUBLIC const unit_name_string units_hz;
WS_DLL_PUBLIC const unit_name_string units_hz_s;
#ifdef __cplusplus #ifdef __cplusplus
} }