Back to index

php5  5.3.10
Defines | Functions | Variables
formatted_print.c File Reference
#include <math.h>
#include "php.h"
#include "ext/standard/head.h"
#include "php_string.h"
#include "zend_execute.h"
#include <stdio.h>

Go to the source code of this file.

Defines

#define LCONV_DECIMAL_POINT   '.'
#define ALIGN_LEFT   0
#define ALIGN_RIGHT   1
#define ADJ_WIDTH   1
#define ADJ_PRECISION   2
#define NUM_BUF_SIZE   500
#define NDIG   80
#define FLOAT_DIGITS   6
#define FLOAT_PRECISION   6
#define MAX_FLOAT_DIGITS   38
#define MAX_FLOAT_PRECISION   53
#define PRINTF_DEBUG(arg)

Functions

static void php_sprintf_appendchar (char **buffer, int *pos, int *size, char add TSRMLS_DC)
static void php_sprintf_appendstring (char **buffer, int *pos, int *size, char *add, int min_width, int max_width, char padding, int alignment, int len, int neg, int expprec, int always_sign)
static void php_sprintf_appendint (char **buffer, int *pos, int *size, long number, int width, char padding, int alignment, int always_sign)
static void php_sprintf_appenduint (char **buffer, int *pos, int *size, unsigned long number, int width, char padding, int alignment)
static void php_sprintf_appenddouble (char **buffer, int *pos, int *size, double number, int width, char padding, int alignment, int precision, int adjust, char fmt, int always_sign TSRMLS_DC)
static void php_sprintf_append2n (char **buffer, int *pos, int *size, long number, int width, char padding, int alignment, int n, char *chartable, int expprec)
static int php_sprintf_getnumber (char *buffer, int *pos)
static char * php_formatted_print (int ht, int *len, int use_array, int format_offset TSRMLS_DC)
 PHP_FUNCTION (user_sprintf)
 PHP_FUNCTION (vsprintf)
 PHP_FUNCTION (user_printf)
 PHP_FUNCTION (vprintf)
 PHP_FUNCTION (fprintf)
 PHP_FUNCTION (vfprintf)

Variables

static char hexchars [] = "0123456789abcdef"
static char HEXCHARS [] = "0123456789ABCDEF"

Define Documentation

#define ADJ_PRECISION   2

Definition at line 38 of file formatted_print.c.

#define ADJ_WIDTH   1

Definition at line 37 of file formatted_print.c.

#define ALIGN_LEFT   0

Definition at line 35 of file formatted_print.c.

#define ALIGN_RIGHT   1

Definition at line 36 of file formatted_print.c.

#define FLOAT_DIGITS   6

Definition at line 41 of file formatted_print.c.

#define FLOAT_PRECISION   6

Definition at line 42 of file formatted_print.c.

#define LCONV_DECIMAL_POINT   '.'

Definition at line 32 of file formatted_print.c.

#define MAX_FLOAT_DIGITS   38

Definition at line 43 of file formatted_print.c.

#define MAX_FLOAT_PRECISION   53

Definition at line 44 of file formatted_print.c.

#define NDIG   80

Definition at line 40 of file formatted_print.c.

#define NUM_BUF_SIZE   500

Definition at line 39 of file formatted_print.c.

#define PRINTF_DEBUG (   arg)

Definition at line 50 of file formatted_print.c.


Function Documentation

static char* php_formatted_print ( int  ht,
int len,
int  use_array,
int format_offset  TSRMLS_DC 
) [static]

Definition at line 375 of file formatted_print.c.

