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