File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / main / snprintf.h
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:34:35 2012 UTC (12 years, 1 month ago) by misho
Branches: php, MAIN
CVS tags: v5_4_3elwix, v5_4_17p0, HEAD
php 5.4.3+patches

    1: /*
    2:    +----------------------------------------------------------------------+
    3:    | PHP Version 5                                                        |
    4:    +----------------------------------------------------------------------+
    5:    | Copyright (c) 1997-2012 The PHP Group                                |
    6:    +----------------------------------------------------------------------+
    7:    | This source file is subject to version 3.01 of the PHP license,      |
    8:    | that is bundled with this package in the file LICENSE, and is        |
    9:    | available through the world-wide-web at the following url:           |
   10:    | http://www.php.net/license/3_01.txt                                  |
   11:    | If you did not receive a copy of the PHP license and are unable to   |
   12:    | obtain it through the world-wide-web, please send a note to          |
   13:    | license@php.net so we can mail you a copy immediately.               |
   14:    +----------------------------------------------------------------------+
   15:    | Author: Stig Sæther Bakken <ssb@php.net>                             |
   16:    |         Marcus Boerger <helly@php.net>                               |
   17:    +----------------------------------------------------------------------+
   18: */
   19: 
   20: /* $Id: snprintf.h,v 1.1.1.2 2012/05/29 12:34:35 misho Exp $ */
   21: 
   22: /*
   23: 
   24: Comparing: sprintf, snprintf, slprintf, spprintf
   25: 
   26: sprintf  offers the ability to make a lot of failures since it does not know
   27:          the size of the buffer it uses. Therefore usage of sprintf often
   28:          results in possible entries for buffer overrun attacks. So please
   29:          use this version only if you are sure the call is safe. sprintf
   30:          allways terminstes the buffer it writes to.
   31: 
   32: snprintf knows the buffers size and will not write behind it. But you will
   33:          have to use either a static buffer or allocate a dynamic buffer
   34:          before beeing able to call the function. In other words you must
   35:          be sure that you really know the maximum size of the buffer required.
   36:          A bad thing is having a big maximum while in most cases you would
   37:          only need a small buffer. If the size of the resulting string is
   38:          longer or equal to the buffer size than the buffer is not terminated.
   39:          The function also returns the number of chars not including the
   40:          terminating \0 that were needed to fully comply to the print request.
   41: 
   42: slprintf same as snprintf with the difference that it actually returns the
   43:          length printed not including the terminating \0.
   44: 
   45: spprintf is the dynamical version of snprintf. It allocates the buffer in size
   46:          as needed and allows a maximum setting as snprintf (turn this feature
   47:          off by setting max_len to 0). spprintf is a little bit slower than
   48:          snprintf and offers possible memory leakes if you miss freeing the
   49:          buffer allocated by the function. Therfore this function should be
   50:          used where either no maximum is known or the maximum is much bigger
   51:          than normal size required. spprintf allways terminates the buffer.
   52: 
   53: Example:
   54: 
   55:  #define MAX 1024              | #define MAX 1024               | #define MAX 1024
   56:  char buffer[MAX]              | char buffer[MAX]               | char *buffer;
   57:                                |                                |
   58:                                |                                | // No need to initialize buffer:
   59:                                |                                | // spprintf ignores value of buffer
   60:  sprintf(buffer, "test");      | snprintf(buffer, MAX, "test"); | spprintf(&buffer, MAX, "text");
   61:                                |                                | if (!buffer)
   62:                                |                                |   return OUT_OF_MEMORY
   63:  // sprintf allways terminates | // manual termination of       | // spprintf allays terminates buffer
   64:  // buffer                     | // buffer *IS* required        |
   65:                                | buffer[MAX-1] = 0;             |
   66:  action_with_buffer(buffer);   | action_with_buffer(buffer);    | action_with_buffer(buffer);
   67:                                |                                | efree(buffer);
   68: */
   69: 
   70: #ifndef SNPRINTF_H
   71: #define SNPRINTF_H
   72: 
   73: typedef int bool_int;
   74: 
   75: typedef enum {
   76: 	NO = 0, YES = 1
   77: } boolean_e;
   78: 
   79: 
   80: BEGIN_EXTERN_C()
   81: PHPAPI int ap_php_slprintf(char *buf, size_t len, const char *format,...);
   82: PHPAPI int ap_php_vslprintf(char *buf, size_t len, const char *format, va_list ap);
   83: PHPAPI int ap_php_snprintf(char *, size_t, const char *, ...);
   84: PHPAPI int ap_php_vsnprintf(char *, size_t, const char *, va_list ap);
   85: PHPAPI int ap_php_vasprintf(char **buf, const char *format, va_list ap);
   86: PHPAPI int ap_php_asprintf(char **buf, const char *format, ...);
   87: PHPAPI int php_sprintf (char* s, const char* format, ...) PHP_ATTRIBUTE_FORMAT(printf, 2, 3);
   88: PHPAPI char * php_gcvt(double value, int ndigit, char dec_point, char exponent, char *buf);
   89: PHPAPI char * php_conv_fp(register char format, register double num,
   90: 		 boolean_e add_dp, int precision, char dec_point, bool_int * is_negative, char *buf, int *len);
   91: 
   92: END_EXTERN_C()
   93: 
   94: #ifdef slprintf
   95: #undef slprintf
   96: #endif
   97: #define slprintf ap_php_slprintf
   98: 
   99: #ifdef vslprintf
  100: #undef vslprintf
  101: #endif
  102: #define vslprintf ap_php_vslprintf
  103: 
  104: #ifdef snprintf
  105: #undef snprintf
  106: #endif
  107: #define snprintf ap_php_snprintf
  108: 
  109: #ifdef vsnprintf
  110: #undef vsnprintf
  111: #endif
  112: #define vsnprintf ap_php_vsnprintf
  113: 
  114: #ifndef HAVE_VASPRINTF
  115: #define vasprintf ap_php_vasprintf
  116: #endif
  117: 
  118: #ifndef HAVE_ASPRINTF
  119: #define asprintf ap_php_asprintf
  120: #endif
  121: 
  122: #ifdef sprintf
  123: #undef sprintf
  124: #endif
  125: #define sprintf php_sprintf
  126: 
  127: typedef enum {
  128: 	LM_STD = 0,
  129: #if SIZEOF_INTMAX_T
  130: 	LM_INTMAX_T,
  131: #endif
  132: #if SIZEOF_PTRDIFF_T
  133: 	LM_PTRDIFF_T,
  134: #endif
  135: #if SIZEOF_LONG_LONG
  136: 	LM_LONG_LONG,
  137: #endif
  138: 	LM_SIZE_T,
  139: 	LM_LONG,
  140: 	LM_LONG_DOUBLE
  141: } length_modifier_e;
  142: 
  143: #ifdef PHP_WIN32
  144: # define WIDE_INT		__int64
  145: #elif SIZEOF_LONG_LONG_INT
  146: # define WIDE_INT		long long int
  147: #elif SIZEOF_LONG_LONG
  148: # define WIDE_INT		long long
  149: #else
  150: # define WIDE_INT		long
  151: #endif
  152: typedef WIDE_INT wide_int;
  153: typedef unsigned WIDE_INT u_wide_int;
  154: 
  155: extern char * ap_php_conv_10(register wide_int num, register bool_int is_unsigned,
  156: 	   register bool_int * is_negative, char *buf_end, register int *len);
  157: 
  158: extern char * ap_php_conv_p2(register u_wide_int num, register int nbits,
  159: 		 char format, char *buf_end, register int *len);
  160: 
  161: /* The maximum precision that's allowed for float conversion. Does not include
  162:  * decimal separator, exponent, sign, terminator. Currently does not affect
  163:  * the modes e/f, only g/k/H, as those have a different limit enforced at
  164:  * another level (see NDIG in php_conv_fp()).
  165:  * Applies to the formatting functions of both spprintf.c and snprintf.c, which
  166:  * use equally sized buffers of MAX_BUF_SIZE = 512 to hold the result of the
  167:  * call to php_gcvt().
  168:  * This should be reasonably smaller than MAX_BUF_SIZE (I think MAX_BUF_SIZE - 9
  169:  * should be enough, but let's give some more space) */
  170: #define FORMAT_CONV_MAX_PRECISION 500
  171: 
  172: #endif /* SNPRINTF_H */
  173: 
  174: /*
  175:  * Local variables:
  176:  * tab-width: 4
  177:  * c-basic-offset: 4
  178:  * End:
  179:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>