{
       zval ***args, **z_format;
       int argc, size = 240, inpos = 0, outpos = 0, temppos;
       int alignment, currarg, adjusting, argnum, width, precision;
       char *format, *result, padding;
       int always_sign;

       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", &args, &argc) == FAILURE) {
              return NULL;
       }

       /* verify the number of args */
       if ((use_array && argc != (2 + format_offset)) 
                     || (!use_array && argc < (1 + format_offset))) {
              efree(args);
              WRONG_PARAM_COUNT_WITH_RETVAL(NULL);
       }
       
       if (use_array) {
              int i = 1;
              zval ***newargs;
              zval **array;

              z_format = args[format_offset];
              array = args[1 + format_offset];
              
              SEPARATE_ZVAL(array);
              convert_to_array_ex(array);
              
              argc = 1 + zend_hash_num_elements(Z_ARRVAL_PP(array));
              newargs = (zval ***)safe_emalloc(argc, sizeof(zval *), 0);
              newargs[0] = z_format;
              
              for (zend_hash_internal_pointer_reset(Z_ARRVAL_PP(array));
                      zend_hash_get_current_data(Z_ARRVAL_PP(array), (void **)&newargs[i++]) == SUCCESS;
                      zend_hash_move_forward(Z_ARRVAL_PP(array)));

              efree(args);
              args = newargs;
              format_offset = 0;
       }
       
       convert_to_string_ex(args[format_offset]);
       format = Z_STRVAL_PP(args[format_offset]);
       result = emalloc(size);

       currarg = 1;

       while (inpos<Z_STRLEN_PP(args[format_offset])) {
              int expprec = 0, multiuse = 0;
              zval *tmp;

              PRINTF_DEBUG(("sprintf: format[%d]='%c'\n", inpos, format[inpos]));
              PRINTF_DEBUG(("sprintf: outpos=%d\n", outpos));
              if (format[inpos] != '%') {
                     php_sprintf_appendchar(&result, &outpos, &size, format[inpos++] TSRMLS_CC);
              } else if (format[inpos + 1] == '%') {
                     php_sprintf_appendchar(&result, &outpos, &size, '%' TSRMLS_CC);
                     inpos += 2;
              } else {
                     /* starting a new format specifier, reset variables */
                     alignment = ALIGN_RIGHT;
                     adjusting = 0;
                     padding = ' ';
                     always_sign = 0;
                     inpos++;                    /* skip the '%' */

                     PRINTF_DEBUG(("sprintf: first looking at '%c', inpos=%d\n",
                                            format[inpos], inpos));
                     if (isascii((int)format[inpos]) && !isalpha((int)format[inpos])) {
                            /* first look for argnum */
                            temppos = inpos;
                            while (isdigit((int)format[temppos])) temppos++;
                            if (format[temppos] == '$') {
                                   argnum = php_sprintf_getnumber(format, &inpos);

                                   if (argnum <= 0) {
                                          efree(result);
                                          efree(args);
                                          php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument number must be greater than zero");
                                          return NULL;
                                   }

                                   multiuse = 1;
                                   inpos++;  /* skip the '$' */
                            } else {
                                   argnum = currarg++;
                            }

                            argnum += format_offset;

                            /* after argnum comes modifiers */
                            PRINTF_DEBUG(("sprintf: looking for modifiers\n"
                                                   "sprintf: now looking at '%c', inpos=%d\n",
                                                   format[inpos], inpos));
                            for (;; inpos++) {
                                   if (format[inpos] == ' ' || format[inpos] == '0') {
                                          padding = format[inpos];
                                   } else if (format[inpos] == '-') {
                                          alignment = ALIGN_LEFT;
                                          /* space padding, the default */
                                   } else if (format[inpos] == '+') {
                                          always_sign = 1;
                                   } else if (format[inpos] == '\'') {
                                          padding = format[++inpos];
                                   } else {
                                          PRINTF_DEBUG(("sprintf: end of modifiers\n"));
                                          break;
                                   }
                            }
                            PRINTF_DEBUG(("sprintf: padding='%c'\n", padding));
                            PRINTF_DEBUG(("sprintf: alignment=%s\n",
                                                   (alignment == ALIGN_LEFT) ? "left" : "right"));


                            /* after modifiers comes width */
                            if (isdigit((int)format[inpos])) {
                                   PRINTF_DEBUG(("sprintf: getting width\n"));
                                   if ((width = php_sprintf_getnumber(format, &inpos)) < 0) {
                                          efree(result);
                                          efree(args);
                                          php_error_docref(NULL TSRMLS_CC, E_WARNING, "Width must be greater than zero and less than %d", INT_MAX);
                                          return NULL;
                                   }
                                   adjusting |= ADJ_WIDTH;
                            } else {
                                   width = 0;
                            }
                            PRINTF_DEBUG(("sprintf: width=%d\n", width));

                            /* after width and argnum comes precision */
                            if (format[inpos] == '.') {
                                   inpos++;
                                   PRINTF_DEBUG(("sprintf: getting precision\n"));
                                   if (isdigit((int)format[inpos])) {
                                          if ((precision = php_sprintf_getnumber(format, &inpos)) < 0) {
                                                 efree(result);
                                                 efree(args);
                                                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Precision must be greater than zero and less than %d", INT_MAX);
                                                 return NULL;
                                          }
                                          adjusting |= ADJ_PRECISION;
                                          expprec = 1;
                                   } else {
                                          precision = 0;
                                   }
                            } else {
                                   precision = 0;
                            }
                            PRINTF_DEBUG(("sprintf: precision=%d\n", precision));
                     } else {
                            width = precision = 0;
                            argnum = currarg++ + format_offset;
                     }

                     if (argnum >= argc) {
                            efree(result);
                            efree(args);
                            php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too few arguments");
                            return NULL;
                     }

                     if (format[inpos] == 'l') {
                            inpos++;
                     }
                     PRINTF_DEBUG(("sprintf: format character='%c'\n", format[inpos]));
                     /* now we expect to find a type specifier */
                     if (multiuse) {
                            MAKE_STD_ZVAL(tmp);
                            *tmp = **(args[argnum]);
                            INIT_PZVAL(tmp);
                            zval_copy_ctor(tmp);
                     } else {
                            SEPARATE_ZVAL(args[argnum]);
                            tmp = *(args[argnum]);
                     }

                     switch (format[inpos]) {
                            case 's': {
                                   zval *var, var_copy;
                                   int use_copy;

                                   zend_make_printable_zval(tmp, &var_copy, &use_copy);
                                   if (use_copy) {
                                          var = &var_copy;
                                   } else {
                                          var = tmp;
                                   }
                                   php_sprintf_appendstring(&result, &outpos, &size,
                                                                              Z_STRVAL_P(var),
                                                                              width, precision, padding,
                                                                              alignment,
                                                                              Z_STRLEN_P(var),
                                                                              0, expprec, 0);
                                   if (use_copy) {
                                          zval_dtor(&var_copy);
                                   }
                                   break;
                            }

                            case 'd':
                                   convert_to_long(tmp);
                                   php_sprintf_appendint(&result, &outpos, &size,
                                                                        Z_LVAL_P(tmp),
                                                                        width, padding, alignment,
                                                                        always_sign);
                                   break;

                            case 'u':
                                   convert_to_long(tmp);
                                   php_sprintf_appenduint(&result, &outpos, &size,
                                                                        Z_LVAL_P(tmp),
                                                                        width, padding, alignment);
                                   break;

                            case 'g':
                            case 'G':
                            case 'e':
                            case 'E':
                            case 'f':
                            case 'F':
                                   convert_to_double(tmp);
                                   php_sprintf_appenddouble(&result, &outpos, &size,
                                                                              Z_DVAL_P(tmp),
                                                                              width, padding, alignment,
                                                                              precision, adjusting,
                                                                              format[inpos], always_sign
                                                                              TSRMLS_CC);
                                   break;
                                   
                            case 'c':
                                   convert_to_long(tmp);
                                   php_sprintf_appendchar(&result, &outpos, &size,
                                                                      (char) Z_LVAL_P(tmp) TSRMLS_CC);
                                   break;

                            case 'o':
                                   convert_to_long(tmp);
                                   php_sprintf_append2n(&result, &outpos, &size,
                                                                       Z_LVAL_P(tmp),
                                                                       width, padding, alignment, 3,
                                                                       hexchars, expprec);
                                   break;

                            case 'x':
                                   convert_to_long(tmp);
                                   php_sprintf_append2n(&result, &outpos, &size,
                                                                       Z_LVAL_P(tmp),
                                                                       width, padding, alignment, 4,
                                                                       hexchars, expprec);
                                   break;

                            case 'X':
                                   convert_to_long(tmp);
                                   php_sprintf_append2n(&result, &outpos, &size,
                                                                       Z_LVAL_P(tmp),
                                                                       width, padding, alignment, 4,
                                                                       HEXCHARS, expprec);
                                   break;

                            case 'b':
                                   convert_to_long(tmp);
                                   php_sprintf_append2n(&result, &outpos, &size,
                                                                       Z_LVAL_P(tmp),
                                                                       width, padding, alignment, 1,
                                                                       hexchars, expprec);
                                   break;

                            case '%':
                                   php_sprintf_appendchar(&result, &outpos, &size, '%' TSRMLS_CC);

                                   break;
                            default:
                                   break;
                     }
                     if (multiuse) {
                            zval_ptr_dtor(&tmp);
                     }
                     inpos++;
              }
       }
       
       efree(args);
       
       /* possibly, we have to make sure we have room for the terminating null? */
       result[outpos]=0;
       *len = outpos;       
       return result;
}

