xref: /openbsd-src/sys/dev/pci/drm/include/linux/string.h (revision 932d5abe5ead509bbf1478149730397319a9e66f)
17f4dd379Sjsg /* Public domain. */
27f4dd379Sjsg 
37f4dd379Sjsg #ifndef _LINUX_STRING_H
47f4dd379Sjsg #define _LINUX_STRING_H
57f4dd379Sjsg 
67f4dd379Sjsg #include <sys/types.h>
77f4dd379Sjsg #include <sys/systm.h>
87f4dd379Sjsg #include <sys/malloc.h>
97f4dd379Sjsg #include <sys/stdint.h>
107f4dd379Sjsg #include <sys/errno.h>
117f4dd379Sjsg 
121bb76ff1Sjsg #include <linux/compiler.h>
131bb76ff1Sjsg 
147f4dd379Sjsg void *memchr_inv(const void *, int, size_t);
157f4dd379Sjsg 
167f4dd379Sjsg static inline void *
memset32(uint32_t * b,uint32_t c,size_t len)177f4dd379Sjsg memset32(uint32_t *b, uint32_t c, size_t len)
187f4dd379Sjsg {
197f4dd379Sjsg 	uint32_t *dst = b;
207f4dd379Sjsg 	while (len--)
217f4dd379Sjsg 		*dst++ = c;
227f4dd379Sjsg 	return b;
237f4dd379Sjsg }
247f4dd379Sjsg 
257f4dd379Sjsg static inline void *
memset64(uint64_t * b,uint64_t c,size_t len)267f4dd379Sjsg memset64(uint64_t *b, uint64_t c, size_t len)
277f4dd379Sjsg {
287f4dd379Sjsg 	uint64_t *dst = b;
297f4dd379Sjsg 	while (len--)
307f4dd379Sjsg 		*dst++ = c;
317f4dd379Sjsg 	return b;
327f4dd379Sjsg }
337f4dd379Sjsg 
347f4dd379Sjsg static inline void *
memset_p(void ** p,void * v,size_t n)357f4dd379Sjsg memset_p(void **p, void *v, size_t n)
367f4dd379Sjsg {
377f4dd379Sjsg #ifdef __LP64__
387f4dd379Sjsg 	return memset64((uint64_t *)p, (uintptr_t)v, n);
397f4dd379Sjsg #else
407f4dd379Sjsg 	return memset32((uint32_t *)p, (uintptr_t)v, n);
417f4dd379Sjsg #endif
427f4dd379Sjsg }
437f4dd379Sjsg 
447f4dd379Sjsg static inline void *
kmemdup(const void * src,size_t len,int flags)457f4dd379Sjsg kmemdup(const void *src, size_t len, int flags)
467f4dd379Sjsg {
477f4dd379Sjsg 	void *p = malloc(len, M_DRM, flags);
487f4dd379Sjsg 	if (p)
497f4dd379Sjsg 		memcpy(p, src, len);
507f4dd379Sjsg 	return (p);
517f4dd379Sjsg }
527f4dd379Sjsg 
537f4dd379Sjsg static inline void *
kstrdup(const char * str,int flags)547f4dd379Sjsg kstrdup(const char *str, int flags)
557f4dd379Sjsg {
567f4dd379Sjsg 	size_t len;
577f4dd379Sjsg 	char *p;
587f4dd379Sjsg 
59c349dbc7Sjsg 	if (str == NULL)
60c349dbc7Sjsg 		return NULL;
61c349dbc7Sjsg 
627f4dd379Sjsg 	len = strlen(str) + 1;
637f4dd379Sjsg 	p = malloc(len, M_DRM, flags);
647f4dd379Sjsg 	if (p)
657f4dd379Sjsg 		memcpy(p, str, len);
667f4dd379Sjsg 	return (p);
677f4dd379Sjsg }
687f4dd379Sjsg 
697f4dd379Sjsg static inline int
match_string(const char * const * array,size_t n,const char * str)707f4dd379Sjsg match_string(const char * const *array,  size_t n, const char *str)
717f4dd379Sjsg {
727f4dd379Sjsg 	int i;
737f4dd379Sjsg 
747f4dd379Sjsg 	for (i = 0; i < n; i++) {
757f4dd379Sjsg 		if (array[i] == NULL)
767f4dd379Sjsg 			break;
777f4dd379Sjsg 		if (!strcmp(array[i], str))
787f4dd379Sjsg 			return i;
797f4dd379Sjsg 	}
807f4dd379Sjsg 
817f4dd379Sjsg 	return -EINVAL;
827f4dd379Sjsg }
837f4dd379Sjsg 
84*932d5abeSkettenis static inline ssize_t
strscpy(char * dst,const char * src,size_t dstsize)85*932d5abeSkettenis strscpy(char *dst, const char *src, size_t dstsize)
86*932d5abeSkettenis {
87*932d5abeSkettenis 	ssize_t r;
88*932d5abeSkettenis 	r = strlcpy(dst, src, dstsize);
89*932d5abeSkettenis 	if (dstsize == 0 || r >= dstsize)
90*932d5abeSkettenis 		return -E2BIG;
91*932d5abeSkettenis 	return r;
92*932d5abeSkettenis }
93*932d5abeSkettenis 
941bb76ff1Sjsg static inline ssize_t
strscpy_pad(char * dst,const char * src,size_t dstsize)951bb76ff1Sjsg strscpy_pad(char *dst, const char *src, size_t dstsize)
961bb76ff1Sjsg {
971bb76ff1Sjsg 	memset(dst, 0, dstsize);
98*932d5abeSkettenis 	return strscpy(dst, src, dstsize);
991bb76ff1Sjsg }
1001bb76ff1Sjsg 
1017f4dd379Sjsg #endif
102