diff options
-rw-r--r-- | desiredata/src/desire.h | 87 |
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); |