diff options
-rw-r--r-- | src/library.js | 9 | ||||
-rw-r--r-- | system/lib/libc/musl/src/string/memchr.c | 24 | ||||
-rw-r--r-- | system/lib/libcextra.symbols | 1 | ||||
-rw-r--r-- | tools/system_libs.py | 1 |
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', |