php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
parser.h
Go to the documentation of this file.
1/*
2
3 * Copyright (C) 2021-2022 Alexander Borisov
4 *
5 * Author: Alexander Borisov <borisov@lexbor.com>
6 */
7
8#ifndef LEXBOR_CSS_PARSER_H
9#define LEXBOR_CSS_PARSER_H
10
11#ifdef __cplusplus
12extern "C" {
13#endif
14
15#include "lexbor/css/log.h"
19
20
21#define lxb_css_parser_token_m(parser, token) \
22 do { \
23 token = lxb_css_syntax_parser_token(parser); \
24 if (token == NULL) { \
25 return lxb_css_parser_fail((parser), (parser)->tkz->status); \
26 } \
27 } \
28 while (false)
29
30#define lxb_css_parser_token_next_m(parser, token) \
31 do { \
32 token = lxb_css_syntax_token_next((parser)->tkz); \
33 if (token == NULL) { \
34 return lxb_css_parser_fail((parser), (parser)->tkz->status); \
35 } \
36 } \
37 while (false)
38
39#define lxb_css_parser_token_wo_ws_m(parser, token) \
40 do { \
41 token = lxb_css_syntax_parser_token(parser); \
42 if (token == NULL) { \
43 return lxb_css_parser_fail((parser), (parser)->tkz->status); \
44 } \
45 \
46 if (token->type == LXB_CSS_SYNTAX_TOKEN_WHITESPACE) { \
47 lxb_css_syntax_parser_consume(parser); \
48 token = lxb_css_syntax_parser_token(parser); \
49 if (token == NULL) { \
50 return lxb_css_parser_fail((parser), (parser)->tkz->status); \
51 } \
52 } \
53 } \
54 while (false)
55
56#define lxb_css_parser_token_status_m(parser, token) \
57 do { \
58 if ((token = lxb_css_syntax_parser_token(parser)) == NULL) { \
59 return parser->tkz->status; \
60 } \
61 } \
62 while (false)
63
64#define lxb_css_parser_token_status_next_m(parser, token) \
65 do { \
66 token = lxb_css_syntax_token_next((parser)->tkz); \
67 if (token == NULL) { \
68 return parser->tkz->status; \
69 } \
70 } \
71 while (false)
72
73
74#define lxb_css_parser_token_status_wo_ws_m(parser, token) \
75 do { \
76 if ((token = lxb_css_syntax_parser_token(parser)) == NULL) { \
77 return parser->tkz->status; \
78 } \
79 \
80 if (token->type == LXB_CSS_SYNTAX_TOKEN_WHITESPACE) { \
81 lxb_css_syntax_parser_consume(parser); \
82 if ((token = lxb_css_syntax_parser_token(parser)) == NULL) { \
83 return parser->tkz->status; \
84 } \
85 } \
86 } \
87 while (false)
88
89#define lxb_css_parser_string_dup_m(parser, token, _str, mraw) \
90 do { \
91 if (lxb_css_syntax_token_string_dup(lxb_css_syntax_token_string(token),\
92 (_str), (mraw)) != LXB_STATUS_OK) \
93 { \
94 return lxb_css_parser_fail((parser), \
95 LXB_STATUS_ERROR_MEMORY_ALLOCATION); \
96 } \
97 } \
98 while (false)
99
100
101enum {
103 /* eof-in-at-rule */
105 /* eof-in-qualified-rule */
107 /* eof-in-simple-block */
109 /* eof-in-function */
111 /* eof-before-parse-rule */
113 /* unexpected-token-after-parse-rule */
115 /* eof-before-parse-component-value */
117 /* unexpected-token-after-parse-component-value */
119 /* unexpected-token-in-declaration */
121};
122
130
179
185
189
190
193
196
197LXB_API void
199
200LXB_API void
202
204lxb_css_parser_destroy(lxb_css_parser_t *parser, bool self_destroy);
205
209 void *context, bool stop);
210
214 lxb_css_parser_state_f back, void *ctx, bool root);
215
219
220LXB_API bool
222
223LXB_API bool
225
226LXB_API bool
228
229LXB_API bool
231
232LXB_API bool
234
237
238LXB_API bool
240 const lxb_css_syntax_token_t *token);
241
244 const lxb_css_syntax_token_t *token);
245
246LXB_API bool
248
251
252/*
253 * Inline functions
254 */
257{
258 return parser->status;
259}
260
263{
264 return parser->memory;
265}
266
267lxb_inline void
269{
270 parser->memory = memory;
271}
272
275{
276 return parser->selectors;
277}
278
279lxb_inline void
281 lxb_css_selectors_t *selectors)
282{
283 parser->selectors = selectors;
284}
285
286lxb_inline bool
288{
289 return parser->stage == LXB_CSS_PARSER_RUN;
290}
291
292lxb_inline bool
297
298lxb_inline void
300{
301 parser->rules->failed = is;
302}
303
304lxb_inline void
306{
307 lxb_css_syntax_rule_t *rules = parser->rules + idx;
308
309 if (rules > parser->rules_begin && rules < parser->rules_end) {
310 rules->failed = is;
311 }
312}
313
314lxb_inline bool
316{
317 return parser->rules->failed;
318}
319
320lxb_inline void
322{
323 parser->rules->failed = false;
324 parser->status = LXB_STATUS_OK;
325}
326
329{
330 if (length != NULL) {
331 *length = parser->tkz->in_end - parser->tkz->in_begin;
332 }
333
334 return parser->tkz->in_begin;
335}
336
337lxb_inline void
339 const lxb_char_t *data, size_t length)
340{
342}
343
346{
347 return parser->rules->state;
348}
349
350lxb_inline void
355
356lxb_inline void
362
363lxb_inline void
369
370lxb_inline void *
372{
373 return parser->context;
374}
375
376lxb_inline void
378{
379 parser->context = context;
380}
381
384{
385 return parser->rules;
386}
387
388lxb_inline size_t
390{
391 return parser->rules->deep;
392}
393
396{
397 return parser->states--;
398}
399
402{
403 lxb_css_parser_state_t *entry = parser->states;
404
405 while (!entry->root) {
406 entry--;
407 }
408
409 parser->states = entry;
410
411 return entry;
412}
413
414lxb_inline bool
416{
417 const lxb_css_parser_state_t *entry = parser->states;
418 lxb_css_syntax_rule_t *rules = parser->rules;
419
420 rules->state = entry->state;
421 rules->context = entry->context;
422
423 return true;
424}
425
426lxb_inline void
432
433lxb_inline void
435{
436 parser->states = parser->states_begin;
437}
438
441{
442 return parser->states;
443}
444
445lxb_inline void
452
453lxb_inline void
455{
456 parser->states++;
457}
458
459lxb_inline void
461{
462 parser->states--;
463}
464
467{
468 return parser->log;
469}
470
471lxb_inline void
473 const lxb_css_syntax_token_t *token)
474{
475 if (parser->pos == NULL) {
476 if (token == NULL) {
477 parser->pos = parser->tkz->in_begin;
478 parser->offset = 0;
479 }
480 else {
481 parser->pos = lxb_css_syntax_token_base(token)->begin
482 + lxb_css_syntax_token_base(token)->length;
483 parser->offset = token->offset + lxb_css_syntax_token_base(token)->length;
484 }
485 }
486}
487
490{
491 return &parser->rules->u.list_rules;
492}
493
496{
497 return &parser->rules->u.at_rule;
498}
499
505
511
512
513#ifdef __cplusplus
514} /* extern "C" */
515#endif
516
517#endif /* LEXBOR_CSS_PARSER_H */
@ LXB_STATUS_OK
Definition base.h:49
@ LXB_STATUS_ERROR_UNEXPECTED_DATA
Definition base.h:61
struct lxb_css_parser_state lxb_css_parser_state_t
Definition base.h:42
struct lxb_css_syntax_token lxb_css_syntax_token_t
Definition base.h:46
bool(* lxb_css_parser_state_f)(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
Definition base.h:49
struct lxb_css_memory lxb_css_memory_t
struct lxb_css_syntax_tokenizer lxb_css_syntax_tokenizer_t
Definition base.h:45
struct lxb_css_parser lxb_css_parser_t
Definition base.h:41
lxb_inline void lxb_css_parser_memory_set(lxb_css_parser_t *parser, lxb_css_memory_t *memory)
Definition parser.h:268
lxb_css_parser_stage_t
Definition parser.h:123
@ 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_CSS_PARSER_STOP
Definition parser.h:126
lxb_inline lxb_css_memory_t * lxb_css_parser_memory(lxb_css_parser_t *parser)
Definition parser.h:262
lxb_inline bool lxb_css_parser_status_is_unexpected_data(lxb_css_parser_t *parser)
Definition parser.h:293
lxb_status_t lxb_css_parser_memory_fail_status(lxb_css_parser_t *parser)
Definition parser.c:343
lxb_inline void lxb_css_parser_set_ok(lxb_css_parser_t *parser)
Definition parser.h:321
lxb_inline lxb_css_selectors_t * lxb_css_parser_selectors(lxb_css_parser_t *parser)
Definition parser.h:274
lxb_inline lxb_status_t lxb_css_parser_status(lxb_css_parser_t *parser)
Definition parser.h:256
LXB_API void lxb_css_parser_erase(lxb_css_parser_t *parser)
Definition parser.c:120
LXB_API lxb_css_parser_state_t * lxb_css_parser_states_push(lxb_css_parser_t *parser, lxb_css_parser_state_f state, void *context, bool stop)
Definition parser.c:166
LXB_API lxb_status_t lxb_css_parser_types_push(lxb_css_parser_t *parser, lxb_css_syntax_token_type_t type)
Definition parser.c:225
LXB_API bool lxb_css_parser_fail(lxb_css_parser_t *parser, lxb_status_t status)
Definition parser.c:264
lxb_inline void lxb_css_parser_failed_set(lxb_css_parser_t *parser, bool is)
Definition parser.h:299
lxb_inline void lxb_css_parser_states_down(lxb_css_parser_t *parser)
Definition parser.h:460
lxb_inline const lxb_css_syntax_at_rule_offset_t * lxb_css_parser_at_rule_offset(lxb_css_parser_t *parser)
Definition parser.h:495
@ LXB_CSS_SYNTAX_PARSER_ERROR_EOINFU
Definition parser.h:110
@ LXB_CSS_SYNTAX_PARSER_ERROR_EOINSIBL
Definition parser.h:108
@ LXB_CSS_SYNTAX_PARSER_ERROR_UNDEF
Definition parser.h:102
@ LXB_CSS_SYNTAX_PARSER_ERROR_UNTOINDE
Definition parser.h:120
@ LXB_CSS_SYNTAX_PARSER_ERROR_UNTOAFPACOVA
Definition parser.h:118
@ LXB_CSS_SYNTAX_PARSER_ERROR_UNTOAFPARU
Definition parser.h:114
@ LXB_CSS_SYNTAX_PARSER_ERROR_EOINQURU
Definition parser.h:106
@ LXB_CSS_SYNTAX_PARSER_ERROR_EOINATRU
Definition parser.h:104
@ LXB_CSS_SYNTAX_PARSER_ERROR_EOBEPACOVA
Definition parser.h:116
@ LXB_CSS_SYNTAX_PARSER_ERROR_EOBEPARU
Definition parser.h:112
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
LXB_API bool lxb_css_parser_success(lxb_css_parser_t *parser)
Definition parser.c:279
lxb_inline void lxb_css_parser_state_value_set(lxb_css_parser_t *parser, lxb_css_parser_state_f state)
Definition parser.h:364
lxb_inline bool lxb_css_parser_is_running(lxb_css_parser_t *parser)
Definition parser.h:287
lxb_inline const lxb_char_t * lxb_css_parser_buffer(lxb_css_parser_t *parser, size_t *length)
Definition parser.h:328
LXB_API bool lxb_css_parser_stop(lxb_css_parser_t *parser)
Definition parser.c:257
LXB_API bool lxb_css_parser_failed(lxb_css_parser_t *parser)
Definition parser.c:286
LXB_API void lxb_css_parser_clean(lxb_css_parser_t *parser)
Definition parser.c:104
lxb_inline const lxb_css_syntax_qualified_offset_t * lxb_css_parser_qualified_rule_offset(lxb_css_parser_t *parser)
Definition parser.h:501
lxb_inline lxb_css_parser_state_t * lxb_css_parser_states_to_root(lxb_css_parser_t *parser)
Definition parser.h:401
lxb_inline lxb_css_parser_state_f lxb_css_parser_state(lxb_css_parser_t *parser)
Definition parser.h:345
lxb_inline void * lxb_css_parser_context(lxb_css_parser_t *parser)
Definition parser.h:371
LXB_API lxb_status_t lxb_css_parser_init(lxb_css_parser_t *parser, lxb_css_syntax_tokenizer_t *tkz)
Definition parser.c:19
lxb_inline void lxb_css_parser_state_block_set(lxb_css_parser_t *parser, lxb_css_parser_state_f state)
Definition parser.h:357
lxb_inline size_t lxb_css_parser_rule_deep(lxb_css_parser_t *parser)
Definition parser.h:389
LXB_API lxb_css_parser_t * lxb_css_parser_destroy(lxb_css_parser_t *parser, bool self_destroy)
Definition parser.c:130
lxb_inline void lxb_css_parser_context_set(lxb_css_parser_t *parser, void *context)
Definition parser.h:377
LXB_API lxb_status_t lxb_css_parser_unexpected_status(lxb_css_parser_t *parser)
Definition parser.c:297
lxb_inline lxb_css_syntax_rule_t * lxb_css_parser_current_rule(lxb_css_parser_t *parser)
Definition parser.h:383
lxb_inline bool lxb_css_parser_states_set_back(lxb_css_parser_t *parser)
Definition parser.h:415
lxb_inline lxb_css_parser_state_t * lxb_css_parser_states_current(lxb_css_parser_t *parser)
Definition parser.h:440
lxb_inline void lxb_css_parser_states_set(lxb_css_parser_state_t *states, lxb_css_parser_state_f state, void *context)
Definition parser.h:446
LXB_API lxb_css_parser_t * lxb_css_parser_create(void)
Definition parser.c:13
lxb_inline void lxb_css_parser_offset_set(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token)
Definition parser.h:472
lxb_inline void lxb_css_parser_state_set(lxb_css_parser_t *parser, lxb_css_parser_state_f state)
Definition parser.h:351
lxb_inline const lxb_css_syntax_declarations_offset_t * lxb_css_parser_declarations_offset(lxb_css_parser_t *parser)
Definition parser.h:507
lxb_inline const lxb_css_syntax_list_rules_offset_t * lxb_css_parser_list_rules_offset(lxb_css_parser_t *parser)
Definition parser.h:489
LXB_API bool lxb_css_parser_memory_fail(lxb_css_parser_t *parser)
Definition parser.c:335
lxb_inline void lxb_css_parser_states_clean(lxb_css_parser_t *parser)
Definition parser.h:434
lxb_inline void lxb_css_parser_failed_set_by_id(lxb_css_parser_t *parser, int idx, bool is)
Definition parser.h:305
LXB_API bool lxb_css_parser_unexpected(lxb_css_parser_t *parser)
Definition parser.c:272
lxb_inline lxb_css_parser_state_t * lxb_css_parser_states_pop(lxb_css_parser_t *parser)
Definition parser.h:395
LXB_API lxb_css_parser_state_t * lxb_css_parser_states_next(lxb_css_parser_t *parser, lxb_css_parser_state_f next, lxb_css_parser_state_f back, void *ctx, bool root)
Definition parser.c:208
lxb_inline bool lxb_css_parser_is_failed(lxb_css_parser_t *parser)
Definition parser.h:315
LXB_API lxb_status_t lxb_css_parser_unexpected_data_status(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token)
Definition parser.c:321
lxb_inline lxb_css_log_t * lxb_css_parser_log(lxb_css_parser_t *parser)
Definition parser.h:466
lxb_inline void lxb_css_parser_selectors_set(lxb_css_parser_t *parser, lxb_css_selectors_t *selectors)
Definition parser.h:280
LXB_API bool lxb_css_parser_unexpected_data(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token)
Definition parser.c:307
lxb_inline void lxb_css_parser_states_up(lxb_css_parser_t *parser)
Definition parser.h:454
lxb_inline void lxb_css_parser_states_change_back(lxb_css_parser_t *parser, lxb_css_parser_state_f state)
Definition parser.h:427
struct lxb_css_selectors lxb_css_selectors_t
Definition base.h:38
#define lxb_css_syntax_token_base(token)
Definition token.h:20
lxb_css_syntax_token_type_t
Definition token.h:68
lxb_status_t(* lxb_css_syntax_tokenizer_chunk_f)(lxb_css_syntax_tokenizer_t *tkz, const lxb_char_t **data, const lxb_char_t **end, void *ctx)
Definition tokenizer.h:27
lxb_inline void lxb_css_syntax_tokenizer_buffer_set(lxb_css_syntax_tokenizer_t *tkz, const lxb_char_t *data, size_t size)
Definition tokenizer.h:125
#define LXB_API
Definition def.h:48
DNS_STATUS status
Definition dns_win32.c:49
zend_ffi_type * type
Definition ffi.c:3812
#define NULL
Definition gdcache.h:45
#define next(ls)
Definition minilua.c:2661
zend_constant * data
Definition dce.c:49
lexbor_str_t message
Definition parser.h:187
lxb_css_parser_state_f state
Definition parser.h:181
lxb_css_parser_state_t * states
Definition parser.h:152
lxb_css_parser_state_f block
Definition parser.h:132
lxb_css_syntax_token_type_t * types_begin
Definition parser.h:155
lxb_css_syntax_token_type_t * types_end
Definition parser.h:156
size_t str_size
Definition parser.h:166
lxb_css_memory_t * old_memory
Definition parser.h:142
lxb_css_log_t * log
Definition parser.h:168
void * chunk_ctx
Definition parser.h:160
lxb_css_syntax_token_type_t * types_pos
Definition parser.h:157
lxb_status_t status
Definition parser.h:177
uintptr_t offset
Definition parser.h:163
lxb_css_memory_t * memory
Definition parser.h:141
lxb_css_selectors_t * old_selectors
Definition parser.h:138
lxb_css_syntax_rule_t * rules_end
Definition parser.h:146
void * context
Definition parser.h:133
bool receive_endings
Definition parser.h:175
lxb_css_syntax_rule_t * rules
Definition parser.h:147
lxb_css_parser_stage_t stage
Definition parser.h:170
lxb_css_syntax_tokenizer_chunk_f chunk_cb
Definition parser.h:159
const lxb_char_t * pos
Definition parser.h:162
lxb_css_parser_state_t * states_begin
Definition parser.h:150
lxb_css_parser_state_t * states_end
Definition parser.h:151
lexbor_str_t str
Definition parser.h:165
lxb_css_syntax_tokenizer_t * tkz
Definition parser.h:136
lxb_css_selectors_t * selectors
Definition parser.h:137
bool fake_null
Definition parser.h:173
lxb_css_syntax_rule_t * rules_begin
Definition parser.h:145
const lxb_css_syntax_cb_list_rules_t * list_rules
Definition syntax.h:105
lxb_css_parser_state_f state_back
Definition syntax.h:100
const lxb_css_syntax_cb_at_rule_t * at_rule
Definition syntax.h:106
union lxb_css_syntax_rule::@203345256314064163344113041244217160314313024330 u
const lxb_css_syntax_cb_declarations_t * declarations
Definition syntax.h:108
lxb_css_parser_state_f state
Definition syntax.h:99
lxb_css_syntax_qualified_offset_t qualified
Definition syntax.h:130
uintptr_t offset
Definition token.h:193
const lxb_char_t * in_begin
Definition tokenizer.h:49
const lxb_char_t * in_end
Definition tokenizer.h:50
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