[Spice-devel] [PATCH spice-gtk 01/14] compat: add strtok_r fallback

Marc-André Lureau marcandre.lureau at gmail.com
Wed Feb 12 02:18:59 PST 2014


From: Marc-André Lureau <marcandre.lureau at redhat.com>

The following Spice proxy URI parsing code makes use of it, but it is
not available on Windows

Origin:
http://git.videolan.org/gitweb.cgi/vlc.git/?p=vlc.git;a=blob;f=compat/strtok_r.c
---
 configure.ac      |  2 +-
 gtk/glib-compat.c | 34 ++++++++++++++++++++++++++++++++++
 gtk/glib-compat.h |  8 ++++++++
 3 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/configure.ac b/configure.ac
index 4dcd81c..3670863 100644
--- a/configure.ac
+++ b/configure.ac
@@ -235,7 +235,7 @@ else
         EXTERNAL_PNP_IDS="$with_pnp_ids_path"
 fi
 
-AC_CHECK_FUNCS(clearenv)
+AC_CHECK_FUNCS(clearenv strtok_r)
 
 PKG_CHECK_MODULES(GLIB2, glib-2.0 >= 2.22)
 AC_SUBST(GLIB2_CFLAGS)
diff --git a/gtk/glib-compat.c b/gtk/glib-compat.c
index 9ffadbb..5714173 100644
--- a/gtk/glib-compat.c
+++ b/gtk/glib-compat.c
@@ -1,5 +1,8 @@
 /* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
 /*
+   Copyright (C) 2012-2014 Red Hat, Inc.
+   Copyright © 1998-2009 VLC authors and VideoLAN
+
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
@@ -14,6 +17,7 @@
    License along with this library; if not, see <http://www.gnu.org/licenses/>.
 */
 
+#include <string.h>
 #include "glib-compat.h"
 
 #if !GLIB_CHECK_VERSION(2,26,0)
@@ -105,3 +109,33 @@ guint64 g_get_monotonic_time(void)
     return (((gint64) tv.tv_sec) * 1000000) + tv.tv_usec;
 }
 #endif
+
+#ifndef HAVE_STRTOK_R
+G_GNUC_INTERNAL
+char *strtok_r(char *s, const char *delim, char **save_ptr)
+{
+    char *token;
+
+    if (s == NULL)
+        s = *save_ptr;
+
+    /* Scan leading delimiters. */
+    s += strspn (s, delim);
+    if (*s == '\0')
+        return NULL;
+
+    /* Find the end of the token. */
+    token = s;
+    s = strpbrk (token, delim);
+    if (s == NULL)
+        /* This token finishes the string. */
+        *save_ptr = strchr (token, '\0');
+    else
+    {
+        /* Terminate the token and make *SAVE_PTR point past it. */
+        *s = '\0';
+        *save_ptr = s + 1;
+    }
+    return token;
+}
+#endif
diff --git a/gtk/glib-compat.h b/gtk/glib-compat.h
index c30a735..62580e2 100644
--- a/gtk/glib-compat.h
+++ b/gtk/glib-compat.h
@@ -1,5 +1,8 @@
 /* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
 /*
+   Copyright (C) 2012-2014 Red Hat, Inc.
+   Copyright © 1998-2009 VLC authors and VideoLAN
+
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
@@ -18,6 +21,7 @@
 
 #include <glib-object.h>
 #include <gio/gio.h>
+#include "config.h"
 
 #if !GLIB_CHECK_VERSION(2,26,0)
 #define G_DEFINE_BOXED_TYPE(TypeName, type_name, copy_func, free_func) G_DEFINE_BOXED_TYPE_WITH_CODE (TypeName, type_name, copy_func, free_func, {})
@@ -133,4 +137,8 @@ GType spice_main_context_get_type (void) G_GNUC_CONST;
 guint64 g_get_monotonic_time(void);
 #endif
 
+#ifndef HAVE_STRTOK_R
+char* strtok_r(char *s, const char *delim, char **save_ptr);
+#endif
+
 #endif /* GLIB_COMPAT_H */
-- 
1.8.4.2



More information about the Spice-devel mailing list