diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2010-02-10 15:36:49 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2010-02-11 19:25:39 +1000 |
commit | 3ac43df5d4a25d6e0058b327fa05a1c1436b4794 (patch) | |
tree | 0c691ad68eb1bf4a87e2dd66e373ccbe78f6c31d /os | |
parent | 27d1b86d1b858f931b4cb1b6ddf857c76d92a6d9 (diff) |
Add xstrtokenize to the dix.
Move tokenize out of the parser, make it a dix util function instead.
Splitting a string into multiple substrings is useful by other places, so
let's use it across the line. Future users include config/hal, config/udev
and of course the parser.
Example usage:
char **substrings = xstrtokenize(my_string, "\n");
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Dan Nicholson <dbn.lists@gmail.com>
Diffstat (limited to 'os')
-rw-r--r-- | os/utils.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/os/utils.c b/os/utils.c index d7c8388d0..71ab6f07a 100644 --- a/os/utils.c +++ b/os/utils.c @@ -1870,6 +1870,46 @@ CheckUserAuthorization(void) #endif } +/* + * Tokenize a string into a NULL terminated array of strings. Always returns + * an allocated array unless an error occurs. + */ +char** +xstrtokenize(const char *str, const char *separators) +{ + char **list, **nlist; + char *tok, *tmp; + unsigned num = 0, n; + + if (!str) + return NULL; + list = calloc(1, sizeof(*list)); + if (!list) + return NULL; + tmp = strdup(str); + if (!tmp) + goto error; + for (tok = strtok(tmp, separators); tok; tok = strtok(NULL, separators)) { + nlist = realloc(list, (num + 2) * sizeof(*list)); + if (!nlist) + goto error; + list = nlist; + list[num] = strdup(tok); + if (!list[num]) + goto error; + list[++num] = NULL; + } + free(tmp); + return list; + +error: + free(tmp); + for (n = 0; n < num; n++) + free(list[n]); + free(list); + return NULL; +} + #ifdef __SCO__ #include <fcntl.h> |