From a70e8bc2359d655964a05f9c8f5dc5bc80bbc1cd Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Tue, 7 Nov 2006 16:45:01 +0000 Subject: [PATCH] Added silc_string_split. --- lib/silcutil/silcstrutil.c | 49 ++++++++++++++++++++++++++++++++++++++ lib/silcutil/silcstrutil.h | 17 +++++++++++++ 2 files changed, 66 insertions(+) diff --git a/lib/silcutil/silcstrutil.c b/lib/silcutil/silcstrutil.c index 8bec2fc7..db912fe3 100644 --- a/lib/silcutil/silcstrutil.c +++ b/lib/silcutil/silcstrutil.c @@ -264,3 +264,52 @@ int silc_string_compare(char *string1, char *string2) silc_free(tmpstr2); return FALSE; } + +/* Splits a string containing separator `ch' and returns an array of the + splitted strings. */ + +char **silc_string_split(const char *string, char ch, int *ret_count) +{ + char **splitted = NULL, sep[1], *item, *cp; + int i = 0, len; + + if (!string) + return NULL; + if (!ret_count) + return NULL; + + splitted = silc_calloc(1, sizeof(*splitted)); + if (!splitted) + return NULL; + + if (!strchr(string, ch)) { + splitted[0] = silc_memdup(string, strlen(string)); + *ret_count = 1; + return splitted; + } + + sep[0] = ch; + cp = (char *)string; + while(cp) { + len = strcspn(cp, sep); + item = silc_memdup(cp, len); + if (!item) { + silc_free(splitted); + return NULL; + } + + cp += len; + if (strlen(cp) == 0) + cp = NULL; + else + cp++; + + splitted = silc_realloc(splitted, (i + 1) * sizeof(*splitted)); + if (!splitted) + return NULL; + splitted[i++] = item; + } + *ret_count = i; + + return splitted; +} diff --git a/lib/silcutil/silcstrutil.h b/lib/silcutil/silcstrutil.h index c223fe6b..0e20e98f 100644 --- a/lib/silcutil/silcstrutil.h +++ b/lib/silcutil/silcstrutil.h @@ -190,4 +190,21 @@ int silc_string_match(const char *string1, const char *string2); ***/ int silc_string_compare(char *string1, char *string2); +/****f* silcutil/SilcStrUtilAPI/silc_string_split + * + * SYNOPSIS + * + * char **silc_string_split(const char *string, char ch, int *ret_count); + * + * DESCRIPTION + * + * Splits a `string' that has a separator `ch' into an array of strings + * and returns the array. The `ret_count' will contain the number of + * strings in the array. Caller must free the strings and the array. + * Returns NULL on error. If the string does not have `ch' separator + * this returns the `string' in the array. + * + ***/ +char **silc_string_split(const char *string, char ch, int *ret_count); + #endif /* SILCSTRUTIL_H */ -- 2.43.0