Hi, On 05/24/2012 04:40 PM, Uri Lublin wrote:
mingw imlpements neigther strtok_r nor strtok_s. So here is a simple implementation of strtok_r (for windows). It assumes the delimiter is a single character, which is good enough for usbredirfilter.
If we're going to do this I would prefer to do a full implementation, without the delimiter is a single char limit. I know this is not important right now, but we might start depending on multi-char delimiters in the future and then this will come back to bite us.
--- usbredirparser/usbredirfilter.c | 47 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 47 insertions(+), 0 deletions(-) diff --git a/usbredirparser/usbredirfilter.c b/usbredirparser/usbredirfilter.c index b74c921..df48acb 100644 --- a/usbredirparser/usbredirfilter.c +++ b/usbredirparser/usbredirfilter.c @@ -23,6 +23,53 @@ #include<string.h> #include<errno.h> +#ifdef WIN32 +#define strtok_r win_strtok_r + +/* + * strtok_r like implementation for windows (mingw). + * + * Only the first character of delim is used as a delimiter + */ +char *win_strtok_r(char *str, const char *delim, char **state) +{ + const char d = delim[0]; + char *p; + int found = 0; + + /* sanity checks */ + if ((delim == NULL) || (state == NULL)) + return NULL; + + if (str == NULL) { + str = *state; + } + + if (str == NULL) { + return NULL; + } + + for (p=str; *p ; p++) { + if (*p == d) { + found = 1; + *p++ = '\0'; + while (*p&& *p==d) /* skip all delimiters */
I suggest adding a: bool char_matches_delim(char c, const char *delim); helper function and using that in place of the 2 *p == d checks, making this a fully compatible strtok replacement drop-in.
+ p++; + break; + } + } + + *state = found ? p : NULL; + + /* do not return empty strings */ + if (!*str) + return NULL; + + return str; +} + +#endif + #include "usbredirfilter.h" int usbredirfilter_string_to_rules(
Regards, Hans _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel