aboutsummaryrefslogtreecommitdiff
path: root/desiredata/src/kernel.c
diff options
context:
space:
mode:
authorN.N. <matju@users.sourceforge.net>2009-04-25 16:21:00 +0000
committerN.N. <matju@users.sourceforge.net>2009-04-25 16:21:00 +0000
commite0f7523b4ce97e8a5cf38aa5a73d2abe8fbc687a (patch)
treed4a5f2c19dd37f909a4372728e017a1c6364c1f4 /desiredata/src/kernel.c
parent9f9ca8a9f29c0eb0f4816277bd0b3baba03150a4 (diff)
move asprintf,vasprintf out to kernel.c to avoid multiple defs
svn path=/trunk/; revision=11145
Diffstat (limited to 'desiredata/src/kernel.c')
-rw-r--r--desiredata/src/kernel.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/desiredata/src/kernel.c b/desiredata/src/kernel.c
index 95f3d7b4..03ef0d59 100644
--- a/desiredata/src/kernel.c
+++ b/desiredata/src/kernel.c
@@ -2347,3 +2347,61 @@ void pd_init() {
garray_init();
}
};
+
+#ifndef HAVE_ASPRINTF
+int asprintf(char **str, const char *fmt, ...)
+{
+ va_list ap;
+ int ret;
+ *str = NULL;
+ va_start(ap, fmt);
+ ret = vasprintf(str, fmt, ap);
+ va_end(ap);
+
+ return ret;
+}
+#endif /* HAVE_ASPRINTF */
+#ifndef HAVE_VASPRINTF
+int vasprintf(char **str, const char *fmt, va_list ap)
+{
+ int ret = -1;
+ va_list ap2;
+ char *string, *newstr;
+ size_t len;
+
+ VA_COPY(ap2, ap);
+ if ((string = (char *)malloc(INIT_SZ)) == NULL)
+ goto fail;
+
+ ret = vsnprintf(string, INIT_SZ, fmt, ap2);
+ if (ret >= 0 && ret < INIT_SZ) { /* succeeded with initial alloc */
+ *str = string;
+ } else if (ret == INT_MAX || ret < 0) { /* Bad length */
+ goto fail;
+ } else { /* bigger than initial, realloc allowing for nul */
+ len = (size_t)ret + 1;
+ if ((newstr = (char *)realloc(string, len)) == NULL) {
+ free(string);
+ goto fail;
+ } else {
+ va_end(ap2);
+ VA_COPY(ap2, ap);
+ ret = vsnprintf(newstr, len, fmt, ap2);
+ if (ret >= 0 && (size_t)ret < len) {
+ *str = newstr;
+ } else { /* failed with realloc'ed string, give up */
+ free(newstr);
+ goto fail;
+ }
+ }
+ }
+ va_end(ap2);
+ return (ret);
+
+fail:
+ *str = NULL;
+ errno = ENOMEM;
+ va_end(ap2);
+ return (-1);
+}
+#endif /* HAVE_VASPRINTF */