|
From: Khalid El-K. <kha...@ho...> - 2003-03-31 14:14:37
|
hmm, I believe that every different implementation means new different logic, and a different logic means better/worse performance ... I'll be sending you the final result for comparsion anyway ;) Regards, Khalid Al-Kary > > > > > Hi fellows, > > I'm developing a low-level C-based string manipulation API ... > > in my Implementation of the function "explode" which splits a > > string into > > pieces (with a specified separator) and returns these pieces > > into an array. > > >While you are reinventing the wheel, you can take a look at GLib's >sources at www.gtk.org. More specifically the funciton g_strsplit(): > >http://developer.gnome.org/doc/API/2.0/glib/glib-String-Utility-Functions.ht >ml#g-strsplit > > >Here is the code: > > >Note: "GSList" is a single linked list pointer. > > > > >- 8< - 8< - 8< - 8< - 8< - 8< - 8< - 8< - 8< - 8< - 8< - 8< - 8< > >/** > * g_strsplit: > * @string: a string to split. > * @delimiter: a string which specifies the places at which to split the >string. > * The delimiter is not included in any of the resulting strings, >unless > * @max_tokens is reached. > * @max_tokens: the maximum number of pieces to split @string into. If >this >is > * less than 1, the string is split completely. > * > * Splits a string into a maximum of @max_tokens pieces, using the given > * @delimiter. If @max_tokens is reached, the remainder of @string is >appended > * to the last token. > * > * As a special case, the result of splitting the empty string "" is an >empty > * vector, not a vector containing a single string. The reason for this > * special case is that being able to represent a empty vector is >typically > * more useful than consistent handling of empty elements. If you do need > * to represent empty elements, you'll need to check for the empty string > * before calling g_strsplit(). > * > * Return value: a newly-allocated %NULL-terminated array of strings. Use > * g_strfreev() to free it. > **/ >gchar** >g_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; >} > >- 8< - 8< - 8< - 8< - 8< - 8< - 8< - 8< - 8< - 8< > > > > > > > > >Daniel K. O. > > >Only ask questions with yes/no answers if you want "yes" or "no" as the >answer. >http://homepages.tesco.net/~J.deBoynePollard/FGA/questions-with-yes-or-no-an >swers.html > > > > _________________________________________________________________ MSN 8 with e-mail virus protection service: 2 months FREE* http://join.msn.com/?page=features/virus |