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>
This commit is contained in:
parent
27d1b86d1b
commit
3ac43df5d4
|
@ -60,44 +60,6 @@ xf86ConfigSymTabRec InputClassTab[] =
|
||||||
|
|
||||||
#define TOKEN_SEP "|"
|
#define TOKEN_SEP "|"
|
||||||
|
|
||||||
/*
|
|
||||||
* Tokenize a string into a NULL terminated array of strings. Always returns
|
|
||||||
* an allocated array unless an error occurs.
|
|
||||||
*/
|
|
||||||
static char **
|
|
||||||
tokenize(const char *str)
|
|
||||||
{
|
|
||||||
char **list, **nlist;
|
|
||||||
char *tok, *tmp;
|
|
||||||
unsigned num = 0, n;
|
|
||||||
|
|
||||||
list = calloc(1, sizeof(*list));
|
|
||||||
if (!list)
|
|
||||||
return NULL;
|
|
||||||
tmp = strdup(str);
|
|
||||||
if (!tmp)
|
|
||||||
goto error;
|
|
||||||
for (tok = strtok(tmp, TOKEN_SEP); tok; tok = strtok(NULL, TOKEN_SEP)) {
|
|
||||||
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:
|
|
||||||
TestFree(tmp);
|
|
||||||
for (n = 0; n < num; n++)
|
|
||||||
free(list[n]);
|
|
||||||
TestFree(list);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
XF86ConfInputClassPtr
|
XF86ConfInputClassPtr
|
||||||
xf86parseInputClassSection(void)
|
xf86parseInputClassSection(void)
|
||||||
{
|
{
|
||||||
|
@ -133,17 +95,17 @@ xf86parseInputClassSection(void)
|
||||||
case MATCH_PRODUCT:
|
case MATCH_PRODUCT:
|
||||||
if (xf86getSubToken(&(ptr->comment)) != STRING)
|
if (xf86getSubToken(&(ptr->comment)) != STRING)
|
||||||
Error(QUOTE_MSG, "MatchProduct");
|
Error(QUOTE_MSG, "MatchProduct");
|
||||||
ptr->match_product = tokenize(val.str);
|
ptr->match_product = xstrtokenize(val.str, TOKEN_SEP);
|
||||||
break;
|
break;
|
||||||
case MATCH_VENDOR:
|
case MATCH_VENDOR:
|
||||||
if (xf86getSubToken(&(ptr->comment)) != STRING)
|
if (xf86getSubToken(&(ptr->comment)) != STRING)
|
||||||
Error(QUOTE_MSG, "MatchVendor");
|
Error(QUOTE_MSG, "MatchVendor");
|
||||||
ptr->match_vendor = tokenize(val.str);
|
ptr->match_vendor = xstrtokenize(val.str, TOKEN_SEP);
|
||||||
break;
|
break;
|
||||||
case MATCH_DEVICE_PATH:
|
case MATCH_DEVICE_PATH:
|
||||||
if (xf86getSubToken(&(ptr->comment)) != STRING)
|
if (xf86getSubToken(&(ptr->comment)) != STRING)
|
||||||
Error(QUOTE_MSG, "MatchDevicePath");
|
Error(QUOTE_MSG, "MatchDevicePath");
|
||||||
ptr->match_device = tokenize(val.str);
|
ptr->match_device = xstrtokenize(val.str, TOKEN_SEP);
|
||||||
break;
|
break;
|
||||||
case MATCH_IS_KEYBOARD:
|
case MATCH_IS_KEYBOARD:
|
||||||
if (xf86getSubToken(&(ptr->comment)) != STRING)
|
if (xf86getSubToken(&(ptr->comment)) != STRING)
|
||||||
|
|
|
@ -210,6 +210,9 @@ pad_to_int32(const int bytes) {
|
||||||
return (((bytes) + 3) & ~3);
|
return (((bytes) + 3) & ~3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern char**
|
||||||
|
xstrtokenize(const char *str, const char* separators);
|
||||||
|
|
||||||
/* some macros to help swap requests, replies, and events */
|
/* some macros to help swap requests, replies, and events */
|
||||||
|
|
||||||
#define LengthRestB(stuff) \
|
#define LengthRestB(stuff) \
|
||||||
|
|
40
os/utils.c
40
os/utils.c
|
@ -1870,6 +1870,46 @@ CheckUserAuthorization(void)
|
||||||
#endif
|
#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__
|
#ifdef __SCO__
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue