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