Back to index

glibc  2.9
Functions
vasprintf.c File Reference
#include <malloc.h>
#include <string.h>
#include "libioP.h"
#include "stdio.h"
#include <stdio_ext.h>
#include "strfile.h"

Go to the source code of this file.

Functions

int _IO_vasprintf (char **result_ptr, const char *format, _IO_va_list args)

Function Documentation

int _IO_vasprintf ( char **  result_ptr,
const char *  format,
_IO_va_list  args 
)

Definition at line 36 of file vasprintf.c.

{
  /* 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;
  /* No need to clear the memory here (unlike for open_memstream) since
     we know we will never seek on the stream.  */
  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_internal (&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 = INTUSE(_IO_vfprintf) (&sf._sbf._f, format, args);
  if (ret < 0)
    {
      free (sf._sbf._f._IO_buf_base);
      return ret;
    }
  /* Only use realloc if the size we need is of the same (binary)
     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;
}

Here is the call graph for this function: