php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
str.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2018-2023 Alexander Borisov
3 *
4 * Author: Alexander Borisov <borisov@lexbor.com>
5 */
6
7#ifndef LEXBOR_STR_H
8#define LEXBOR_STR_H
9
10#ifdef __cplusplus
11extern "C" {
12#endif
13
14#include "lexbor/core/base.h"
15#include "lexbor/core/mraw.h"
16#include "lexbor/core/utils.h"
17
18
19#define lexbor_str_get(str, attr) str->attr
20#define lexbor_str_set(str, attr) lexbor_str_get(str, attr)
21#define lexbor_str_len(str) lexbor_str_get(str, length)
22#define lexbor_str(p) {.data = (lxb_char_t *) (p), sizeof(p) - 1}
23
24
25#define lexbor_str_check_size_arg_m(str, size, mraw, plus_len, return_fail) \
26 do { \
27 void *tmp; \
28 \
29 if (str->length > (SIZE_MAX - (plus_len))) \
30 return (return_fail); \
31 \
32 if ((str->length + (plus_len)) > (size)) { \
33 tmp = lexbor_mraw_realloc(mraw, str->data, \
34 (str->length + plus_len)); \
35 \
36 if (tmp == NULL) { \
37 return (return_fail); \
38 } \
39 \
40 str->data = (lxb_char_t *) tmp; \
41 } \
42 } \
43 while (0)
44
45
46typedef struct {
48 size_t length;
49}
51
52
55
58
61 const lxb_char_t *data, size_t length);
62
63LXB_API void
65
66LXB_API void
68
70lexbor_str_destroy(lexbor_str_t *str, lexbor_mraw_t *mraw, bool destroy_obj);
71
72
74lexbor_str_realloc(lexbor_str_t *str, lexbor_mraw_t *mraw, size_t new_size);
75
77lexbor_str_check_size(lexbor_str_t *str, lexbor_mraw_t *mraw, size_t plus_len);
78
79/* Append */
82 const lxb_char_t *data, size_t length);
83
86 const lxb_char_t *buff, size_t length);
87
90 const lxb_char_t data);
91
94 const lxb_char_t *data, size_t length);
95
98 const lxb_char_t *buff, size_t length);
99
100/* Other functions */
102lexbor_str_copy(lexbor_str_t *dest, const lexbor_str_t *target,
103 lexbor_mraw_t *mraw);
104
105LXB_API void
107
108LXB_API void
110
111LXB_API size_t
113
114LXB_API size_t
116
117LXB_API size_t
119
120
121/* Data utils */
122/*
123 * [in] first: must be null-terminated
124 * [in] sec: no matter what data
125 * [in] sec_size: size of the 'sec' buffer
126 *
127 * Function compare two lxb_char_t data until find '\0' in first arg.
128 * Successfully if the function returned a pointer starting with '\0',
129 * otherwise, if the data of the second buffer is insufficient function returned
130 * position in first buffer.
131 * If function returns NULL, the data are not equal.
132 */
133LXB_API const lxb_char_t *
135 size_t sec_size);
136LXB_API bool
137lexbor_str_data_ncasecmp_end(const lxb_char_t *first, const lxb_char_t *sec,
138 size_t size);
139LXB_API bool
140lexbor_str_data_ncasecmp_contain(const lxb_char_t *where, size_t where_size,
141 const lxb_char_t *what, size_t what_size);
142LXB_API bool
143lexbor_str_data_ncasecmp(const lxb_char_t *first, const lxb_char_t *sec,
144 size_t size);
145LXB_API bool
146lexbor_str_data_nlocmp_right(const lxb_char_t *first, const lxb_char_t *sec,
147 size_t size);
148LXB_API bool
149lexbor_str_data_nupcmp_right(const lxb_char_t *first, const lxb_char_t *sec,
150 size_t size);
151LXB_API bool
152lexbor_str_data_casecmp(const lxb_char_t *first, const lxb_char_t *sec);
153
154LXB_API bool
155lexbor_str_data_ncmp_end(const lxb_char_t *first, const lxb_char_t *sec,
156 size_t size);
157LXB_API bool
158lexbor_str_data_ncmp_contain(const lxb_char_t *where, size_t where_size,
159 const lxb_char_t *what, size_t what_size);
160LXB_API bool
161lexbor_str_data_ncmp(const lxb_char_t *first, const lxb_char_t *sec,
162 size_t size);
163
164LXB_API bool
165lexbor_str_data_cmp(const lxb_char_t *first, const lxb_char_t *sec);
166
167LXB_API bool
168lexbor_str_data_cmp_ws(const lxb_char_t *first, const lxb_char_t *sec);
169
170LXB_API void
171lexbor_str_data_to_lowercase(lxb_char_t *to, const lxb_char_t *from, size_t len);
172
173LXB_API void
174lexbor_str_data_to_uppercase(lxb_char_t *to, const lxb_char_t *from, size_t len);
175
176LXB_API const lxb_char_t *
178
179LXB_API const lxb_char_t *
181
182
183/*
184 * Inline functions
185 */
188{
189 return str->data;
190}
191
192lxb_inline size_t
194{
195 return str->length;
196}
197
198lxb_inline size_t
200{
201 return lexbor_mraw_data_size(str->data);
202}
203
204lxb_inline void
209
212{
213 if (length >= lexbor_str_size(str)) {
214 lxb_char_t *tmp;
215
216 tmp = lexbor_str_realloc(str, mraw, length + 1);
217 if (tmp == NULL) {
218 return NULL;
219 }
220 }
221
222 str->length = length;
223 str->data[length] = 0x00;
224
225 return str->data;
226}
227
228/*
229 * No inline functions for ABI.
230 */
233
234LXB_API size_t
236
237LXB_API size_t
239
240LXB_API void
242
245 size_t length);
246
247
248#ifdef __cplusplus
249} /* extern "C" */
250#endif
251
252#endif /* LEXBOR_STR_H */
size_t len
Definition apprentice.c:174
#define LXB_API
Definition def.h:48
new_type size
Definition ffi.c:4365
#define NULL
Definition gdcache.h:45
lxb_inline size_t lexbor_mraw_data_size(void *data)
Definition mraw.h:66
zend_constant * data
LXB_API lxb_char_t * lexbor_str_length_set_noi(lexbor_str_t *str, lexbor_mraw_t *mraw, size_t length)
Definition str.c:639
LXB_API const lxb_char_t * lexbor_str_data_find_uppercase(const lxb_char_t *data, size_t len)
Definition str.c:598
LXB_API bool lexbor_str_data_ncasecmp_contain(const lxb_char_t *where, size_t where_size, const lxb_char_t *what, size_t what_size)
Definition str.c:422
LXB_API lexbor_str_t * lexbor_str_create(void)
Definition str.c:16
lxb_inline lxb_char_t * lexbor_str_length_set(lexbor_str_t *str, lexbor_mraw_t *mraw, size_t length)
Definition str.h:211
LXB_API bool lexbor_str_data_nupcmp_right(const lxb_char_t *first, const lxb_char_t *sec, size_t size)
Definition str.c:463
LXB_API lxb_char_t * lexbor_str_append_with_rep_null_chars(lexbor_str_t *str, lexbor_mraw_t *mraw, const lxb_char_t *buff, size_t length)
Definition str.c:205
LXB_API size_t lexbor_str_whitespace_from_end(lexbor_str_t *target)
Definition str.c:363
LXB_API lxb_char_t * lexbor_str_append_one(lexbor_str_t *str, lexbor_mraw_t *mraw, const lxb_char_t data)
Definition str.c:169
LXB_API bool lexbor_str_data_nlocmp_right(const lxb_char_t *first, const lxb_char_t *sec, size_t size)
Definition str.c:450
LXB_API void lexbor_str_data_to_uppercase(lxb_char_t *to, const lxb_char_t *from, size_t len)
Definition str.c:574
lxb_inline size_t lexbor_str_size(lexbor_str_t *str)
Definition str.h:199
LXB_API void lexbor_str_stay_only_whitespace(lexbor_str_t *target)
Definition str.c:266
LXB_API lexbor_str_t * lexbor_str_destroy(lexbor_str_t *str, lexbor_mraw_t *mraw, bool destroy_obj)
Definition str.c:76
LXB_API lxb_char_t * lexbor_str_init(lexbor_str_t *str, lexbor_mraw_t *mraw, size_t size)
Definition str.c:22
LXB_API bool lexbor_str_data_ncmp(const lxb_char_t *first, const lxb_char_t *sec, size_t size)
Definition str.c:523
LXB_API lxb_char_t * lexbor_str_data_noi(lexbor_str_t *str)
Definition str.c:615
LXB_API lxb_char_t * lexbor_str_append_before(lexbor_str_t *str, lexbor_mraw_t *mraw, const lxb_char_t *buff, size_t length)
Definition str.c:149
LXB_API void lexbor_str_data_set_noi(lexbor_str_t *str, lxb_char_t *data)
Definition str.c:633
LXB_API bool lexbor_str_data_ncmp_end(const lxb_char_t *first, const lxb_char_t *sec, size_t size)
Definition str.c:495
LXB_API lxb_char_t * lexbor_str_check_size(lexbor_str_t *str, lexbor_mraw_t *mraw, size_t plus_len)
Definition str.c:107
LXB_API void lexbor_str_data_to_lowercase(lxb_char_t *to, const lxb_char_t *from, size_t len)
Definition str.c:564
LXB_API bool lexbor_str_data_ncmp_contain(const lxb_char_t *where, size_t where_size, const lxb_char_t *what, size_t what_size)
Definition str.c:510
LXB_API bool lexbor_str_data_casecmp(const lxb_char_t *first, const lxb_char_t *sec)
Definition str.c:476
LXB_API lxb_char_t * lexbor_str_realloc(lexbor_str_t *str, lexbor_mraw_t *mraw, size_t new_size)
Definition str.c:94
LXB_API size_t lexbor_str_size_noi(lexbor_str_t *str)
Definition str.c:627
LXB_API size_t lexbor_str_length_noi(lexbor_str_t *str)
Definition str.c:621
LXB_API const lxb_char_t * lexbor_str_data_find_lowercase(const lxb_char_t *data, size_t len)
Definition str.c:584
LXB_API lxb_char_t * lexbor_str_append_lowercase(lexbor_str_t *str, lexbor_mraw_t *mraw, const lxb_char_t *data, size_t length)
Definition str.c:183
LXB_API size_t lexbor_str_whitespace_from_begin(lexbor_str_t *target)
Definition str.c:348
LXB_API bool lexbor_str_data_cmp(const lxb_char_t *first, const lxb_char_t *sec)
Definition str.c:530
LXB_API void lexbor_str_clean(lexbor_str_t *str)
Definition str.c:64
lxb_inline void lexbor_str_data_set(lexbor_str_t *str, lxb_char_t *data)
Definition str.h:205
LXB_API lxb_char_t * lexbor_str_init_append(lexbor_str_t *str, lexbor_mraw_t *mraw, const lxb_char_t *data, size_t length)
Definition str.c:39
LXB_API void lexbor_str_clean_all(lexbor_str_t *str)
Definition str.c:70
LXB_API size_t lexbor_str_crop_whitespace_from_begin(lexbor_str_t *target)
Definition str.c:328
LXB_API bool lexbor_str_data_ncasecmp_end(const lxb_char_t *first, const lxb_char_t *sec, size_t size)
Definition str.c:405
LXB_API lxb_char_t * lexbor_str_copy(lexbor_str_t *dest, const lexbor_str_t *target, lexbor_mraw_t *mraw)
Definition str.c:247
LXB_API lxb_char_t * lexbor_str_append(lexbor_str_t *str, lexbor_mraw_t *mraw, const lxb_char_t *data, size_t length)
Definition str.c:131
LXB_API bool lexbor_str_data_ncasecmp(const lxb_char_t *first, const lxb_char_t *sec, size_t size)
Definition str.c:435
lxb_inline lxb_char_t * lexbor_str_data(lexbor_str_t *str)
Definition str.h:187
LXB_API const lxb_char_t * lexbor_str_data_ncasecmp_first(const lxb_char_t *first, const lxb_char_t *sec, size_t sec_size)
Definition str.c:384
LXB_API void lexbor_str_strip_collapse_whitespace(lexbor_str_t *target)
Definition str.c:282
LXB_API bool lexbor_str_data_cmp_ws(const lxb_char_t *first, const lxb_char_t *sec)
Definition str.c:547
lxb_inline size_t lexbor_str_length(lexbor_str_t *str)
Definition str.h:193
lxb_char_t * data
Definition str.h:47
size_t length
Definition str.h:48
#define lxb_inline
Definition types.h:21
unsigned char lxb_char_t
Definition types.h:27