Herb C Reference
Loading...
Searching...
No Matches
lexer_peek_helpers.h
Go to the documentation of this file.
1#ifndef HERB_LEXER_PEEK_HELPERS_H
2#define HERB_LEXER_PEEK_HELPERS_H
3
4#include "lexer_struct.h"
5#include "macros.h"
6#include "token_struct.h"
7#include "util/hb_string.h"
8
9#include <ctype.h>
10#include <stdbool.h>
11#include <stdint.h>
12#include <stdio.h>
13#include <stdlib.h>
14
15typedef struct {
16 uint32_t position;
17 uint32_t line;
18 uint32_t column;
20 uint32_t previous_line;
25
26bool lexer_peek_for_doctype(const lexer_T* lexer, uint32_t offset);
27bool lexer_peek_for_xml_declaration(const lexer_T* lexer, uint32_t offset);
28bool lexer_peek_for_cdata_start(const lexer_T* lexer, uint32_t offset);
29bool lexer_peek_for_cdata_end(const lexer_T* lexer, uint32_t offset);
30bool lexer_peek_for_html_comment_start(const lexer_T* lexer, uint32_t offset);
32bool lexer_peek_for_close_tag_start(const lexer_T* lexer, uint32_t offset);
33
34static inline char lexer_peek(const lexer_T* lexer, uint32_t offset) {
35 return lexer->source.data[MIN(lexer->current_position + offset, lexer->source.length)];
36}
37
38static inline char lexer_backtrack(const lexer_T* lexer, uint32_t offset) {
39 return lexer->source.data[MAX(lexer->current_position - offset, 0)];
40}
41
42static inline bool lexer_peek_for_html_comment_end(const lexer_T* lexer, uint32_t offset) {
43 uint32_t position = lexer->current_position + offset;
44
45 return position + 2 < lexer->source.length && lexer->source.data[position] == '-'
46 && lexer->source.data[position + 1] == '-' && lexer->source.data[position + 2] == '>';
47}
48
49static inline bool lexer_peek_for_html_comment_invalid_end(const lexer_T* lexer, uint32_t offset) {
50 uint32_t position = lexer->current_position + offset;
51
52 return position + 3 < lexer->source.length && lexer->source.data[position] == '-'
53 && lexer->source.data[position + 1] == '-' && lexer->source.data[position + 2] == '!'
54 && lexer->source.data[position + 3] == '>';
55}
56
57static inline bool lexer_peek_erb_start(const lexer_T* lexer, uint32_t offset) {
58 uint32_t position = lexer->current_position + offset;
59
60 return position + 1 < lexer->source.length && lexer->source.data[position] == '<'
61 && lexer->source.data[position + 1] == '%';
62}
63
64static inline bool lexer_peek_erb_close_tag(const lexer_T* lexer, uint32_t offset) {
65 uint32_t position = lexer->current_position + offset;
66
67 return position + 1 < lexer->source.length && lexer->source.data[position] == '%'
68 && lexer->source.data[position + 1] == '>';
69}
70
71static inline bool lexer_peek_erb_dash_close_tag(const lexer_T* lexer, uint32_t offset) {
72 uint32_t position = lexer->current_position + offset;
73
74 return position + 2 < lexer->source.length && lexer->source.data[position] == '-'
75 && lexer->source.data[position + 1] == '%' && lexer->source.data[position + 2] == '>';
76}
77
78static inline bool lexer_peek_erb_percent_close_tag(const lexer_T* lexer, uint32_t offset) {
79 uint32_t position = lexer->current_position + offset;
80
81 return position + 2 < lexer->source.length && lexer->source.data[position] == '%'
82 && lexer->source.data[position + 1] == '%' && lexer->source.data[position + 2] == '>';
83}
84
85static inline bool lexer_peek_erb_equals_close_tag(const lexer_T* lexer, uint32_t offset) {
86 uint32_t position = lexer->current_position + offset;
87
88 return position + 2 < lexer->source.length && lexer->source.data[position] == '='
89 && lexer->source.data[position + 1] == '%' && lexer->source.data[position + 2] == '>';
90}
91
92static inline bool lexer_peek_erb_end(const lexer_T* lexer, uint32_t offset) {
93 return lexer_peek_erb_close_tag(lexer, offset) || lexer_peek_erb_dash_close_tag(lexer, offset)
94 || lexer_peek_erb_percent_close_tag(lexer, offset) || lexer_peek_erb_equals_close_tag(lexer, offset);
95}
96
99 .line = lexer->current_line,
100 .column = lexer->current_column,
101 .previous_position = lexer->previous_position,
102 .previous_line = lexer->previous_line,
103 .previous_column = lexer->previous_column,
104 .current_character = lexer->current_character,
105 .state = lexer->state };
106 return snapshot;
107}
108
109static inline void lexer_restore_state(lexer_T* lexer, lexer_state_snapshot_T snapshot) {
110 lexer->current_position = snapshot.position;
111 lexer->current_line = snapshot.line;
112 lexer->current_column = snapshot.column;
113 lexer->previous_position = snapshot.previous_position;
114 lexer->previous_line = snapshot.previous_line;
115 lexer->previous_column = snapshot.previous_column;
116 lexer->current_character = snapshot.current_character;
117 lexer->state = snapshot.state;
118}
119
120#endif
static bool lexer_peek_for_html_comment_end(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.h:42
static void lexer_restore_state(lexer_T *lexer, lexer_state_snapshot_T snapshot)
Definition lexer_peek_helpers.h:109
bool lexer_peek_for_doctype(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.c:18
bool lexer_peek_for_html_comment_start(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.c:34
static char lexer_backtrack(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.h:38
static bool lexer_peek_erb_percent_close_tag(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.h:78
static bool lexer_peek_erb_close_tag(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.h:64
static bool lexer_peek_erb_end(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.h:92
bool lexer_peek_for_cdata_end(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.c:30
static bool lexer_peek_erb_equals_close_tag(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.h:85
bool lexer_peek_for_close_tag_start(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.c:38
bool lexer_peek_for_xml_declaration(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.c:22
static char lexer_peek(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.h:34
static bool lexer_peek_erb_start(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.h:57
static bool lexer_peek_for_html_comment_invalid_end(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.h:49
static bool lexer_peek_erb_dash_close_tag(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.h:71
bool lexer_peek_for_cdata_start(const lexer_T *lexer, uint32_t offset)
Definition lexer_peek_helpers.c:26
static lexer_state_snapshot_T lexer_save_state(lexer_T *lexer)
Definition lexer_peek_helpers.h:97
bool lexer_peek_for_token_type_after_whitespace(lexer_T *lexer, token_type_T token_type)
Definition lexer_peek_helpers.c:53
lexer_state_T
Definition lexer_struct.h:11
#define MIN(a, b)
Definition macros.h:14
#define MAX(a, b)
Definition macros.h:12
Definition lexer_struct.h:17
uint32_t previous_column
Definition lexer_struct.h:26
uint32_t previous_line
Definition lexer_struct.h:25
hb_string_T source
Definition lexer_struct.h:19
lexer_state_T state
Definition lexer_struct.h:30
uint32_t current_position
Definition lexer_struct.h:23
char current_character
Definition lexer_struct.h:29
uint32_t current_column
Definition lexer_struct.h:22
uint32_t previous_position
Definition lexer_struct.h:27
uint32_t current_line
Definition lexer_struct.h:21
Definition lexer_peek_helpers.h:15
char current_character
Definition lexer_peek_helpers.h:22
uint32_t previous_line
Definition lexer_peek_helpers.h:20
uint32_t column
Definition lexer_peek_helpers.h:18
uint32_t previous_position
Definition lexer_peek_helpers.h:19
uint32_t previous_column
Definition lexer_peek_helpers.h:21
uint32_t line
Definition lexer_peek_helpers.h:17
lexer_state_T state
Definition lexer_peek_helpers.h:23
uint32_t position
Definition lexer_peek_helpers.h:16
int token_type(const token_T *token)
Definition token.c:207
token_type_T
Definition token_struct.h:10