Here is the call graph for this function:

Here is the caller graph for this function:

PHP_FUNCTION ( user_sprintf  )

Definition at line 669 of file formatted_print.c.

{
       char *result;
       int len;
       
       if ((result=php_formatted_print(ht, &len, 0, 0 TSRMLS_CC))==NULL) {
              RETURN_FALSE;
       }
       RETVAL_STRINGL(result, len, 0);
}

Here is the call graph for this function:

PHP_FUNCTION ( vsprintf  )

Definition at line 683 of file formatted_print.c.

{
       char *result;
       int len;
       
       if ((result=php_formatted_print(ht, &len, 1, 0 TSRMLS_CC))==NULL) {
              RETURN_FALSE;
       }
       RETVAL_STRINGL(result, len, 0);
}

Here is the call graph for this function:

PHP_FUNCTION ( user_printf  )

Definition at line 697 of file formatted_print.c.

{
       char *result;
       int len, rlen;
       
       if ((result=php_formatted_print(ht, &len, 0, 0 TSRMLS_CC))==NULL) {
              RETURN_FALSE;
       }
       rlen = PHPWRITE(result, len);
       efree(result);
       RETURN_LONG(rlen);
}

Here is the call graph for this function:

PHP_FUNCTION ( vprintf  )

Definition at line 713 of file formatted_print.c.

