summaryrefslogtreecommitdiff
path: root/libc/string/memcmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/string/memcmp.c')
-rw-r--r--libc/string/memcmp.c39
1 files changed, 33 insertions, 6 deletions
diff --git a/libc/string/memcmp.c b/libc/string/memcmp.c
index 5963dd174..9808b3785 100644
--- a/libc/string/memcmp.c
+++ b/libc/string/memcmp.c
@@ -1,16 +1,43 @@
/*
+ * Copyright (C) 2002 Manuel Novoa III
* Copyright (C) 2000-2005 Erik Andersen <andersen@uclibc.org>
*
* Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
*/
-#define L_memcmp
-#define Wmemcmp __memcmp
+#include "_string.h"
-#include "wstring.c"
+#ifdef WANT_WIDE
+# define __Wmemcmp __wmemcmp
+# define Wmemcmp wmemcmp
+#else
+# define __Wmemcmp __memcmp
+# define Wmemcmp memcmp
+#endif
-strong_alias(__memcmp, memcmp)
+int attribute_hidden __Wmemcmp(const Wvoid *s1, const Wvoid *s2, size_t n)
+{
+ register const Wuchar *r1 = (const Wuchar *) s1;
+ register const Wuchar *r2 = (const Wuchar *) s2;
-weak_alias(memcmp, bcmp)
+#ifdef WANT_WIDE
+ while (n && (*r1 == *r2)) {
+ ++r1;
+ ++r2;
+ --n;
+ }
-#undef L_memcmp
+ return (n == 0) ? 0 : ((*r1 < *r2) ? -1 : 1);
+#else
+ int r = 0;
+
+ while (n-- && ((r = ((int)(*r1++)) - *r2++) == 0));
+
+ return r;
+#endif
+}
+
+strong_alias(__Wmemcmp,Wmemcmp)
+#ifndef WANT_WIDE
+strong_alias(__memcmp,bcmp)
+#endif