aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library.js9
-rw-r--r--system/lib/libc/musl/src/string/memchr.c24
-rw-r--r--system/lib/libcextra.symbols1
-rw-r--r--tools/system_libs.py1
4 files changed, 26 insertions, 9 deletions
diff --git a/src/library.js b/src/library.js
index 9114a539..0726f1a8 100644
--- a/src/library.js
+++ b/src/library.js
@@ -3639,15 +3639,6 @@ LibraryManager.library = {
return pdest|0;
},
- memchr: function(ptr, chr, num) {
- chr = unSign(chr);
- for (var i = 0; i < num; i++) {
- if ({{{ makeGetValue('ptr', 0, 'i8') }}} == chr) return ptr;
- ptr++;
- }
- return 0;
- },
-
strnlen: function(ptr, num) {
num = num >>> 0;
for (var i = 0; i < num; i++) {
diff --git a/system/lib/libc/musl/src/string/memchr.c b/system/lib/libc/musl/src/string/memchr.c
new file mode 100644
index 00000000..a0472f78
--- /dev/null
+++ b/system/lib/libc/musl/src/string/memchr.c
@@ -0,0 +1,24 @@
+#include <string.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <limits.h>
+
+#define SS (sizeof(size_t))
+#define ALIGN (sizeof(size_t)-1)
+#define ONES ((size_t)-1/UCHAR_MAX)
+#define HIGHS (ONES * (UCHAR_MAX/2+1))
+#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
+
+void *memchr(const void *src, int c, size_t n)
+{
+ const unsigned char *s = src;
+ c = (unsigned char)c;
+ for (; ((uintptr_t)s & ALIGN) && n && *s != c; s++, n--);
+ if (n && *s != c) {
+ const size_t *w;
+ size_t k = ONES * c;
+ for (w = (const void *)s; n>=SS && !HASZERO(*w^k); w++, n-=SS);
+ for (s = (const void *)w; n && *s != c; s++, n--);
+ }
+ return n ? (void *)s : 0;
+}
diff --git a/system/lib/libcextra.symbols b/system/lib/libcextra.symbols
index 30a39d52..94cd79be 100644
--- a/system/lib/libcextra.symbols
+++ b/system/lib/libcextra.symbols
@@ -92,6 +92,7 @@
T mbstowcs
T mbtowc
T memccpy
+ T memchr
T memmem
T mempcpy
W memrchr
diff --git a/tools/system_libs.py b/tools/system_libs.py
index 6814e806..dc24c1e3 100644
--- a/tools/system_libs.py
+++ b/tools/system_libs.py
@@ -239,6 +239,7 @@ def calculate(temp_files, in_temp, stdout, stderr):
'memccpy.c',
'memmem.c',
'mempcpy.c',
+ 'memchr.c',
'memrchr.c',
'stpcpy.c',
'strcasestr.c',