diff options
-rw-r--r-- | desiredata/src/desire.h | 118 | ||||
-rw-r--r-- | desiredata/src/kernel.c | 58 |
2 files changed, 89 insertions, 87 deletions
diff --git a/desiredata/src/desire.h b/desiredata/src/desire.h index 4f2329d3..eb87fef4 100644 --- a/desiredata/src/desire.h +++ b/desiredata/src/desire.h @@ -51,6 +51,37 @@ extern "C" { #endif +/* ----------------------- (v)asprintf missing on mingw... ---------------------------------------------------*/ + +#ifndef HAVE_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 +extern int vasprintf(char **str, const char *fmt, va_list ap); +#endif + +#ifndef HAVE_ASPRINTF +#define HAVE_ASPRINTF +extern int asprintf(char **str, const char *fmt, ...); +#endif + /* ----------------------- m_imp.h ---------------------------------------------------*/ typedef struct _methodentry { @@ -306,93 +337,6 @@ 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); 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 */ |