diff options
author | Ori Bernstein <ori@eigenstate.org> | 2020-12-17 19:20:04 -0800 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2020-12-17 19:20:04 -0800 |
commit | 658c1b9f68065a4e9ac7f1e28b3eedbba36c3099 (patch) | |
tree | 7a5bdde36c6afd569f7da424221ba0e845cca260 | |
parent | 646c502b151f667362c625b6e2440cf1db520475 (diff) | |
download | plan9front-658c1b9f68065a4e9ac7f1e28b3eedbba36c3099.tar.xz |
libap: add strndup
strndup is part of POSIX.1, so APE should provide it.
This patch adds it, so need to patch it out of fewer
programs going forward.
-rw-r--r-- | sys/include/ape/string.h | 1 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/gen/strndup.c | 20 |
2 files changed, 21 insertions, 0 deletions
diff --git a/sys/include/ape/string.h b/sys/include/ape/string.h index 50dfad93c..4c69206f7 100644 --- a/sys/include/ape/string.h +++ b/sys/include/ape/string.h @@ -19,6 +19,7 @@ extern int memcmp(const void *, const void *, size_t); extern int strcmp(const char *, const char *); extern int strcoll(const char *, const char *); extern char *strdup(char*); +extern char *strndup(char*, size_t); extern int strncmp(const char *, const char *, size_t); extern size_t strxfrm(char *, const char *, size_t); extern void *memchr(const void *, int, size_t); diff --git a/sys/src/ape/lib/ap/gen/strndup.c b/sys/src/ape/lib/ap/gen/strndup.c new file mode 100644 index 000000000..b60e2da2b --- /dev/null +++ b/sys/src/ape/lib/ap/gen/strndup.c @@ -0,0 +1,20 @@ +#include <string.h> +#include <ctype.h> +#include <stdlib.h> + +char* +strndup(char *p, size_t max) +{ + int n; + char *np; + + n = strlen(p)+1; + if(n > max) + n = max+1; + np = malloc(n); + if(!np) + return nil; + memmove(np, p, n); + np[n-1] = 0; + return np; +} |