{
       char *result;
       int len, rlen;
       
       if ((result=php_formatted_print(ht, &len, 1, 0 TSRMLS_CC))==NULL) {
              RETURN_FALSE;
       }
       rlen = PHPWRITE(result, len);
       efree(result);
       RETURN_LONG(rlen);
}

Here is the call graph for this function:

PHP_FUNCTION ( fprintf  )

Definition at line 729 of file formatted_print.c.

{
       php_stream *stream;
       zval *arg1;
       char *result;
       int len;
       
       if (ZEND_NUM_ARGS() < 2) {
              WRONG_PARAM_COUNT;
       }
       
       if (zend_parse_parameters(1 TSRMLS_CC, "r", &arg1) == FAILURE) {
              RETURN_FALSE;
       }
       
       php_stream_from_zval(stream, &arg1);

       if ((result=php_formatted_print(ht, &len, 0, 1 TSRMLS_CC))==NULL) {
              RETURN_FALSE;
       }

       php_stream_write(stream, result, len);

       efree(result);

       RETURN_LONG(len);
}

Here is the call graph for this function:

PHP_FUNCTION ( vfprintf  )

Definition at line 760 of file formatted_print.c.

{
       php_stream *stream;
       zval *arg1;
       char *result;
       int len;
       
       if (ZEND_NUM_ARGS() != 3) {
              WRONG_PARAM_COUNT;
       }
       
       if (zend_parse_parameters(1 TSRMLS_CC, "r", &arg1) == FAILURE) {
              RETURN_FALSE;
       }
       
       php_stream_from_zval(stream, &arg1);

       if ((result=php_formatted_print(ht, &len, 1, 1 TSRMLS_CC))==NULL) {
              RETURN_FALSE;
       }

       php_stream_write(stream, result, len);

       efree(result);

       RETURN_LONG(len);
}

