return ret;
{ free (sf._sbf._f._IO_buf_base); return ret; }
_IO_vasprintf (result_ptr, format, args)     char **result_ptr;     const char *format;     _IO_va_list args;{  /* Initial size of the buffer to be used.  Will be doubled each time an     overflow occurs.  */  const _IO_size_t init_string_size = 100;  char *string;  _IO_strfile sf;  int ret;  _IO_size_t needed;  _IO_size_t allocated;  string = (char *) malloc (init_string_size);  if (string == NULL)    return -1;#ifdef _IO_MTSAFE_IO  sf._sbf._f._lock = NULL;#endif  _IO_no_init ((_IO_FILE *) &sf._sbf, _IO_USER_LOCK, -1, NULL, NULL);  _IO_JUMPS ((struct _IO_FILE_plus *) &sf._sbf) = &_IO_str_jumps;  _IO_str_init_static (&sf, string, init_string_size, string);  sf._sbf._f._flags &= ~_IO_USER_BUF;  sf._s._allocate_buffer = (_IO_alloc_type) malloc;  sf._s._free_buffer = (_IO_free_type) free;  ret = _IO_vfprintf (&sf._sbf._f, format, args);  if (ret < 0)    return ret;  /* Only use realloc if the size we need is of the same order of     magnitude then the memory we allocated.  */  needed = sf._sbf._f._IO_write_ptr - sf._sbf._f._IO_write_base + 1;  allocated = sf._sbf._f._IO_write_end - sf._sbf._f._IO_write_base;  if ((allocated << 1) <= needed)    *result_ptr = (char *) realloc (sf._sbf._f._IO_buf_base, needed);  else    {      *result_ptr = (char *) malloc (needed);      if (*result_ptr != NULL)	{	  memcpy (*result_ptr, sf._sbf._f._IO_buf_base, needed - 1);	  free (sf._sbf._f._IO_buf_base);	}      else	/* We have no choice, use the buffer we already have.  */	*result_ptr = (char *) realloc (sf._sbf._f._IO_buf_base, needed);    }  if (*result_ptr == NULL)    *result_ptr = sf._sbf._f._IO_buf_base;  (*result_ptr)[needed - 1] = '\0';  return ret;}