From Sebastien Tandel:
authorsfisher <sfisher@f5534014-38df-0310-8fa8-9805f1628bb7>
Tue, 13 Feb 2007 20:57:22 +0000 (20:57 +0000)
committersfisher <sfisher@f5534014-38df-0310-8fa8-9805f1628bb7>
Tue, 13 Feb 2007 20:57:22 +0000 (20:57 +0000)
Create two new files (ws_strsplit.[ch]) that use GTK2 code to override
the buggy g_strsplit() function when compiling for GTK1.  Include this
work-around function (ws_strsplit) in libwireshark.def.  Add notes on usage
to README.developer.  Include epan/ws_strsplit.h in all files that use
g_strsplit().

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@20804 f5534014-38df-0310-8fa8-9805f1628bb7

19 files changed:
doc/README.developer
epan/Makefile.common
epan/crypt/airpdcap.c
epan/dissectors/packet-http.c
epan/dissectors/packet-jxta.c
epan/dissectors/packet-k12.c
epan/ex-opt.c
epan/libwireshark.def
epan/stats_tree.c
epan/ws_strsplit.c [new file with mode: 0644]
epan/ws_strsplit.h [new file with mode: 0644]
gtk/font_utils.c
gtk/voip_calls.c
gtk/webbrowser.c
plugins/mate/mate_grammar.lemon
plugins/mate/mate_setup.c
plugins/mate/mate_util.c
tap-funnel.c
util.c

index a27c8f31747bd58b60882cec6efcd4c966b0e95f..3032263502edbc3f97690d95f15d0bdc41fbbffb 100644 (file)
@@ -433,6 +433,12 @@ automatically free()d when the dissection of the current packet ends so you
 don't have to worry about free()ing them explicitly in order to not leak memory.
 Please read README.malloc.
 
+When using g_strsplit() from glib, place an #include <epan/ws_strsplit.h> at
+the top of your file.  This file will leave in place g_strsplit() when using
+GTK/GLib v2 and replace it with GLib v2 code when compiling for GTK/GLib 1.
+This is necessary because the GLib v1 version of g_strsplit is known to be
+buggy.  In either case, you will still use the g_strsplit() function name
+as usual in your code.
 
 1.1.3 Robustness.
 
index febc2a831933f4181d25f71963b0cf37636a9fe6..108fe0cbfbe79c547a1ab476270fc170b88f90d0 100644 (file)
@@ -91,6 +91,7 @@ LIBWIRESHARK_SRC =            \
        uat_load.c \
        unicode-utils.c         \
        value_string.c          \
+       ws_strsplit.c           \
        xdlc.c                  \
        xmlstub.c
 
@@ -190,6 +191,7 @@ LIBWIRESHARK_INCLUDES =     \
        uat-int.h       \
        unicode-utils.h         \
        value_string.h          \
+       ws_strsplit.h           \
        x264_prt_id.h           \
        xdlc.h                  \
        xmlstub.h
index aa7f6e5069f14bb68e03efd7ac393a5b413aa8d9..08754033bf12cb4d1d34814a025e20a3363a2664 100644 (file)
@@ -35,6 +35,7 @@
 #include <epan/tvbuff.h>
 #include <epan/crc32.h>
 #include <epan/strutil.h>
+#include <epan/ws_strsplit.h>
 
 #include "airpdcap_system.h"
 #include "airpdcap_int.h"
index ddacf2de9fcadaead498d30daaf5aabacf8541a6..71df1e16fc56c2458ff40535dba5b543ed5fe994 100644 (file)
@@ -44,6 +44,7 @@
 #include <epan/base64.h>
 #include <epan/emem.h>
 #include <epan/stats_tree.h>
+#include <epan/ws_strsplit.h>
 
 #include <epan/req_resp_hdrs.h>
 #include "packet-http.h"
index 25d30cf58a8483bcf1654e3ca1cde4b8c516df1a..97c58da391ee61e71e3037f4f296c4b08a0ea25f 100644 (file)
@@ -46,6 +46,7 @@
 #include <epan/prefs.h>
 #include <epan/tap.h>
 #include <epan/emem.h>
+#include <epan/ws_strsplit.h>
 
 #include "packet-jxta.h"
 
index c62959b11cfa808b441eba2e195e1baab34755a3..ef98bf661324fe51ad1ecc42aa36a93185ae1b05 100644 (file)
@@ -41,6 +41,7 @@
 #include <epan/strutil.h>
 #include "packet-sscop.h"
 #include "packet-umts_fp.h"
