1 /* $NetBSD: strdup.c,v 1.6 2022/10/09 21:41:03 christos Exp $ */ 2 3 #include <config.h> 4 5 #include <ntp_assert.h> 6 #include <string.h> 7 #include "ntp_malloc.h" 8 #include "l_stdlib.h" 9 10 #define STRDUP_EMPTY_UNIT 11 12 #ifndef HAVE_STRDUP 13 # undef STRDUP_EMPTY_UNIT 14 char *strdup(const char *s); 15 char * 16 strdup( 17 const char *s 18 ) 19 { 20 size_t octets; 21 char * cp; 22 23 REQUIRE(s); 24 octets = strlen(s) + 1; 25 if ((cp = malloc(octets)) == NULL) 26 return NULL; 27 memcpy(cp, s, octets); 28 29 return cp; 30 } 31 #endif 32 33 #ifndef HAVE_MEMCHR 34 # undef STRDUP_EMPTY_UNIT 35 void *memchr(const void *s, int c, size_t n) 36 { 37 const unsigned char *p = s; 38 while (n && *p != c) { 39 --n; 40 ++p; 41 } 42 return n ? (char*)p : NULL; 43 } 44 #endif 45 46 #ifndef HAVE_STRNLEN 47 # undef STRDUP_EMPTY_UNIT 48 size_t strnlen(const char *s, size_t n) 49 { 50 const char *e = memchr(s, 0, n); 51 return e ? (size_t)(e - s) : n; 52 } 53 #endif 54 55 #ifdef STRDUP_EMPTY_UNIT 56 int strdup_c_nonempty_compilation_unit; 57 #endif 58