Include config.h first; it defines _FILE_OFFSET_BITS, and if some system
[metze/wireshark/wip.git] / epan / column.c
index a549a3b979b33679ab54a8b5b1e6dba4a1406d74..cef72417785c1f6209f49620408b94c572898a45 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "config.h"
 
 #include <stdio.h>
 #include <string.h>
 
 #include <epan/timestamp.h>
 #include <epan/prefs.h>
-#include <epan/nstime.h>
 #include <epan/dfilter/dfilter.h>
-#include "cfile.h"
 #include <epan/column.h>
 #include <epan/packet.h>
 
-/* Given a format number (as defined in packet.h), returns its equivalent
+/* Given a format number (as defined in column_info.h), returns its equivalent
    string */
 const gchar *
-col_format_to_string(gint fmt) {
-  const gchar *slist[] = {
-    "%m",
-    "%t",
-    "%Rt",
-    "%At",
-    "%Yt",
-    "%Tt",
-    "%Gt",
-    "%rct",
-    "%dct",
-    "%s",
-    "%rs",
-    "%us",
-    "%hs",
-    "%rhs",
-    "%uhs",
-    "%ns",
-    "%rns",
-    "%uns",
-    "%d",
-    "%rd",
-    "%ud",
-    "%hd",
-    "%rhd",
-    "%uhd",
-    "%nd",
-    "%rnd",
-    "%und",
-    "%S",
-    "%rS",
-    "%uS",
-    "%D",
-    "%rD",
-    "%uD",
-    "%p",
-    "%i",
-    "%L",
-    "%B",
-    "%XO",
-    "%XR",
-    "%I",
-    "%c",
-    "%Xs",
-    "%Xd",
-    "%V",
-    "%x",
-    "%e",
-    "%H",
-    "%P",
-    "%y",
-    "%z",
-    "%q",
-    "%f",
-    "%U",
-    "%E",
-    "%C",
-    "%l",
-    "%a",
-    "%F",
-    "%Cus"
+col_format_to_string(const gint fmt) {
+  static const gchar *const slist[NUM_COL_FMTS] = {
+    "%q",                                       /* 0) COL_8021Q_VLAN_ID */
+    "%Yt",                                      /* 1) COL_ABS_DATE_TIME */
+    "%At",                                      /* 2) COL_ABS_TIME */
+    "%c",                                       /* 3) COL_CIRCUIT_ID */
+    "%Xd",                                      /* 4) COL_DSTIDX */
+    "%Xs",                                      /* 5) COL_SRCIDX */
+    "%V",                                       /* 6) COL_VSAN */
+    "%B",                                       /* 7) COL_CUMULATIVE_BYTES */
+    "%Cus",                                     /* 8) COL_CUSTOM */
+    "%y",                                       /* 9) COL_DCE_CALL */
+    "%z",                                       /* 10) COL_DCE_CTX */
+    "%Tt",                                      /* 11) COL_DELTA_TIME */
+    "%dct",                                     /* 12) COL_DELTA_CONV_TIME */
+    "%Gt",                                      /* 13) COL_DELTA_TIME_DIS */
+    "%rd",                                      /* 14) COL_RES_DST */
+    "%ud",                                      /* 15) COL_UNRES_DST */
+    "%rD",                                      /* 16) COL_RES_DST_PORT */
+    "%uD",                                      /* 17) COL_UNRES_DST_PORT */
+    "%d",                                       /* 18) COL_DEF_DST */
+    "%D",                                       /* 19) COL_DEF_DST_PORT */
+    "%a",                                       /* 20) COL_EXPERT */
+    "%I",                                       /* 21) COL_IF_DIR */
+    "%XO",                                      /* 22) COL_OXID */
+    "%XR",                                      /* 23) COL_RXID */
+    "%C",                                       /* 24) !! DEPRECATED !! - COL_FR_DLCI */
+    "%F",                                       /* 25) COL_FREQ_CHAN */
+    "%l",                                       /* 26) !! DEPRECATED !! - COL_BSSGP_TLLI */
+    "%P",                                       /* 27) !! DEPRECATED !! - COL_HPUX_DEVID */
+    "%H",                                       /* 28) !! DEPRECATED !! - COL_HPUX_SUBSYS */
+    "%hd",                                      /* 29) COL_DEF_DL_DST */
+    "%hs",                                      /* 30) COL_DEF_DL_SRC */
+    "%rhd",                                     /* 31) COL_RES_DL_DST */
+    "%uhd",                                     /* 32) COL_UNRES_DL_DST */
+    "%rhs",                                     /* 33) COL_RES_DL_SRC*/
+    "%uhs",                                     /* 34) COL_UNRES_DL_SRC */
+    "%e",                                       /* 35) COL_RSSI */
+    "%x",                                       /* 36) COL_TX_RATE */
+    "%f",                                       /* 37) COL_DSCP_VALUE */
+    "%i",                                       /* 38) COL_INFO */
+    "%U",                                       /* 39) !! DEPRECATED !! - COL_COS_VALUE */
+    "%rnd",                                     /* 40) COL_RES_NET_DST */
+    "%und",                                     /* 41) COL_UNRES_NET_DST */
+    "%rns",                                     /* 42) COL_RES_NET_SRC */
+    "%uns",                                     /* 43) COL_UNRES_NET_SRC */
+    "%nd",                                      /* 44) COL_DEF_NET_DST */
+    "%ns",                                      /* 45) COL_DEF_NET_SRC */
+    "%m",                                       /* 46) COL_NUMBER */
+    "%L",                                       /* 47) COL_PACKET_LENGTH */
+    "%p",                                       /* 48) COL_PROTOCOL */
+    "%Rt",                                      /* 49) COL_REL_TIME */
+    "%rct",                                     /* 50) !! DEPRECATED !! - COL_REL_CONV_TIME */
+    "%s",                                       /* 51) COL_DEF_SRC */
+    "%S",                                       /* 52) COL_DEF_SRC_PORT */
+    "%rs",                                      /* 53) COL_RES_SRC */
+    "%us",                                      /* 54) COL_UNRES_SRC */
+    "%rS",                                      /* 55) COL_RES_SRC_PORT */
+    "%uS",                                      /* 56) COL_UNRES_SRC_PORT */
+    "%E",                                       /* 57) COL_TEI */
+    "%Yut",                                     /* 58) COL_UTC_DATE_TIME */
+    "%Aut",                                     /* 59) COL_UTC_TIME */
+    "%t"                                        /* 60) COL_CLS_TIME */
   };
 
   if (fmt < 0 || fmt >= NUM_COL_FMTS)
@@ -115,72 +113,74 @@ col_format_to_string(gint fmt) {
   return(slist[fmt]);
 }
 
-/* Given a format number (as defined in packet.h), returns its
+/* Given a format number (as defined in column_info.h), returns its
   description */
-static const gchar *dlist[NUM_COL_FMTS] = {
-       "Number",                                   /* COL_NUMBER */
-       "Time (format as specified)",               /* COL_CLS_TIME */
-       "Relative time",                            /* COL_REL_TIME */
-       "Absolute time",                            /* COL_ABS_TIME */
-       "Absolute date and time",                   /* COL_ABS_DATE_TIME */
-       "Delta time",                               /* COL_DELTA_TIME */
-       "Delta time displayed",                     /* COL_DELTA_TIME_DIS */
-       "Relative time (conversation)",             /* COL_REL_CONV_TIME */
-       "Delta time (conversation)",                /* COL_DELTA_CONV_TIME */
-       "Source address",                           /* COL_DEF_SRC */
-       "Src addr (resolved)",                      /* COL_RES_SRC */
-       "Src addr (unresolved)",                    /* COL_UNRES_SRC */
-       "Hardware src addr",                        /* COL_DEF_DL_SRC */
-       "Hw src addr (resolved)",                   /* COL_RES_DL_SRC*/
-       "Hw src addr (unresolved)",                 /* COL_UNRES_DL_SRC */
-       "Network src addr",                         /* COL_DEF_NET_SRC */
-       "Net src addr (resolved)",                  /* COL_RES_NET_SRC */
-       "Net src addr (unresolved)",                /* COL_UNRES_NET_SRC */
-       "Destination address",                      /* COL_DEF_DST */
-       "Dest addr (resolved)",                     /* COL_RES_DST */
-       "Dest addr (unresolved)",                   /* COL_UNRES_DST */
-       "Hardware dest addr",                       /* COL_DEF_DL_DST */
-       "Hw dest addr (resolved)",                  /* COL_RES_DL_DST */
-       "Hw dest addr (unresolved)",                /* COL_UNRES_DL_DST */
-       "Network dest addr",                        /* COL_DEF_NET_DST */
-       "Net dest addr (resolved)",                 /* COL_RES_NET_DST */
-       "Net dest addr (unresolved)",               /* COL_UNRES_NET_DST */
-       "Source port",                              /* COL_DEF_SRC_PORT */
-       "Src port (resolved)",                      /* COL_RES_SRC_PORT */
-       "Src port (unresolved)",                    /* COL_UNRES_SRC_PORT */
-       "Destination port",                         /* COL_DEF_DST_PORT */
-       "Dest port (resolved)",                     /* COL_RES_DST_PORT */
-       "Dest port (unresolved)",                   /* COL_UNRES_DST_PORT */
-       "Protocol",                                 /* COL_PROTOCOL */
-       "Information",                              /* COL_INFO */
-       "Packet length (bytes)" ,                   /* COL_PACKET_LENGTH */
-       "Cumulative Bytes" ,                        /* COL_CUMULATIVE_BYTES */
-       "Fibre Channel OXID",                       /* COL_OXID */
-       "Fibre Channel RXID",                       /* COL_RXID */
-       "FW-1 monitor if/direction",                /* COL_IF_DIR */
-       "Circuit ID",                               /* COL_CIRCUIT_ID */
-       "Cisco Src PortIdx",                        /* COL_SRCIDX */
-       "Cisco Dst PortIdx",                        /* COL_DSTIDX */
-       "Cisco VSAN",                               /* COL_VSAN */
-       "IEEE 802.11 TX rate",                      /* COL_TX_RATE */
-       "IEEE 802.11 RSSI",                         /* COL_RSSI */
-       "HP-UX Subsystem",                          /* COL_HPUX_SUBSYS */
-       "HP-UX Device ID",                          /* COL_HPUX_DEVID */
-       "DCE/RPC call (cn_call_id / dg_seqnum)",    /* COL_DCE_CALL */
-       "DCE/RPC context ID (cn_ctx_id)",           /* COL_DCE_CTX */
-       "802.1Q VLAN id",                           /* COL_8021Q_VLAN_ID */
-       "IP DSCP Value",                            /* COL_DSCP_VALUE */
-       "L2 COS Value (802.1p)",                    /* COL_COS_VALUE */
-       "TEI",                                      /* XXX - why is it missing in column_utils.c and elsewhere? */
-       "Frame Relay DLCI",                         /* COL_FR_DLCI */
-       "GPRS BSSGP TLLI",                          /* COL_BSSGP_TLLI */
-       "Expert Info Severity",                     /* COL_EXPERT */
-       "Frequency/Channel",                        /* COL_FREQ_CHAN */
-       "Custom"                                    /* COL_CUSTOM */
-};
-
 const gchar *
-col_format_desc(gint fmt) {
+col_format_desc(const gint fmt) {
+  static const gchar *const dlist[NUM_COL_FMTS] = {
+    "802.1Q VLAN id",                           /* 0) COL_8021Q_VLAN_ID */
+    "Absolute date and time",                   /* 1) COL_ABS_DATE_TIME */
+    "Absolute time",                            /* 2) COL_ABS_TIME */
+    "Circuit ID",                               /* 3) COL_CIRCUIT_ID */
+    "Cisco Dst PortIdx",                        /* 4) COL_DSTIDX */
+    "Cisco Src PortIdx",                        /* 5) COL_SRCIDX */
+    "Cisco VSAN",                               /* 6) COL_VSAN */
+    "Cumulative Bytes" ,                        /* 7) COL_CUMULATIVE_BYTES */
+    "Custom",                                   /* 8) COL_CUSTOM */
+    "DCE/RPC call (cn_call_id / dg_seqnum)",    /* 9) COL_DCE_CALL */
+    "DCE/RPC context ID (cn_ctx_id)",           /* 10) COL_DCE_CTX */
+    "Delta time",                               /* 11) COL_DELTA_TIME */
+    "Delta time (conversation)",                /* 12) COL_DELTA_CONV_TIME */
+    "Delta time displayed",                     /* 13) COL_DELTA_TIME_DIS */
+    "Dest addr (resolved)",                     /* 14) COL_RES_DST */
+    "Dest addr (unresolved)",                   /* 15) COL_UNRES_DST */
+    "Dest port (resolved)",                     /* 16) COL_RES_DST_PORT */
+    "Dest port (unresolved)",                   /* 17) COL_UNRES_DST_PORT */
+    "Destination address",                      /* 18) COL_DEF_DST */
+    "Destination port",                         /* 19) COL_DEF_DST_PORT */
+    "Expert Info Severity",                     /* 20) COL_EXPERT */
+    "FW-1 monitor if/direction",                /* 21) COL_IF_DIR */
+    "Fibre Channel OXID",                       /* 22) COL_OXID */
+    "Fibre Channel RXID",                       /* 23) COL_RXID */
+    "Frame Relay DLCI",                         /* 24) !! DEPRECATED !! - COL_FR_DLCI */
+    "Frequency/Channel",                        /* 25) COL_FREQ_CHAN */
+    "GPRS BSSGP TLLI",                          /* 26) !! DEPRECATED !! - COL_BSSGP_TLLI */
+    "HP-UX Device ID",                          /* 27) !! DEPRECATED !! - COL_HPUX_DEVID */
+    "HP-UX Subsystem",                          /* 28) !! DEPRECATED !! - COL_HPUX_SUBSYS */
+    "Hardware dest addr",                       /* 29) COL_DEF_DL_DST */
+    "Hardware src addr",                        /* 30) COL_DEF_DL_SRC */
+    "Hw dest addr (resolved)",                  /* 31) COL_RES_DL_DST */
+    "Hw dest addr (unresolved)",                /* 32) COL_UNRES_DL_DST */
+    "Hw src addr (resolved)",                   /* 33) COL_RES_DL_SRC*/
+    "Hw src addr (unresolved)",                 /* 34) COL_UNRES_DL_SRC */
+    "IEEE 802.11 RSSI",                         /* 35) COL_RSSI */
+    "IEEE 802.11 TX rate",                      /* 36) COL_TX_RATE */
+    "IP DSCP Value",                            /* 37) COL_DSCP_VALUE */
+    "Information",                              /* 38) COL_INFO */
+    "L2 COS Value (802.1p)",                    /* 39) !! DEPRECATED !! - COL_COS_VALUE */
+    "Net dest addr (resolved)",                 /* 40) COL_RES_NET_DST */
+    "Net dest addr (unresolved)",               /* 41) COL_UNRES_NET_DST */
+    "Net src addr (resolved)",                  /* 42) COL_RES_NET_SRC */
+    "Net src addr (unresolved)",                /* 43) COL_UNRES_NET_SRC */
+    "Network dest addr",                        /* 44) COL_DEF_NET_DST */
+    "Network src addr",                         /* 45) COL_DEF_NET_SRC */
+    "Number",                                   /* 46) COL_NUMBER */
+    "Packet length (bytes)" ,                   /* 47) COL_PACKET_LENGTH */
+    "Protocol",                                 /* 48) COL_PROTOCOL */
+    "Relative time",                            /* 49) COL_REL_TIME */
+    "Relative time (conversation)",             /* 50) !! DEPRECATED !! - COL_REL_CONV_TIME */
+    "Source address",                           /* 51) COL_DEF_SRC */
+    "Source port",                              /* 52) COL_DEF_SRC_PORT */
+    "Src addr (resolved)",                      /* 53) COL_RES_SRC */
+    "Src addr (unresolved)",                    /* 54) COL_UNRES_SRC */
+    "Src port (resolved)",                      /* 55) COL_RES_SRC_PORT */
+    "Src port (unresolved)",                    /* 56) COL_UNRES_SRC_PORT */
+    "TEI",                                      /* 57) COL_TEI */
+    "UTC date and time",                        /* 58) COL_UTC_DATE_TIME */
+    "UTC time",                                 /* 59) COL_UTC_TIME */
+    "Time (format as specified)"                /* 60) COL_CLS_TIME */
+  };
+
   g_assert((fmt >= 0) && (fmt < NUM_COL_FMTS));
   return(dlist[fmt]);
 }
@@ -188,7 +188,7 @@ col_format_desc(gint fmt) {
 /* Marks each array element true if it can be substituted for the given
    column format */
 void
-get_column_format_matches(gboolean *fmt_list, gint format) {
+get_column_format_matches(gboolean *fmt_list, const gint format) {
 
   /* Get the obvious: the format itself */
   if ((format >= 0) && (format < NUM_COL_FMTS))
@@ -238,72 +238,6 @@ get_column_format_matches(gboolean *fmt_list, gint format) {
     case COL_DEF_DST_PORT:
       fmt_list[COL_RES_DST_PORT] = TRUE;
       break;
-    case COL_OXID:
-      fmt_list[COL_OXID] = TRUE;
-      break;
-    case COL_RXID:
-      fmt_list[COL_RXID] = TRUE;
-      break;
-    case COL_IF_DIR:
-      fmt_list[COL_IF_DIR] = TRUE;
-      break;
-    case COL_CIRCUIT_ID:
-      fmt_list[COL_CIRCUIT_ID] = TRUE;
-      break;
-    case COL_SRCIDX:
-      fmt_list[COL_SRCIDX] = TRUE;
-      break;
-    case COL_DSTIDX:
-      fmt_list[COL_DSTIDX] = TRUE;
-      break;
-    case COL_VSAN:
-      fmt_list[COL_VSAN] = TRUE;
-      break;
-    case COL_TX_RATE:
-      fmt_list[COL_TX_RATE] = TRUE;
-      break;
-    case COL_RSSI:
-      fmt_list[COL_RSSI] = TRUE;
-      break;
-    case COL_HPUX_SUBSYS:
-      fmt_list[COL_HPUX_SUBSYS] = TRUE;
-      break;
-    case COL_HPUX_DEVID:
-      fmt_list[COL_HPUX_DEVID] = TRUE;
-      break;
-    case COL_DCE_CALL:
-      fmt_list[COL_DCE_CALL] = TRUE;
-      break;
-    case COL_DCE_CTX:
-      fmt_list[COL_DCE_CTX] = TRUE;
-      break;
-    case COL_8021Q_VLAN_ID:
-      fmt_list[COL_8021Q_VLAN_ID] = TRUE;
-      break;
-    case COL_DSCP_VALUE:
-      fmt_list[COL_DSCP_VALUE] = TRUE;
-      break;
-    case COL_COS_VALUE:
-      fmt_list[COL_COS_VALUE] = TRUE;
-      break;
-    case COL_TEI:
-      fmt_list[COL_TEI] = TRUE;
-      break;
-    case COL_FR_DLCI:
-      fmt_list[COL_FR_DLCI] = TRUE;
-      break;
-    case COL_BSSGP_TLLI:
-      fmt_list[COL_BSSGP_TLLI] = TRUE;
-      break;
-    case COL_EXPERT:
-      fmt_list[COL_EXPERT] = TRUE;
-      break;
-    case COL_FREQ_CHAN:
-      fmt_list[COL_FREQ_CHAN] = TRUE;
-      break;
-    case COL_CUSTOM:
-      fmt_list[COL_CUSTOM] = TRUE;
-      break;
     default:
       break;
   }
@@ -312,154 +246,156 @@ 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)
+get_timestamp_column_longest_string(const gint type, const 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):
-       case(TS_DELTA_DIS):
-               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_EPOCH):
+    switch(type) {
+    case(TS_ABSOLUTE_WITH_DATE):
+    case(TS_UTC_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):
+    case(TS_UTC):
+        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):
+    case(TS_DELTA_DIS):
+        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_EPOCH):
         /* This is enough to represent 2^63 (signed 64-bit integer) + fractions */
-               switch(precision) {
-                       case(TS_PREC_AUTO_SEC):
-                       case(TS_PREC_FIXED_SEC):
-                               return "0000000000000000000";
-                               break;
-                       case(TS_PREC_AUTO_DSEC):
-                       case(TS_PREC_FIXED_DSEC):
-                               return "0000000000000000000.0";
-                               break;
-                       case(TS_PREC_AUTO_CSEC):
-                       case(TS_PREC_FIXED_CSEC):
-                               return "0000000000000000000.00";
-                               break;
-                       case(TS_PREC_AUTO_MSEC):
-                       case(TS_PREC_FIXED_MSEC):
-                               return "0000000000000000000.000";
-                               break;
-                       case(TS_PREC_AUTO_USEC):
-                       case(TS_PREC_FIXED_USEC):
-                               return "0000000000000000000.000000";
-                               break;
-                       case(TS_PREC_AUTO_NSEC):
-                       case(TS_PREC_FIXED_NSEC):
-                               return "0000000000000000000.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 "";
+        switch(precision) {
+            case(TS_PREC_AUTO_SEC):
+            case(TS_PREC_FIXED_SEC):
+                return "0000000000000000000";
+                break;
+            case(TS_PREC_AUTO_DSEC):
+            case(TS_PREC_FIXED_DSEC):
+                return "0000000000000000000.0";
+                break;
+            case(TS_PREC_AUTO_CSEC):
+            case(TS_PREC_FIXED_CSEC):
+                return "0000000000000000000.00";
+                break;
+            case(TS_PREC_AUTO_MSEC):
+            case(TS_PREC_FIXED_MSEC):
+                return "0000000000000000000.000";
+                break;
+            case(TS_PREC_AUTO_USEC):
+            case(TS_PREC_FIXED_USEC):
+                return "0000000000000000000.000000";
+                break;
+            case(TS_PREC_AUTO_NSEC):
+            case(TS_PREC_FIXED_NSEC):
+                return "0000000000000000000.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 the longer string of the column title or the hard-coded width of
  * its contents for building the packet list layout. */
 const gchar *
-get_column_width_string(gint format, gint col)
+get_column_width_string(const gint format, const gint col)
 {
-       if(strlen(get_column_longest_string(format)) >
-          strlen(get_column_title(col)))
-               return get_column_longest_string(format);
-       else
-               return get_column_title(col);
+    if(strlen(get_column_longest_string(format)) >
+       strlen(get_column_title(col)))
+        return get_column_longest_string(format);
+    else
+        return get_column_title(col);
 }
 
 /* Returns a string representing the longest possible value for a
@@ -475,7 +411,7 @@ get_column_width_string(gint format, gint col)
    is somewhat arbitrary in any case.  We should probably clean
    that up eventually, though. */
 const char *
-get_column_longest_string(gint format)
+get_column_longest_string(const gint format)
 {
   switch (format) {
     case COL_NUMBER:
@@ -487,9 +423,15 @@ get_column_longest_string(gint format)
     case COL_ABS_DATE_TIME:
       return get_timestamp_column_longest_string(TS_ABSOLUTE_WITH_DATE, timestamp_get_precision());
       break;
+    case COL_UTC_DATE_TIME:
+      return get_timestamp_column_longest_string(TS_UTC_WITH_DATE, timestamp_get_precision());
+      break;
     case COL_ABS_TIME:
       return get_timestamp_column_longest_string(TS_ABSOLUTE, timestamp_get_precision());
       break;
+    case COL_UTC_TIME:
+      return get_timestamp_column_longest_string(TS_UTC, timestamp_get_precision());
+      break;
     case COL_REL_TIME:
       return get_timestamp_column_longest_string(TS_RELATIVE, timestamp_get_precision());
       break;
@@ -499,8 +441,8 @@ get_column_longest_string(gint format)
     case COL_DELTA_TIME_DIS:
       return get_timestamp_column_longest_string(TS_DELTA_DIS, timestamp_get_precision());
       break;
-    case COL_REL_CONV_TIME:    /* 'abuse' TS_RELATIVE to set the time format */
-    case COL_DELTA_CONV_TIME:  /* for the conversation related time columns */
+    case COL_REL_CONV_TIME: /* 'abuse' TS_RELATIVE to set the time format */
+    case COL_DELTA_CONV_TIME:   /* for the conversation related time columns */
       return get_timestamp_column_longest_string(TS_RELATIVE, timestamp_get_precision());
       break;
     case COL_DEF_SRC:
@@ -532,7 +474,7 @@ get_column_longest_string(gint format)
       return "000000";
       break;
     case COL_PROTOCOL:
-      return "Protocol";       /* not the longest, but the longest is too long */
+      return "Protocol";    /* not the longest, but the longest is too long */
       break;
     case COL_PACKET_LENGTH:
       return "00000";
@@ -600,7 +542,7 @@ get_column_longest_string(gint format)
       return "9999 MHz [A 999]";
       break;
     case COL_CUSTOM:
-      return "0000000000";     /* not the longest, but the longest is too long */
+      return "0000000000";  /* not the longest, but the longest is too long */
       break;
     default: /* COL_INFO */
       return "Source port: kerberos-master  Destination port: kerberos-master";
@@ -611,96 +553,252 @@ get_column_longest_string(gint format)
 /* Returns the longest possible width, in characters, for a particular
    column type. */
 gint
-get_column_char_width(gint format)
+get_column_char_width(const gint format)
 {
-  return strlen(get_column_longest_string(format));
+  return (gint)strlen(get_column_longest_string(format));
 }
 
 gint
-get_column_format(gint col) {
+get_column_format(const gint col)
+{
   GList    *clp = g_list_nth(prefs.col_list, col);
   fmt_data *cfmt;
 
+  if (!clp)  /* Invalid column requested */
+    return -1;
+
   cfmt = (fmt_data *) clp->data;
 
-  return(get_column_format_from_str(cfmt->fmt));
+  return(cfmt->fmt);
+}
+
+void
+set_column_format(const gint col, const gint fmt)
+{
+  GList    *clp = g_list_nth(prefs.col_list, col);
+  fmt_data *cfmt;
+
+  if (!clp)  /* Invalid column requested */
+    return;
+
+  cfmt = (fmt_data *) clp->data;
+
+  cfmt->fmt = fmt;
 }
 
 gint
-get_column_format_from_str(gchar *str) {
+get_column_format_from_str(const gchar *str)
+{
   gint i;
 
   for (i = 0; i < NUM_COL_FMTS; i++) {
     if (strcmp(str, col_format_to_string(i)) == 0)
       return i;
   }
-  return -1;   /* illegal */
+  return -1;    /* illegal */
 }
 
 gchar *
-get_column_title(gint col) {
+get_column_title(const gint col)
+{
   GList    *clp = g_list_nth(prefs.col_list, col);
   fmt_data *cfmt;
 
+  if (!clp)  /* Invalid column requested */
+    return NULL;
+
   cfmt = (fmt_data *) clp->data;
 
   return(cfmt->title);
 }
 
-gchar *
-get_column_custom_field(gint col) {
+void
+set_column_title(const gint col, const gchar *title)
+{
+  GList    *clp = g_list_nth(prefs.col_list, col);
+  fmt_data *cfmt;
+
+  if (!clp)  /* Invalid column requested */
+    return;
+
+  cfmt = (fmt_data *) clp->data;
+
+  g_free (cfmt->title);
+  cfmt->title = g_strdup (title);
+}
+
+gboolean
+get_column_visible(const gint col)
+{
+  GList    *clp = g_list_nth(prefs.col_list, col);
+  fmt_data *cfmt;
+
+  if (!clp)  /* Invalid column requested */
+    return TRUE;
+
+  cfmt = (fmt_data *) clp->data;
+
+  return(cfmt->visible);
+}
+
+void
+set_column_visible(const gint col, gboolean visible)
+{
+  GList    *clp = g_list_nth(prefs.col_list, col);
+  fmt_data *cfmt;
+
+  if (!clp)  /* Invalid column requested */
+    return;
+
+  cfmt = (fmt_data *) clp->data;
+
+  cfmt->visible = visible;
+}
+
+gboolean
+get_column_resolved(const gint col)
+{
+  GList    *clp = g_list_nth(prefs.col_list, col);
+  fmt_data *cfmt;
+
+  if (!clp)  /* Invalid column requested */
+    return TRUE;
+
+  cfmt = (fmt_data *) clp->data;
+
+  return(cfmt->resolved);
+}
+
+void
+set_column_resolved(const gint col, gboolean resolved)
+{
+  GList    *clp = g_list_nth(prefs.col_list, col);
+  fmt_data *cfmt;
+
+  if (!clp)  /* Invalid column requested */
+    return;
+
+  cfmt = (fmt_data *) clp->data;
+
+  cfmt->resolved = resolved;
+}
+
+const gchar *
+get_column_custom_field(const gint col)
+{
   GList    *clp = g_list_nth(prefs.col_list, col);
   fmt_data *cfmt;
 
+  if (!clp)  /* Invalid column requested */
+    return NULL;
+
   cfmt = (fmt_data *) clp->data;
 
   return(cfmt->custom_field);
 }
 
 void
-build_column_format_array(capture_file *cfile, gboolean reset_fences)
+set_column_custom_field(const gint col, const char *custom_field)
+{
+  GList    *clp = g_list_nth(prefs.col_list, col);
+  fmt_data *cfmt;
+
+  if (!clp)  /* Invalid column requested */
+    return;
+
+  cfmt = (fmt_data *) clp->data;
+
+  g_free (cfmt->custom_field);
+  cfmt->custom_field = g_strdup (custom_field);
+}
+
+gint
+get_column_custom_occurrence(const gint col)
 {
-  int i, j;
+  GList    *clp = g_list_nth(prefs.col_list, col);
+  fmt_data *cfmt;
 
-  col_setup(&cfile->cinfo, prefs.num_cols);
+  if (!clp)  /* Invalid column requested */
+    return 0;
+
+  cfmt = (fmt_data *) clp->data;
 
-  for (i = 0; i < cfile->cinfo.num_cols; i++) {
-    cfile->cinfo.col_fmt[i] = get_column_format(i);
-    cfile->cinfo.col_title[i] = g_strdup(get_column_title(i));
-    if (cfile->cinfo.col_fmt[i] == COL_CUSTOM) {
-      cfile->cinfo.col_custom_field[i] = g_strdup(get_column_custom_field(i));
+  return(cfmt->custom_occurrence);
+}
+
+void
+set_column_custom_occurrence(const gint col, const gint custom_occurrence)
+{
+  GList    *clp = g_list_nth(prefs.col_list, col);
+  fmt_data *cfmt;
+
+  if (!clp)  /* Invalid column requested */
+    return;
+
+  cfmt = (fmt_data *) clp->data;
+
+  cfmt->custom_occurrence = custom_occurrence;
+}
+
+void
+build_column_format_array(column_info *cinfo, const gint num_cols, const gboolean reset_fences)
+{
+  int i;
+
+  /* Build the column format array */
+  col_setup(cinfo, num_cols);
+
+  for (i = 0; i < cinfo->num_cols; i++) {
+    cinfo->col_fmt[i] = get_column_format(i);
+    cinfo->col_title[i] = g_strdup(get_column_title(i));
+
+    if (cinfo->col_fmt[i] == COL_CUSTOM) {
+      cinfo->col_custom_field[i] = g_strdup(get_column_custom_field(i));
+      cinfo->col_custom_occurrence[i] = get_column_custom_occurrence(i);
+      if(!dfilter_compile(cinfo->col_custom_field[i], &cinfo->col_custom_dfilter[i])) {
+        /* XXX: Should we issue a warning? */
+        g_free(cinfo->col_custom_field[i]);
+        cinfo->col_custom_field[i] = NULL;
+        cinfo->col_custom_occurrence[i] = 0;
+        cinfo->col_custom_dfilter[i] = NULL;
+      }
     } else {
-      cfile->cinfo.col_custom_field[i] = NULL;
+      cinfo->col_custom_field[i] = NULL;
+      cinfo->col_custom_occurrence[i] = 0;
+      cinfo->col_custom_dfilter[i] = NULL;
     }
-    cfile->cinfo.fmt_matx[i] = (gboolean *) g_malloc0(sizeof(gboolean) *
-                                                    NUM_COL_FMTS);
-    get_column_format_matches(cfile->cinfo.fmt_matx[i],
-                             cfile->cinfo.col_fmt[i]);
-    cfile->cinfo.col_data[i] = NULL;
-
-    if (cfile->cinfo.col_fmt[i] == COL_INFO)
-      cfile->cinfo.col_buf[i] = (gchar *) g_malloc(sizeof(gchar) *
-                                                 COL_MAX_INFO_LEN);
+
+    cinfo->fmt_matx[i] = (gboolean *) g_malloc0(sizeof(gboolean) * NUM_COL_FMTS);
+    get_column_format_matches(cinfo->fmt_matx[i], cinfo->col_fmt[i]);
+    cinfo->col_data[i] = NULL;
+
+    if (cinfo->col_fmt[i] == COL_INFO)
+      cinfo->col_buf[i] = (gchar *) g_malloc(sizeof(gchar) * COL_MAX_INFO_LEN);
     else
-      cfile->cinfo.col_buf[i] = (gchar *) g_malloc(sizeof(gchar) * COL_MAX_LEN);
+      cinfo->col_buf[i] = (gchar *) g_malloc(sizeof(gchar) * COL_MAX_LEN);
 
     if(reset_fences)
-      cfile->cinfo.col_fence[i] = 0;
+      cinfo->col_fence[i] = 0;
 
-    cfile->cinfo.col_expr[i] = (gchar *) g_malloc(sizeof(gchar) * COL_MAX_LEN);
-    cfile->cinfo.col_expr_val[i] = (gchar *) g_malloc(sizeof(gchar) *
-                                                    COL_MAX_LEN);
+    cinfo->col_expr.col_expr[i] = (gchar *) g_malloc(sizeof(gchar) * COL_MAX_LEN);
+    cinfo->col_expr.col_expr_val[i] = (gchar *) g_malloc(sizeof(gchar) * COL_MAX_LEN);
   }
 
-  for (i = 0; i < cfile->cinfo.num_cols; i++) {
+  cinfo->col_expr.col_expr[i] = NULL;
+  cinfo->col_expr.col_expr_val[i] = NULL;
+
+  for (i = 0; i < cinfo->num_cols; i++) {
+    int j;
+
     for (j = 0; j < NUM_COL_FMTS; j++) {
-      if (!cfile->cinfo.fmt_matx[i][j])
-             continue;
+      if (!cinfo->fmt_matx[i][j])
+          continue;
 
-      if (cfile->cinfo.col_first[j] == -1)
-        cfile->cinfo.col_first[j] = i;
+      if (cinfo->col_first[j] == -1)
+        cinfo->col_first[j] = i;
 
-      cfile->cinfo.col_last[j] = i;
+      cinfo->col_last[j] = i;
     }
   }
 }
+