+#include <epan/ws_strsplit.h>
 
 typedef struct _k12_hdls_t {
        char* match;
index f584324c8e551149e4571e5ac35949100120fc18..3731572d5253090cc90635b65076ffcc1627586f 100644 (file)
@@ -32,6 +32,7 @@
 
 #include <glib.h>
 #include "ex-opt.h"
+#include <epan/ws_strsplit.h>
 
 static GHashTable* ex_opts = NULL;
 
index ce9ec2e9cf91ac6136505fac85e5627d6d5ba55e..206fd6ffcc86fdda937b2a42cbc2715be2ffcd0f 100644 (file)
@@ -802,4 +802,5 @@ vals_status                     DATA
 val_to_str
 value_is_in_range
 write_prefs
+ws_strsplit
 xml_escape
index dd4e8f0161845e817184b00c0b56955ae2f3d495..02ca8a90bdd68775d70bc88a4181952b2a52cab2 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <glib.h>
 #include <epan/stats_tree_priv.h>
+#include <epan/ws_strsplit.h>
 #include <string.h>
 
 #include "stats_tree.h"
@@ -541,48 +542,42 @@ extern guint8* stats_tree_get_abbr(const guint8* optarg) {
  *
  */
 static range_pair_t* get_range(guint8* rngstr) {
-       gchar** split;
-       range_pair_t* rng;
-       
-       split = g_strsplit((gchar*)rngstr,"-",2);
+        gchar** split;
+        range_pair_t* rng;
 
-       /* empty string */
-       if (split[0] == NULL) {
-         g_strfreev(split);
-         return NULL;
-       }
+        split = g_strsplit((gchar*)rngstr,"-",2);
 
-#if GLIB_MAJOR_VERSION >= 2
-       /* means we have a non empty string 
-        * which does not contain a delimiter */
-       if (split[1] == NULL) {
-         g_strfreev(split);
-         return NULL;
-       }
-#endif
+        /* empty string */
+        if (split[0] == NULL) {
+          g_strfreev(split);
+          return NULL;
+        }
 
-       rng = g_malloc(sizeof(range_pair_t));
+        /* means we have a non empty string 
+         * which does not contain a delimiter */
+        if (split[1] == NULL) {
+          g_strfreev(split);
+          return NULL;
+        }
 
-       /* string == "X-?" */
-       if (*(split[0]) != '\0') {
-           rng->floor = strtol(split[0],NULL,10);
-       } else
-         /* string == "-?" */
-         rng->floor = G_MININT;
+        rng = g_malloc(sizeof(range_pair_t));
+
+        /* string == "X-?" */
+        if (*(split[0]) != '\0') {
+            rng->floor = strtol(split[0],NULL,10);
+        } else
+          /* string == "-?" */
+          rng->floor = G_MININT;
+
+        /* string != "?-" */
+        if (*(split[1]) != '\0') {
+          rng->ceil  = strtol(split[1],NULL,10);
+        } else
+          /* string == "?-" */
+          rng->ceil = G_MAXINT;
+
+        g_strfreev(split);
 
-       /* string != "?-" */
-#if GLIB_MAJOR_VERSION >= 2
-       if (*(split[1]) != '\0') {
-#else
-       if (split[1] != NULL) {
-#endif
-         rng->ceil  = strtol(split[1],NULL,10);
-       } else
-         /* string == "?-" */
-         rng->ceil = G_MAXINT;
-       
-       g_strfreev(split);
-       
        return rng;
 }
 
@@ -595,7 +590,7 @@ extern int stats_tree_create_range_node(stats_tree* st,
        guint8* curr_range;
        stat_node* rng_root = new_stat_node(st, name, parent_id, FALSE, TRUE);
        stat_node* range_node = NULL;
-       
+
        va_start( list, parent_id );
        while (( curr_range = va_arg(list, guint8*) )) {
                range_node = new_stat_node(st, curr_range, rng_root->id, FALSE, FALSE);
diff --git a/epan/ws_strsplit.c b/epan/ws_strsplit.c
new file mode 100644 (file)
index 0000000..b0f02e7
--- /dev/null
@@ -0,0 +1,82 @@
+/* ws_strsplit.c
+ * String Split utility function
+ * Code borrowed from GTK2 to override the GTK1 version of g_strsplit, which is
+ * known to be buggy.
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.
+ */
+
+#if GLIB_MAJOR_VERSION < 2
+#include <glib.h>
+#include <string.h>
+
+gchar** ws_strsplit ( const gchar *string,
+                     const gchar *delimiter,
+                     gint max_tokens)
+{
+  GSList *string_list = NULL, *slist;
+  gchar **str_array, *s;
+  guint n = 0;
+  const gchar *remainder;
+
+  g_return_val_if_fail (string != NULL, NULL);
+  g_return_val_if_fail (delimiter != NULL, NULL);
+  g_return_val_if_fail (delimiter[0] != '\0', NULL);
+
+  if (max_tokens < 1)
+    max_tokens = G_MAXINT;
+
+  remainder = string;
+  s = strstr (remainder, delimiter);
+  if (s) {
+    gsize delimiter_len = strlen (delimiter);
+
+    while (--max_tokens && s) {
+      gsize len;
+      gchar *new_string;
+
+      len = s - remainder;
+      new_string = g_new (gchar, len + 1);
+      strncpy (new_string, remainder, len);
+      new_string[len] = 0;
+      string_list = g_slist_prepend (string_list, new_string);
+      n++;
+      remainder = s + delimiter_len;
+      s = strstr (remainder, delimiter);
+    }
+  }
+  if (*string) {
+    n++;
+    string_list = g_slist_prepend (string_list, g_strdup (remainder));
+  }
+
+  str_array = g_new (gchar*, n + 1);
+
+  str_array[n--] = NULL;
+  for (slist = string_list; slist; slist = slist->next)
+    str_array[n--] = slist->data;
+
+  g_slist_free (string_list);
+
+  return str_array;
+}
+
+#endif /* GLIB_MAJOR_VERSION */
diff --git a/epan/ws_strsplit.h b/epan/ws_strsplit.h
new file mode 100644 (file)
index 0000000..3f5280a
--- /dev/null
@@ -0,0 +1,41 @@
+/* ws_strsplit.h
+ * String Split utility function
+ * Code borrowed from GTK2 to override the GTK1 version of g_strsplit, which is
+ * known to be buggy.
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.
+ */
+
+#ifndef __WS_STRSPLIT_H__
+#define __WS_STRSPLIT_H__
+
+#if GLIB_MAJOR_VERSION < 2
+
+#define g_strsplit(s, d, t) ws_strsplit(s, d, t)
+
+gchar ** ws_strsplit (const gchar *string,
+                     const gchar *delimiter,
+                     gint max_tokens);
+
+#endif /* GLIB_MAJOR_VERSION */
+
+#endif /* __WS_STRSPLIT_H__ */
+
index fb5da326358b5bc89ac5de3bdf3bd5834e1433b2..11875fc09f093461314cea7075c98b2c888e9816 100644 (file)
@@ -32,6 +32,7 @@
 #include <stdio.h>
 
 #include <epan/packet.h>
+#include <epan/ws_strsplit.h>
 
 #ifdef _WIN32
 #include <windows.h>
index daadca553c64b0cf77d2e50329520e8e207e24f4..18a763bd3044e21299c949ecf719ca02f506cbd8 100644 (file)
@@ -61,6 +61,7 @@
 #include <epan/dissectors/packet-t38.h>
 #include <epan/conversation.h>
 #include <epan/rtp_pt.h>
+#include <epan/ws_strsplit.h>
 
 #include "alert_box.h"
 #include "simple_dialog.h"
index 4520704f679e135dd8ba06a64f55c42a19c9b9c0..ff069c98da49df9c6bc3ffd7e548bb76c76163db 100644 (file)
@@ -35,6 +35,7 @@
 #include <gtk/gtk.h>
 
 #include <epan/filesystem.h>
+#include <epan/ws_strsplit.h>
 
 #include <epan/prefs.h>
 #include "webbrowser.h"
index b575b4963491b89b989de6cee86af48f2a5880f4..d57e109aac98807d0a26f3026b95b1608c203ac3 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "mate.h"
 #include "mate_grammar.h"
+#include <epan/ws_strsplit.h>
 
 #define DUMMY void*
 
index f0fa63145c1b82f65f3e180d6933f5e76df1b75e..c9146eee500c5eb131c8a699359b5143a4ae659d 100644 (file)
@@ -25,6 +25,7 @@
 */
 
 #include "mate.h"
+#include <epan/ws_strsplit.h>
 
 /* the current mate_config */
 static mate_config* matecfg = NULL;
index 7108c215e4703c5251f8516eef161dcaaefe22c5..c93512dd314a55f6f26aedffdbdfcda03b23be10 100644 (file)
@@ -28,6 +28,7 @@
 #include "mate.h"
 #include "mate_util.h"
 #include <wiretap/file_util.h>
+#include <epan/ws_strsplit.h>
 
 /***************************************************************************
 *  dbg_print
index 7fed0d2f9d95d0e8b26e498e1d74808657b074e6..f15b4d77b5d224489dc7cffb7023ec1199c460bb 100644 (file)
@@ -30,6 +30,7 @@
 #include <epan/funnel.h>
 #include <stdio.h>
 #include <epan/stat_cmd_args.h>
+#include <epan/ws_strsplit.h>
 
 
 struct _funnel_text_window_t {
diff --git a/util.c b/util.c
index d5e23088113d16aff6fa632011ac36f78dad5d09..80fe8d8f1eb3937e5bc70a6d443aa73b27d4ad21 100644 (file)
--- a/util.c
+++ b/util.c
@@ -39,6 +39,7 @@
 
 #include <epan/address.h>
 #include <epan/addr_resolv.h>
+#include <epan/ws_strsplit.h>
 
 #include "util.h"