Home | History | Annotate | Line # | Download | only in libntp
      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