Annotation of embedaddon/php/main/snprintf.h, revision 1.1
1.1 ! misho 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 321634 2012-01-01 13:15:04Z felipe $ */
! 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>