xref: /php-src/ext/dom/lexbor/lexbor/css/syntax/syntax.h (revision f0934090)
1 /*
2  * Copyright (C) 2022 Alexander Borisov
3  *
4  * Author: Alexander Borisov <borisov@lexbor.com>
5  */
6 
7 #ifndef LEXBOR_CSS_SYNTAX_H
8 #define LEXBOR_CSS_SYNTAX_H
9 
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13 
14 #include "lexbor/css/syntax/tokenizer.h"
15 
16 
17 typedef struct lxb_css_syntax_rule lxb_css_syntax_rule_t;
18 
19 typedef const lxb_css_syntax_token_t *
20 (*lxb_css_syntax_state_f)(lxb_css_parser_t *parser,
21                           const lxb_css_syntax_token_t *token,
22                           lxb_css_syntax_rule_t *rule);
23 
24 typedef lxb_status_t
25 (*lxb_css_syntax_declaration_end_f)(lxb_css_parser_t *parser, void *ctx,
26                                     bool important, bool failed);
27 
28 typedef lxb_status_t
29 (*lxb_css_syntax_cb_done_f)(lxb_css_parser_t *parser,
30                             const lxb_css_syntax_token_t *token,
31                             void *ctx, bool failed);
32 
33 typedef struct {
34     uintptr_t begin;
35     uintptr_t end;
36 }
37 lxb_css_syntax_list_rules_offset_t;
38 
39 typedef struct {
40     uintptr_t name;
41     uintptr_t prelude;
42     uintptr_t prelude_end;
43     uintptr_t block;
44     uintptr_t block_end;
45 }
46 lxb_css_syntax_at_rule_offset_t;
47 
48 typedef struct {
49     uintptr_t prelude;
50     uintptr_t prelude_end;
51     uintptr_t block;
52     uintptr_t block_end;
53 }
54 lxb_css_syntax_qualified_offset_t;
55 
56 typedef struct {
57     uintptr_t begin;
58     uintptr_t end;
59     uintptr_t name_begin;
60     uintptr_t name_end;
61     uintptr_t value_begin;
62     uintptr_t before_important;
63     uintptr_t value_end;
64 }
65 lxb_css_syntax_declarations_offset_t;
66 
67 typedef struct {
68     lxb_css_parser_state_f   state;
69     lxb_css_parser_state_f   block;
70     lxb_css_parser_state_f   failed;
71     lxb_css_syntax_cb_done_f end;
72 }
73 lxb_css_syntax_cb_base_t;
74 
75 typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_pipe_t;
76 typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_block_t;
77 typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_function_t;
78 typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_components_t;
79 typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_at_rule_t;
80 typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_qualified_rule_t;
81 
82 typedef struct {
83     lxb_css_syntax_cb_base_t          cb;
84     lxb_css_syntax_declaration_end_f  declaration_end;
85     const lxb_css_syntax_cb_at_rule_t *at_rule;
86 }
87 lxb_css_syntax_cb_declarations_t;
88 
89 typedef struct {
90     lxb_css_syntax_cb_base_t                 cb;
91     lxb_css_parser_state_f                   next;
92     const lxb_css_syntax_cb_at_rule_t        *at_rule;
93     const lxb_css_syntax_cb_qualified_rule_t *qualified_rule;
94 }
95 lxb_css_syntax_cb_list_rules_t;
96 
97 struct lxb_css_syntax_rule {
98     lxb_css_syntax_state_f       phase;
99     lxb_css_parser_state_f       state;
100     lxb_css_parser_state_f       state_back;
101     lxb_css_syntax_state_f       back;
102 
103     union {
104         const lxb_css_syntax_cb_base_t           *cb;
105         const lxb_css_syntax_cb_list_rules_t     *list_rules;
106         const lxb_css_syntax_cb_at_rule_t        *at_rule;
107         const lxb_css_syntax_cb_qualified_rule_t *qualified_rule;
108         const lxb_css_syntax_cb_declarations_t   *declarations;
109         const lxb_css_syntax_cb_components_t     *components;
110         const lxb_css_syntax_cb_function_t       *func;
111         const lxb_css_syntax_cb_block_t          *block;
112         const lxb_css_syntax_cb_pipe_t           *pipe;
113         void                                     *user;
114     } cbx;
115 
116     void                        *context;
117 
118     uintptr_t                   offset;
119     size_t                      deep;
120     lxb_css_syntax_token_type_t block_end;
121     bool                        skip_ending;
122     bool                        skip_consume;
123     bool                        important;
124     bool                        failed;
125     bool                        top_level;
126 
127     union {
128         lxb_css_syntax_list_rules_offset_t   list_rules;
129         lxb_css_syntax_at_rule_offset_t      at_rule;
130         lxb_css_syntax_qualified_offset_t    qualified;
131         lxb_css_syntax_declarations_offset_t declarations;
132         void                                 *user;
133     } u;
134 };
135 
136 
137 LXB_API lxb_status_t
138 lxb_css_syntax_parse_list_rules(lxb_css_parser_t *parser,
139                                 const lxb_css_syntax_cb_list_rules_t *cb,
140                                 const lxb_char_t *data, size_t length,
141                                 void *ctx, bool top_level);
142 
143 LXB_API lxb_status_t
144 lxb_css_syntax_stack_expand(lxb_css_parser_t *parser, size_t count);
145 
146 LXB_API void
147 lxb_css_syntax_codepoint_to_ascii(lxb_css_syntax_tokenizer_t *tkz,
148                                   lxb_codepoint_t cp);
149 
150 LXB_API lxb_status_t
151 lxb_css_syntax_ident_serialize(const lxb_char_t *data, size_t length,
152                                lexbor_serialize_cb_f cb, void *ctx);
153 
154 LXB_API lxb_status_t
155 lxb_css_syntax_string_serialize(const lxb_char_t *data, size_t length,
156                                 lexbor_serialize_cb_f cb, void *ctx);
157 
158 LXB_API lxb_status_t
159 lxb_css_syntax_ident_or_string_serialize(const lxb_char_t *data, size_t length,
160                                          lexbor_serialize_cb_f cb, void *ctx);
161 
162 #ifdef __cplusplus
163 } /* extern "C" */
164 #endif
165 
166 #endif /* LEXBOR_CSS_SYNTAX_H */
167