summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/string.h3
-rw-r--r--libc/string/Makefile2
-rw-r--r--libc/string/string.c20
3 files changed, 21 insertions, 4 deletions
diff --git a/include/string.h b/include/string.h
index 3c03c7cee..13bdca993 100644
--- a/include/string.h
+++ b/include/string.h
@@ -125,8 +125,7 @@ extern char *strdup (__const char *__s) __THROW __attribute_malloc__;
/* Return a malloc'd copy of at most N bytes of STRING. The
resultant string is terminated even if no null terminator
appears before STRING[N]. */
-#if 0
-//#if defined __USE_GNU
+#if defined __USE_GNU
extern char *strndup (__const char *__string, size_t __n)
__THROW __attribute_malloc__;
#endif
diff --git a/libc/string/Makefile b/libc/string/Makefile
index 748a935eb..7ef900041 100644
--- a/libc/string/Makefile
+++ b/libc/string/Makefile
@@ -25,7 +25,7 @@ include $(TOPDIR)Rules.mak
MSRC=string.c
MOBJ=strlen.o strcat.o strcpy.o strchr.o strcmp.o strncat.o strncpy.o \
- strncmp.o strrchr.o strdup.o memcpy.o memccpy.o memset.o \
+ strncmp.o strrchr.o strdup.o strndup.o memcpy.o memccpy.o memset.o \
memmove.o memcmp.o memchr.o ffs.o strnlen.o strxfrm.o stpcpy.o stpncpy.o
ifeq ($(HAS_LOCALE),true)
diff --git a/libc/string/string.c b/libc/string/string.c
index 7ccc55733..94bf542e4 100644
--- a/libc/string/string.c
+++ b/libc/string/string.c
@@ -274,6 +274,25 @@ char *strdup(const char *str)
}
#endif
+/********************** Function strndup ************************************/
+#ifdef L_strndup
+char *strndup(const char *str, size_t len)
+{
+ register size_t n;
+ register char *dst;
+
+ n = strlen(str);
+ if (len < n)
+ n = len;
+ dst = (char *) malloc(n+1);
+ if (dst) {
+ memcpy(dst, str, n);
+ dst[n] = '\0';
+ }
+ return dst;
+}
+#endif
+
/********************** Function memcpy ************************************/
#ifdef L_memcpy
@@ -409,5 +428,4 @@ int ffs(int x)
}
#endif
-
/********************** THE END ********************************************/