17#define LXB_CSS_SYNTAX_RES_NAME_MAP
20#define LEXBOR_STR_RES_MAP_HEX
21#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER
25#define LXB_CSS_SYNTAX_NEXT_CHUNK(_tkz, _status, _data, _end) \
27 _status = lxb_css_syntax_tokenizer_next_chunk(_tkz, &_data, &_end); \
28 if (_status != LXB_STATUS_OK) { \
35#define LXB_CSS_SYNTAX_STR_APPEND_LEN(_tkz, _status, _begin, _length) \
37 _status = lxb_css_syntax_string_append(_tkz, _begin, _length); \
38 if (_status != LXB_STATUS_OK) { \
44#define LXB_CSS_SYNTAX_STR_APPEND(_tkz, _status, _begin, _end) \
45 LXB_CSS_SYNTAX_STR_APPEND_LEN(_tkz, _status, _begin, (_end - _begin))
47#define LXB_CSS_SYNTAX_DELIM_APPEND(_tkz, _begin, _length, _ch) \
49 if (lxb_css_syntax_list_append_delim(_tkz, _begin, _length, _ch) \
132 if ((
size_t) (tkz->
end - tkz->
pos) <= length) {
148 if (tkz->
pos >= tkz->
end) {
298 lexbor_str_res_ansi_replacement_character,
299 sizeof(lexbor_str_res_ansi_replacement_character) - 1);
564 lexbor_str_res_ansi_replacement_character,
565 sizeof(lexbor_str_res_ansi_replacement_character) - 1);
611 data = lxb_css_syntax_state_escaped_string(tkz,
data, &
end,
682 if (lxb_css_syntax_res_name_map[*
data] == 0x00) {
703 if (
ch == 0x0A ||
ch == 0x0C ||
ch == 0x0D) {
709 data = lxb_css_syntax_state_escaped(tkz,
data, &
end, &length);
721 return lxb_css_syntax_state_consume_ident(tkz, token,
data,
end);
807 if (*
data >= 0x30 && *
data <= 0x39) {
811 return lxb_css_syntax_state_consume_numeric(tkz, token,
data,
end);
828 return lxb_css_syntax_state_decimal(tkz, token, tkz->
buffer,
834 if (*
data >= 0x30 && *
data <= 0x39) {
838 return lxb_css_syntax_state_decimal(tkz, token, tkz->
buffer,
913 unsigned minuses_len = 1;
919 if (*
data >= 0x30 && *
data <= 0x39) {
922 data = lxb_css_syntax_state_consume_numeric(tkz, token,
data,
end);
925 number->
num = -number->
num;
944 if (*
data >= 0x30 && *
data <= 0x39) {
947 data = lxb_css_syntax_state_decimal(tkz, token, tkz->
buffer,
952 number->
num = -number->
num;
993 return lxb_css_syntax_state_ident_like_not_url(tkz, token,
996 else if (*
data == 0x3E) {
1009 if (lxb_css_syntax_res_name_map[*
data] == LXB_CSS_SYNTAX_RES_NAME_START
1015 return lxb_css_syntax_state_ident_like_not_url(tkz, token,
data,
end);
1021 if (*
data == 0x5C) {
1027 goto delim_rev_solidus;
1032 if (
ch != 0x0A &&
ch != 0x0C &&
ch != 0x0D) {
1037 goto delim_rev_solidus;
1042 if (
ch != 0x0A &&
ch != 0x0C &&
ch != 0x0D) {
1049 if (minuses_len == 2) {
1058 if (minuses_len == 2) {
1075 data = lxb_css_syntax_state_escaped(tkz,
data, &
end, &length);
1082 return lxb_css_syntax_state_ident_like_not_url(tkz, token,
data,
end);
1107 if (*
data >= 0x30 && *
data <= 0x39) {
1110 return lxb_css_syntax_state_decimal(tkz, token, tkz->
buffer,
1171 if (
data[0] ==
'!' &&
data[1] ==
'-' &&
data[2] ==
'-') {
1196 if (*
data != 0x21) {
1210 if (*
data != 0x2D) {
1227 if (*
data == 0x2D) {
1238 if (lxb_css_syntax_res_name_map[*
data] == LXB_CSS_SYNTAX_RES_NAME_START) {
1239 goto ident_with_minus;
1243 if (*
data == 0x5C) {
1255 if (
ch != 0x0A &&
ch != 0x0C &&
ch != 0x0D) {
1259 data = lxb_css_syntax_state_escaped(tkz,
data, &
end, &length);
1278 if (
ch == 0x0A ||
ch == 0x0C ||
ch == 0x0D) {
1285 data = lxb_css_syntax_state_escaped(tkz,
data + 1, &
end, &length);
1290 else if (*
data != 0x00) {
1306 if (ident ==
NULL) {
1313 data = lxb_css_syntax_state_ident_like_not_url(tkz, ident,
data,
end);
1346 unsigned minuses_len = 0;
1361 if (lxb_css_syntax_res_name_map[*
data] == LXB_CSS_SYNTAX_RES_NAME_START) {
1362 return lxb_css_syntax_state_consume_ident(tkz, token,
data,
end);
1368 if (*
data == 0x2D) {
1379 if (lxb_css_syntax_res_name_map[*
data] == LXB_CSS_SYNTAX_RES_NAME_START
1384 return lxb_css_syntax_state_consume_ident(tkz, token,
data,
end);
1386 else if (*
data == 0x2D) {
1389 return lxb_css_syntax_state_consume_ident(tkz, token,
1397 if (*
data == 0x5C) {
1409 if (
ch != 0x0A &&
ch != 0x0C &&
ch != 0x0D) {
1414 data = lxb_css_syntax_state_escaped(tkz,
data, &
end, &length);
1421 return lxb_css_syntax_state_consume_ident(tkz, token,
data,
end);
1426 else if (*
data != 0x00) {
1427 if (minuses_len != 0) {
1438 return lxb_css_syntax_state_consume_ident(tkz, token,
data,
end);
1442 if (minuses_len != 0) {
1495 if (
ch == 0x0A ||
ch == 0x0C ||
ch == 0x0D) {
1501 data = lxb_css_syntax_state_escaped(tkz,
data, &
end, &length);
1508 return lxb_css_syntax_state_ident_like(tkz, token,
data,
end);
1585 bool e_is_negative,
int exponent,
int e_digit)
1587 if (e_is_negative) {
1588 exponent -= e_digit;
1591 exponent += e_digit;
1612 return lxb_css_syntax_state_consume_numeric(tkz, token,
data,
end);
1638 if (buf_start != buf_end) {
1639 *buf_start++ = *
data;
1662 if (*
data != 0x2E) {
1666 return lxb_css_syntax_state_consume_numeric_name_start(tkz, token,
1679 if (*
data >= 0x30 && *
data <= 0x39) {
1682 return lxb_css_syntax_state_decimal(tkz, token, buf_start, buf_end,
1703 int exponent, e_digit;
1719 if (buf_start != buf_end) {
1720 *buf_start++ = *
data;
1734 buf_start, 0, exponent, 0);
1741 while (*
data >= 0x30 && *
data <= 0x39);
1751 if (
ch != 0x45 &&
ch != 0x65) {
1753 buf_start, 0, exponent, 0);
1755 return lxb_css_syntax_state_consume_numeric_name_start(tkz, token,
1760 e_is_negative =
false;
1768 buf_start, 0, exponent, 0);
1785 e_is_negative =
true;
1819 data = lxb_css_syntax_state_consume_ident(tkz, t_str,
1838 e_digit = (*
data - 0x30) + e_digit * 0x0A;
1848 e_is_negative, exponent, e_digit);
1855 while(*
data >= 0x30 && *
data <= 0x39);
1862 e_is_negative, exponent, e_digit);
1864 return lxb_css_syntax_state_consume_numeric_name_start(tkz, token,
1882 data = lxb_css_syntax_state_consume_ident(tkz, t_str,
data,
end);
1918 if (lxb_css_syntax_res_name_map[
ch] == LXB_CSS_SYNTAX_RES_NAME_START
1951 if (lxb_css_syntax_res_name_map[
ch] == LXB_CSS_SYNTAX_RES_NAME_START
1952 ||
ch == 0x2D ||
ch == 0x00)
1973 goto delim_rev_solidus;
1979 if (
ch != 0x0A &&
ch != 0x0C &&
ch != 0x0D) {
1989 data = lxb_css_syntax_state_escaped(tkz,
data, &
end, &length);
2020 data = lxb_css_syntax_state_consume_ident(tkz, t_str,
data,
end);
2058 if (lxb_css_syntax_res_name_map[*
data] == 0x00) {
2061 if (*
data == 0x5C) {
2073 goto push_delim_last;
2078 goto push_delim_last;
2083 data = lxb_css_syntax_state_escaped(tkz,
data, &
end, &length);
2090 else if (*
data == 0x00) {
2098 lexbor_str_res_ansi_replacement_character,
2099 sizeof(lexbor_str_res_ansi_replacement_character) - 1);
2135 return lxb_css_syntax_state_ident_like(tkz, token,
data,
end);
2151 data = lxb_css_syntax_state_consume_ident(tkz, token,
data,
end);
2175 ws_begin = tkz->
pos;
2197 if (
ch == 0x22 ||
ch == 0x27) {
2206 return lxb_css_syntax_state_url(tkz, token,
data,
end);
2233 if (tkz->
pos >= tkz->
end) {
2271 return lxb_css_syntax_state_ident_like_not_url(tkz, token,
data,
end);
2279 data = lxb_css_syntax_state_consume_ident(tkz, token,
data,
end);
2348 lexbor_str_res_ansi_replacement_character,
2349 sizeof(lexbor_str_res_ansi_replacement_character) - 1);
2392 return lxb_css_syntax_state_bad_url(tkz, token,
data + 1,
end);
2419 if (
ch == 0x0A ||
ch == 0x0C ||
ch == 0x0D) {
2425 return lxb_css_syntax_state_bad_url(tkz, token,
data,
end);
2428 data = lxb_css_syntax_state_escaped(tkz,
data, &
end, &length);
2483 if (*
data == 0x29) {
2494 return lxb_css_syntax_state_bad_url(tkz, token,
2509 || (*
data >= 0x0E && *
data <= 0x1F))
2516 return lxb_css_syntax_state_bad_url(tkz, token,
2564 if (*
data == 0x29) {
2573 else if (*
data == 0x5C) {
2592 sizeof(lexbor_str_res_ansi_replacement_character) - 1);
2622 if (lexbor_str_res_map_hex[*
data] == 0xFF) {
2626 if (*
data == 0x00) {
2658 if (*
data == 0x0A) {
2678 cp |= lexbor_str_res_map_hex[*
data];
2681 if ((tkz->
end - tkz->
pos) < 5) {
2702 if (*
data == 0x0D) {
2718 if (*
data == 0x0A) {
2726 if (*
data == 0x00) {
2737 if (*
data == 0x0A || *
data == 0x0C) {
2743 return lxb_css_syntax_state_escaped(tkz,
data,
end, length);
count(Countable|array $value, int $mode=COUNT_NORMAL)
@ LXB_STATUS_ERROR_MEMORY_ALLOCATION
struct lxb_css_syntax_token lxb_css_syntax_token_t
struct lxb_css_syntax_tokenizer lxb_css_syntax_tokenizer_t
const lxb_char_t * lxb_css_syntax_state_consume_before_numeric(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
const lxb_char_t * lxb_css_syntax_state_semicolon(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
const lxb_char_t * lxb_css_syntax_state_ls_bracket(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
const lxb_char_t * lxb_css_syntax_state_at(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
const lxb_char_t * lxb_css_syntax_state_minus_process(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
const lxb_char_t * lxb_css_syntax_state_ident_like_not_url_begin(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
lxb_inline void lxb_css_syntax_consume_numeric_set_int(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *start, const lxb_char_t *end)
lxb_inline void lxb_css_syntax_state_delim_set(lxb_css_syntax_token_t *token, const lxb_char_t *data, lxb_char_t ch, size_t length)
const lxb_char_t * lxb_css_syntax_state_plus_process(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
const lxb_char_t * lxb_css_syntax_state_rs_bracket(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
const lxb_char_t * lxb_css_syntax_state_comment(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
const lxb_char_t * lxb_css_syntax_state_lc_bracket(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
const lxb_char_t * lxb_css_syntax_state_string(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
lxb_inline const lxb_char_t * lxb_css_syntax_state_dimension_set(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data)
const lxb_char_t * lxb_css_syntax_state_less_sign(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
const lxb_char_t * lxb_css_syntax_state_full_stop(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
lxb_inline lxb_css_syntax_token_t * lxb_css_syntax_state_token_create(lxb_css_syntax_tokenizer_t *tkz)
const lxb_char_t * lxb_css_syntax_state_whitespace(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
const lxb_char_t * lxb_css_syntax_state_rsolidus(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
const lxb_char_t * lxb_css_syntax_state_rparenthesis(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
lxb_inline lxb_status_t lxb_css_syntax_string_realloc(lxb_css_syntax_tokenizer_t *tkz, size_t upto)
const lxb_char_t * lxb_css_syntax_state_delim(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
#define LXB_CSS_SYNTAX_DELIM_APPEND(_tkz, _begin, _length, _ch)
const lxb_char_t * lxb_css_syntax_state_rc_bracket(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
const lxb_char_t * lxb_css_syntax_state_minus(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
const lxb_char_t * lxb_css_syntax_state_hash(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
const lxb_char_t * lxb_css_syntax_state_plus(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
lxb_inline lxb_status_t lxb_css_syntax_string_append(lxb_css_syntax_tokenizer_t *tkz, const lxb_char_t *data, size_t length)
lxb_inline const lxb_char_t * lxb_css_syntax_state_string_set(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data)
lxb_inline void lxb_css_syntax_consume_numeric_set_float(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *start, const lxb_char_t *end, bool e_is_negative, int exponent, int e_digit)
lxb_inline lxb_status_t lxb_css_syntax_state_string_term(lxb_css_syntax_tokenizer_t *tkz)
const lxb_char_t * lxb_css_syntax_state_lparenthesis(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
#define LXB_CSS_SYNTAX_STR_APPEND_LEN(_tkz, _status, _begin, _length)
lxb_inline lxb_status_t lxb_css_syntax_string_append_rep(lxb_css_syntax_tokenizer_t *tkz)
const lxb_char_t * lxb_css_syntax_state_comma(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
#define LXB_CSS_SYNTAX_STR_APPEND(_tkz, _status, _begin, _end)
lxb_inline lxb_css_syntax_token_t * lxb_css_syntax_list_append_delim(lxb_css_syntax_tokenizer_t *tkz, const lxb_char_t *data, size_t length, lxb_char_t ch)
const lxb_char_t * lxb_css_syntax_state_colon(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
#define LXB_CSS_SYNTAX_NEXT_CHUNK(_tkz, _status, _data, _end)
const lxb_char_t * lxb_css_syntax_state_ident_like_begin(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token, const lxb_char_t *data, const lxb_char_t *end)
lxb_css_syntax_token_t * lxb_css_syntax_token_cached_create(lxb_css_syntax_tokenizer_t *tkz)
#define lxb_css_syntax_token_number(token)
struct lxb_css_syntax_token_number lxb_css_syntax_token_number_t
#define lxb_css_syntax_token_string(token)
#define lxb_css_syntax_token_base(token)
@ LXB_CSS_SYNTAX_TOKEN_FUNCTION
@ LXB_CSS_SYNTAX_TOKEN_LS_BRACKET
@ LXB_CSS_SYNTAX_TOKEN_BAD_URL
@ LXB_CSS_SYNTAX_TOKEN_RC_BRACKET
@ LXB_CSS_SYNTAX_TOKEN_NUMBER
@ LXB_CSS_SYNTAX_TOKEN_BAD_STRING
@ LXB_CSS_SYNTAX_TOKEN_CDO
@ LXB_CSS_SYNTAX_TOKEN_COMMA
@ LXB_CSS_SYNTAX_TOKEN_CDC
@ LXB_CSS_SYNTAX_TOKEN_DELIM
@ LXB_CSS_SYNTAX_TOKEN_COLON
@ LXB_CSS_SYNTAX_TOKEN_DIMENSION
@ LXB_CSS_SYNTAX_TOKEN_RS_BRACKET
@ LXB_CSS_SYNTAX_TOKEN_AT_KEYWORD
@ LXB_CSS_SYNTAX_TOKEN_STRING
@ LXB_CSS_SYNTAX_TOKEN_URL
@ LXB_CSS_SYNTAX_TOKEN_IDENT
@ LXB_CSS_SYNTAX_TOKEN_WHITESPACE
@ LXB_CSS_SYNTAX_TOKEN_LC_BRACKET
@ LXB_CSS_SYNTAX_TOKEN_L_PARENTHESIS
@ LXB_CSS_SYNTAX_TOKEN_HASH
@ LXB_CSS_SYNTAX_TOKEN_PERCENTAGE
@ LXB_CSS_SYNTAX_TOKEN_COMMENT
@ LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS
@ LXB_CSS_SYNTAX_TOKEN_SEMICOLON
#define lxb_css_syntax_token_delim(token)
struct lxb_css_syntax_token_string lxb_css_syntax_token_string_t
#define lxb_css_syntax_token_dimension_string(token)
lxb_css_syntax_tokenizer_error_t * lxb_css_syntax_tokenizer_error_add(lexbor_array_obj_t *parse_errors, const lxb_char_t *pos, lxb_css_syntax_tokenizer_error_id_t id)
@ LXB_CSS_SYNTAX_TOKENIZER_ERROR_EOINUR
@ LXB_CSS_SYNTAX_TOKENIZER_ERROR_WRESINUR
@ LXB_CSS_SYNTAX_TOKENIZER_ERROR_EOINST
@ LXB_CSS_SYNTAX_TOKENIZER_ERROR_NEINST
@ LXB_CSS_SYNTAX_TOKENIZER_ERROR_EOINCO
@ LXB_CSS_SYNTAX_TOKENIZER_ERROR_QOINUR
lxb_status_t lxb_css_syntax_tokenizer_next_chunk(lxb_css_syntax_tokenizer_t *tkz, const lxb_char_t **data, const lxb_char_t **end)
hash(string $algo, string $data, bool $binary=false, array $options=[])
LXB_API void * lexbor_realloc(void *dst, size_t size)
unsigned const char * end
bool lexbor_str_data_casecmp(const lxb_char_t *first, const lxb_char_t *sec)
double lexbor_strtod_internal(const lxb_char_t *start, size_t length, int exp)
lxb_css_syntax_token_type_t type
lexbor_array_obj_t * parse_errors
lxb_css_syntax_tokenizer_cache_t * cache
const lxb_char_t * in_end
void lxb_css_syntax_codepoint_to_ascii(lxb_css_syntax_tokenizer_t *tkz, lxb_codepoint_t cp)
unsigned int lxb_status_t
#define lexbor_utils_whitespace(onechar, action, logic)