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 * 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 * 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 * 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 * 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 * 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 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 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 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