aboutsummaryrefslogtreecommitdiff
path: root/desiredata/src/desire.h
diff options
context:
space:
mode:
authorN.N. <matju@users.sourceforge.net>2009-04-25 16:09:39 +0000
committerN.N. <matju@users.sourceforge.net>2009-04-25 16:09:39 +0000
commit9f9ca8a9f29c0eb0f4816277bd0b3baba03150a4 (patch)
treeef58ba1b34b430e844309114a2426263f4a3f8c0 /desiredata/src/desire.h
parent2743812ae16911b0533a99905d9aa5b3668f6bf0 (diff)
add (v)asprintf for win32 (sent by Patrice Colet)
svn path=/trunk/; revision=11144
Diffstat (limited to 'desiredata/src/desire.h')
-rw-r--r--desiredata/src/desire.h87
1 files changed, 87 insertions, 0 deletions
diff --git a/desiredata/src/desire.h b/desiredata/src/desire.h
index cb5a84d2..4f2329d3 100644
--- a/desiredata/src/desire.h
+++ b/desiredata/src/desire.h
@@ -306,6 +306,93 @@ EXTERN const char *inlet_tip(t_inlet* i,int num);
extern t_hash<t_pd *,long> *object_table;
extern t_hash<t_symbol *,t_class *> *class_table;
+#ifdef MSW
+
+#ifndef HAVE_VASPRINTF
+extern int vasprintf();
+#define HAVE_VASPRINTF
+#include <stdio.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#ifndef VA_COPY
+# ifdef HAVE_VA_COPY
+# define VA_COPY(dest, src) va_copy(dest, src)
+# else
+# ifdef HAVE___VA_COPY
+# define VA_COPY(dest, src) __va_copy(dest, src)
+# else
+# define VA_COPY(dest, src) (dest) = (src)
+# endif
+# endif
+#endif
+
+#define INIT_SZ 128
+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 */
+
+/* Include asprintf() */
+#ifndef HAVE_ASPRINTF
+#define HAVE_ASPRINTF
+extern int 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 */
+#endif /* MSW */
+
/* some kernel.c stuff that wasn't in any header, when shifting to C++. */
void obj_moveinletfirst(t_object *x, t_inlet *i);
void obj_moveoutletfirst(t_object *x, t_outlet *o);