1#ifndef _LIBC_STRING_H 2#define _LIBC_STRING_H 3 4#include_next <string.h> 5 6/* map the internal glibc interface to the public one */ 7#define __memcpy(to, from, size) memcpy(to, from, size) 8#define __strchrnul(string, character) strchrnul(string, character) 9#define __strnlen strnlen 10#define __strdup strdup 11#define __strndup strndup 12#define __stpcpy stpcpy 13#define __strtok_r strtok_r 14#define __strcasecmp strcasecmp 15 16static inline char * 17__strerror_r(int error, char *buffer, size_t bufferSize) 18{ 19 if (strerror_r(error, buffer, bufferSize) != 0) 20 strlcpy(buffer, "Unknown Error", bufferSize); 21 22 return buffer; 23} 24 25static inline void * 26__mempcpy(void *to, const void *from, size_t size) 27{ 28 memcpy(to, from, size); 29 return (unsigned char *)to + size; 30} 31 32#undef strdupa 33#define strdupa(s) \ 34 (__extension__ \ 35 ({ \ 36 __const char *__old = (s); \ 37 size_t __len = strlen (__old) + 1; \ 38 char *__new = (char *) __builtin_alloca (__len); \ 39 (char *) memcpy (__new, __old, __len); \ 40 })) 41 42/* Alternative version which doesn't pollute glibc's namespace. */ 43#undef strndupa 44#define strndupa(s, n) \ 45 (__extension__ \ 46 ({ \ 47 __const char *__old = (s); \ 48 size_t __len = __strnlen (__old, (n)); \ 49 char *__new = (char *) __builtin_alloca (__len + 1); \ 50 __new[__len] = '\0'; \ 51 (char *) memcpy (__new, __old, __len); \ 52 })) 53 54#endif /* _LIBC_STRING_H */ 55