diff options
author | Ulf Lamping <ulf.lamping@web.de> | 2005-08-25 21:29:54 +0000 |
---|---|---|
committer | Ulf Lamping <ulf.lamping@web.de> | 2005-08-25 21:29:54 +0000 |
commit | 723c80ea90a3c56c069a0a99e22edd43b00cf357 (patch) | |
tree | a0bd0c2272cf5b8f96e1364c0e2f7be960df4f69 /epan | |
parent | bd42437262d885f24cbf0fc96e4b2235aac695a3 (diff) |
timestamp display precision:
- automatic adjustment depending on file format
- manual adjustment through menu items
save the setting in the recent file
svn path=/trunk/; revision=15534
Diffstat (limited to 'epan')
-rw-r--r-- | epan/column-utils.c | 200 | ||||
-rw-r--r-- | epan/column.c | 128 | ||||
-rw-r--r-- | epan/libethereal.def | 6 | ||||
-rw-r--r-- | epan/timestamp.c | 18 | ||||
-rw-r--r-- | epan/timestamp.h | 30 | ||||
-rw-r--r-- | epan/to_str.c | 12 | ||||
-rw-r--r-- | epan/to_str.h | 3 |
7 files changed, 367 insertions, 30 deletions
diff --git a/epan/column-utils.c b/epan/column-utils.c index 7120ce474a..d77b3c650a 100644 --- a/epan/column-utils.c +++ b/epan/column-utils.c @@ -476,7 +476,57 @@ col_set_abs_date_time(frame_data *fd, column_info *cinfo, int col) then = fd->abs_ts.secs; tmp = localtime(&then); if (tmp != NULL) { - g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, + switch(timestamp_get_precision()) { + case(TS_PREC_FIXED_SEC): + case(TS_PREC_AUTO_SEC): + g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, + "%04d-%02d-%02d %02d:%02d:%02d", + tmp->tm_year + 1900, + tmp->tm_mon + 1, + tmp->tm_mday, + tmp->tm_hour, + tmp->tm_min, + tmp->tm_sec); + break; + case(TS_PREC_FIXED_DSEC): + case(TS_PREC_AUTO_DSEC): + g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, + "%04d-%02d-%02d %02d:%02d:%02d.%01ld", + tmp->tm_year + 1900, + tmp->tm_mon + 1, + tmp->tm_mday, + tmp->tm_hour, + tmp->tm_min, + tmp->tm_sec, + (long)fd->abs_ts.nsecs / 100000000); + break; + case(TS_PREC_FIXED_CSEC): + case(TS_PREC_AUTO_CSEC): + g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, + "%04d-%02d-%02d %02d:%02d:%02d.%02ld", + tmp->tm_year + 1900, + tmp->tm_mon + 1, + tmp->tm_mday, + tmp->tm_hour, + tmp->tm_min, + tmp->tm_sec, + (long)fd->abs_ts.nsecs / 10000000); + break; + case(TS_PREC_FIXED_MSEC): + case(TS_PREC_AUTO_MSEC): + g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, + "%04d-%02d-%02d %02d:%02d:%02d.%03ld", + tmp->tm_year + 1900, + tmp->tm_mon + 1, + tmp->tm_mday, + tmp->tm_hour, + tmp->tm_min, + tmp->tm_sec, + (long)fd->abs_ts.nsecs / 1000000); + break; + case(TS_PREC_FIXED_USEC): + case(TS_PREC_AUTO_USEC): + g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, "%04d-%02d-%02d %02d:%02d:%02d.%06ld", tmp->tm_year + 1900, tmp->tm_mon + 1, @@ -484,7 +534,23 @@ col_set_abs_date_time(frame_data *fd, column_info *cinfo, int col) tmp->tm_hour, tmp->tm_min, tmp->tm_sec, - (long)fd->abs_ts.nsecs / 1000); /* XXX - this has to be improved */ + (long)fd->abs_ts.nsecs / 1000); + break; + case(TS_PREC_FIXED_NSEC): + case(TS_PREC_AUTO_NSEC): + g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, + "%04d-%02d-%02d %02d:%02d:%02d.%09ld", + tmp->tm_year + 1900, + tmp->tm_mon + 1, + tmp->tm_mday, + tmp->tm_hour, + tmp->tm_min, + tmp->tm_sec, + (long)fd->abs_ts.nsecs); + break; + default: + g_assert_not_reached(); + } } else { cinfo->col_buf[col][0] = '\0'; } @@ -496,8 +562,40 @@ col_set_abs_date_time(frame_data *fd, column_info *cinfo, int col) static void col_set_rel_time(frame_data *fd, column_info *cinfo, int col) { - display_signed_time(cinfo->col_buf[col], COL_MAX_LEN, - fd->rel_ts.secs, fd->rel_ts.nsecs / 1000, USECS); /* XXX - this has to be improved */ + switch(timestamp_get_precision()) { + case(TS_PREC_FIXED_SEC): + case(TS_PREC_AUTO_SEC): + display_signed_time(cinfo->col_buf[col], COL_MAX_LEN, + fd->rel_ts.secs, fd->rel_ts.nsecs / 1000000000, SECS); + break; + case(TS_PREC_FIXED_DSEC): + case(TS_PREC_AUTO_DSEC): + display_signed_time(cinfo->col_buf[col], COL_MAX_LEN, + fd->rel_ts.secs, fd->rel_ts.nsecs / 100000000, DSECS); + break; + case(TS_PREC_FIXED_CSEC): + case(TS_PREC_AUTO_CSEC): + display_signed_time(cinfo->col_buf[col], COL_MAX_LEN, + fd->rel_ts.secs, fd->rel_ts.nsecs / 10000000, CSECS); + break; + case(TS_PREC_FIXED_MSEC): + case(TS_PREC_AUTO_MSEC): + display_signed_time(cinfo->col_buf[col], COL_MAX_LEN, + fd->rel_ts.secs, fd->rel_ts.nsecs / 1000000, MSECS); + break; + case(TS_PREC_FIXED_USEC): + case(TS_PREC_AUTO_USEC): + display_signed_time(cinfo->col_buf[col], COL_MAX_LEN, + fd->rel_ts.secs, fd->rel_ts.nsecs / 1000, USECS); + break; + case(TS_PREC_FIXED_NSEC): + case(TS_PREC_AUTO_NSEC): + display_signed_time(cinfo->col_buf[col], COL_MAX_LEN, + fd->rel_ts.secs, fd->rel_ts.nsecs, NSECS); + break; + default: + g_assert_not_reached(); + } cinfo->col_data[col] = cinfo->col_buf[col]; strcpy(cinfo->col_expr[col],"frame.time_relative"); strcpy(cinfo->col_expr_val[col],cinfo->col_buf[col]); @@ -506,8 +604,40 @@ col_set_rel_time(frame_data *fd, column_info *cinfo, int col) static void col_set_delta_time(frame_data *fd, column_info *cinfo, int col) { - display_signed_time(cinfo->col_buf[col], COL_MAX_LEN, - fd->del_ts.secs, fd->del_ts.nsecs / 1000, USECS); + switch(timestamp_get_precision()) { + case(TS_PREC_FIXED_SEC): + case(TS_PREC_AUTO_SEC): + display_signed_time(cinfo->col_buf[col], COL_MAX_LEN, + fd->del_ts.secs, fd->del_ts.nsecs / 1000000000, SECS); + break; + case(TS_PREC_FIXED_DSEC): + case(TS_PREC_AUTO_DSEC): + display_signed_time(cinfo->col_buf[col], COL_MAX_LEN, + fd->del_ts.secs, fd->del_ts.nsecs / 100000000, DSECS); + break; + case(TS_PREC_FIXED_CSEC): + case(TS_PREC_AUTO_CSEC): + display_signed_time(cinfo->col_buf[col], COL_MAX_LEN, + fd->del_ts.secs, fd->del_ts.nsecs / 10000000, CSECS); + break; + case(TS_PREC_FIXED_MSEC): + case(TS_PREC_AUTO_MSEC): + display_signed_time(cinfo->col_buf[col], COL_MAX_LEN, + fd->del_ts.secs, fd->del_ts.nsecs / 1000000, MSECS); + break; + case(TS_PREC_FIXED_USEC): + case(TS_PREC_AUTO_USEC): + display_signed_time(cinfo->col_buf[col], COL_MAX_LEN, + fd->del_ts.secs, fd->del_ts.nsecs / 1000, USECS); + break; + case(TS_PREC_FIXED_NSEC): + case(TS_PREC_AUTO_NSEC): + display_signed_time(cinfo->col_buf[col], COL_MAX_LEN, + fd->del_ts.secs, fd->del_ts.nsecs, NSECS); + break; + default: + g_assert_not_reached(); + } cinfo->col_data[col] = cinfo->col_buf[col]; strcpy(cinfo->col_expr[col],"frame.time_delta"); strcpy(cinfo->col_expr_val[col],cinfo->col_buf[col]); @@ -524,11 +654,63 @@ col_set_abs_time(frame_data *fd, column_info *cinfo, int col) then = fd->abs_ts.secs; tmp = localtime(&then); if (tmp != NULL) { - g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, "%02d:%02d:%02d.%06ld", + switch(timestamp_get_precision()) { + case(TS_PREC_FIXED_SEC): + case(TS_PREC_AUTO_SEC): + g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, + "%02d:%02d:%02d", + tmp->tm_hour, + tmp->tm_min, + tmp->tm_sec); + break; + case(TS_PREC_FIXED_DSEC): + case(TS_PREC_AUTO_DSEC): + g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, + "%02d:%02d:%02d.%01ld", + tmp->tm_hour, + tmp->tm_min, + tmp->tm_sec, + (long)fd->abs_ts.nsecs / 100000000); + break; + case(TS_PREC_FIXED_CSEC): + case(TS_PREC_AUTO_CSEC): + g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, + "%02d:%02d:%02d.%02ld", + tmp->tm_hour, + tmp->tm_min, + tmp->tm_sec, + (long)fd->abs_ts.nsecs / 10000000); + break; + case(TS_PREC_FIXED_MSEC): + case(TS_PREC_AUTO_MSEC): + g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, + "%02d:%02d:%02d.%03ld", + tmp->tm_hour, + tmp->tm_min, + tmp->tm_sec, + (long)fd->abs_ts.nsecs / 1000000); + break; + case(TS_PREC_FIXED_USEC): + case(TS_PREC_AUTO_USEC): + g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, + "%02d:%02d:%02d.%06ld", + tmp->tm_hour, + tmp->tm_min, + tmp->tm_sec, + (long)fd->abs_ts.nsecs / 1000); + break; + case(TS_PREC_FIXED_NSEC): + case(TS_PREC_AUTO_NSEC): + g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, + "%02d:%02d:%02d.%09ld", tmp->tm_hour, tmp->tm_min, tmp->tm_sec, - (long)fd->abs_ts.nsecs / 1000); /* XXX - this has to be improved */ + (long)fd->abs_ts.nsecs); + break; + default: + g_assert_not_reached(); + } } else { cinfo->col_buf[col][0] = '\0'; } @@ -547,7 +729,7 @@ col_set_abs_time(frame_data *fd, column_info *cinfo, int col) void col_set_cls_time(frame_data *fd, column_info *cinfo, int col) { - switch (get_timestamp_setting()) { + switch (timestamp_get_type()) { case TS_ABSOLUTE: col_set_abs_time(fd, cinfo, col); break; diff --git a/epan/column.c b/epan/column.c index 83d96d0004..90dae76709 100644 --- a/epan/column.c +++ b/epan/column.c @@ -214,6 +214,115 @@ get_column_format_matches(gboolean *fmt_list, gint format) { } } +/* Returns a string representing the longest possible value for + a timestamp column type. */ +static const char * +get_timestamp_column_longest_string(gint type, gint precision) +{ + + switch(type) { + case(TS_ABSOLUTE_WITH_DATE): + switch(precision) { + case(TS_PREC_AUTO_SEC): + case(TS_PREC_FIXED_SEC): + return "0000-00-00 00:00:00"; + break; + case(TS_PREC_AUTO_DSEC): + case(TS_PREC_FIXED_DSEC): + return "0000-00-00 00:00:00.0"; + break; + case(TS_PREC_AUTO_CSEC): + case(TS_PREC_FIXED_CSEC): + return "0000-00-00 00:00:00.00"; + break; + case(TS_PREC_AUTO_MSEC): + case(TS_PREC_FIXED_MSEC): + return "0000-00-00 00:00:00.000"; + break; + case(TS_PREC_AUTO_USEC): + case(TS_PREC_FIXED_USEC): + return "0000-00-00 00:00:00.000000"; + break; + case(TS_PREC_AUTO_NSEC): + case(TS_PREC_FIXED_NSEC): + return "0000-00-00 00:00:00.000000000"; + break; + default: + g_assert_not_reached(); + } + break; + case(TS_ABSOLUTE): + switch(precision) { + case(TS_PREC_AUTO_SEC): + case(TS_PREC_FIXED_SEC): + return "00:00:00"; + break; + case(TS_PREC_AUTO_DSEC): + case(TS_PREC_FIXED_DSEC): + return "00:00:00.0"; + break; + case(TS_PREC_AUTO_CSEC): + case(TS_PREC_FIXED_CSEC): + return "00:00:00.00"; + break; + case(TS_PREC_AUTO_MSEC): + case(TS_PREC_FIXED_MSEC): + return "00:00:00.000"; + break; + case(TS_PREC_AUTO_USEC): + case(TS_PREC_FIXED_USEC): + return "00:00:00.000000"; + break; + case(TS_PREC_AUTO_NSEC): + case(TS_PREC_FIXED_NSEC): + return "00:00:00.000000000"; + break; + default: + g_assert_not_reached(); + } + break; + case(TS_RELATIVE): /* fallthrough */ + case(TS_DELTA): + switch(precision) { + case(TS_PREC_AUTO_SEC): + case(TS_PREC_FIXED_SEC): + return "0000"; + break; + case(TS_PREC_AUTO_DSEC): + case(TS_PREC_FIXED_DSEC): + return "0000.0"; + break; + case(TS_PREC_AUTO_CSEC): + case(TS_PREC_FIXED_CSEC): + return "0000.00"; + break; + case(TS_PREC_AUTO_MSEC): + case(TS_PREC_FIXED_MSEC): + return "0000.000"; + break; + case(TS_PREC_AUTO_USEC): + case(TS_PREC_FIXED_USEC): + return "0000.000000"; + break; + case(TS_PREC_AUTO_NSEC): + case(TS_PREC_FIXED_NSEC): + return "0000.000000000"; + break; + default: + g_assert_not_reached(); + } + break; + case(TS_NOT_SET): + return "0000.000000"; + break; + default: + g_assert_not_reached(); + } + + /* never reached, satisfy compiler */ + return ""; +} + /* Returns a string representing the longest possible value for a particular column type. @@ -234,22 +343,19 @@ get_column_longest_string(gint format) return "0000000"; break; case COL_CLS_TIME: - if (get_timestamp_setting() == TS_ABSOLUTE) - return "00:00:00.000000"; - else if (get_timestamp_setting() == TS_ABSOLUTE_WITH_DATE) - return "0000-00-00 00:00:00.000000"; - else - return "0000.000000"; - break; - case COL_ABS_TIME: - return "00:00:00.000000"; + return get_timestamp_column_longest_string(timestamp_get_type(), timestamp_get_precision()); break; case COL_ABS_DATE_TIME: - return "0000-00-00 00:00:00.000000"; + return get_timestamp_column_longest_string(TS_ABSOLUTE_WITH_DATE, timestamp_get_precision()); + break; + case COL_ABS_TIME: + return get_timestamp_column_longest_string(TS_ABSOLUTE, timestamp_get_precision()); break; case COL_REL_TIME: + return get_timestamp_column_longest_string(TS_RELATIVE, timestamp_get_precision()); + break; case COL_DELTA_TIME: - return "0000.000000"; + return get_timestamp_column_longest_string(TS_DELTA, timestamp_get_precision()); break; case COL_DEF_SRC: case COL_RES_SRC: diff --git a/epan/libethereal.def b/epan/libethereal.def index ea14571675..7e8db18328 100644 --- a/epan/libethereal.def +++ b/epan/libethereal.def @@ -307,7 +307,6 @@ get_plugins_pers_dir get_systemfile_dir get_tcp_port get_tempfile_path -get_timestamp_setting get_udp_port gsm_a_bssmap_msg_strings DATA gsm_a_dtap_msg_cc_strings DATA @@ -522,7 +521,6 @@ rtp_free_hash_dyn_payload rtp_payload_type_vals DATA rtp_payload_type_short_vals DATA set_actual_length -set_timestamp_setting show_fragment_seq_tree show_fragment_tree sid_name_snooping DATA @@ -563,6 +561,10 @@ test_for_directory test_for_fifo time_msecs_to_str time_secs_to_str +timestamp_get_precision +timestamp_get_type +timestamp_set_precision +timestamp_set_type trans2_cmd_vals DATA tree_is_expanded DATA tvb_bytes_exist diff --git a/epan/timestamp.c b/epan/timestamp.c index d948fda3d5..b7cef811f6 100644 --- a/epan/timestamp.c +++ b/epan/timestamp.c @@ -32,12 +32,26 @@ * and distinguish it from a command line value */ static ts_type timestamp_type = TS_NOT_SET; -ts_type get_timestamp_setting(void) +static int timestamp_precision = TS_PREC_AUTO_USEC; + +ts_type timestamp_get_type(void) { return timestamp_type; } -void set_timestamp_setting(ts_type ts_t) +void timestamp_set_type(ts_type ts_t) { timestamp_type = ts_t; } + + +int timestamp_get_precision(void) +{ + return timestamp_precision; +} + +void timestamp_set_precision(int tsp) +{ + timestamp_precision = tsp; +} + diff --git a/epan/timestamp.h b/epan/timestamp.h index 706fba4ce9..f9f953219b 100644 --- a/epan/timestamp.h +++ b/epan/timestamp.h @@ -32,16 +32,34 @@ typedef enum { TS_RELATIVE, TS_ABSOLUTE, TS_ABSOLUTE_WITH_DATE, - TS_DELTA -} ts_type; - + TS_DELTA, /* * Special value used for the command-line setting in Ethereal, to indicate * that no value has been set from the command line. */ -#define TS_NOT_SET ((ts_type)-1) + TS_NOT_SET +} ts_type; + +typedef enum { + TS_PREC_AUTO, /* recent */ + TS_PREC_FIXED_SEC, /* recent and internal */ + TS_PREC_FIXED_DSEC, /* recent and internal */ + TS_PREC_FIXED_CSEC, /* recent and internal */ + TS_PREC_FIXED_MSEC, /* recent and internal */ + TS_PREC_FIXED_USEC, /* recent and internal */ + TS_PREC_FIXED_NSEC, /* recent and internal */ + TS_PREC_AUTO_SEC, /* internal */ + TS_PREC_AUTO_DSEC, /* internal */ + TS_PREC_AUTO_CSEC, /* internal */ + TS_PREC_AUTO_MSEC, /* internal */ + TS_PREC_AUTO_USEC, /* internal */ + TS_PREC_AUTO_NSEC /* internal */ +} ts_precision; + +extern ts_type timestamp_get_type(void); +extern void timestamp_set_type(ts_type); -extern ts_type get_timestamp_setting(void); -extern void set_timestamp_setting(ts_type); +extern int timestamp_get_precision(void); +extern void timestamp_set_precision(int tsp); #endif /* timestamp.h */ diff --git a/epan/to_str.c b/epan/to_str.c index 3e00274fe0..0431f66233 100644 --- a/epan/to_str.c +++ b/epan/to_str.c @@ -506,6 +506,18 @@ display_signed_time(gchar *buf, int buflen, gint32 sec, gint32 frac, } switch (units) { + case SECS: + g_snprintf(buf, buflen, "%s%d", sign, sec); + break; + + case DSECS: + g_snprintf(buf, buflen, "%s%d.%01d", sign, sec, frac); + break; + + case CSECS: + g_snprintf(buf, buflen, "%s%d.%02d", sign, sec, frac); + break; + case MSECS: g_snprintf(buf, buflen, "%s%d.%03d", sign, sec, frac); break; diff --git a/epan/to_str.h b/epan/to_str.h index e34a8242b5..55449f490d 100644 --- a/epan/to_str.h +++ b/epan/to_str.h @@ -37,6 +37,9 @@ * Resolution of a time stamp. */ typedef enum { + SECS, /* seconds */ + DSECS, /* deciseconds */ + CSECS, /* centiseconds */ MSECS, /* milliseconds */ USECS, /* microseconds */ NSECS /* nanoseconds */ |