2011-05-26 Yaakov Selkowitz * libc/include/string.h (strdupa): New macro function. (strndupa): New macro function. Index: libc/include/string.h =================================================================== RCS file: /cvs/src/src/newlib/libc/include/string.h,v retrieving revision 1.27 diff -u -p -r1.27 string.h --- libc/include/string.h 28 Mar 2011 14:51:28 -0000 1.27 +++ libc/include/string.h 26 May 2011 09:50:40 -0000 @@ -96,6 +96,20 @@ char *_EXFUN(strsignal, (int __signo)); int _EXFUN(strtosigno, (const char *__name)); #endif +#if defined _GNU_SOURCE && defined __GNUC__ +#define strdupa(s) \ + (__extension__ ({const char *__in = (s); \ + size_t __len = strlen (__in) + 1; \ + char * __out = (char *) __builtin_alloca (__len); \ + (char *) memcpy (__out, __in, __len);})) +#define strndupa(s, n) \ + (__extension__ ({const char *__in = (s); \ + size_t __len = strnlen (__in, (n)) + 1; \ + char *__out = (char *) __builtin_alloca (__len); \ + __out[__len-1] = '\0'; \ + (char *) memcpy (__out, __in, __len-1);})) +#endif /* _GNU_SOURCE && __GNUC__ */ + /* These function names are used on Windows and perhaps other systems. */ #ifndef strcmpi #define strcmpi strcasecmp