Re: [usbredir v2 PATCH] usbredirfilter: Win32: implement strtok_r to be used by windows (win_strtok_r)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]