diff --git a/WWW/Library/Implementation/HTString.c b/WWW/Library/Implementation/HTString.c index e212c6f..7ee64ac 100644 --- a/WWW/Library/Implementation/HTString.c +++ b/WWW/Library/Implementation/HTString.c @@ -551,6 +551,46 @@ PUBLIC_IF_FIND_LEAKS char *StrAllocVsprintf(char **pstr, const char *fmt, va_list * ap) { +#ifdef HAVE_VASPRINTF + /* + * Use vasprintf() if we have it, since it is simplest. + */ + char *result = 0; + char *temp = 0; + + /* discard old destination if no length was given */ + if (pstr && !dst_len) { + if (*pstr) + FREE(*pstr); + } + + if (vasprintf(&temp, fmt, *ap) >= 0) { + if (dst_len != 0) { + int src_len = strlen(temp); + int new_len = dst_len + src_len + 1; + + result = HTAlloc(pstr ? *pstr : 0, new_len); + if (result != 0) { + strcpy(result + dst_len, temp); + mark_malloced(temp, new_len); + } + free(temp); + } else { + result = temp; + mark_malloced(temp, strlen(temp)); + } + } + + if (pstr != 0) + *pstr = result; + + return result; +#else /* !HAVE_VASPRINTF */ + /* + * If vasprintf() is not available, this works - but does not implement + * the POSIX '$' formatting character which may be used in some of the + * ".po" files. + */ #ifdef SAVE_TIME_NOT_SPACE static size_t tmp_len = 0; static size_t fmt_len = 0; @@ -566,20 +606,9 @@ PUBLIC_IF_FIND_LEAKS char *StrAllocVsprintf(char **pstr, char *dst_ptr = *pstr; const char *format = fmt; - if (fmt == 0 || *fmt == '\0') + if (isEmpty(fmt)) return 0; -#ifdef USE_VASPRINTF - if (pstr && !dst_len) { - if (*pstr) - FREE(*pstr); - if (vasprintf(pstr, fmt, *ap) >= 0) { - mark_malloced(*pstr, strlen(*pstr) + 1); - return (*pstr); - } - } -#endif /* USE_VASPRINTF */ - need = strlen(fmt) + 1; #ifdef SAVE_TIME_NOT_SPACE if (!fmt_ptr || fmt_len < need * NUM_WIDTH) { @@ -780,6 +809,7 @@ PUBLIC_IF_FIND_LEAKS char *StrAllocVsprintf(char **pstr, if (pstr) *pstr = dst_ptr; return (dst_ptr); +#endif /* HAVE_VASPRINTF */ } #undef SAVE_TIME_NOT_SPACE @@ -827,16 +857,7 @@ char *HTSprintf0(char **pstr, const char *fmt,...) LYva_start(ap, fmt); { -#ifdef USE_VASPRINTF - if (pstr) { - if (*pstr) - FREE(*pstr); - if (vasprintf(pstr, fmt, ap) >= 0) /* else call outofmem?? */ - mark_malloced(*pstr, strlen(*pstr) + 1); - result = *pstr; - } else -#endif /* USE_VASPRINTF */ - result = StrAllocVsprintf(pstr, 0, fmt, &ap); + result = StrAllocVsprintf(pstr, 0, fmt, &ap); } va_end(ap);