--- /dev/null
+/* [XSI] char* strndup(const char *, size_t)\r
+\r
+ This file is part of the Public Domain C Library (PDCLib).\r
+ Permission is granted to use, modify, and / or redistribute at will.\r
+*/\r
+\r
+#include <string.h>\r
+#include <stdlib.h>\r
+\r
+#ifndef REGTEST\r
+\r
+char *strndup( const char * s, size_t len )\r
+{\r
+ char* ns = NULL;\r
+ if(s) {\r
+ ns = malloc(len + 1);\r
+ if(ns) {\r
+ ns[len] = 0;\r
+ // strncpy to be pedantic about modification in multithreaded \r
+ // applications\r
+ return strncpy(ns, s, len);\r
+ }\r
+ }\r
+ return ns;\r
+}\r
+\r
+#endif\r
+\r
+#ifdef TEST\r
+#include <_PDCLIB_test.h>\r
+\r
+int main( void )\r
+{\r
+ const char *teststr = "Hello, world";\r
+ const char *teststr2 = "\xFE\x8C\n";\r
+ char *testres, *testres2;\r
+\r
+ TESTCASE(testres = strndup(teststr, 5));\r
+ TESTCASE(testres2 = strndup(teststr2, 1));\r
+ TESTCASE(strcmp(testres, teststr) != 0);\r
+ TESTCASE(strncmp(testres, teststr, 5) == 0);\r
+ TESTCASE(strcmp(testres2, teststr2) != 0);\r
+ TESTCASE(strncmp(testres2, teststr2, 1) == 0);\r
+ free(testres);\r
+ free(testres2);\r
+ TESTCASE(testres = strndup(teststr, 20));\r
+ TESTCASE(testres2 = strndup(teststr2, 5));\r
+ TESTCASE(strcmp(testres, teststr) == 0);\r
+ TESTCASE(strcmp(testres2, teststr2) == 0);\r
+ free(testres);\r
+ free(testres2);\r
+ \r
+ return TEST_RESULTS;\r
+}\r
+\r
+#endif\r