summaryrefslogtreecommitdiff
path: root/gstrfuncs.c
diff options
context:
space:
mode:
authorElliot Lee <sopwith@src.gnome.org>1998-10-21 20:14:16 +0000
committerElliot Lee <sopwith@src.gnome.org>1998-10-21 20:14:16 +0000
commitdaf46f9550a4f697f2c1926e59dbeab5215052ba (patch)
tree2d74271d35e20b1bdd0dc8c02325c96ebcaa84c8 /gstrfuncs.c
parent634e4a58c6927c6d14673dae6cce479c7f1d9055 (diff)
downloadglib-daf46f9550a4f697f2c1926e59dbeab5215052ba.tar.gz
Fix new strfuncs back up (again) - No, incrementing pointers in a loop is
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.
Diffstat (limited to 'gstrfuncs.c')
-rw-r--r--gstrfuncs.c96
1 files changed, 75 insertions, 21 deletions
diff --git a/gstrfuncs.c b/gstrfuncs.c
index b40bafd8e..776e99120 100644
--- a/gstrfuncs.c
+++ b/gstrfuncs.c
@@ -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;
+}