php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
selectors.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2020-2022 Alexander Borisov
3 *
4 * Author: Alexander Borisov <borisov@lexbor.com>
5 */
6
7#include "lexbor/core/print.h"
8#include "lexbor/css/css.h"
9
10
12lxb_css_selectors_parse_list(lxb_css_parser_t *parser,
13 const lxb_css_syntax_cb_components_t *components,
14 const lxb_char_t *data, size_t length);
15
16static lxb_status_t
17lxb_css_selectors_components_end(lxb_css_parser_t *parser,
18 const lxb_css_syntax_token_t *token,
19 void *ctx, bool failed);
20
21
22static const lxb_css_syntax_cb_components_t lxb_css_selectors_complex_list_cb = {
24 .block = NULL,
25 .failed = lxb_css_state_failed,
26 .end = lxb_css_selectors_components_end
27};
28
29static const lxb_css_syntax_cb_components_t lxb_css_selectors_compound_list_cb = {
31 .block = NULL,
32 .failed = lxb_css_state_failed,
33 .end = lxb_css_selectors_components_end
34};
35
36static const lxb_css_syntax_cb_components_t lxb_css_selectors_simple_list_cb = {
38 .block = NULL,
39 .failed = lxb_css_state_failed,
40 .end = lxb_css_selectors_components_end
41};
42
43static const lxb_css_syntax_cb_components_t lxb_css_selectors_relative_list_cb = {
45 .block = NULL,
46 .failed = lxb_css_state_failed,
47 .end = lxb_css_selectors_components_end
48};
49
50static const lxb_css_syntax_cb_components_t lxb_css_selectors_complex_cb = {
52 .block = NULL,
53 .failed = lxb_css_state_failed,
54 .end = lxb_css_selectors_components_end
55};
56
57static const lxb_css_syntax_cb_components_t lxb_css_selectors_compound_cb = {
59 .block = NULL,
60 .failed = lxb_css_state_failed,
61 .end = lxb_css_selectors_components_end
62};
63
64static const lxb_css_syntax_cb_components_t lxb_css_selectors_simple_cb = {
66 .block = NULL,
67 .failed = lxb_css_state_failed,
68 .end = lxb_css_selectors_components_end
69};
70
71static const lxb_css_syntax_cb_components_t lxb_css_selectors_relative_cb = {
73 .block = NULL,
74 .failed = lxb_css_state_failed,
75 .end = lxb_css_selectors_components_end
76};
77
78
81{
82 return lexbor_calloc(1, sizeof(lxb_css_selectors_t));
83}
84
87{
88 if (selectors == NULL) {
90 }
91
92 selectors->list = NULL;
93 selectors->list_last = NULL;
94 selectors->parent = NULL;
97 selectors->error = 0;
98 selectors->err_in_function = false;
99 selectors->failed = false;
100
101 return LXB_STATUS_OK;
102}
103
104void
106{
107 if (selectors != NULL) {
108 selectors->list = NULL;
109 selectors->list_last = NULL;
110 selectors->parent = NULL;
113 selectors->error = 0;
114 selectors->err_in_function = false;
115 selectors->failed = false;
116 }
117}
118
120lxb_css_selectors_destroy(lxb_css_selectors_t *selectors, bool self_destroy)
121{
122 if (selectors == NULL) {
123 return NULL;
124 }
125
126 if (self_destroy) {
127 return lexbor_free(selectors);
128 }
129
130 return selectors;
131}
132
135 const lxb_char_t *data, size_t length)
136{
137 return lxb_css_selectors_parse_complex_list(parser, data, length);
138}
139
142 const lxb_char_t *data, size_t length)
143{
144 return lxb_css_selectors_parse_list(parser, &lxb_css_selectors_complex_list_cb,
145 data, length);
146}
147
150 const lxb_char_t *data, size_t length)
151{
152 return lxb_css_selectors_parse_list(parser, &lxb_css_selectors_compound_list_cb,
153 data, length);
154}
155
158 const lxb_char_t *data, size_t length)
159{
160 return lxb_css_selectors_parse_list(parser, &lxb_css_selectors_simple_list_cb,
161 data, length);
162}
163
166 const lxb_char_t *data, size_t length)
167{
168 return lxb_css_selectors_parse_list(parser, &lxb_css_selectors_relative_list_cb,
169 data, length);
170}
171
172static lxb_status_t
173lxb_css_selectors_parse_prepare(lxb_css_parser_t *parser,
174 lxb_css_memory_t *memory,
175 lxb_css_selectors_t *selectors)
176{
177 if (parser->stage != LXB_CSS_PARSER_CLEAN) {
178 if (parser->stage == LXB_CSS_PARSER_RUN) {
180 }
181
182 lxb_css_parser_clean(parser);
183 }
184
185 parser->tkz->with_comment = false;
186 parser->stage = LXB_CSS_PARSER_RUN;
187
188 parser->old_memory = parser->memory;
189 parser->old_selectors = parser->selectors;
190
191 parser->memory = memory;
192 parser->selectors = selectors;
193
194 return LXB_STATUS_OK;
195}
196
198lxb_css_selectors_parse_process(lxb_css_parser_t *parser,
199 const lxb_css_syntax_cb_components_t *components,
200 const lxb_char_t *data, size_t length)
201{
203
204 lxb_css_parser_buffer_set(parser, data, length);
205
207 components, NULL,
209 if (rule == NULL) {
210 return NULL;
211 }
212
213 parser->status = lxb_css_syntax_parser_run(parser);
214 if (parser->status != LXB_STATUS_OK) {
215 return NULL;
216 }
217
218 return parser->selectors->list;
219}
220
221static void
222lxb_css_selectors_parse_finish(lxb_css_parser_t *parser)
223{
224 parser->stage = LXB_CSS_PARSER_END;
225
226 parser->memory = parser->old_memory;
227 parser->selectors = parser->old_selectors;
228}
229
231lxb_css_selectors_parse_list(lxb_css_parser_t *parser,
232 const lxb_css_syntax_cb_components_t *components,
233 const lxb_char_t *data, size_t length)
234{
235 lxb_css_memory_t *memory;
236 lxb_css_selectors_t *selectors;
238
239 memory = parser->memory;
240 selectors = parser->selectors;
241
242 if (selectors == NULL) {
243 selectors = lxb_css_selectors_create();
244 parser->status = lxb_css_selectors_init(selectors);
245
246 if (parser->status != LXB_STATUS_OK) {
247 (void) lxb_css_selectors_destroy(selectors, true);
248 return NULL;
249 }
250 }
251 else {
252 lxb_css_selectors_clean(selectors);
253 }
254
255 if (memory == NULL) {
256 memory = lxb_css_memory_create();
257 parser->status = lxb_css_memory_init(memory, 256);
258
259 if (parser->status != LXB_STATUS_OK) {
260 if (selectors != parser->selectors) {
261 (void) lxb_css_selectors_destroy(selectors, true);
262 }
263
264 (void) lxb_css_memory_destroy(memory, true);
265 return NULL;
266 }
267 }
268
269 parser->status = lxb_css_selectors_parse_prepare(parser, memory, selectors);
270 if (parser->status != LXB_STATUS_OK) {
271 list = NULL;
272 goto end;
273 }
274
275 list = lxb_css_selectors_parse_process(parser, components, data, length);
276
277 lxb_css_selectors_parse_finish(parser);
278
279end:
280
281 if (list == NULL && memory != parser->memory) {
282 (void) lxb_css_memory_destroy(memory, true);
283 }
284
285 if (selectors != parser->selectors) {
286 (void) lxb_css_selectors_destroy(selectors, true);
287 }
288
289 return list;
290}
291
292static lxb_status_t
293lxb_css_selectors_components_end(lxb_css_parser_t *parser,
294 const lxb_css_syntax_token_t *token,
295 void *ctx, bool failed)
296{
298 lxb_css_selectors_t *selectors = parser->selectors;
299
300 if (failed) {
301 list = selectors->list_last;
302
303 if (list != NULL) {
306 }
307 }
308
309 return LXB_STATUS_OK;
310}
311
314 const lxb_char_t *data, size_t length)
315{
316 return lxb_css_selectors_parse_list(parser, &lxb_css_selectors_complex_cb,
317 data, length);
318}
319
322 const lxb_char_t *data, size_t length)
323{
324 return lxb_css_selectors_parse_list(parser, &lxb_css_selectors_compound_cb,
325 data, length);
326}
327
330 const lxb_char_t *data, size_t length)
331{
332 return lxb_css_selectors_parse_list(parser, &lxb_css_selectors_simple_cb,
333 data, length);
334}
335
338 const lxb_char_t *data, size_t length)
339{
340 return lxb_css_selectors_parse_list(parser, &lxb_css_selectors_relative_cb,
341 data, length);
342}
@ LXB_STATUS_ERROR_OBJECT_IS_NULL
Definition base.h:52
@ LXB_STATUS_ERROR_WRONG_ARGS
Definition base.h:58
@ LXB_STATUS_OK
Definition base.h:49
struct lxb_css_syntax_token lxb_css_syntax_token_t
Definition base.h:46
LXB_API lxb_status_t lxb_css_memory_init(lxb_css_memory_t *memory, size_t prepare_count)
Definition css.c:28
struct lxb_css_memory lxb_css_memory_t
LXB_API lxb_css_memory_t * lxb_css_memory_destroy(lxb_css_memory_t *memory, bool self_destroy)
Definition css.c:97
LXB_API lxb_css_memory_t * lxb_css_memory_create(void)
Definition css.c:22
struct lxb_css_parser lxb_css_parser_t
Definition base.h:41
void lxb_css_parser_clean(lxb_css_parser_t *parser)
Definition parser.c:104
@ LXB_CSS_PARSER_CLEAN
Definition parser.h:124
@ LXB_CSS_PARSER_RUN
Definition parser.h:125
@ LXB_CSS_PARSER_END
Definition parser.h:127
lxb_inline void lxb_css_parser_buffer_set(lxb_css_parser_t *parser, const lxb_char_t *data, size_t length)
Definition parser.h:338
struct lxb_css_selector_list lxb_css_selector_list_t
Definition base.h:40
struct lxb_css_selectors lxb_css_selectors_t
Definition base.h:38
lxb_css_selector_list_t * lxb_css_selectors_parse_simple_list(lxb_css_parser_t *parser, const lxb_char_t *data, size_t length)
Definition selectors.c:157
lxb_status_t lxb_css_selectors_init(lxb_css_selectors_t *selectors)
Definition selectors.c:86
lxb_css_selectors_t * lxb_css_selectors_destroy(lxb_css_selectors_t *selectors, bool self_destroy)
Definition selectors.c:120
lxb_css_selector_list_t * lxb_css_selectors_parse_compound(lxb_css_parser_t *parser, const lxb_char_t *data, size_t length)
Definition selectors.c:321
lxb_css_selector_list_t * lxb_css_selectors_parse_simple(lxb_css_parser_t *parser, const lxb_char_t *data, size_t length)
Definition selectors.c:329
lxb_css_selector_list_t * lxb_css_selectors_parse_complex(lxb_css_parser_t *parser, const lxb_char_t *data, size_t length)
Definition selectors.c:313
lxb_css_selector_list_t * lxb_css_selectors_parse_relative(lxb_css_parser_t *parser, const lxb_char_t *data, size_t length)
Definition selectors.c:337
lxb_css_selectors_t * lxb_css_selectors_create(void)
Definition selectors.c:80
void lxb_css_selectors_clean(lxb_css_selectors_t *selectors)
Definition selectors.c:105
lxb_css_selector_list_t * lxb_css_selectors_parse(lxb_css_parser_t *parser, const lxb_char_t *data, size_t length)
Definition selectors.c:134
lxb_css_selector_list_t * lxb_css_selectors_parse_relative_list(lxb_css_parser_t *parser, const lxb_char_t *data, size_t length)
Definition selectors.c:165
lxb_css_selector_list_t * lxb_css_selectors_parse_complex_list(lxb_css_parser_t *parser, const lxb_char_t *data, size_t length)
Definition selectors.c:141
lxb_css_selector_list_t * lxb_css_selectors_parse_compound_list(lxb_css_parser_t *parser, const lxb_char_t *data, size_t length)
Definition selectors.c:149
bool lxb_css_selectors_state_compound(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
Definition state.c:616
bool lxb_css_selectors_state_compound_list(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
Definition state.c:585
bool lxb_css_selectors_state_simple(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
Definition state.c:927
bool lxb_css_selectors_state_relative_list(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
Definition state.c:313
bool lxb_css_selectors_state_complex(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
Definition state.c:453
bool lxb_css_selectors_state_relative(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
Definition state.c:343
bool lxb_css_selectors_state_complex_list(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
Definition state.c:283
bool lxb_css_selectors_state_simple_list(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
Definition state.c:898
bool lxb_css_state_failed(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
Definition state.c:32
lxb_css_syntax_rule_t * lxb_css_syntax_parser_components_push(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, lxb_css_parser_state_f state_back, const lxb_css_syntax_cb_components_t *comp, void *ctx, lxb_css_syntax_token_type_t stop)
Definition parser.c:390
lxb_status_t lxb_css_syntax_parser_run(lxb_css_parser_t *parser)
Definition parser.c:116
@ LXB_CSS_SYNTAX_TOKEN_UNDEF
Definition token.h:69
#define NULL
Definition gdcache.h:45
LXB_API void * lexbor_free(void *dst)
Definition memory.c:33
LXB_API void * lexbor_calloc(size_t num, size_t size)
Definition memory.c:27
unsigned const char * end
Definition php_ffi.h:51
zend_constant * data
void lxb_css_selector_list_destroy(lxb_css_selector_list_t *list)
Definition selector.c:211
void lxb_css_selector_list_selectors_remove(lxb_css_selectors_t *selectors, lxb_css_selector_list_t *list)
Definition selector.c:196
@ LXB_CSS_SELECTOR_COMBINATOR_DESCENDANT
Definition selector.h:35
lxb_css_memory_t * old_memory
Definition parser.h:142
lxb_status_t status
Definition parser.h:177
lxb_css_memory_t * memory
Definition parser.h:141
lxb_css_selectors_t * old_selectors
Definition parser.h:138
lxb_css_parser_stage_t stage
Definition parser.h:170
lxb_css_syntax_tokenizer_t * tkz
Definition parser.h:136
lxb_css_selectors_t * selectors
Definition parser.h:137
lxb_css_selector_list_t * list_last
Definition selectors.h:25
lxb_css_selector_combinator_t combinator
Definition selectors.h:29
uintptr_t error
Definition selectors.h:32
lxb_css_selector_list_t * list
Definition selectors.h:24
lxb_css_selector_t * parent
Definition selectors.h:27
lxb_css_selector_combinator_t comb_default
Definition selectors.h:30
lxb_css_syntax_cb_base_t lxb_css_syntax_cb_components_t
Definition syntax.h:78
struct lxb_css_syntax_rule lxb_css_syntax_rule_t
Definition syntax.h:17
unsigned int lxb_status_t
Definition types.h:28
unsigned char lxb_char_t
Definition types.h:27
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)