1 /* Public domain. */
2 
3 #ifndef _LINUX_STRING_H
4 #define _LINUX_STRING_H
5 
6 #include <sys/types.h>
7 #include <sys/systm.h>
8 #include <sys/malloc.h>
9 #include <sys/stdint.h>
10 #include <sys/errno.h>
11 
12 #include <linux/compiler.h>
13 
14 void *memchr_inv(const void *, int, size_t);
15 
16 static inline bool
mem_is_zero(const void * b,size_t len)17 mem_is_zero(const void *b, size_t len)
18 {
19 	return (memchr_inv(b, 0, len) == NULL);
20 }
21 
22 static inline void *
memset32(uint32_t * b,uint32_t c,size_t len)23 memset32(uint32_t *b, uint32_t c, size_t len)
24 {
25 	uint32_t *dst = b;
26 	while (len--)
27 		*dst++ = c;
28 	return b;
29 }
30 
31 static inline void *
memset64(uint64_t * b,uint64_t c,size_t len)32 memset64(uint64_t *b, uint64_t c, size_t len)
33 {
34 	uint64_t *dst = b;
35 	while (len--)
36 		*dst++ = c;
37 	return b;
38 }
39 
40 static inline void *
memset_p(void ** p,void * v,size_t n)41 memset_p(void **p, void *v, size_t n)
42 {
43 #ifdef __LP64__
44 	return memset64((uint64_t *)p, (uintptr_t)v, n);
45 #else
46 	return memset32((uint32_t *)p, (uintptr_t)v, n);
47 #endif
48 }
49 
50 static inline void *
kmemdup(const void * src,size_t len,int flags)51 kmemdup(const void *src, size_t len, int flags)
52 {
53 	void *p = malloc(len, M_DRM, flags);
54 	if (p)
55 		memcpy(p, src, len);
56 	return (p);
57 }
58 
59 static inline void *
kmemdup_array(const void * src,size_t nemb,size_t size,int flags)60 kmemdup_array(const void *src, size_t nemb, size_t size, int flags)
61 {
62 	void *p = mallocarray(nemb, size, M_DRM, flags);
63 	if (p)
64 		memcpy(p, src, nemb * size);
65 	return (p);
66 }
67 
68 static inline void *
kstrdup(const char * str,int flags)69 kstrdup(const char *str, int flags)
70 {
71 	size_t len;
72 	char *p;
73 
74 	if (str == NULL)
75 		return NULL;
76 
77 	len = strlen(str) + 1;
78 	p = malloc(len, M_DRM, flags);
79 	if (p)
80 		memcpy(p, str, len);
81 	return (p);
82 }
83 
84 static inline const char *
kstrdup_const(const char * str,int flags)85 kstrdup_const(const char *str, int flags)
86 {
87 	return kstrdup(str, flags);
88 }
89 
90 void kfree_const(const void *);
91 
92 static inline int
match_string(const char * const * array,size_t n,const char * str)93 match_string(const char * const *array,  size_t n, const char *str)
94 {
95 	int i;
96 
97 	for (i = 0; i < n; i++) {
98 		if (array[i] == NULL)
99 			break;
100 		if (!strcmp(array[i], str))
101 			return i;
102 	}
103 
104 	return -EINVAL;
105 }
106 
107 static inline ssize_t
strscpy(char * dst,const char * src,size_t dstsize)108 strscpy(char *dst, const char *src, size_t dstsize)
109 {
110 	ssize_t r;
111 	r = strlcpy(dst, src, dstsize);
112 	if (dstsize == 0 || r >= dstsize)
113 		return -E2BIG;
114 	return r;
115 }
116 
117 static inline ssize_t
strscpy_pad(char * dst,const char * src,size_t dstsize)118 strscpy_pad(char *dst, const char *src, size_t dstsize)
119 {
120 	memset(dst, 0, dstsize);
121 	return strscpy(dst, src, dstsize);
122 }
123 
124 #endif
125