diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2014-08-26 23:11:34 -0400 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2014-08-29 22:06:59 -0400 |
commit | 17a007bc60c69d6ea471a96a465e04ba4ac2d00f (patch) | |
tree | 2b0ca8b479f48cbd047414a10cb58430faf9ca71 /firmware/include | |
parent | 77b3625763ae4d5aa6aaa9d44fbc1bfec6b29335 (diff) | |
download | rockbox-17a007bc60c69d6ea471a96a465e04ba4ac2d00f.tar.gz rockbox-17a007bc60c69d6ea471a96a465e04ba4ac2d00f.tar.bz2 rockbox-17a007bc60c69d6ea471a96a465e04ba4ac2d00f.zip |
Add normal alloca() definition and implement a strdupa and friends
Change-Id: I21c9c21fd664fb11bc8496ace4a389f535a030d6
Diffstat (limited to 'firmware/include')
-rw-r--r-- | firmware/include/string-extra.h | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/firmware/include/string-extra.h b/firmware/include/string-extra.h index 6a9e0c77be..9ab53d8154 100644 --- a/firmware/include/string-extra.h +++ b/firmware/include/string-extra.h @@ -34,4 +34,38 @@ #endif #endif +/* copies a buffer of len bytes and null terminates it */ +static inline char * strmemcpy(char *dst, const char *src, size_t len) +{ + /* NOTE: for now, assumes valid parameters! */ + *(char *)mempcpy(dst, src, len) = '\0'; + return dst; +} + +/* duplicate and null-terminate a memory block on the stack with alloca() */ +#define strmemdupa(s, l) \ + ({ const char *___s = (s); \ + size_t ___l = (l); \ + char *___buf = alloca(___l + 1); \ + strmemcpy(___buf, ___s, ___l); }) + +/* strdupa and strndupa may already be provided by a system's string.h */ + +#ifndef strdupa +/* duplicate an entire string on the stack with alloca() */ +#define strdupa(s) \ + ({ const char *__s = (s); \ + strmemdupa((__s), strlen(__s)); }) +#endif /* strdupa */ + +#ifndef strndupa +/* duplicate a string on the stack with alloca(), truncating it if it is too + long */ +#define strndupa(s, n) \ + ({ const char *__s = (s); \ + size_t __n = (n); \ + size_t __len = strlen(_s); \ + strmemdupa(__s, MIN(__n, __len)); }) +#endif /* strndupa */ + #endif /* STRING_EXTRA_H */ |