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);
|