Here is the call graph for this function:

static void php_sprintf_append2n ( char **  buffer,
int pos,
int size,
long  number,
int  width,
char  padding,
int  alignment,
int  n,
char *  chartable,
int  expprec 
) [inline, static]

Definition at line 299 of file formatted_print.c.

{
       char numbuf[NUM_BUF_SIZE];
       register unsigned long num;
       register unsigned int  i = NUM_BUF_SIZE - 1;
       register int andbits = (1 << n) - 1;

       PRINTF_DEBUG(("sprintf: append2n(%x, %x, %x, %d, %d, '%c', %d, %d, %x)\n",
                              *buffer, pos, size, number, width, padding, alignment, n,
                              chartable));
       PRINTF_DEBUG(("sprintf: append2n 2^%d andbits=%x\n", n, andbits));

       num = (unsigned long) number;
       numbuf[i] = '\0';

       do {
              numbuf[--i] = chartable[(num & andbits)];
              num >>= n;
       }
       while (num > 0);

       php_sprintf_appendstring(buffer, pos, size, &numbuf[i], width, 0,
                                                  padding, alignment, (NUM_BUF_SIZE - 1) - i,
                                                  0, expprec, 0);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void php_sprintf_appendchar ( char **  buffer,
int pos,
int size,
char add  TSRMLS_DC 
) [inline, static]

Definition at line 58 of file formatted_print.c.

{
       if ((*pos + 1) >= *size) {
              *size <<= 1;
              PRINTF_DEBUG(("%s(): ereallocing buffer to %d bytes\n", get_active_function_name(TSRMLS_C), *size));
              *buffer = erealloc(*buffer, *size);
       }
       PRINTF_DEBUG(("sprintf: appending '%c', pos=\n", add, *pos));
       (*buffer)[(*pos)++] = add;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void php_sprintf_appenddouble ( char **  buffer,
int pos,
int size,
double  number,
int  width,
char  padding,
int  alignment,
int  precision,
int  adjust,
char  fmt,
int always_sign  TSRMLS_DC 
) [inline, static]

Definition at line 208 of file formatted_print.c.

{
       char num_buf[NUM_BUF_SIZE];
       char *s = NULL;
       int s_len = 0, is_negative = 0;
#ifdef HAVE_LOCALE_H
       struct lconv *lconv;
#endif

       PRINTF_DEBUG(("sprintf: appenddouble(%x, %x, %x, %f, %d, '%c', %d, %c)\n",
                              *buffer, pos, size, number, width, padding, alignment, fmt));
       if ((adjust & ADJ_PRECISION) == 0) {
              precision = FLOAT_PRECISION;
       } else if (precision > MAX_FLOAT_PRECISION) {
              php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Requested precision of %d digits was truncated to PHP maximum of %d digits", precision, MAX_FLOAT_PRECISION);
              precision = MAX_FLOAT_PRECISION;
       }
       
       if (zend_isnan(number)) {
              is_negative = (number<0);
              php_sprintf_appendstring(buffer, pos, size, "NaN", 3, 0, padding,
                                                         alignment, 3, is_negative, 0, always_sign);
              return;
       }

       if (zend_isinf(number)) {
              is_negative = (number<0);
              php_sprintf_appendstring(buffer, pos, size, "INF", 3, 0, padding,
                                                         alignment, 3, is_negative, 0, always_sign);
              return;
       }

       switch (fmt) {                     
              case 'e':
              case 'E':
              case 'f':
              case 'F':
#ifdef HAVE_LOCALE_H
                     lconv = localeconv();
#endif
                     s = php_conv_fp((fmt == 'f')?'F':fmt, number, 0, precision,
                                          (fmt == 'f')?LCONV_DECIMAL_POINT:'.',
                                          &is_negative, &num_buf[1], &s_len);
                     if (is_negative) {
                            num_buf[0] = '-';
                            s = num_buf;
                            s_len++;
                     } else if (always_sign) {
                            num_buf[0] = '+';
                            s = num_buf;
                            s_len++;
                     }
                     break;

              case 'g':
              case 'G':
                     if (precision == 0)
                            precision = 1;
                     /*
                      * * We use &num_buf[ 1 ], so that we have room for the sign
                      */
#ifdef HAVE_LOCALE_H
                     lconv = localeconv();
#endif
                     s = php_gcvt(number, precision, LCONV_DECIMAL_POINT, (fmt == 'G')?'E':'e', &num_buf[1]);
                     is_negative = 0;
                     if (*s == '-') {
                            is_negative = 1;
                            s = &num_buf[1];
                     } else if (always_sign) {
                            num_buf[0] = '+';
                            s = num_buf;
                     }

                     s_len = strlen(s);
                     break;
       }

       php_sprintf_appendstring(buffer, pos, size, s, width, 0, padding,
                                                  alignment, s_len, is_negative, 0, always_sign);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void php_sprintf_appendint ( char **  buffer,
int pos,
int size,
long  number,
int  width,
char  padding,
int  alignment,
int  always_sign 
) [inline, static]

Definition at line 132 of file formatted_print.c.

{
       char numbuf[NUM_BUF_SIZE];
       register unsigned long magn, nmagn;
       register unsigned int i = NUM_BUF_SIZE - 1, neg = 0;

       PRINTF_DEBUG(("sprintf: appendint(%x, %x, %x, %d, %d, '%c', %d)\n",
                              *buffer, pos, size, number, width, padding, alignment));
       if (number < 0) {
              neg = 1;
              magn = ((unsigned long) -(number + 1)) + 1;
       } else {
              magn = (unsigned long) number;
       }

       /* Can't right-pad 0's on integers */
       if(alignment==0 && padding=='0') padding=' ';

       numbuf[i] = '\0';

       do {
              nmagn = magn / 10;

              numbuf[--i] = (unsigned char)(magn - (nmagn * 10)) + '0';
              magn = nmagn;
       }
       while (magn > 0 && i > 0);
       if (neg) {
              numbuf[--i] = '-';
       } else if (always_sign) {
              numbuf[--i] = '+';
       }
       PRINTF_DEBUG(("sprintf: appending %d as \"%s\", i=%d\n",
                              number, &numbuf[i], i));
       php_sprintf_appendstring(buffer, pos, size, &numbuf[i], width, 0,
                                                  padding, alignment, (NUM_BUF_SIZE - 1) - i,
                                                  neg, 0, always_sign);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void php_sprintf_appendstring ( char **  buffer,
int pos,
int size,
char *  add,
int  min_width,
int  max_width,
char  padding,
int  alignment,
int  len,
int  neg,
int  expprec,
int  always_sign 
) [inline, static]

Definition at line 72 of file formatted_print.c.

{
       register int npad;
       int req_size;
       int copy_len;
       int m_width;

       copy_len = (expprec ? MIN(max_width, len) : len);
       npad = min_width - copy_len;

       if (npad < 0) {
              npad = 0;
       }
       
       PRINTF_DEBUG(("sprintf: appendstring(%x, %d, %d, \"%s\", %d, '%c', %d)\n",
                              *buffer, *pos, *size, add, min_width, padding, alignment));
       m_width = MAX(min_width, copy_len);

       if(m_width > INT_MAX - *pos - 1) {
              zend_error_noreturn(E_ERROR, "Field width %d is too long", m_width);
       }

       req_size = *pos + m_width + 1;

       if (req_size > *size) {
              while (req_size > *size) {
                     if(*size > INT_MAX/2) {
                            zend_error_noreturn(E_ERROR, "Field width %d is too long", req_size); 
                     }
                     *size <<= 1;
              }
              PRINTF_DEBUG(("sprintf ereallocing buffer to %d bytes\n", *size));
              *buffer = erealloc(*buffer, *size);
       }
       if (alignment == ALIGN_RIGHT) {
              if ((neg || always_sign) && padding=='0') {
                     (*buffer)[(*pos)++] = (neg) ? '-' : '+';
                     add++;
                     len--;
                     copy_len--;
              }
              while (npad-- > 0) {
                     (*buffer)[(*pos)++] = padding;
              }
       }
       PRINTF_DEBUG(("sprintf: appending \"%s\"\n", add));
       memcpy(&(*buffer)[*pos], add, copy_len + 1);
       *pos += copy_len;
       if (alignment == ALIGN_LEFT) {
              while (npad--) {
                     (*buffer)[(*pos)++] = padding;
              }
       }
}

Here is the caller graph for this function:

static void php_sprintf_appenduint ( char **  buffer,
int pos,
int size,
unsigned long  number,
int  width,
char  padding,
int  alignment 
) [inline, static]

Definition at line 176 of file formatted_print.c.

{
       char numbuf[NUM_BUF_SIZE];
       register unsigned long magn, nmagn;
       register unsigned int i = NUM_BUF_SIZE - 1;

       PRINTF_DEBUG(("sprintf: appenduint(%x, %x, %x, %d, %d, '%c', %d)\n",
                              *buffer, pos, size, number, width, padding, alignment));
       magn = (unsigned long) number;

       /* Can't right-pad 0's on integers */
       if (alignment == 0 && padding == '0') padding = ' ';

       numbuf[i] = '\0';

       do {
              nmagn = magn / 10;

              numbuf[--i] = (unsigned char)(magn - (nmagn * 10)) + '0';
              magn = nmagn;
       } while (magn > 0 && i > 0);

       PRINTF_DEBUG(("sprintf: appending %d as \"%s\", i=%d\n", number, &numbuf[i], i));
       php_sprintf_appendstring(buffer, pos, size, &numbuf[i], width, 0,
                                                  padding, alignment, (NUM_BUF_SIZE - 1) - i, 0, 0, 0);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int php_sprintf_getnumber ( char *  buffer,
int pos 
) [inline, static]

Definition at line 330 of file formatted_print.c.

{
       char *endptr;
       register long num = strtol(&buffer[*pos], &endptr, 10);
       register int i = 0;

       if (endptr != NULL) {
              i = (endptr - &buffer[*pos]);
       }
       PRINTF_DEBUG(("sprintf_getnumber: number was %d bytes long\n", i));
       *pos += i;

       if (num >= INT_MAX || num < 0) {
              return -1;
       } else {
              return (int) num;
       }
}

Here is the caller graph for this function:


Variable Documentation

char hexchars[] = "0123456789abcdef" [static]

Definition at line 53 of file formatted_print.c.

char HEXCHARS[] = "0123456789ABCDEF" [static]

Definition at line 54 of file formatted_print.c.