summaryrefslogtreecommitdiff
path: root/epan/strutil.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2007-10-26 05:42:12 +0000
committerAnders Broman <anders.broman@ericsson.com>2007-10-26 05:42:12 +0000
commit3a16fb20a3ef22213bac070b871c91a141cbba65 (patch)
tree4d67f48f3730a2b0a859650113866f141a786480 /epan/strutil.c
parent300503cdcb355a2415ee44df7350e79113bb3ee4 (diff)
downloadwireshark-3a16fb20a3ef22213bac070b871c91a141cbba65.tar.gz
Apply yet another set of the optimization patches:
Replace strncpy with g_strlcpy. Add g_strlcat for GTK1 and don't use g_snprintf in GTK1 g_strlcpy printf family is very slow. svn path=/trunk/; revision=23273
Diffstat (limited to 'epan/strutil.c')
-rw-r--r--epan/strutil.c70
1 files changed, 60 insertions, 10 deletions
diff --git a/epan/strutil.c b/epan/strutil.c
index 3f1b04db86..05ab72bf94 100644
--- a/epan/strutil.c
+++ b/epan/strutil.c
@@ -952,19 +952,69 @@ convert_string_case(const char *string, gboolean case_insensitive)
return out_string;
}
-/* g_strlcat() does not exist in GLib 1.2[.x] */
+/* g_strlcat(), g_strlcpy don't exist in GLib 1.2[.x] */
#if GLIB_MAJOR_VERSION < 2
gsize
-g_strlcat(gchar *dst, gchar *src, gsize size)
+g_strlcat(gchar *dest, gchar *src, gsize dest_size)
{
- gsize strl;
- int strs;
- strl=strlen(dst);
- strs=strlen(src);
- if(strl<size)
- g_snprintf(dst+strl, size-strl, "%s", src);
- dst[size-1]=0;
- return strl+strs;
+ gchar *d = dest;
+ const gchar *s = src;
+ gsize bytes_left = dest_size;
+ gsize dlength; /* Logically, MIN (strlen (d), dest_size) */
+
+ /* Find the end of dst and adjust bytes left but don't go past end */
+ while (*d != 0 && bytes_left-- != 0)
+ d++;
+ dlength = d - dest;
+ bytes_left = dest_size - dlength;
+
+ if (bytes_left == 0)
+ return dlength + strlen (s);
+
+ while (*s != 0)
+ {
+ if (bytes_left != 1)
+ {
+ *d++ = *s;
+ bytes_left--;
+ }
+ s++;
+ }
+ *d = 0;
+
+ return dlength + (s - src); /* count does not include NUL */
+}
+
+/* --------------------------------- */
+gsize
+g_strlcpy(gchar *dest, const gchar *src, gsize dest_size)
+{
+ gchar *d = dest;
+ const gchar *s = src;
+ gsize n = dest_size;
+
+ /* Copy as many bytes as will fit */
+ if (n != 0 && --n != 0)
+ do
+ {
+ gchar c = *s++;
+
+ *d++ = c;
+ if (c == 0)
+ break;
+ }
+ while (--n != 0);
+
+ /* If not enough room in dest, add NUL and traverse rest of src */
+ if (n == 0)
+ {
+ if (dest_size != 0)
+ *d = 0;
+ while (*s++)
+ ;
+ }
+
+ return s - src - 1; /* count does not include NUL */
}
#endif