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