From e81f26718e5c95de6140631652f1319857602ff8 Mon Sep 17 00:00:00 2001 From: Alexander Pickering Date: Fri, 29 Dec 2017 01:21:32 -0500 Subject: Fixed bugfixes Fixed bug with tokenizing, also fixed a bug with parsing loops also fixed a bug with adding vars to a varlist --- ctemplates.c | 39 +++++++++++++++++++++++++-------------- ctemplates.h | 48 ++++++------------------------------------------ 2 files changed, 31 insertions(+), 56 deletions(-) diff --git a/ctemplates.c b/ctemplates.c index a470ebc..fb32b67 100644 --- a/ctemplates.c +++ b/ctemplates.c @@ -286,7 +286,8 @@ scan_text(char* start, size_t strlen, size_t* consumed){ enum TMPL_tagtype type = tag_null; char* cursor = start; while(type == tag_null){ - cursor = (char*)memchr(cursor,'<',strlen); + int left = strlen - (cursor - start); + cursor = (char*)memchr(cursor,'<',left); if(cursor == NULL){ cursor = start + (strlen > 0 ? strlen : 1); break; @@ -353,6 +354,7 @@ TMPL_add_var_to_varlist(struct TMPL_varlist* t, char* varname, char* var){ vi->type = vartype_var; size_t slen = strlen(var); vi->item.s = (char*)malloc(sizeof(char)*slen); + vi->item.s[slen] = '\0'; memcpy(vi->item.s,var,slen); int succ = hashmap_put(t->map,varname,vi); if(succ != MAP_OK){ @@ -426,38 +428,38 @@ print_ast(struct TMPL_tagnode* root){ } struct TMPL_token* -TMPL_tokenize(char* tmplstr, size_t strlen){ - if(strlen == 0) return NULL; +TMPL_tokenize(char* tmplstr, size_t m_strlen){ + if(m_strlen == 0) return NULL; struct TMPL_token* first; char* textcursor = tmplstr; size_t newlength; enum TMPL_tagtype ttype; - ttype = starts_with_token(tmplstr+1,strlen); - if(ttype == tag_null){ - first = scan_text(textcursor,strlen,&newlength); - first->type = tag_text; - }else{ - first = scan_tag(textcursor,strlen,&newlength); + ttype = starts_with_token(tmplstr+1,m_strlen); + if(*tmplstr == '<' && ttype != tag_null){ + first = scan_tag(textcursor,m_strlen,&newlength); first->type = ttype; + }else{ + first = scan_text(textcursor,m_strlen,&newlength); + first->type = tag_text; } textcursor += newlength; first->end = textcursor; first->length = newlength; - strlen -= newlength; + m_strlen -= newlength; struct TMPL_token* tokencursor = first; struct TMPL_token* newnode; while(*textcursor != '\0'){ - ttype = starts_with_token(textcursor+1,strlen); + ttype = starts_with_token(textcursor+1,m_strlen); if(ttype == tag_null){ - newnode = scan_text(textcursor,strlen,&newlength); + newnode = scan_text(textcursor,m_strlen,&newlength); newnode->type = tag_text; }else{ - newnode = scan_tag(textcursor,strlen,&newlength); + newnode = scan_tag(textcursor,m_strlen,&newlength); newnode->type = ttype; } tokencursor->next = newnode; textcursor += newlength; - strlen -= newlength; + m_strlen -= newlength; tokencursor = newnode; } return first; @@ -639,6 +641,7 @@ parse_loop(struct TMPL_token* head, struct TMPL_buf* errbuf){ char* start_of_name = loop_start + name_offset + ATTRIBUTE_VARNAME_LENGTH; size_t name_size = get_quoted_string(start_of_name,head->length); char* loopname = (char*)malloc(sizeof(char)*name_size); + memcpy(loopname,start_of_name,name_size); loopname[name_size] = '\0'; t->TMPL_tag.loop.loopname = loopname; @@ -782,6 +785,7 @@ parse(struct TMPL_token* head, struct TMPL_buf* errbuf){ if(head == NULL){ return NULL; } + printf("Parsing token of type: %d\n",head->type); switch(head->type){ case tag_text: root = parse_text(head,errbuf); @@ -805,6 +809,7 @@ parse(struct TMPL_token* head, struct TMPL_buf* errbuf){ root = NULL; break; default: + printf("Hit token of type: %d, exiting\n", head->type); exit(-1); break; } @@ -826,9 +831,15 @@ compile(char* tmplstr){ struct TMPL_templates* ret = alloc_templates(); ret->out = alloc_tmpl_buf(); ret->errout = alloc_tmpl_buf(); + printf("About to do hard things\n"); struct TMPL_token* tokens = TMPL_tokenize(tmplstr,slen); + print_tokens(tokens); + printf("Done tokenizeing\n"); struct TMPL_tagnode* ast = parse(tokens,ret->errout); + printf("Done making ast\n"); + print_ast(ast); if(ast == NULL){ + printf("Failed to compile\n"); }else{ ret->roottag = ast; } diff --git a/ctemplates.h b/ctemplates.h index e0e4a63..3dba429 100644 --- a/ctemplates.h +++ b/ctemplates.h @@ -9,11 +9,9 @@ #ifndef _CTEMPLATE_H #define _CTEMPLATE_H - #include "fbuf.h" #include "kmp.h" #include "hashmap.h" -#include "ctemplates.h" #define MAX_TEMPLATE_LENGTH 2147384647 @@ -176,44 +174,11 @@ struct TMPL_token{ struct TMPL_token* next;//The next token }TMPL_token; +void TMPL_add_var_to_varlist(struct TMPL_varlist* vl, char* name, char* value); +void TMPL_add_loop_to_varlist(struct TMPL_varlist* vl, char* name, struct TMPL_loop* loop); +void TMPL_add_varlist_to_loop(struct TMPL_loop* l, struct TMPL_varlist* vl); -typedef void (*TMPL_fmtfunc) (const char *, FILE *); - -/* - -TMPL_varlist *TMPL_add_var(TMPL_varlist *varlist, - const char *varname1, const char *value1, ... , 0); -*/ - -//TMPL_varlist *TMPL_add_var(TMPL_varlist *varlist, ...); -extern struct TMPL_varlist* TMPL_add_var(struct TMPL_varlist* varlist, ...); - -/*TMPL_varlist *TMPL_add_loop(TMPL_varlist *varlist, - const char *name, TMPL_loop *loop); - */ -extern struct TMPL_varlist* TMPL_add_loop(struct TMPL_varlist* varlist, - const char* name, struct TMPL_loop* loop); - - -//TMPL_loop *TMPL_add_varlist(TMPL_loop *loop, TMPL_varlist *varlist); -struct TMPL_loop* TMPL_add_varlist(struct TMPL_loop* loop, struct TMPL_varlist* varlist); - -//void TMPL_free_varlist(TMPL_varlist *varlist); -void TMPL_free_varlist(struct TMPL_varlist* varlist); - -//TMPL_fmtlist *TMPL_add_fmt(TMPL_fmtlist *fmtlist, - //const char *name, TMPL_fmtfunc fmtfunc); -struct TMPL_fmtlist* TMPL_add_fmt(struct TMPL_fmtlist* fmtlist, - const char* name, void* fmtfunc); - -void TMPL_free_fmtlist(struct TMPL_fmtlist* fmtlist); - -/*int TMPL_write(const char *filename, const char *tmplstr, - const TMPL_fmtlist *fmtlist, const TMPL_varlist *varlist, - FILE *out, FILE *errout); -*/ - struct TMPL_varlist* TMPL_alloc_varlist(void); void TMPL_free_varlist(struct TMPL_varlist* t); @@ -223,13 +188,12 @@ void TMPL_free_varitem(struct TMPL_varitem* vi); struct TMPL_templates* TMPL_alloc_template(char* t); void TMPL_free_template(struct TMPL_templates* t); +struct TMPL_loop* TMPL_alloc_loop(void); +void TMPL_free_loop(struct TMPL_loop* tl); + char* TMPL_render(struct TMPL_templates* t, struct TMPL_varlist* varlist, size_t* size_p); struct TMPL_tagnode* TMPL_alloc_tagnode(enum TMPL_tagtype); void TMPL_free_tagnode(struct TMPL_tagnode* tn); -/* TODO: Remove this after testing is done */ -struct TMPL_token* TMPL_tokenize(char* tmplstr, size_t strlen); - - #endif -- cgit v1.2.3-70-g09d2