Back to index

cell-binutils  2.17cvs20070401
Functions
vasprintf.c File Reference
#include <ansidecl.h>
#include <stdarg.h>
#include <stdio.h>
#include "libiberty.h"

Go to the source code of this file.

Functions

unsigned long strtoul ()
PTR malloc ()
static int int_vasprintf (char **, const char *, va_list)
int vasprintf (char **result, const char *format, va_list args)

Function Documentation

static int int_vasprintf ( char **  result,
const char *  format,
va_list  args 
) [static]

Definition at line 64 of file vasprintf.c.

{
  const char *p = format;
  /* Add one to make sure that it is never zero, which might cause malloc
     to return NULL.  */
  int total_width = strlen (format) + 1;
  va_list ap;

#ifdef va_copy
  va_copy (ap, args);
#else
  memcpy ((PTR) &ap, (PTR) &args, sizeof (va_list));
#endif

  while (*p != '\0')
    {
      if (*p++ == '%')
       {
         while (strchr ("-+ #0", *p))
           ++p;
         if (*p == '*')
           {
             ++p;
             total_width += abs (va_arg (ap, int));
           }
         else
           total_width += strtoul (p, (char **) &p, 10);
         if (*p == '.')
           {
             ++p;
             if (*p == '*')
              {
                ++p;
                total_width += abs (va_arg (ap, int));
              }
             else
             total_width += strtoul (p, (char **) &p, 10);
           }
         while (strchr ("hlL", *p))
           ++p;
         /* Should be big enough for any format specifier except %s and floats.  */
         total_width += 30;
         switch (*p)
           {
           case 'd':
           case 'i':
           case 'o':
           case 'u':
           case 'x':
           case 'X':
           case 'c':
             (void) va_arg (ap, int);
             break;
           case 'f':
           case 'e':
           case 'E':
           case 'g':
           case 'G':
             (void) va_arg (ap, double);
             /* Since an ieee double can have an exponent of 307, we'll
               make the buffer wide enough to cover the gross case. */
             total_width += 307;
             break;
           case 's':
             total_width += strlen (va_arg (ap, char *));
             break;
           case 'p':
           case 'n':
             (void) va_arg (ap, char *);
             break;
           }
         p++;
       }
    }
#ifdef va_copy
  va_end (ap);
#endif
#ifdef TEST
  global_total_width = total_width;
#endif
  *result = (char *) malloc (total_width);
  if (*result != NULL)
    return vsprintf (*result, format, args);
  else
    return -1;
}

Here is the call graph for this function:

Here is the caller graph for this function:

PTR malloc ( )
int vasprintf ( char **  result,
const char *  format,
va_list  args 
)

Definition at line 152 of file vasprintf.c.

{
  return int_vasprintf (result, format, args);
}

Here is the call graph for this function: