|
25 | 25 | smart_str_appendl_ex((dest), (src), strlen(src), (what))
|
26 | 26 | #define smart_str_appends(dest, src) \
|
27 | 27 | smart_str_appendl((dest), (src), strlen(src))
|
| 28 | +#define smart_str_extract(dest) \ |
| 29 | + smart_str_extract_ex((dest), 0) |
| 30 | +#define smart_str_trim_to_size(dest) \ |
| 31 | + smart_str_trim_to_size_ex((dest), 0) |
28 | 32 | #define smart_str_extend(dest, len) \
|
29 | 33 | smart_str_extend_ex((dest), (len), 0)
|
30 | 34 | #define smart_str_appendc(dest, c) \
|
@@ -101,10 +105,19 @@ static zend_always_inline size_t smart_str_get_len(smart_str *str) {
|
101 | 105 | return str->s ? ZSTR_LEN(str->s) : 0;
|
102 | 106 | }
|
103 | 107 |
|
104 |
| -static zend_always_inline zend_string *smart_str_extract(smart_str *str) { |
| 108 | +static zend_always_inline void smart_str_trim_to_size_ex(smart_str *str, bool persistent) |
| 109 | +{ |
| 110 | + if (str->s && str->a > ZSTR_LEN(str->s)) { |
| 111 | + str->s = zend_string_realloc(str->s, ZSTR_LEN(str->s), persistent); |
| 112 | + str->a = ZSTR_LEN(str->s); |
| 113 | + } |
| 114 | +} |
| 115 | + |
| 116 | +static zend_always_inline zend_string *smart_str_extract_ex(smart_str *str, bool persistent) { |
105 | 117 | if (str->s) {
|
106 | 118 | zend_string *res;
|
107 | 119 | smart_str_0(str);
|
| 120 | + smart_str_trim_to_size_ex(str, persistent); |
108 | 121 | res = str->s;
|
109 | 122 | str->s = NULL;
|
110 | 123 | return res;
|
|
0 commit comments