diff options
-rw-r--r-- | src/library.js | 32 | ||||
-rw-r--r-- | system/lib/libc/musl/src/string/strcspn.c | 19 | ||||
-rw-r--r-- | system/lib/libc/musl/src/string/strspn.c | 20 | ||||
-rw-r--r-- | system/lib/libcextra.symbols | 2 | ||||
-rw-r--r-- | tools/system_libs.py | 2 |
5 files changed, 43 insertions, 32 deletions
diff --git a/src/library.js b/src/library.js index a146eb7d..88c07027 100644 --- a/src/library.js +++ b/src/library.js @@ -3576,38 +3576,6 @@ LibraryManager.library = { return (curr - ptr)|0; }, - strspn: function(pstr, pset) { - var str = pstr, set, strcurr, setcurr; - while (1) { - strcurr = {{{ makeGetValue('str', '0', 'i8') }}}; - if (!strcurr) return str - pstr; - set = pset; - while (1) { - setcurr = {{{ makeGetValue('set', '0', 'i8') }}}; - if (!setcurr || setcurr == strcurr) break; - set++; - } - if (!setcurr) return str - pstr; - str++; - } - }, - - strcspn: function(pstr, pset) { - var str = pstr, set, strcurr, setcurr; - while (1) { - strcurr = {{{ makeGetValue('str', '0', 'i8') }}}; - if (!strcurr) return str - pstr; - set = pset; - while (1) { - setcurr = {{{ makeGetValue('set', '0', 'i8') }}}; - if (!setcurr || setcurr == strcurr) break; - set++; - } - if (setcurr) return str - pstr; - str++; - } - }, - strcpy__asm: true, strcpy__sig: 'iii', strcpy: function(pdest, psrc) { diff --git a/system/lib/libc/musl/src/string/strcspn.c b/system/lib/libc/musl/src/string/strcspn.c new file mode 100644 index 00000000..cfdba114 --- /dev/null +++ b/system/lib/libc/musl/src/string/strcspn.c @@ -0,0 +1,19 @@ +#include <string.h> + +#define BITOP(a,b,op) \ + ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a)))) + +char *__strchrnul(const char *, int); + +size_t strcspn(const char *s, const char *c) +{ + const char *a = s; + size_t byteset[32/sizeof(size_t)]; + + if (!c[0] || !c[1]) return __strchrnul(s, *c)-a; + + memset(byteset, 0, sizeof byteset); + for (; *c && BITOP(byteset, *(unsigned char *)c, |=); c++); + for (; *s && !BITOP(byteset, *(unsigned char *)s, &); s++); + return s-a; +} diff --git a/system/lib/libc/musl/src/string/strspn.c b/system/lib/libc/musl/src/string/strspn.c new file mode 100644 index 00000000..9543dad0 --- /dev/null +++ b/system/lib/libc/musl/src/string/strspn.c @@ -0,0 +1,20 @@ +#include <string.h> + +#define BITOP(a,b,op) \ + ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a)))) + +size_t strspn(const char *s, const char *c) +{ + const char *a = s; + size_t byteset[32/sizeof(size_t)] = { 0 }; + + if (!c[0]) return 0; + if (!c[1]) { + for (; *s == *c; s++); + return s-a; + } + + for (; *c && BITOP(byteset, *(unsigned char *)c, |=); c++); + for (; *s && BITOP(byteset, *(unsigned char *)s, &); s++); + return s-a; +} diff --git a/system/lib/libcextra.symbols b/system/lib/libcextra.symbols index 6620faa9..e38afa70 100644 --- a/system/lib/libcextra.symbols +++ b/system/lib/libcextra.symbols @@ -111,12 +111,14 @@ T strcasecmp_l T strcasestr W strchrnul + T strcspn T strfmon T strfmon_l T strlcat T strlcpy T strncasecmp_l T strsep + T strspn T strverscmp T strxfrm W strxfrm_l diff --git a/tools/system_libs.py b/tools/system_libs.py index 086b8ddd..1027a5a1 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -242,9 +242,11 @@ def calculate(temp_files, in_temp, stdout, stderr): 'memrchr.c', 'strcasestr.c', 'strchrnul.c', + 'strcspn.c', 'strlcat.c', 'strlcpy.c', 'strsep.c', + 'strspn.c', 'strverscmp.c', 'wcpcpy.c', 'wcpncpy.c', |