xref: /openbsd/sys/dev/pci/drm/include/linux/string.h (revision 932d5abe)
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 void *
memset32(uint32_t * b,uint32_t c,size_t len)17 memset32(uint32_t *b, uint32_t c, size_t len)
18 {
19 	uint32_t *dst = b;
20 	while (len--)
21 		*dst++ = c;
22 	return b;
23 }
24 
25 static inline void *
memset64(uint64_t * b,uint64_t c,size_t len)26 memset64(uint64_t *b, uint64_t c, size_t len)
27 {
28 	uint64_t *dst = b;
29 	while (len--)
30 		*dst++ = c;
31 	return b;
32 }
33 
34 static inline void *
memset_p(void ** p,void * v,size_t n)35 memset_p(void **p, void *v, size_t n)
36 {
37 #ifdef __LP64__
38 	return memset64((uint64_t *)p, (uintptr_t)v, n);
39 #else
40 	return memset32((uint32_t *)p, (uintptr_t)v, n);
41 #endif
42 }
43 
44 static inline void *
kmemdup(const void * src,size_t len,int flags)45 kmemdup(const void *src, size_t len, int flags)
46 {
47 	void *p = malloc(len, M_DRM, flags);
48 	if (p)
49 		memcpy(p, src, len);
50 	return (p);
51 }
52 
53 static inline void *
kstrdup(const char * str,int flags)54 kstrdup(const char *str, int flags)
55 {
56 	size_t len;
57 	char *p;
58 
59 	if (str == NULL)
60 		return NULL;
61 
62 	len = strlen(str) + 1;
63 	p = malloc(len, M_DRM, flags);
64 	if (p)
65 		memcpy(p, str, len);
66 	return (p);
67 }
68 
69 static inline int
match_string(const char * const * array,size_t n,const char * str)70 match_string(const char * const *array,  size_t n, const char *str)
71 {
72 	int i;
73 
74 	for (i = 0; i < n; i++) {
75 		if (array[i] == NULL)
76 			break;
77 		if (!strcmp(array[i], str))
78 			return i;
79 	}
80 
81 	return -EINVAL;
82 }
83 
84 static inline ssize_t
strscpy(char * dst,const char * src,size_t dstsize)85 strscpy(char *dst, const char *src, size_t dstsize)
86 {
87 	ssize_t r;
88 	r = strlcpy(dst, src, dstsize);
89 	if (dstsize == 0 || r >= dstsize)
90 		return -E2BIG;
91 	return r;
92 }
93 
94 static inline ssize_t
strscpy_pad(char * dst,const char * src,size_t dstsize)95 strscpy_pad(char *dst, const char *src, size_t dstsize)
96 {
97 	memset(dst, 0, dstsize);
98 	return strscpy(dst, src, dstsize);
99 }
100 
101 #endif
102