php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
pseudo_state.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/css/css.h"
10
11
12static bool
13lxb_css_selectors_state_pseudo_anb(lxb_css_parser_t *parser,
14 const lxb_css_syntax_token_t *token, void *ctx);
15
16static bool
17lxb_css_selectors_state_pseudo_of_begin(lxb_css_parser_t *parser,
18 const lxb_css_syntax_token_t *token, void *ctx);
19
20static lxb_status_t
21lxb_css_selectors_state_pseudo_of_end(lxb_css_parser_t *parser,
22 const lxb_css_syntax_token_t *token,
23 void *ctx, bool failed);
24static bool
25lxb_css_selectors_state_pseudo_of_back(lxb_css_parser_t *parser,
26 const lxb_css_syntax_token_t *token, void *ctx);
27
28
29static const lxb_css_syntax_cb_components_t lxb_css_selectors_comp = {
31 .block = NULL,
32 .failed = lxb_css_state_failed,
33 .end = lxb_css_selectors_state_pseudo_of_end
34};
35
36
37lxb_inline bool
39 const lxb_css_syntax_token_t *token, void *ctx)
40{
41 (void) lxb_css_selectors_state_pseudo_anb(parser, token, ctx);
42 if (parser->status != LXB_STATUS_OK) {
43 parser->selectors->list = NULL;
44 parser->selectors->list_last = NULL;
45
46 return lxb_css_parser_failed(parser);
47 }
48
49 parser->selectors->list = NULL;
50
51 return lxb_css_parser_success(parser);
52}
53
54
55bool
61
62bool
73
74bool
80
81bool
92
93bool
104
105bool
111
112bool
114 const lxb_css_syntax_token_t *token, void *ctx)
115{
117
118 parser->selectors->list = NULL;
119 parser->selectors->list_last = NULL;
120
121 return true;
122}
123
124bool
126 const lxb_css_syntax_token_t *token, void *ctx)
127{
128 return lxb_css_selectors_state_pseudo_of_begin(parser, token, ctx);
129}
130
131bool
137
138bool
140 const lxb_css_syntax_token_t *token, void *ctx)
141{
142 return lxb_css_selectors_state_pseudo_of_begin(parser, token, ctx);
143}
144
145bool
151
152bool
158
159bool
165
166bool
168 const lxb_css_syntax_token_t *token, void *ctx)
169{
171
172 parser->selectors->list = NULL;
173 parser->selectors->list_last = NULL;
174
175 return true;
176}
177
178bool
180 const lxb_css_syntax_token_t *token, void *ctx)
181{
182 return true;
183}
184
185static bool
186lxb_css_selectors_state_pseudo_anb(lxb_css_parser_t *parser,
187 const lxb_css_syntax_token_t *token,
188 void *ctx)
189{
190 lxb_css_selectors_t *selectors;
193
194 selectors = parser->selectors;
195
196 anbof = lexbor_mraw_alloc(parser->memory->mraw,
198 if (anbof == NULL) {
199 return lxb_css_parser_memory_fail(parser);
200 }
201
202 parser->status = lxb_css_syntax_anb_handler(parser, token, &anbof->anb);
203 if (parser->status != LXB_STATUS_OK) {
204 lexbor_mraw_free(parser->memory->mraw, anbof);
205 return true;
206 }
207
208 list = selectors->list_last;
209 list->last->u.pseudo.data = anbof;
210
211 anbof->of = NULL;
212
213 return true;
214}
215
216static bool
217lxb_css_selectors_state_pseudo_of_begin(lxb_css_parser_t *parser,
218 const lxb_css_syntax_token_t *token,
219 void *ctx)
220{
222 lxb_css_selectors_t *selectors;
225
226 static const lxb_char_t of[] = "of";
227
228 selectors = parser->selectors;
229
230 (void) lxb_css_selectors_state_pseudo_anb(parser, token, ctx);
231 if (parser->status != LXB_STATUS_OK) {
232 selectors->list = NULL;
233 selectors->list_last = NULL;
234
235 token = lxb_css_syntax_parser_token(parser);
236 if (token == NULL) {
237 return lxb_css_parser_memory_fail(parser);
238 }
239
240 if (token->type != LXB_CSS_SYNTAX_TOKEN__END) {
241 if (lxb_css_syntax_token_error(parser, token, "Selectors") == NULL) {
242 return lxb_css_parser_memory_fail(parser);
243 }
244 }
245
246 return lxb_css_parser_failed(parser);
247 }
248
249 list = selectors->list_last;
250
251 selectors->list = NULL;
252
253 lxb_css_parser_token_wo_ws_m(parser, token);
254
255 if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) {
256 ident = lxb_css_syntax_token_ident(token);
257
258 if (ident->length == sizeof(of) - 1
259 && lexbor_str_data_ncasecmp(ident->data, of, ident->length))
260 {
262
263 selectors->list = NULL;
264 selectors->list_last = NULL;
265
266 token = lxb_css_syntax_parser_token(parser);
267 if (token == NULL) {
268 return lxb_css_parser_memory_fail(parser);
269 }
270
271 rule = lxb_css_syntax_parser_components_push(parser, token,
272 lxb_css_selectors_state_pseudo_of_back,
273 &lxb_css_selectors_comp, list,
275 if (rule == NULL) {
277 list->last->u.pseudo.data);
278 return lxb_css_parser_memory_fail(parser);
279 }
280
283 return true;
284 }
285 }
286
287 return lxb_css_parser_success(parser);
288}
289
290static lxb_status_t
291lxb_css_selectors_state_pseudo_of_end(lxb_css_parser_t *parser,
292 const lxb_css_syntax_token_t *token,
293 void *ctx, bool failed)
294{
296 lxb_css_selector_list_t *list = ctx;
297
298 anbof = list->last->u.pseudo.data;
299 anbof->of = parser->selectors->list;
300
301 parser->selectors->list = NULL;
302
303 return LXB_STATUS_OK;
304}
305
306static bool
307lxb_css_selectors_state_pseudo_of_back(lxb_css_parser_t *parser,
308 const lxb_css_syntax_token_t *token, void *ctx)
309{
310 parser->selectors->list = NULL;
311
312 return lxb_css_parser_success(parser);
313}
lxb_status_t lxb_css_syntax_anb_handler(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, lxb_css_syntax_anb_t *anb)
Definition anb.c:129
@ LXB_STATUS_OK
Definition base.h:49
@ LXB_STATUS_ERROR_UNEXPECTED_DATA
Definition base.h:61
struct lxb_css_syntax_token lxb_css_syntax_token_t
Definition base.h:46
struct lxb_css_parser lxb_css_parser_t
Definition base.h:41
bool lxb_css_parser_success(lxb_css_parser_t *parser)
Definition parser.c:279
bool lxb_css_parser_fail(lxb_css_parser_t *parser, lxb_status_t status)
Definition parser.c:264
bool lxb_css_parser_memory_fail(lxb_css_parser_t *parser)
Definition parser.c:335
bool lxb_css_parser_failed(lxb_css_parser_t *parser)
Definition parser.c:286
#define lxb_css_parser_token_wo_ws_m(parser, token)
Definition parser.h:39
lxb_inline void lxb_css_parser_state_set(lxb_css_parser_t *parser, lxb_css_parser_state_f state)
Definition parser.h:351
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
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_list(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
Definition state.c:283
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
const lxb_css_syntax_token_t * lxb_css_syntax_parser_token(lxb_css_parser_t *parser)
Definition parser.c:142
lxb_css_log_message_t * lxb_css_syntax_token_error(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, const char *module_name)
Definition token.c:594
void lxb_css_syntax_token_consume(lxb_css_syntax_tokenizer_t *tkz)
Definition token.c:63
lxb_css_syntax_token_string_t lxb_css_syntax_token_ident_t
Definition token.h:145
#define lxb_css_syntax_token_ident(token)
Definition token.h:21
@ LXB_CSS_SYNTAX_TOKEN_IDENT
Definition token.h:72
@ LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS
Definition token.h:98
@ LXB_CSS_SYNTAX_TOKEN__END
Definition token.h:103
#define NULL
Definition gdcache.h:45
void * lexbor_mraw_free(lexbor_mraw_t *mraw, void *data)
Definition mraw.c:392
void * lexbor_mraw_alloc(lexbor_mraw_t *mraw, size_t size)
Definition mraw.c:180
bool lxb_css_selectors_state_pseudo_class_function__undef(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_pseudo_class_function_dir(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_pseudo_class_function_where(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_pseudo_class_function_lang(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_pseudo_class_function_nth_last_child(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_pseudo_class_function_nth_col(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_pseudo_class_function_nth_child(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_pseudo_element_function__undef(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_pseudo_class_function_has(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_pseudo_class_function_nth_last_col(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
lxb_inline bool lxb_css_selectors_state_pseudo_anb_begin(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_pseudo_class_function_nth_last_of_type(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_pseudo_class_function_nth_of_type(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_pseudo_class_function_not(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_pseudo_class_function_is(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_pseudo_class_function_current(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lexbor_str_data_ncasecmp(const lxb_char_t *first, const lxb_char_t *sec, size_t size)
Definition str.c:435
lexbor_mraw_t * mraw
Definition base.h:32
lxb_status_t status
Definition parser.h:177
lxb_css_memory_t * memory
Definition parser.h:141
lxb_css_syntax_tokenizer_t * tkz
Definition parser.h:136
lxb_css_selectors_t * selectors
Definition parser.h:137
lxb_css_selector_list_t * of
Definition selector.h:79
lxb_css_syntax_anb_t anb
Definition selector.h:78
lxb_css_selector_t * last
Definition selector.h:167
union lxb_css_selector::lxb_css_selector_u u
lxb_css_selector_list_t * list_last
Definition selectors.h:25
lxb_css_selector_list_t * list
Definition selectors.h:24
const lxb_char_t * data
Definition token.h:128
lxb_css_syntax_token_type_t type
Definition token.h:192
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
#define lxb_inline
Definition types.h:21
unsigned char lxb_char_t
Definition types.h:27
lxb_css_selector_pseudo_t pseudo
Definition selector.h:92
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)