- c = cf.pd + tree_selected_start;
- buf = g_malloc(32 + tree_selected_len * 3);
- ptr = buf;
-
- sprintf(ptr, "frame[%d : %d] == ", tree_selected_start, tree_selected_len);
- ptr = buf+strlen(buf);
-
- if (tree_selected_len == 1) {
- sprintf(ptr, "0x%02x", *c++);
- }
- else {
- for (i=0;i<tree_selected_len; i++) {
- if (i == 0 ) {
- sprintf(ptr, "%02x", *c++);
- }
- else {
- sprintf(ptr, ":%02x", *c++);
- }
- ptr = buf+strlen(buf);
- }
- }
+ hfinfo = finfo_selected->hfinfo;
+ g_assert(hfinfo);
+ abbrev_len = strlen(hfinfo->abbrev);
+
+ switch(hfinfo->type) {
+
+ case FT_BOOLEAN:
+ dfilter_len = abbrev_len + 2;
+ buf = g_malloc0(dfilter_len);
+ snprintf(buf, dfilter_len, "%s%s", finfo_selected->value.numeric ? "" : "!",
+ hfinfo->abbrev);
+ break;
+
+ case FT_UINT8:
+ case FT_UINT16:
+ case FT_UINT24:
+ case FT_UINT32:
+ case FT_INT8:
+ case FT_INT16:
+ case FT_INT24:
+ case FT_INT32:
+ dfilter_len = abbrev_len + 20;
+ buf = g_malloc0(dfilter_len);
+ format = hfinfo_numeric_format(hfinfo);
+ snprintf(buf, dfilter_len, format, hfinfo->abbrev, finfo_selected->value.numeric);
+ break;
+
+ case FT_IPv4:
+ dfilter_len = abbrev_len + 21;
+ buf = g_malloc0(dfilter_len);
+ /* xxx.xxx.xxx.xxx */
+ format = g_strdup("%s == ");
+ ipv4_addr_sprintf(&(finfo_selected->value.ipv4), &format[6]),
+ snprintf(buf, dfilter_len, format, hfinfo->abbrev);
+ g_free(format);
+ break;
+
+ case FT_IPXNET:
+ dfilter_len = abbrev_len + 15;
+ buf = g_malloc0(dfilter_len);
+ snprintf(buf, dfilter_len, "%s == 0x%08x", hfinfo->abbrev,
+ finfo_selected->value.numeric);
+ break;
+
+ case FT_IPv6:
+ stringified = ip6_to_str((struct e_in6_addr*) &(finfo_selected->value.ipv6));
+ dfilter_len = abbrev_len + 4 + strlen(stringified) + 1;
+ buf = g_malloc0(dfilter_len);
+ snprintf(buf, dfilter_len, "%s == %s", hfinfo->abbrev,
+ stringified);
+ break;
+
+ case FT_DOUBLE:
+ dfilter_len = abbrev_len + 30;
+ buf = g_malloc0(dfilter_len);
+ snprintf(buf, dfilter_len, "%s == %f", hfinfo->abbrev,
+ finfo_selected->value.floating);
+ break;
+
+ case FT_ETHER:
+ dfilter_len = abbrev_len + 22;
+ buf = g_malloc0(dfilter_len);
+ snprintf(buf, dfilter_len, "%s == %02x:%02x:%02x:%02x:%02x:%02x",
+ hfinfo->abbrev,
+ finfo_selected->value.ether[0],
+ finfo_selected->value.ether[1],
+ finfo_selected->value.ether[2],
+ finfo_selected->value.ether[3],
+ finfo_selected->value.ether[4],
+ finfo_selected->value.ether[5]);
+ break;
+#if 0
+
+ case FT_ABSOLUTE_TIME:
+ case FT_RELATIVE_TIME:
+ memcpy(&fi->value.time, va_arg(ap, struct timeval*),
+ sizeof(struct timeval));
+ break;
+
+ case FT_STRING:
+ /* This g_strdup'ed memory is freed in proto_tree_free_node() */
+ fi->value.string = g_strdup(va_arg(ap, char*));
+ break;
+
+ case FT_TEXT_ONLY:
+ ; /* nothing */
+ break;
+#endif
+ default:
+ c = cf.pd + finfo_selected->start;
+ buf = g_malloc0(32 + finfo_selected->length * 3);
+ ptr = buf;
+
+ sprintf(ptr, "frame[%d : %d] == ", finfo_selected->start, finfo_selected->length);
+ ptr = buf+strlen(buf);
+
+ if (finfo_selected->length == 1) {
+ sprintf(ptr, "0x%02x", *c++);
+ }
+ else {
+ for (i=0;i<finfo_selected->length; i++) {
+ if (i == 0 ) {
+ sprintf(ptr, "%02x", *c++);
+ }
+ else {
+ sprintf(ptr, ":%02x", *c++);
+ }
+ ptr = buf+strlen(buf);
+ }
+ }
+ break;
+ }