diff --git a/cext/src/include/ruby/asprintf.h b/cext/src/include/ruby/asprintf.h deleted file mode 100644 index 6a6271b084c..00000000000 --- a/cext/src/include/ruby/asprintf.h +++ /dev/null @@ -1,80 +0,0 @@ -#if !defined(__WIN32__) && !defined(__MINGW32__) -# include -# include -#endif - -#define INIT_SZ 128 - -#ifndef ENOMEM -# define ENOMEM 12 -#endif - -# - -#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 - - -static inline 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); -} -static inline 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; -} diff --git a/cext/src/include/ruby/ruby.h b/cext/src/include/ruby/ruby.h index cd1436817dc..69273d8cf3c 100644 --- a/cext/src/include/ruby/ruby.h +++ b/cext/src/include/ruby/ruby.h @@ -35,20 +35,12 @@ // Some platform specific includes #if defined(__WIN32__) || defined(__MINGW32__) # include "jruby_win32.h" -# include "asprintf.h" #else # define RUBY_DLLSPEC # include # include #endif -#if defined (__SVR4) && defined (__sun) -# define HAVE_VA_COPY -# ifndef asprintf -# include "asprintf.h" -# endif -#endif - #ifdef RUBY_EXTCONF_H #include RUBY_EXTCONF_H #endif diff --git a/cext/src/object.cpp b/cext/src/object.cpp index 5b3d1c7b281..a60c78da70a 100644 --- a/cext/src/object.cpp +++ b/cext/src/object.cpp @@ -19,7 +19,8 @@ * version 3 along with this work. If not, see . */ - +#include +#include #include "jruby.h" #include "ruby.h" #include "JLocalEnv.h" @@ -270,16 +271,14 @@ extern "C" VALUE rb_any_to_s(VALUE obj) { char* buf; + int len = 128, buflen; - if (asprintf(&buf, "#<%s:%p>", rb_obj_classname(obj), (void *) obj) == -1) { - // Could not allocate - return rb_str_new("", 0); - } - - VALUE result = rb_str_new_cstr(buf); - free(buf); + do { + buf = (char *) alloca(buflen = len); + len = snprintf(buf, buflen, "#<%s:%p>", rb_obj_classname(obj), (void *) obj); + } while (len >= buflen); - return result; + return rb_str_new_cstr(buf); } extern "C" void