From b8d7add3779d251ec1401777b55a509df5fac7a4 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Mon, 26 Mar 2001 18:35:34 +0000 Subject: [PATCH] *** empty log message *** --- ChangeLog | 11 +++++ ChangeLog.pre-2-0 | 11 +++++ ChangeLog.pre-2-10 | 11 +++++ ChangeLog.pre-2-12 | 11 +++++ ChangeLog.pre-2-2 | 11 +++++ ChangeLog.pre-2-4 | 11 +++++ ChangeLog.pre-2-6 | 11 +++++ ChangeLog.pre-2-8 | 11 +++++ config.h.win32.in | 3 ++ configure.in | 2 +- docs/reference/glib/glib-sections.txt | 1 + docs/reference/glib/tmpl/macros_misc.sgml | 1 - docs/reference/glib/tmpl/string_utils.sgml | 10 +++++ glib.def | 1 + glib/glib.def | 1 + glib/gstrfuncs.c | 68 ++++++++++++++++++++++++------ glib/gstrfuncs.h | 3 ++ gstrfuncs.c | 68 ++++++++++++++++++++++++------ gstrfuncs.h | 3 ++ 19 files changed, 219 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index 995f57a..12e494f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +Mon Mar 26 13:34:50 2001 Owen Taylor + + [ Patch from DindinX , added docs ] + + * gstrfuncs.c, gstrfuncs.h: Add g_stpcpy () for platform that don't + have stpcpy (). + * gstrfuncs.c (g_strjoin, g_strjoinv and g_strconcat): use + g_stpcpy () so these functions run much faster. + * config.h.win32.in, glib.def: add reference to g_stpcpy () + * configure.in: Add a test for the stpcpy () function. + 2001-03-20 Havoc Pennington * gutf8.c (g_utf8_strlen): rewrite, based on bug #52328 from diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 995f57a..12e494f 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,14 @@ +Mon Mar 26 13:34:50 2001 Owen Taylor + + [ Patch from DindinX , added docs ] + + * gstrfuncs.c, gstrfuncs.h: Add g_stpcpy () for platform that don't + have stpcpy (). + * gstrfuncs.c (g_strjoin, g_strjoinv and g_strconcat): use + g_stpcpy () so these functions run much faster. + * config.h.win32.in, glib.def: add reference to g_stpcpy () + * configure.in: Add a test for the stpcpy () function. + 2001-03-20 Havoc Pennington * gutf8.c (g_utf8_strlen): rewrite, based on bug #52328 from diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 995f57a..12e494f 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,14 @@ +Mon Mar 26 13:34:50 2001 Owen Taylor + + [ Patch from DindinX , added docs ] + + * gstrfuncs.c, gstrfuncs.h: Add g_stpcpy () for platform that don't + have stpcpy (). + * gstrfuncs.c (g_strjoin, g_strjoinv and g_strconcat): use + g_stpcpy () so these functions run much faster. + * config.h.win32.in, glib.def: add reference to g_stpcpy () + * configure.in: Add a test for the stpcpy () function. + 2001-03-20 Havoc Pennington * gutf8.c (g_utf8_strlen): rewrite, based on bug #52328 from diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 995f57a..12e494f 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,14 @@ +Mon Mar 26 13:34:50 2001 Owen Taylor + + [ Patch from DindinX , added docs ] + + * gstrfuncs.c, gstrfuncs.h: Add g_stpcpy () for platform that don't + have stpcpy (). + * gstrfuncs.c (g_strjoin, g_strjoinv and g_strconcat): use + g_stpcpy () so these functions run much faster. + * config.h.win32.in, glib.def: add reference to g_stpcpy () + * configure.in: Add a test for the stpcpy () function. + 2001-03-20 Havoc Pennington * gutf8.c (g_utf8_strlen): rewrite, based on bug #52328 from diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 995f57a..12e494f 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,14 @@ +Mon Mar 26 13:34:50 2001 Owen Taylor + + [ Patch from DindinX , added docs ] + + * gstrfuncs.c, gstrfuncs.h: Add g_stpcpy () for platform that don't + have stpcpy (). + * gstrfuncs.c (g_strjoin, g_strjoinv and g_strconcat): use + g_stpcpy () so these functions run much faster. + * config.h.win32.in, glib.def: add reference to g_stpcpy () + * configure.in: Add a test for the stpcpy () function. + 2001-03-20 Havoc Pennington * gutf8.c (g_utf8_strlen): rewrite, based on bug #52328 from diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 995f57a..12e494f 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,14 @@ +Mon Mar 26 13:34:50 2001 Owen Taylor + + [ Patch from DindinX , added docs ] + + * gstrfuncs.c, gstrfuncs.h: Add g_stpcpy () for platform that don't + have stpcpy (). + * gstrfuncs.c (g_strjoin, g_strjoinv and g_strconcat): use + g_stpcpy () so these functions run much faster. + * config.h.win32.in, glib.def: add reference to g_stpcpy () + * configure.in: Add a test for the stpcpy () function. + 2001-03-20 Havoc Pennington * gutf8.c (g_utf8_strlen): rewrite, based on bug #52328 from diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 995f57a..12e494f 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,14 @@ +Mon Mar 26 13:34:50 2001 Owen Taylor + + [ Patch from DindinX , added docs ] + + * gstrfuncs.c, gstrfuncs.h: Add g_stpcpy () for platform that don't + have stpcpy (). + * gstrfuncs.c (g_strjoin, g_strjoinv and g_strconcat): use + g_stpcpy () so these functions run much faster. + * config.h.win32.in, glib.def: add reference to g_stpcpy () + * configure.in: Add a test for the stpcpy () function. + 2001-03-20 Havoc Pennington * gutf8.c (g_utf8_strlen): rewrite, based on bug #52328 from diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 995f57a..12e494f 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,14 @@ +Mon Mar 26 13:34:50 2001 Owen Taylor + + [ Patch from DindinX , added docs ] + + * gstrfuncs.c, gstrfuncs.h: Add g_stpcpy () for platform that don't + have stpcpy (). + * gstrfuncs.c (g_strjoin, g_strjoinv and g_strconcat): use + g_stpcpy () so these functions run much faster. + * config.h.win32.in, glib.def: add reference to g_stpcpy () + * configure.in: Add a test for the stpcpy () function. + 2001-03-20 Havoc Pennington * gutf8.c (g_utf8_strlen): rewrite, based on bug #52328 from diff --git a/config.h.win32.in b/config.h.win32.in index d263cf2..6e8f1a8 100644 --- a/config.h.win32.in +++ b/config.h.win32.in @@ -102,6 +102,9 @@ /* Define if you have the on_exit function. */ /* #undef HAVE_ON_EXIT */ +/* Define if you have the stpcpy function. */ +/* #undef HAVE_STPCPY */ + /* Define if you have the strcasecmp function. */ /* #undef HAVE_STRCASECMP */ diff --git a/configure.in b/configure.in index 9f6a21b..5cd4e33 100644 --- a/configure.in +++ b/configure.in @@ -412,7 +412,7 @@ GLIB_SIZEOF([$size_includes], ptrdiff_t, ptrdiff_t) GLIB_SIZEOF([$size_includes], intmax_t, intmax_t) # Check for some functions -AC_CHECK_FUNCS(lstat strerror strsignal memmove mkstemp vsnprintf strcasecmp strncasecmp poll getcwd) +AC_CHECK_FUNCS(lstat strerror strsignal memmove mkstemp vsnprintf stpcpy strcasecmp strncasecmp poll getcwd) # Check if bcopy can be used for overlapping copies, if memmove isn't found. # The check is borrowed from the PERL Configure script. diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt index c2bbb37..ebc9f37 100644 --- a/docs/reference/glib/glib-sections.txt +++ b/docs/reference/glib/glib-sections.txt @@ -804,6 +804,7 @@ g_strdup g_strndup g_strdupv g_strnfill +g_stpcpy g_strlcpy diff --git a/docs/reference/glib/tmpl/macros_misc.sgml b/docs/reference/glib/tmpl/macros_misc.sgml index 994ffb7..a7768c7 100644 --- a/docs/reference/glib/tmpl/macros_misc.sgml +++ b/docs/reference/glib/tmpl/macros_misc.sgml @@ -66,7 +66,6 @@ only one statement is expected by the compiler. Portable way to copy va_list variables. - @ap1: the va_list variable to place a copy of @ap2 in. @ap2: a va_list. diff --git a/docs/reference/glib/tmpl/string_utils.sgml b/docs/reference/glib/tmpl/string_utils.sgml index 7ee4906..2bcd04a 100644 --- a/docs/reference/glib/tmpl/string_utils.sgml +++ b/docs/reference/glib/tmpl/string_utils.sgml @@ -59,6 +59,16 @@ The returned string should be freed when no longer needed. @Returns: a newly-allocated string filled the @fill_char. + + + + + +@dest: +@src: +@Returns: + + diff --git a/glib.def b/glib.def index 62012cd..3042c52 100644 --- a/glib.def +++ b/glib.def @@ -475,6 +475,7 @@ EXPORTS g_static_rw_lock_writer_lock g_static_rw_lock_writer_trylock g_static_rw_lock_writer_unlock + g_strcpy g_str_equal g_str_hash g_strcanon diff --git a/glib/glib.def b/glib/glib.def index 62012cd..3042c52 100644 --- a/glib/glib.def +++ b/glib/glib.def @@ -475,6 +475,7 @@ EXPORTS g_static_rw_lock_writer_lock g_static_rw_lock_writer_trylock g_static_rw_lock_writer_unlock + g_strcpy g_str_equal g_str_hash g_strcanon diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c index 0efc262..add39aa 100644 --- a/glib/gstrfuncs.c +++ b/glib/gstrfuncs.c @@ -118,6 +118,40 @@ g_strnfill (guint length, return str; } +/** + * g_stpcpy: + * @dest: destination buffer + * @src: source string + * + * Copies a nul-terminated string into the dest buffer, include the + * trailing nul, and return a pointer to the trailing nul byte. + * This is useful for concatenating multiple strings together + * without having to repeatedly scan for the end. + * + * Return value: a pointer to trailing nul byte. + **/ +gchar * +g_stpcpy (gchar *dest, + const gchar *src) +{ +#ifdef HAVE_STPCPY + g_return_val_if_fail (dest != NULL, NULL); + g_return_val_if_fail (src != NULL, NULL); + return stpcpy (dest, src); +#else + register gchar *d = dest; + register const gchar *s = src; + + g_return_val_if_fail (dest != NULL, NULL); + g_return_val_if_fail (src != NULL, NULL); + do + *d++ = *s; + while (*s++ != '\0'); + + return d - 1; +#endif +} + gchar* g_strdup_vprintf (const gchar *format, va_list args1) @@ -156,6 +190,7 @@ g_strconcat (const gchar *string1, ...) va_list args; gchar *s; gchar *concat; + gchar *ptr; g_return_val_if_fail (string1 != NULL, NULL); @@ -170,9 +205,9 @@ g_strconcat (const gchar *string1, ...) va_end (args); concat = g_new (gchar, l); - concat[0] = 0; + ptr = concat; - strcat (concat, string1); + ptr = g_stpcpy (ptr, string1); va_start (args, string1); s = va_arg (args, gchar*); while (s) @@ -1369,6 +1404,7 @@ g_strjoinv (const gchar *separator, gchar **str_array) { gchar *string; + gchar *ptr; g_return_val_if_fail (str_array != NULL, NULL); @@ -1381,17 +1417,19 @@ g_strjoinv (const gchar *separator, guint separator_len; separator_len = strlen (separator); + /* First part, getting length */ len = 1 + strlen (str_array[0]); - for(i = 1; str_array[i] != NULL; i++) - len += separator_len + strlen(str_array[i]); + for (i = 1; str_array[i] != NULL; i++) + len += strlen (str_array[i]); + len += separator_len * (i - 1); + /* Second part, building string */ string = g_new (gchar, len); - *string = 0; - strcat (string, *str_array); + ptr = g_stpcpy (string, *str_array); for (i = 1; str_array[i] != NULL; i++) { - strcat (string, separator); - strcat (string, str_array[i]); + ptr = g_stpcpy (ptr, separator); + ptr = g_stpcpy (ptr, str_array[i]); } } else @@ -1408,6 +1446,7 @@ g_strjoin (const gchar *separator, va_list args; guint len; guint separator_len; + gchar *ptr; if (separator == NULL) separator = ""; @@ -1420,7 +1459,8 @@ g_strjoin (const gchar *separator, if (s) { - len = strlen (s); + /* First part, getting length */ + len = 1 + strlen (s); s = va_arg (args, gchar*); while (s) @@ -1430,19 +1470,19 @@ g_strjoin (const gchar *separator, } va_end (args); - string = g_new (gchar, len + 1); - *string = 0; + /* Second part, building string */ + string = g_new (gchar, len); va_start (args, separator); s = va_arg (args, gchar*); - strcat (string, s); + ptr = g_stpcpy (string, s); s = va_arg (args, gchar*); while (s) { - strcat (string, separator); - strcat (string, s); + ptr = g_stpcpy (ptr, separator); + ptr = g_stpcpy (ptr, s); s = va_arg (args, gchar*); } } diff --git a/glib/gstrfuncs.h b/glib/gstrfuncs.h index 11064c3..183fecf 100644 --- a/glib/gstrfuncs.h +++ b/glib/gstrfuncs.h @@ -119,6 +119,9 @@ gchar* g_strjoinv (const gchar *separator, void g_strfreev (gchar **str_array); gchar** g_strdupv (gchar **str_array); +gchar* g_stpcpy (gchar *dest, + const char *src); + G_END_DECLS #endif /* __G_STRFUNCS_H__ */ diff --git a/gstrfuncs.c b/gstrfuncs.c index 0efc262..add39aa 100644 --- a/gstrfuncs.c +++ b/gstrfuncs.c @@ -118,6 +118,40 @@ g_strnfill (guint length, return str; } +/** + * g_stpcpy: + * @dest: destination buffer + * @src: source string + * + * Copies a nul-terminated string into the dest buffer, include the + * trailing nul, and return a pointer to the trailing nul byte. + * This is useful for concatenating multiple strings together + * without having to repeatedly scan for the end. + * + * Return value: a pointer to trailing nul byte. + **/ +gchar * +g_stpcpy (gchar *dest, + const gchar *src) +{ +#ifdef HAVE_STPCPY + g_return_val_if_fail (dest != NULL, NULL); + g_return_val_if_fail (src != NULL, NULL); + return stpcpy (dest, src); +#else + register gchar *d = dest; + register const gchar *s = src; + + g_return_val_if_fail (dest != NULL, NULL); + g_return_val_if_fail (src != NULL, NULL); + do + *d++ = *s; + while (*s++ != '\0'); + + return d - 1; +#endif +} + gchar* g_strdup_vprintf (const gchar *format, va_list args1) @@ -156,6 +190,7 @@ g_strconcat (const gchar *string1, ...) va_list args; gchar *s; gchar *concat; + gchar *ptr; g_return_val_if_fail (string1 != NULL, NULL); @@ -170,9 +205,9 @@ g_strconcat (const gchar *string1, ...) va_end (args); concat = g_new (gchar, l); - concat[0] = 0; + ptr = concat; - strcat (concat, string1); + ptr = g_stpcpy (ptr, string1); va_start (args, string1); s = va_arg (args, gchar*); while (s) @@ -1369,6 +1404,7 @@ g_strjoinv (const gchar *separator, gchar **str_array) { gchar *string; + gchar *ptr; g_return_val_if_fail (str_array != NULL, NULL); @@ -1381,17 +1417,19 @@ g_strjoinv (const gchar *separator, guint separator_len; separator_len = strlen (separator); + /* First part, getting length */ len = 1 + strlen (str_array[0]); - for(i = 1; str_array[i] != NULL; i++) - len += separator_len + strlen(str_array[i]); + for (i = 1; str_array[i] != NULL; i++) + len += strlen (str_array[i]); + len += separator_len * (i - 1); + /* Second part, building string */ string = g_new (gchar, len); - *string = 0; - strcat (string, *str_array); + ptr = g_stpcpy (string, *str_array); for (i = 1; str_array[i] != NULL; i++) { - strcat (string, separator); - strcat (string, str_array[i]); + ptr = g_stpcpy (ptr, separator); + ptr = g_stpcpy (ptr, str_array[i]); } } else @@ -1408,6 +1446,7 @@ g_strjoin (const gchar *separator, va_list args; guint len; guint separator_len; + gchar *ptr; if (separator == NULL) separator = ""; @@ -1420,7 +1459,8 @@ g_strjoin (const gchar *separator, if (s) { - len = strlen (s); + /* First part, getting length */ + len = 1 + strlen (s); s = va_arg (args, gchar*); while (s) @@ -1430,19 +1470,19 @@ g_strjoin (const gchar *separator, } va_end (args); - string = g_new (gchar, len + 1); - *string = 0; + /* Second part, building string */ + string = g_new (gchar, len); va_start (args, separator); s = va_arg (args, gchar*); - strcat (string, s); + ptr = g_stpcpy (string, s); s = va_arg (args, gchar*); while (s) { - strcat (string, separator); - strcat (string, s); + ptr = g_stpcpy (ptr, separator); + ptr = g_stpcpy (ptr, s); s = va_arg (args, gchar*); } } diff --git a/gstrfuncs.h b/gstrfuncs.h index 11064c3..183fecf 100644 --- a/gstrfuncs.h +++ b/gstrfuncs.h @@ -119,6 +119,9 @@ gchar* g_strjoinv (const gchar *separator, void g_strfreev (gchar **str_array); gchar** g_strdupv (gchar **str_array); +gchar* g_stpcpy (gchar *dest, + const char *src); + G_END_DECLS #endif /* __G_STRFUNCS_H__ */ -- 2.7.4