summaryrefslogtreecommitdiffstats
path: root/firmware/include/string-extra.h
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2014-08-26 23:11:34 -0400
committerMichael Sevakis <jethead71@rockbox.org>2014-08-29 22:06:59 -0400
commit17a007bc60c69d6ea471a96a465e04ba4ac2d00f (patch)
tree2b0ca8b479f48cbd047414a10cb58430faf9ca71 /firmware/include/string-extra.h
parent77b3625763ae4d5aa6aaa9d44fbc1bfec6b29335 (diff)
downloadrockbox-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/string-extra.h')
-rw-r--r--firmware/include/string-extra.h34
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 */