From 06087b10ec7a897ad48db83f7f33a8fc11fa9341 Mon Sep 17 00:00:00 2001 From: Alexander Pickering Date: Wed, 28 Aug 2019 17:28:55 -0400 Subject: Added break statement to templates Added a break statement that can break out of loops, also added some tests to test the functionality of the same. --- src/ctemplates.h | 57 ++++---------------------------------------------------- 1 file changed, 4 insertions(+), 53 deletions(-) (limited to 'src/ctemplates.h') diff --git a/src/ctemplates.h b/src/ctemplates.h index f84876c..b422b77 100644 --- a/src/ctemplates.h +++ b/src/ctemplates.h @@ -12,6 +12,7 @@ #include "fbuf.h" #include "kmp.h" #include "hashmap.h" +#include "lexer.h" #define MAX_TEMPLATE_LENGTH 2147384647 @@ -21,36 +22,8 @@ typedef struct TMPL_loop TMPL_loop; typedef struct TMPL_fmtlist TMPL_fmtlist; typedef struct TMPL_fmtlists TMPL_fmtlists; */ -#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 ERRBUF_HINTLEN 50 -#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) //I guess it counts the backslash? #define ATTRIBUTE_VARNAME_LENGTH SIZEOF(ATTRIBUTE_VARNAME) - 1 @@ -63,20 +36,6 @@ typedef struct TMPL_fmtlists TMPL_fmtlists; //Length of error messages #define ERR_MSG_LEN 500 -/*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_light_string{ const char* start; size_t len; @@ -172,6 +131,9 @@ struct TMPL_templates{ struct TMPL_buf* out; struct TMPL_buf* errout; struct TMPL_tagnode* roottag; + struct TMPL_tagnode* cursor; + int jumping; //tells other functions that they should not change + //the cursor, set after a break or continue. int breaks; int continues; int linenum; @@ -179,17 +141,6 @@ struct TMPL_templates{ } TMPL_templates; -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; int TMPL_add_var_to_varlist(struct TMPL_varlist* vl, const char* name, const char* value); int TMPL_add_loop_to_varlist(struct TMPL_varlist* vl, const char* name, struct TMPL_loop* loop); -- cgit v1.2.3-70-g09d2