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 16 static 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 25 static 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