Enlightenment CVS committal Author : pfritz Project : e17 Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore Modified Files: Ecore_Str.h ecore_str.c Log Message: add ecore_str_split(), thanks to rookmoot =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore/Ecore_Str.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- Ecore_Str.h 17 Feb 2007 06:25:53 -0000 1.4 +++ Ecore_Str.h 13 Mar 2007 01:17:33 -0000 1.5 @@ -46,7 +46,9 @@ EAPI int ecore_str_has_prefix(const char *str, const char *prefix); EAPI int ecore_str_has_suffix(const char *str, const char *suffix); - +EAPI char **ecore_str_split(const char *string, const char *delimiter, + int max_tokens); +EAPI void ecore_str_vector_free(char **str_array); #ifdef __cplusplus } =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore/ecore_str.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- ecore_str.c 17 Feb 2007 06:25:53 -0000 1.5 +++ ecore_str.c 13 Mar 2007 01:17:33 -0000 1.6 @@ -20,7 +20,8 @@ #include <sys/types.h> #include <string.h> -# include "ecore_private.h" +#include "ecore_private.h" +#include "Ecore_Data.h" /* * Copy src to string dst of size siz. At most siz-1 characters @@ -129,3 +130,95 @@ return (strncmp(str + str_len - suffix_len, suffix, suffix_len) == 0); } + +/** + * Splits a string into a maximum of max_tokens pieces, using the given + * delimiter. If max_tokens is reached, the final string in the returned + * string array contains the remainder of string. + * + * @param string A string to split. + * @param 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. + * @param max_tokens The maximum number of strings to split string into. + * If this is less than 1, the string is split completely. + * @return A newly-allocated NULL-terminated array of strings. + * Use ecore_str_vector_free() to free it. + */ +char** +ecore_str_split(const char *string, const char *delimiter, int max_tokens) +{ + char **str_array = NULL; + char *s; + size_t n = 0; + int max = max_tokens; + const char *remainder; + size_t delimiter_len; + + CHECK_PARAM_POINTER_RETURN("string", string, NULL); + CHECK_PARAM_POINTER_RETURN("delimiter", delimiter, NULL); + + /* on the first run we just count the number of the strings we'll finally + * have */ + remainder = string; + s = strstr(remainder, delimiter); + if (s) + { + delimiter_len = strlen(delimiter); + while (--max_tokens && s) + { + remainder = s + delimiter_len; + s = strstr(remainder, delimiter); + n++; + } + } + if (*string != '\0') n++; + + str_array = malloc(sizeof(char *)*(n + 1)); + str_array[n] = NULL; + + /* reset to the initial values */ + n = 0; + max_tokens = max; + remainder = string; + s = strstr(remainder, delimiter); + if (s) + { + while (--max_tokens && s) + { + size_t len; + char *new_string; + + len = s - remainder; + new_string = malloc(sizeof(char)*(len + 1)); + memcpy(new_string, remainder, len); + new_string[len] = 0; + str_array[n++] = new_string; + + remainder = s + delimiter_len; + s = strstr(remainder, delimiter); + } + } + if (*string != '\0') str_array[n] = strdup(remainder); + + return str_array; +} + +/** + * Free an array of strings and the array itself + * + * @param str_array An NULL-terminated array of strings to free. + */ +void +ecore_str_vector_free(char **str_array) +{ + CHECK_PARAM_POINTER("str_array", str_array); + int i; + + for(i=0; str_array[i] != NULL; i++) + { + FREE(str_array[i]); + } + FREE(str_array); +} + ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs