From 5b52e5658dc1199ac2f15ea91fc2da29ab367cd5 Mon Sep 17 00:00:00 2001 From: hniksic Date: Fri, 8 Jul 2005 00:33:05 -0700 Subject: [PATCH] [svn] Use vasprintf where available. --- ChangeLog | 5 +++++ configure.in | 4 ++-- src/ChangeLog | 4 ++++ src/utils.c | 45 ++++++++++++++++++++++++++++----------------- 4 files changed, 39 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index 214a60f1..4a707013 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2005-07-08 Hrvoje Niksic + + * configure.in: Don't check for symlink, which is expected to + exist. Check for asprintf. + 2005-07-07 Hrvoje Niksic * configure.bat: Copy the common config.h and config-compiler.h. diff --git a/configure.in b/configure.in index c3487b91..ec943cde 100644 --- a/configure.in +++ b/configure.in @@ -204,8 +204,8 @@ dnl AC_FUNC_ALLOCA AC_FUNC_MMAP AC_FUNC_FSEEKO -AC_CHECK_FUNCS(strptime timegm snprintf vsnprintf drand48) -AC_CHECK_FUNCS(usleep ftello sigblock sigsetjmp symlink) +AC_CHECK_FUNCS(strptime timegm snprintf vsnprintf vasprintf drand48) +AC_CHECK_FUNCS(usleep ftello sigblock sigsetjmp) dnl We expect to have these functions on Unix-like systems configure dnl runs on. The defines are provided to get them in config.h.in so diff --git a/src/ChangeLog b/src/ChangeLog index dbc98322..185da492 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2005-07-08 Hrvoje Niksic + + * utils.c (aprintf): Use vasprintf where available. + 2005-07-08 Hrvoje Niksic * url.c (rewrite_shorthand_url): Simplify code using aprintf and diff --git a/src/utils.c b/src/utils.c index 29262c12..b79c8dcd 100644 --- a/src/utils.c +++ b/src/utils.c @@ -42,9 +42,6 @@ so, delete this exception statement from your version. */ #ifdef HAVE_MMAP # include #endif -#ifdef HAVE_PWD_H -# include -#endif #ifdef HAVE_UTIME_H # include #endif @@ -52,9 +49,6 @@ so, delete this exception statement from your version. */ # include #endif #include -#ifdef NeXT -# include /* for access() */ -#endif #include #include #include @@ -79,8 +73,7 @@ so, delete this exception statement from your version. */ # endif #endif -#undef USE_SIGNAL_TIMEOUT -#if defined(HAVE_SIGSETJMP) || defined(HAVE_SIGBLOCK) +#if defined HAVE_SIGSETJMP || defined HAVE_SIGBLOCK # define USE_SIGNAL_TIMEOUT #endif @@ -148,17 +141,37 @@ sepstring (const char *s) return res; } -/* Like sprintf, but allocates a string of sufficient size with malloc - and returns it. GNU libc has a similar function named asprintf, - which requires the pointer to the string to be passed. */ +/* Like sprintf, but prints into a string of sufficient size freshly + allocated with malloc, which is returned. If unable to print due + to invalid format, returns NULL. Inability to allocate needed + memory results in abort, as with xmalloc. This is in spirit + similar to the GNU/BSD extension asprintf, but somewhat easier to + use. + + Internally the function either calls vasprintf or loops around + vsnprintf until the correct size is found. Since Wget also ships a + fallback implementation of vsnprintf, this should be portable. */ char * aprintf (const char *fmt, ...) { - /* This function is implemented using vsnprintf, which we provide - for the systems that don't have it. Therefore, it should be 100% - portable. */ +#ifdef HAVE_VASPRINTF + /* Use vasprintf. */ + int ret; + va_list args; + char *str; + va_start (args, fmt); + ret = vasprintf (&str, fmt, args); + va_end (args); + if (ret < 0 && errno == ENOMEM) + abort (); /* for consistency with xmalloc/xrealloc */ + else if (ret < 0) + return NULL; + return str; +#else /* not HAVE_VASPRINTF */ + /* vasprintf is unavailable. snprintf into a small buffer and + resize it as necessary. */ int size = 32; char *str = xmalloc (size); @@ -167,9 +180,6 @@ aprintf (const char *fmt, ...) int n; va_list args; - /* See log_vprintf_internal for explanation why it's OK to rely - on the return value of vsnprintf. */ - va_start (args, fmt); n = vsnprintf (str, size, fmt, args); va_end (args); @@ -185,6 +195,7 @@ aprintf (const char *fmt, ...) size <<= 1; /* twice the old size */ str = xrealloc (str, size); } +#endif /* not HAVE_VASPRINTF */ } /* Concatenate the NULL-terminated list of string arguments into -- 2.39.2