Fix new strfuncs back up (again) - No, incrementing pointers in a loop is
authorElliot Lee <sopwith@src.gnome.org>
Wed, 21 Oct 1998 20:14:16 +0000 (20:14 +0000)
committerElliot Lee <sopwith@src.gnome.org>
Wed, 21 Oct 1998 20:14:16 +0000 (20:14 +0000)
Fix new strfuncs back up (again)
- No, incrementing pointers in a loop is not any faster than
  indexing an array in a loop with a good compiler, but it is
  harder to read.
- strconcat doesn't allow a separator - added g_str_array_join,
  renamed g_str_array_join to g_str_array_joinv
- join routines take separator as first argument, as is customary.

glib.h
glib/glib.h
glib/gstrfuncs.c
gstrfuncs.c

diff --git a/glib.h b/glib.h
index 2d37a01..c033b0a 100644 (file)
--- a/glib.h
+++ b/glib.h
@@ -1377,15 +1377,17 @@ gchar*   g_strconcat            (const gchar *string1,
 /* NULL terminated string arrays.
  * g_str_array_split() splits up string into max_tokens tokens at delim and
  * returns a newly allocated string array.
- * g_str_array_join() concatenates all of str_array's strings, sliding in an
+ * g_str_array_joinv() concatenates all of str_array's strings, sliding in an
  * optional separator, the returned string is newly allocated.
  * g_str_array_free() frees the array itself and all of its strings.
  */
 gchar**         g_str_array_split      (const gchar  *string,
                                 const gchar  *delimiter,
                                 gint          max_tokens);
-gchar*  g_str_array_join       (gchar       **str_array,
-                                const gchar  *separator);
+gchar*   g_str_array_joinv      (const gchar  *separator,
+                                const gchar **str_array);
+gchar*   g_str_array_join       (const gchar  *separator,
+                                ...);
 void     g_str_array_free       (gchar       **str_array);
 
 
index 2d37a01..c033b0a 100644 (file)
@@ -1377,15 +1377,17 @@ gchar*   g_strconcat            (const gchar *string1,
 /* NULL terminated string arrays.
  * g_str_array_split() splits up string into max_tokens tokens at delim and
  * returns a newly allocated string array.
- * g_str_array_join() concatenates all of str_array's strings, sliding in an
+ * g_str_array_joinv() concatenates all of str_array's strings, sliding in an
  * optional separator, the returned string is newly allocated.
  * g_str_array_free() frees the array itself and all of its strings.
  */
 gchar**         g_str_array_split      (const gchar  *string,
                                 const gchar  *delimiter,
                                 gint          max_tokens);
-gchar*  g_str_array_join       (gchar       **str_array,
-                                const gchar  *separator);
+gchar*   g_str_array_joinv      (const gchar  *separator,
+                                const gchar **str_array);
+gchar*   g_str_array_join       (const gchar  *separator,
+                                ...);
 void     g_str_array_free       (gchar       **str_array);
 
 
index b40bafd..776e991 100644 (file)
@@ -1026,8 +1026,8 @@ g_str_array_split (const gchar *string,
                   gint         max_tokens)
 {
   GSList *string_list = NULL, *slist;
-  gchar **str_array, **as, *s;
-  guint n = 1;
+  gchar **str_array, *s;
+  guint i, n = 1;
 
   g_return_val_if_fail (string != NULL, NULL);
   g_return_val_if_fail (delimiter != NULL, NULL);
@@ -1063,10 +1063,13 @@ g_str_array_split (const gchar *string,
     }
   
   str_array = g_new (gchar*, n);
-  as = str_array + n - 1;
-  *(as--) = NULL;
+
+  i = n - 1;
+
+  str_array[i--] = NULL;
   for (slist = string_list; slist; slist = slist->next)
-    *(as--) = slist->data;
+    str_array[i--] = slist->data;
+
   g_slist_free (string_list);
 
   return str_array;
@@ -1077,41 +1080,43 @@ g_str_array_free (gchar **str_array)
 {
   if (str_array)
     {
-      gchar **as;
+      int i;
+
+      for(i = 0; str_array[i] != NULL; i++)
+       g_free(str_array[i]);
 
-      for (as = str_array; *as; as++)
-       g_free (*as);
       g_free (str_array);
     }
 }
 
 gchar*
-g_str_array_join (gchar       **str_array,
-                 const gchar  *separator)
+g_str_array_joinv (const gchar  *separator,
+                  const gchar **str_array)
 {
   gchar *string;
   
   g_return_val_if_fail (str_array != NULL, NULL);
-  g_return_val_if_fail (separator != NULL, NULL);
+
+  if(separator == NULL)
+    separator = "";
 
   if (*str_array)
     {
-      guint len;
-      guint seperator_len;
-      gchar **as;
-
-      seperator_len = strlen (separator);
-      len = 1 + strlen (*str_array);
-      for (as = str_array + 1; *as; as++)
-       len += seperator_len + strlen (*as);
+      guint i, len;
+      guint separator_len;
+
+      separator_len = strlen (separator);
+      len = 1 + strlen (str_array[0]);
+      for(i = 1; str_array[i] != NULL; i++)
+       len += separator_len + strlen(str_array[i]);
       
       string = g_new (gchar, len);
       *string = 0;
       strcat (string, *str_array);
-      for (as = str_array + 1; *as; as++)
+      for (i = 1; str_array[i] != NULL; i++)
        {
          strcat (string, separator);
-         strcat (string, *as);
+         strcat (string, str_array[i]);
        }
       }
   else
@@ -1119,3 +1124,52 @@ g_str_array_join (gchar       **str_array,
 
   return string;
 }
+
+gchar*
+g_str_array_join (const gchar  *separator,
+                 ...)
+{
+  gchar *string, *s;
+  va_list args;
+  guint len;
+  guint separator_len;
+
+  if(separator == NULL)
+    separator = "";
+
+  separator_len = strlen (separator);
+
+  va_start(args, separator);
+
+  s = va_arg(args, gchar *);
+
+  if(s) {
+    len = strlen(s) + 1;
+
+    while((s = va_arg(args, gchar*)))
+      {
+       len += separator_len + strlen(s);
+      }
+    va_end(args);
+
+    string = g_new (gchar, len);
+
+    va_start(args, separator);
+
+    *string = 0;
+    s = va_arg(args, gchar*);
+    strcat (string, s);
+
+    while((s = va_arg(args, gchar*)))
+      {
+       strcat(string, separator);
+       strcat(string, s);
+      }
+
+  } else
+    string = g_strdup("");
+
+  va_end(args);
+
+  return string;
+}
index b40bafd..776e991 100644 (file)
@@ -1026,8 +1026,8 @@ g_str_array_split (const gchar *string,
                   gint         max_tokens)
 {
   GSList *string_list = NULL, *slist;
-  gchar **str_array, **as, *s;
-  guint n = 1;
+  gchar **str_array, *s;
+  guint i, n = 1;
 
   g_return_val_if_fail (string != NULL, NULL);
   g_return_val_if_fail (delimiter != NULL, NULL);
@@ -1063,10 +1063,13 @@ g_str_array_split (const gchar *string,
     }
   
   str_array = g_new (gchar*, n);
-  as = str_array + n - 1;
-  *(as--) = NULL;
+
+  i = n - 1;
+
+  str_array[i--] = NULL;
   for (slist = string_list; slist; slist = slist->next)
-    *(as--) = slist->data;
+    str_array[i--] = slist->data;
+
   g_slist_free (string_list);
 
   return str_array;
@@ -1077,41 +1080,43 @@ g_str_array_free (gchar **str_array)
 {
   if (str_array)
     {
-      gchar **as;
+      int i;
+
+      for(i = 0; str_array[i] != NULL; i++)
+       g_free(str_array[i]);
 
-      for (as = str_array; *as; as++)
-       g_free (*as);
       g_free (str_array);
     }
 }
 
 gchar*
-g_str_array_join (gchar       **str_array,
-                 const gchar  *separator)
+g_str_array_joinv (const gchar  *separator,
+                  const gchar **str_array)
 {
   gchar *string;
   
   g_return_val_if_fail (str_array != NULL, NULL);
-  g_return_val_if_fail (separator != NULL, NULL);
+
+  if(separator == NULL)
+    separator = "";
 
   if (*str_array)
     {
-      guint len;
-      guint seperator_len;
-      gchar **as;
-
-      seperator_len = strlen (separator);
-      len = 1 + strlen (*str_array);
-      for (as = str_array + 1; *as; as++)
-       len += seperator_len + strlen (*as);
+      guint i, len;
+      guint separator_len;
+
+      separator_len = strlen (separator);
+      len = 1 + strlen (str_array[0]);
+      for(i = 1; str_array[i] != NULL; i++)
+       len += separator_len + strlen(str_array[i]);
       
       string = g_new (gchar, len);
       *string = 0;
       strcat (string, *str_array);
-      for (as = str_array + 1; *as; as++)
+      for (i = 1; str_array[i] != NULL; i++)
        {
          strcat (string, separator);
-         strcat (string, *as);
+         strcat (string, str_array[i]);
        }
       }
   else
@@ -1119,3 +1124,52 @@ g_str_array_join (gchar       **str_array,
 
   return string;
 }
+
+gchar*
+g_str_array_join (const gchar  *separator,
+                 ...)
+{
+  gchar *string, *s;
+  va_list args;
+  guint len;
+  guint separator_len;
+
+  if(separator == NULL)
+    separator = "";
+
+  separator_len = strlen (separator);
+
+  va_start(args, separator);
+
+  s = va_arg(args, gchar *);
+
+  if(s) {
+    len = strlen(s) + 1;
+
+    while((s = va_arg(args, gchar*)))
+      {
+       len += separator_len + strlen(s);
+      }
+    va_end(args);
+
+    string = g_new (gchar, len);
+
+    va_start(args, separator);
+
+    *string = 0;
+    s = va_arg(args, gchar*);
+    strcat (string, s);
+
+    while((s = va_arg(args, gchar*)))
+      {
+       strcat(string, separator);
+       strcat(string, s);
+      }
+
+  } else
+    string = g_strdup("");
+
+  va_end(args);
+
+  return string;
+}