aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar ridiculousfish <corydoras@ridiculousfish.com>2013-05-16 19:44:21 -0700
committerGravatar ridiculousfish <corydoras@ridiculousfish.com>2013-05-16 19:45:47 -0700
commit77ec902ca70b4da4556ececcf7ef2024955b0e63 (patch)
treeb60693b7cf64b7bb94a35d6a78a7f223e9865270
parent7d9b0a00e4ec7c3d10bc08fb4ca4716aa31a0589 (diff)
Fix for failing to weak link wcsncasecmp - binary dies on SnowLeopard
-rw-r--r--fallback.cpp48
-rw-r--r--fallback.h4
2 files changed, 33 insertions, 19 deletions
diff --git a/fallback.cpp b/fallback.cpp
index a88f00f7..7e215bbe 100644
--- a/fallback.cpp
+++ b/fallback.cpp
@@ -817,7 +817,7 @@ static wchar_t *wcsdup_fallback(const wchar_t *in)
return out;
}
-int wcscasecmp_fallback(const wchar_t *a, const wchar_t *b)
+static int wcscasecmp_fallback(const wchar_t *a, const wchar_t *b)
{
if (*a == 0)
{
@@ -834,6 +834,26 @@ int wcscasecmp_fallback(const wchar_t *a, const wchar_t *b)
return wcscasecmp_fallback(a+1,b+1);
}
+static int wcsncasecmp_fallback(const wchar_t *a, const wchar_t *b, size_t count)
+{
+ if (count == 0)
+ return 0;
+
+ if (*a == 0)
+ {
+ return (*b==0)?0:-1;
+ }
+ else if (*b == 0)
+ {
+ return 1;
+ }
+ int diff = towlower(*a)-towlower(*b);
+ if (diff != 0)
+ return diff;
+ else
+ return wcsncasecmp_fallback(a+1,b+1, count-1);
+}
+
#if __APPLE__ && __DARWIN_C_LEVEL >= 200809L
/* Note parens avoid the macro expansion */
@@ -851,6 +871,13 @@ int wcscasecmp_use_weak(const wchar_t *a, const wchar_t *b)
return wcscasecmp_fallback(a, b);
}
+int wcsncasecmp_use_weak(const wchar_t *s1, const wchar_t *s2, size_t n)
+{
+ if (wcsncasecmp != NULL)
+ return (wcsncasecmp)(s1, s2, n);
+ return wcsncasecmp_fallback(s1, s2, n);
+}
+
#else //__APPLE__
#ifndef HAVE_WCSDUP
@@ -881,24 +908,9 @@ size_t wcslen(const wchar_t *in)
#endif
#ifndef HAVE_WCSNCASECMP
-int wcsncasecmp(const wchar_t *a, const wchar_t *b, int count)
+int wcsncasecmp(const wchar_t *a, const wchar_t *b, size_t count)
{
- if (count == 0)
- return 0;
-
- if (*a == 0)
- {
- return (*b==0)?0:-1;
- }
- else if (*b == 0)
- {
- return 1;
- }
- int diff = towlower(*a)-towlower(*b);
- if (diff != 0)
- return diff;
- else
- return wcsncasecmp(a+1,b+1, count-1);
+ return wcsncasecmp_fallback(a, b, count);
}
#endif
diff --git a/fallback.h b/fallback.h
index 433f48d5..eba91be6 100644
--- a/fallback.h
+++ b/fallback.h
@@ -217,8 +217,10 @@ int wcwidth(wchar_t c);
#if __APPLE__ && __DARWIN_C_LEVEL >= 200809L
wchar_t *wcsdup_use_weak(const wchar_t *);
int wcscasecmp_use_weak(const wchar_t *, const wchar_t *);
+int wcsncasecmp_use_weak(const wchar_t *s1, const wchar_t *s2, size_t n);
#define wcsdup(a) wcsdup_use_weak((a))
#define wcscasecmp(a, b) wcscasecmp_use_weak((a), (b))
+#define wcsncasecmp(a, b, c) wcsncasecmp_use_weak((a), (b), (c))
#else
@@ -273,7 +275,7 @@ size_t wcslen(const wchar_t *in);
fish and guaranteed to be a sane, english word. Using wcsncasecmp on
a user-supplied string should be considered a bug.
*/
-int wcsncasecmp(const wchar_t *a, const wchar_t *b, int count);
+int wcsncasecmp(const wchar_t *a, const wchar_t *b, size_t count);
/**
Returns a newly allocated wide character string wich is a copy of