summaryrefslogtreecommitdiff
path: root/os/utils.c
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2010-02-10 15:36:49 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2010-02-11 19:25:39 +1000
commit3ac43df5d4a25d6e0058b327fa05a1c1436b4794 (patch)
tree0c691ad68eb1bf4a87e2dd66e373ccbe78f6c31d /os/utils.c
parent27d1b86d1b858f931b4cb1b6ddf857c76d92a6d9 (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/utils.c')
-rw-r--r--os/utils.c40
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>