root/ext/standard/php_smart_str.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. smart_str_print_long
  2. smart_str_print_unsigned

   1 /*
   2    +----------------------------------------------------------------------+
   3    | PHP Version 5                                                        |
   4    +----------------------------------------------------------------------+
   5    | Copyright (c) 1997-2016 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: Sascha Schumann <sascha@schumann.cx>                         |
  16    +----------------------------------------------------------------------+
  17  */
  18 
  19 /* $Id$ */
  20 
  21 #ifndef PHP_SMART_STR_H
  22 #define PHP_SMART_STR_H
  23 
  24 #include "php_smart_str_public.h"
  25 
  26 #include <stdlib.h>
  27 #ifndef SMART_STR_USE_REALLOC
  28 #include <zend.h>
  29 #endif
  30 
  31 #define smart_str_0(x) do {                                                                                     \
  32         if ((x)->c) {                                                                                                   \
  33                 (x)->c[(x)->len] = '\0';                                                                        \
  34         }                                                                                                                               \
  35 } while (0)
  36 
  37 #ifndef SMART_STR_PREALLOC
  38 #define SMART_STR_PREALLOC 128
  39 #endif
  40 
  41 #ifndef SMART_STR_START_SIZE
  42 #define SMART_STR_START_SIZE 78
  43 #endif
  44 
  45 #ifdef SMART_STR_USE_REALLOC
  46 #define SMART_STR_REALLOC(a,b,c) realloc((a),(b))
  47 #else
  48 #define SMART_STR_REALLOC(a,b,c) perealloc((a),(b),(c))
  49 #endif
  50 
  51 #define SMART_STR_DO_REALLOC(d, what) \
  52         (d)->c = SMART_STR_REALLOC((d)->c, (d)->a + 1, (what))
  53 
  54 #define smart_str_alloc4(d, n, what, newlen) do {                                       \
  55         if (!(d)->c) {                                                                                                  \
  56                 (d)->len = 0;                                                                                           \
  57                 newlen = (n);                                                                                           \
  58                 (d)->a = newlen < SMART_STR_START_SIZE                                          \
  59                                 ? SMART_STR_START_SIZE                                                          \
  60                                 : newlen + SMART_STR_PREALLOC;                                          \
  61                 SMART_STR_DO_REALLOC(d, what);                                                          \
  62         } else {                                                                                                                \
  63                 newlen = (d)->len + (n);                                                                        \
  64                 if (newlen >= (d)->a) {                                                                         \
  65                         (d)->a = newlen + SMART_STR_PREALLOC;                                   \
  66                         SMART_STR_DO_REALLOC(d, what);                                                  \
  67                 }                                                                                                                       \
  68         }                                                                                                                               \
  69 } while (0)
  70 
  71 #define smart_str_alloc(d, n, what) \
  72         smart_str_alloc4((d), (n), (what), newlen)
  73 
  74 /* wrapper */
  75 
  76 #define smart_str_appends_ex(dest, src, what) \
  77         smart_str_appendl_ex((dest), (src), strlen(src), (what))
  78 #define smart_str_appends(dest, src) \
  79         smart_str_appendl((dest), (src), strlen(src))
  80 
  81 #define smart_str_appendc(dest, c) \
  82         smart_str_appendc_ex((dest), (c), 0)
  83 #define smart_str_free(s) \
  84         smart_str_free_ex((s), 0)
  85 #define smart_str_appendl(dest, src, len) \
  86         smart_str_appendl_ex((dest), (src), (len), 0)
  87 #define smart_str_append(dest, src) \
  88         smart_str_append_ex((dest), (src), 0)
  89 #define smart_str_append_long(dest, val) \
  90         smart_str_append_long_ex((dest), (val), 0)
  91 #define smart_str_append_off_t(dest, val) \
  92         smart_str_append_off_t_ex((dest), (val), 0)
  93 #define smart_str_append_unsigned(dest, val) \
  94         smart_str_append_unsigned_ex((dest), (val), 0)
  95 
  96 #define smart_str_appendc_ex(dest, ch, what) do {                                       \
  97         register size_t __nl;                                                                                   \
  98         smart_str_alloc4((dest), 1, (what), __nl);                                              \
  99         (dest)->len = __nl;                                                                                             \
 100         ((unsigned char *) (dest)->c)[(dest)->len - 1] = (ch);                  \
 101 } while (0)
 102 
 103 #define smart_str_free_ex(s, what) do {                                                         \
 104         smart_str *__s = (smart_str *) (s);                                                             \
 105         if (__s->c) {                                                                                                   \
 106                 pefree(__s->c, what);                                                                           \
 107                 __s->c = NULL;                                                                                          \
 108         }                                                                                                                               \
 109         __s->a = __s->len = 0;                                                                                  \
 110 } while (0)
 111 
 112 #define smart_str_appendl_ex(dest, src, nlen, what) do {                        \
 113         register size_t __nl;                                                                                   \
 114         smart_str *__dest = (smart_str *) (dest);                                               \
 115                                                                                                                                         \
 116         smart_str_alloc4(__dest, (nlen), (what), __nl);                                 \
 117         memcpy(__dest->c + __dest->len, (src), (nlen));                                 \
 118         __dest->len = __nl;                                                                                             \
 119 } while (0)
 120 
 121 /* input: buf points to the END of the buffer */
 122 #define smart_str_print_unsigned4(buf, num, vartype, result) do {       \
 123         char *__p = (buf);                                                                                              \
 124         vartype __num = (num);                                                                                  \
 125         *__p = '\0';                                                                                                    \
 126         do {                                                                                                                    \
 127                 *--__p = (char) (__num % 10) + '0';                                                     \
 128                 __num /= 10;                                                                                            \
 129         } while (__num > 0);                                                                                    \
 130         result = __p;                                                                                                   \
 131 } while (0)
 132 
 133 /* buf points to the END of the buffer */
 134 #define smart_str_print_long4(buf, num, vartype, result) do {   \
 135         if (num < 0) {                                                                                                  \
 136                 /* this might cause problems when dealing with LONG_MIN         \
 137                    and machines which don't support long long.  Works           \
 138                    flawlessly on 32bit x86 */                                                           \
 139                 smart_str_print_unsigned4((buf), -(num), vartype, (result));    \
 140                 *--(result) = '-';                                                                                      \
 141         } else {                                                                                                                \
 142                 smart_str_print_unsigned4((buf), (num), vartype, (result));     \
 143         }                                                                                                                               \
 144 } while (0)
 145 
 146 /*
 147  * these could be replaced using a braced-group inside an expression
 148  * for GCC compatible compilers, e.g.
 149  *
 150  * #define f(..) ({char *r;..;__r;})
 151  */  
 152  
 153 static inline char *smart_str_print_long(char *buf, long num) {
 154         char *r; 
 155         smart_str_print_long4(buf, num, unsigned long, r); 
 156         return r;
 157 }
 158 
 159 static inline char *smart_str_print_unsigned(char *buf, long num) {
 160         char *r; 
 161         smart_str_print_unsigned4(buf, num, unsigned long, r); 
 162         return r;
 163 }
 164 
 165 #define smart_str_append_generic_ex(dest, num, type, vartype, func) do {        \
 166         char __b[32];                                                                                                                   \
 167         char *__t;                                                                                                                              \
 168         smart_str_print##func##4 (__b + sizeof(__b) - 1, (num), vartype, __t);  \
 169         smart_str_appendl_ex((dest), __t, __b + sizeof(__b) - 1 - __t, (type)); \
 170 } while (0)
 171         
 172 #define smart_str_append_unsigned_ex(dest, num, type) \
 173         smart_str_append_generic_ex((dest), (num), (type), unsigned long, _unsigned)
 174 
 175 #define smart_str_append_long_ex(dest, num, type) \
 176         smart_str_append_generic_ex((dest), (num), (type), unsigned long, _long)
 177 
 178 #define smart_str_append_off_t_ex(dest, num, type) \
 179         smart_str_append_generic_ex((dest), (num), (type), off_t, _long)
 180 
 181 #define smart_str_append_ex(dest, src, what) \
 182         smart_str_appendl_ex((dest), ((smart_str *)(src))->c, \
 183                 ((smart_str *)(src))->len, (what));
 184 
 185 
 186 #define smart_str_setl(dest, src, nlen) do {                                            \
 187         (dest)->len = (nlen);                                                                                   \
 188         (dest)->a = (nlen) + 1;                                                                                 \
 189         (dest)->c = (char *) (src);                                                                             \
 190 } while (0)
 191 
 192 #define smart_str_sets(dest, src) \
 193         smart_str_setl((dest), (src), strlen(src));
 194 
 195 #endif

/* [<][>][^][v][top][bottom][index][help] */