]> granicus.if.org Git - handbrake/commitdiff
Move strtok_r fallback to dedicated "compat" files.
authorRodeo <tdskywalker@gmail.com>
Fri, 10 Apr 2015 14:56:27 +0000 (14:56 +0000)
committerRodeo <tdskywalker@gmail.com>
Fri, 10 Apr 2015 14:56:27 +0000 (14:56 +0000)
Also, check whether the toolchain already provides strtok_r instead of building it unconditionally.

git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@7076 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/compat.c [new file with mode: 0644]
libhb/compat.h [new file with mode: 0644]
libhb/hb.h
libhb/module.defs
libhb/ports.c
libhb/ports.h
make/configure.py

diff --git a/libhb/compat.c b/libhb/compat.c
new file mode 100644 (file)
index 0000000..440074b
--- /dev/null
@@ -0,0 +1,42 @@
+/* compat.c
+
+   Copyright (c) 2003-2015 HandBrake Team
+   This file is part of the HandBrake source code
+   Homepage: <http://handbrake.fr/>.
+   It may be used under the terms of the GNU General Public License v2.
+   For full terms see the file COPYING file or visit http://www.gnu.org/licenses/gpl-2.0.html
+ */
+
+#include "compat.h"
+
+#ifdef HB_NEED_STRTOK_R
+#include <string.h>
+
+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 // HB_NEED_STRTOK_R
diff --git a/libhb/compat.h b/libhb/compat.h
new file mode 100644 (file)
index 0000000..40283c9
--- /dev/null
@@ -0,0 +1,28 @@
+/* compat.h
+
+   Copyright (c) 2003-2015 HandBrake Team
+   This file is part of the HandBrake source code
+   Homepage: <http://handbrake.fr/>.
+   It may be used under the terms of the GNU General Public License v2.
+   For full terms see the file COPYING file or visit http://www.gnu.org/licenses/gpl-2.0.html
+ */
+
+#ifndef HB_COMPAT_H
+#define HB_COMPAT_H
+
+#ifdef HB_NEED_STRTOK_R
+/*
+ * Some MinGW-w64 distributions #define strtok_r in pthread.h,
+ * however their so-called "implementation" isn't thread-safe.
+ */
+#ifdef USE_PTHREAD
+#include <pthread.h>
+#ifdef strtok_r
+#undef strtok_r
+#endif // strtok_r
+#endif // USE_PTHREAD
+
+char *strtok_r(char *s, const char *delim, char **save_ptr);
+#endif // HB_NEED_STRTOK_R
+
+#endif // HB_COMPAT_H
index 2da5e81c00e6abfe615171e906dd5944d827b191..38418ac3bbb709426915565a4928c6bcd1da76cd 100644 (file)
@@ -16,6 +16,7 @@ extern "C" {
 
 #include "project.h"
 #include "common.h"
+#include "compat.h"
 #include "hb_dict.h"
 #include "hb_json.h"
 #include "param.h"
index 11b8a22c6c05b4e48d5b0bbf444cad308581577b..79222a2fa9a21907f57e64a665c518bf5415d98c 100644 (file)
@@ -72,6 +72,10 @@ ifeq (1,$(FEATURE.x265))
     LIBHB.GCC.D += USE_X265
 endif  
 
+ifeq (1,$(COMPAT.strtok_r))
+    LIBHB.GCC.D += HB_NEED_STRTOK_R
+endif
+
 ## required for <libdvdread/*.h>
 ifneq (,$(filter $(BUILD.arch),ppc ppc64))
        LIBHB.GCC.D += WORDS_BIGENDIAN
index 4e542b2027d99d5f4243fdc1e5ce4660df25ae93..048f478cfdd08a220295067fc58a4bbb9a6c9234 100644 (file)
@@ -1147,33 +1147,6 @@ void hb_net_close( hb_net_t ** _n )
     *_n = NULL;
 }
 
-#ifdef SYS_MINGW
-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
-
 /************************************************************************
 * OS Sleep Allow / Prevent
 ***********************************************************************/
index 7dde2302877a7a8a033f076ef6ffad5c8b9c8fdc..649d3995f6f41bf221993688b2b8dfe8f95f4573 100644 (file)
@@ -56,17 +56,6 @@ uint64_t hb_get_time_us();
 void     hb_snooze( int delay );
 int      hb_platform_init();
 
-#ifdef SYS_MINGW
-/*
- * Some MinGW distributions #define strtok_r in pthread.h,
- * but their so-called "implementation" isn't thread-safe.
- */
-#ifdef strtok_r
-#undef strtok_r
-#endif
-char *strtok_r(char *s, const char *delim, char **save_ptr);
-#endif
-
 #ifdef SYS_MINGW
 typedef struct
 {
index 89221f6cd93324a8630f699bdf7c2548f7b8d64a..5f35ed4a663aa26c60e447c4386e8d60257de3db 100644 (file)
@@ -1617,6 +1617,19 @@ int main()
         regex = LDProbe( 'static regex', '%s -static' % Tools.gcc.pathname, '-lregex', regex_test )
         regex.run()
 
+        strtok_r_test = """
+#include <string.h>
+
+int main ()
+{
+  char *saveptr;
+  strtok_r("String tok string", "tok", &saveptr);
+  return 0;
+}
+"""
+        strtok_r = LDProbe( 'static strtok_r', '%s -static' % Tools.gcc.pathname, '', strtok_r_test )
+        strtok_r.run()
+
     ## cfg hook before doc prep
     cfg.doc_ready()
 
@@ -1744,6 +1757,8 @@ int main()
             doc.add( 'HAS.iconv', 1 )
         if not regex.fail:
             doc.add( 'HAS.regex', 1 )
+        if strtok_r.fail:
+            doc.add( 'COMPAT.strtok_r', 1 )
 
     doc.addMake( '' )
     doc.addMake( '## define debug mode and optimize before other includes' )