php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
parser.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2021 Alexander Borisov
3 *
4 * Author: Alexander Borisov <borisov@lexbor.com>
5 */
6
7#include "lexbor/css/parser.h"
8#include "lexbor/css/state.h"
10
11
14{
15 return lexbor_calloc(1, sizeof(lxb_css_parser_t));
16}
17
20{
22 static const size_t lxb_rules_length = 128;
23 static const size_t lxb_states_length = 1024;
24
25 if (parser == NULL) {
27 }
28
29 /* Stack */
31 * lxb_states_length);
32 if (parser->states_begin == NULL) {
34 }
35
36 parser->states = parser->states_begin;
37 parser->states_end = parser->states_begin + lxb_states_length;
38
39 memset(parser->states, 0x00, sizeof(lxb_css_parser_state_t));
40 parser->states->root = true;
41
42 /* Syntax */
43 parser->my_tkz = false;
44
45 if (tkz == NULL) {
48 if (status != LXB_STATUS_OK) {
49 return status;
50 }
51
52 parser->my_tkz = true;
53 }
54
55 /* Rules */
57 * lxb_rules_length);
58 if (parser->rules_begin == NULL) {
60 }
61
62 parser->rules_end = parser->rules_begin + lxb_rules_length;
63 parser->rules = parser->rules_begin;
64
65 /*
66 * Zero those parameters that can be used (passed to the function).
67 * The parser->rules->phase parameter will be assigned at the end of the
68 * parsing.
69 *
70 * The point is that parser->rules[0] is used as a stub before exiting
71 * parsing.
72 */
73 parser->rules->context = NULL;
74
75 /* Temp */
76 parser->pos = NULL;
77 parser->str.length = 0;
78 parser->str_size = 4096;
79
80 parser->str.data = lexbor_malloc(sizeof(lxb_char_t) * parser->str_size);
81 if (parser->str.data == NULL) {
83 }
84
85 parser->log = lxb_css_log_create();
86 status = lxb_css_log_init(parser->log, NULL);
87 if (status != LXB_STATUS_OK) {
88 return status;
89 }
90
91 parser->tkz = tkz;
92 parser->types_begin = NULL;
93 parser->types_pos = NULL;
94 parser->types_end = NULL;
96 parser->receive_endings = false;
97 parser->status = LXB_STATUS_OK;
98 parser->fake_null = false;
99
100 return LXB_STATUS_OK;
101}
102
103void
105{
107 lxb_css_log_clean(parser->log);
108
109 parser->rules = parser->rules_begin;
110 parser->states = parser->states_begin;
111 parser->types_pos = parser->types_begin;
112 parser->stage = LXB_CSS_PARSER_CLEAN;
113 parser->status = LXB_STATUS_OK;
114 parser->pos = NULL;
115 parser->str.length = 0;
116 parser->fake_null = false;
117}
118
119void
121{
122 lxb_css_parser_clean(parser);
123
124 if (parser->memory != NULL) {
126 }
127}
128
130lxb_css_parser_destroy(lxb_css_parser_t *parser, bool self_destroy)
131{
132 if (parser == NULL) {
133 return NULL;
134 }
135
136 if (parser->my_tkz) {
137 parser->tkz = lxb_css_syntax_tokenizer_destroy(parser->tkz);
138 }
139
140 parser->log = lxb_css_log_destroy(parser->log, true);
141
142 if (parser->rules_begin != NULL) {
143 parser->rules_begin = lexbor_free(parser->rules_begin);
144 }
145
146 if (parser->states_begin != NULL) {
147 parser->states_begin = lexbor_free(parser->states_begin);
148 }
149
150 if (parser->types_begin != NULL) {
151 parser->types_begin = lexbor_free(parser->types_begin);
152 }
153
154 if (parser->str.data != NULL) {
155 parser->str.data = lexbor_free(parser->str.data);
156 }
157
158 if (self_destroy) {
159 return lexbor_free(parser);
160 }
161
162 return parser;
163}
164
167 lxb_css_parser_state_f state, void *ctx, bool root)
168{
169 size_t length, cur_length;
170 lxb_css_parser_state_t *states = ++parser->states;
171
172 if (states >= parser->states_end) {
173 cur_length = states - parser->states_begin;
174
175 if (SIZE_MAX - cur_length < 1024) {
176 goto memory_error;
177 }
178
179 length = cur_length + 1024;
180
181 states = lexbor_realloc(parser->states_begin,
182 length * sizeof(lxb_css_parser_state_t));
183 if (states == NULL) {
184 goto memory_error;
185 }
186
187 parser->states_begin = states;
188 parser->states_end = states + length;
189 parser->states = states + cur_length;
190
191 states = parser->states;
192 }
193
194 states->state = state;
195 states->context = ctx;
196 states->root = root;
197
198 return states;
199
200memory_error:
201
203
204 return NULL;
205}
206
210 lxb_css_parser_state_f back, void *ctx, bool root)
211{
213
214 state = lxb_css_parser_states_push(parser, back, ctx, root);
215 if (state == NULL) {
216 return NULL;
217 }
218
219 parser->rules->state = next;
220
221 return state;
222}
223
227{
228 size_t length, new_length;
230
231 if (parser->types_pos >= parser->types_end) {
232 length = parser->types_end - parser->types_begin;
233
234 if ((SIZE_MAX - length) < 1024) {
236 }
237
238 new_length = length + 1024;
239
240 tmp = lexbor_realloc(parser->types_begin,
241 new_length * sizeof(lxb_css_syntax_token_type_t));
242 if (tmp == NULL) {
244 }
245
246 parser->types_begin = tmp;
247 parser->types_end = tmp + new_length;
248 parser->types_pos = parser->types_begin + length;
249 }
250
251 *parser->types_pos++ = type;
252
253 return LXB_STATUS_OK;
254}
255
256bool
258{
259 parser->loop = false;
260 return true;
261}
262
263bool
265{
266 parser->status = status;
267 parser->loop = false;
268 return true;
269}
270
271bool
273{
275 return true;
276}
277
278bool
280{
282 return true;
283}
284
285bool
287{
288 lxb_css_syntax_rule_t *rule = parser->rules;
289
290 rule->state = rule->cbx.cb->failed;
291 rule->failed = true;
292
293 return true;
294}
295
305
306bool
308 const lxb_css_syntax_token_t *token)
309{
310 static const char selectors[] = "Selectors";
312
313 if (lxb_css_syntax_token_error(parser, token, selectors) == NULL) {
314 return lxb_css_parser_memory_fail(parser);
315 }
316
317 return true;
318}
319
322 const lxb_css_syntax_token_t *token)
323{
324 static const char selectors[] = "Selectors";
326
327 if (lxb_css_syntax_token_error(parser, token, selectors) == NULL) {
329 }
330
332}
333
334bool
336{
338 parser->loop = false;
339 return true;
340}
341
@ LXB_STATUS_ERROR_MEMORY_ALLOCATION
Definition base.h:51
@ LXB_STATUS_ERROR_OBJECT_IS_NULL
Definition base.h:52
@ LXB_STATUS_OK
Definition base.h:49
@ LXB_STATUS_ERROR_OVERFLOW
Definition base.h:62
@ 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_syntax_tokenizer lxb_css_syntax_tokenizer_t
Definition base.h:45
LXB_API void lxb_css_memory_clean(lxb_css_memory_t *memory)
Definition css.c:81
struct lxb_css_parser lxb_css_parser_t
Definition base.h:41
lxb_status_t lxb_css_parser_memory_fail_status(lxb_css_parser_t *parser)
Definition parser.c:343
bool lxb_css_parser_stop(lxb_css_parser_t *parser)
Definition parser.c:257
lxb_css_parser_t * lxb_css_parser_create(void)
Definition parser.c:13
lxb_status_t lxb_css_parser_types_push(lxb_css_parser_t *parser, lxb_css_syntax_token_type_t type)
Definition parser.c:225
bool lxb_css_parser_unexpected(lxb_css_parser_t *parser)
Definition parser.c:272
bool lxb_css_parser_success(lxb_css_parser_t *parser)
Definition parser.c:279
void lxb_css_parser_clean(lxb_css_parser_t *parser)
Definition parser.c:104
lxb_css_parser_state_t * lxb_css_parser_states_push(lxb_css_parser_t *parser, lxb_css_parser_state_f state, void *ctx, bool root)
Definition parser.c:166
lxb_status_t lxb_css_parser_unexpected_status(lxb_css_parser_t *parser)
Definition parser.c:297
bool lxb_css_parser_fail(lxb_css_parser_t *parser, lxb_status_t status)
Definition parser.c:264
void lxb_css_parser_erase(lxb_css_parser_t *parser)
Definition parser.c:120
bool lxb_css_parser_memory_fail(lxb_css_parser_t *parser)
Definition parser.c:335
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_css_parser_t * lxb_css_parser_destroy(lxb_css_parser_t *parser, bool self_destroy)
Definition parser.c:130
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
bool lxb_css_parser_unexpected_data(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token)
Definition parser.c:307
lxb_status_t lxb_css_parser_init(lxb_css_parser_t *parser, lxb_css_syntax_tokenizer_t *tkz)
Definition parser.c:19
bool lxb_css_parser_failed(lxb_css_parser_t *parser)
Definition parser.c:286
@ LXB_CSS_PARSER_CLEAN
Definition parser.h:124
bool lxb_css_state_success(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
Definition state.c:13
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
lxb_css_syntax_token_type_t
Definition token.h:68
DNS_STATUS status
Definition dns_win32.c:49
lxb_css_syntax_tokenizer_t * lxb_css_syntax_tokenizer_create(void)
Definition tokenizer.c:65
lxb_css_syntax_tokenizer_t * lxb_css_syntax_tokenizer_destroy(lxb_css_syntax_tokenizer_t *tkz)
Definition tokenizer.c:157
lxb_status_t lxb_css_syntax_tokenizer_init(lxb_css_syntax_tokenizer_t *tkz)
Definition tokenizer.c:71
lxb_status_t lxb_css_syntax_tokenizer_clean(lxb_css_syntax_tokenizer_t *tkz)
Definition tokenizer.c:136
zend_ffi_type * type
Definition ffi.c:3812
memset(ptr, 0, type->size)
#define SIZE_MAX
Definition funcs.c:51
#define NULL
Definition gdcache.h:45
LXB_API void * lexbor_realloc(void *dst, size_t size)
Definition memory.c:21
LXB_API void * lexbor_free(void *dst)
Definition memory.c:33
LXB_API void * lexbor_malloc(size_t size)
Definition memory.c:15
LXB_API void * lexbor_calloc(size_t num, size_t size)
Definition memory.c:27
lxb_css_log_t * lxb_css_log_destroy(lxb_css_log_t *log, bool self_destroy)
Definition log.c:74
void lxb_css_log_clean(lxb_css_log_t *log)
Definition log.c:62
lxb_status_t lxb_css_log_init(lxb_css_log_t *log, lexbor_mraw_t *mraw)
Definition log.c:34
lxb_css_log_t * lxb_css_log_create(void)
Definition log.c:28
#define next(ls)
Definition minilua.c:2661
lxb_char_t * data
Definition str.h:47
size_t length
Definition str.h:48
lxb_css_parser_state_f state
Definition parser.h:181
lxb_css_parser_state_t * states
Definition parser.h:152
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_log_t * log
Definition parser.h:168
lxb_css_syntax_token_type_t * types_pos
Definition parser.h:157
lxb_status_t status
Definition parser.h:177
lxb_css_memory_t * memory
Definition parser.h:141
lxb_css_syntax_rule_t * rules_end
Definition parser.h:146
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
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
bool fake_null
Definition parser.h:173
lxb_css_syntax_rule_t * rules_begin
Definition parser.h:145
lxb_css_parser_state_f failed
Definition syntax.h:70
const lxb_css_syntax_cb_base_t * cb
Definition syntax.h:104
lxb_css_parser_state_f state
Definition syntax.h:99
union lxb_css_syntax_rule::@073363174301106057201275360263214332217111046371 cbx
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)