]> pd.if.org Git - pdclib/blobdiff - functions/string/strndup.c
* New feature check macro system. See _PDCLIB_aux.h for details
[pdclib] / functions / string / strndup.c
diff --git a/functions/string/strndup.c b/functions/string/strndup.c
new file mode 100644 (file)
index 0000000..e25c7ed
--- /dev/null
@@ -0,0 +1,56 @@
+/* [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