aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library.js32
-rw-r--r--system/lib/libc/musl/src/string/strcspn.c19
-rw-r--r--system/lib/libc/musl/src/string/strspn.c20
-rw-r--r--system/lib/libcextra.symbols2
-rw-r--r--tools/system_libs.py2
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',