aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library.js27
-rw-r--r--system/lib/libc/musl/src/string/strdup.c13
-rw-r--r--system/lib/libc/musl/src/string/strndup.c12
-rw-r--r--system/lib/libcextra.symbols2
-rw-r--r--tools/system_libs.py2
5 files changed, 29 insertions, 27 deletions
diff --git a/src/library.js b/src/library.js
index 601a5c06..6f8fba5e 100644
--- a/src/library.js
+++ b/src/library.js
@@ -3639,33 +3639,6 @@ LibraryManager.library = {
return pdest|0;
},
- strdup__deps: ['strlen', 'malloc'],
- strdup: function(ptr) {
- var len = _strlen(ptr);
- var newStr = _malloc(len + 1);
- {{{ makeCopyValues('newStr', 'ptr', 'len', 'null', null, 1) }}};
- {{{ makeSetValue('newStr', 'len', '0', 'i8') }}};
- return newStr;
- },
-
- strndup__deps: ['strdup', 'strlen', 'malloc'],
- strndup: function(ptr, size) {
- var len = _strlen(ptr);
-
- if (size >= len) {
- return _strdup(ptr);
- }
-
- if (size < 0) {
- size = 0;
- }
-
- var newStr = _malloc(size + 1);
- {{{ makeCopyValues('newStr', 'ptr', 'size', 'null', null, 1) }}};
- {{{ makeSetValue('newStr', 'size', '0', 'i8') }}};
- return newStr;
- },
-
strpbrk: function(ptr1, ptr2) {
var curr;
var searchSet = {};
diff --git a/system/lib/libc/musl/src/string/strdup.c b/system/lib/libc/musl/src/string/strdup.c
new file mode 100644
index 00000000..dd5f80c1
--- /dev/null
+++ b/system/lib/libc/musl/src/string/strdup.c
@@ -0,0 +1,13 @@
+#include <stdlib.h>
+#include <string.h>
+#include "libc.h"
+
+char *__strdup(const char *s)
+{
+ size_t l = strlen(s);
+ char *d = malloc(l+1);
+ if (!d) return NULL;
+ return memcpy(d, s, l+1);
+}
+
+weak_alias(__strdup, strdup);
diff --git a/system/lib/libc/musl/src/string/strndup.c b/system/lib/libc/musl/src/string/strndup.c
new file mode 100644
index 00000000..617d27ba
--- /dev/null
+++ b/system/lib/libc/musl/src/string/strndup.c
@@ -0,0 +1,12 @@
+#include <stdlib.h>
+#include <string.h>
+
+char *strndup(const char *s, size_t n)
+{
+ size_t l = strnlen(s, n);
+ char *d = malloc(l+1);
+ if (!d) return NULL;
+ memcpy(d, s, l);
+ d[l] = 0;
+ return d;
+}
diff --git a/system/lib/libcextra.symbols b/system/lib/libcextra.symbols
index dedfcedd..06e68c92 100644
--- a/system/lib/libcextra.symbols
+++ b/system/lib/libcextra.symbols
@@ -117,12 +117,14 @@
W strchrnul
T strchr
T strcspn
+ T strdup
T strfmon
T strfmon_l
T strlcat
T strlcpy
T strncasecmp_l
T strncat
+ T strndup
T strnlen
T strrchr
T strsep
diff --git a/tools/system_libs.py b/tools/system_libs.py
index f61e2f79..527c573a 100644
--- a/tools/system_libs.py
+++ b/tools/system_libs.py
@@ -248,9 +248,11 @@ def calculate(temp_files, in_temp, stdout, stderr):
'strchr.c',
'strchrnul.c',
'strcspn.c',
+ 'strdup.c',
'strlcat.c',
'strlcpy.c',
'strncat.c',
+ 'strndup.c',
'strnlen.c',
'strrchr.c',
'strsep.c',