aboutsummaryrefslogtreecommitdiff
path: root/src/lexer.h
blob: 06b4bc533aa3d9d31a74e2c2faf5e292908e5e24 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define TAG_NULL_TEXT ""
#define TAG_TEXT_TEXT ""
#define TAG_VAR_TEXT "TMPL_VAR"
#define TAG_IF_TEXT "TMPL_IF"
#define TAG_ELSEIF_TEXT "TMPL_ELSEIF"
#define TAG_ELSE_TEXT "TMPL_ELSE"
#define TAG_LOOP_TEXT "TMPL_LOOP"
#define TAG_BREAK_TEXT "TMPL_BREAK"
#define TAG_CONTINUE_TEXT "TMPL_CONTINUE"
#define TAG_END_TEXT "TMPL_END"

#define ATTRIBUTE_VARNAME "name"
#define ATTRIBUTE_DEFAULT "default"
#define ATTRIBUTE_VALUE "value"
#define ATTRIBUTE_LEVEL "level"

#define SIZEOF(x) (sizeof(x) / sizeof(x[0]))

#define TAG_NULL_LENGTH 0
#define TAG_TEXT_LENGTH 0
#define TAG_VAR_LENGTH SIZEOF(TAG_VAR_TEXT)
#define TAG_IF_LENGTH SIZEOF(TAG_IF_TEXT)
#define TAG_ELSEIF_LENGTH SIZEOF(TAG_ELSEIF_TEXT)
#define TAG_ELSE_LENGTH SIZEOF(TAG_ELSE_TEXT)
#define TAG_LOOP_LENGTH SIZEOF(TAG_LOOP_TEXT)
#define TAG_BREAK_LENGTH SIZEOF(TAG_BREAK_TEXT)
#define TAG_CONTINUE_LENGTH SIZEOF(TAG_CONTINUE_TEXT)
#define TAG_END_LENGTH SIZEOF(TAG_END_TEXT)

/*The different kind of nodes we can have*/
enum TMPL_tagtype{
	tag_null 	=  0,/*Should never show up*/
	tag_text 	=  1,/*A text sequence*/
	tag_var 	=  2,/*A variable to replace*/
	tag_if 		=  3,/*If*/
	tag_elseif 	=  4,/*Else if*/
	tag_else 	=  5,/*Else*/
	tag_end 	=  6,/*end if, end loop*/
	tag_loop 	=  7,/*Loop*/
	tag_break 	=  9,/*Break*/
	tag_continue 	= 10,/*Skip the rest of the loop and go again*/
};

struct TMPL_token{
	const char* start;//Start of token
	const char* end;//End of token
	enum TMPL_tagtype type;//The type of token
	size_t length;//Length of token, should always be end-start
	struct TMPL_token* next;//The next token
	struct TMPL_token* last;//The last token
	unsigned int line;// Not used currently
	unsigned int character;// Not used currently
	struct TMPL_tagnode* into;//The tag node this item became
}TMPL_token;

struct TMPL_token*           TMPL_alloc_token(void);
void                         TMPL_free_token(struct TMPL_token* token);
enum TMPL_tagtype            starts_with_token(const char* str, size_t strlen);
size_t                       tagtype_len(enum TMPL_tagtype t);
struct TMPL_token*           scan_text(
                                       const char* start,
                                       size_t strlen,
                                       size_t* consumed
                                      );
struct TMPL_token*           scan_tag(
                                      const char* start,
                                      size_t strlen,
                                      size_t* consumed
                                     );
void                         print_tokens(struct TMPL_token* head);