aboutsummaryrefslogtreecommitdiff
path: root/src/ctemplates.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ctemplates.c')
-rw-r--r--src/ctemplates.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/src/ctemplates.c b/src/ctemplates.c
index 2092209..9d11f28 100644
--- a/src/ctemplates.c
+++ b/src/ctemplates.c
@@ -4,7 +4,7 @@
*
* Version 0.1
*
- * Copyright (c) 2017-2018 Alexander M. Pickering (alex@cogarr.net)
+ * Copyright (c) 2017-2019 Alexander M. Pickering (alex@cogarr.net)
*
* Distributed under GPL V3, see COPYING for more information.
*
@@ -977,6 +977,7 @@ struct TMPL_varlist*
TMPL_alloc_varlist(){
struct TMPL_varlist* ret = (struct TMPL_varlist*)malloc(sizeof(struct TMPL_varlist));
ret->map = hashmap_new();
+ ret->parent = NULL;
return ret;
}
@@ -1017,6 +1018,7 @@ TMPL_free_loop(struct TMPL_loop* tl){
}
int TMPL_add_varlist_to_loop(struct TMPL_loop* tl,struct TMPL_varlist* vl){
+ vl->parent = tl;
if(tl->loop_len == 0){/*Add the first node*/
tl->varlist = vl;
tl->tail = tl;
@@ -1037,6 +1039,7 @@ TMPL_add_loop_to_varlist(struct TMPL_varlist* vl, const char* name, struct TMPL_
struct TMPL_varitem* vi = TMPL_alloc_varitem();
vi->type = vartype_loop;
vi->item.l = l;
+ l->parent = vl;
int err = hashmap_put(vl->map,(char*)name,vi);
if(err == MAP_OK) return 0;
return -1;
@@ -1075,7 +1078,6 @@ parse(struct TMPL_token* head, struct TMPL_buf* errbuf){
root = NULL;
break;
case tag_continue:
- printf("Parsing continue\n");
root = parse_continue(head,errbuf);
break;
case tag_break:
@@ -1106,9 +1108,10 @@ compile(const char* tmplstr){
struct TMPL_templates* ret = alloc_templates();
ret->out = alloc_tmpl_buf();
ret->errout = alloc_tmpl_buf();
+ ret->breaks = 0;
+ ret->continues = 0;
struct TMPL_token* tokens = TMPL_tokenize(tmplstr,slen);
struct TMPL_tagnode* ast = parse(tokens,ret->errout);
- size_t dummy;
if(ast == NULL){
}else{
ret->roottag = ast;
@@ -1208,6 +1211,9 @@ render_if(struct TMPL_templates* t, struct TMPL_tagnode* node, struct TMPL_varli
cursor = node->TMPL_tag.ifelse.tbranch;
while(cursor != NULL){
render_any(t,cursor,varlist);
+ if(t->breaks > 0 || t->continues > 0){
+ break;
+ }
cursor = cursor->next;
}
@@ -1219,6 +1225,9 @@ render_if(struct TMPL_templates* t, struct TMPL_tagnode* node, struct TMPL_varli
cursor = node->TMPL_tag.ifelse.fbranch;
while(cursor != NULL){
render_any(t,cursor,varlist);
+ if(t->breaks > 0 || t->continues > 0){
+ break;
+ }
cursor = cursor->next;
}
}
@@ -1250,11 +1259,13 @@ resolve_name(struct TMPL_varlist* varlist, char* name,struct TMPL_varitem** item
int
render_break(struct TMPL_templates* t, struct TMPL_tagnode* node, struct TMPL_varlist* varlist){
+ t->breaks = t->breaks + node->TMPL_tag.breakcont.level;
return render_any(t,node->TMPL_tag.breakcont.into->next,varlist->parent->parent);
}
int
render_continue(struct TMPL_templates* t, struct TMPL_tagnode* node, struct TMPL_varlist* varlist){
+ t->continues = t->continues + node->TMPL_tag.breakcont.level;
return render_any(t,node->next,varlist->parent->next->varlist);
}
@@ -1270,12 +1281,22 @@ render_loop(struct TMPL_templates* t, struct TMPL_tagnode* node, struct TMPL_var
nt->out = t->out;
nt->errout = t->errout;
nt->roottag = node->TMPL_tag.loop.body;
+ nt->breaks = t->breaks;
+ nt->continues = t->continues;
struct TMPL_loop* cursor;
/*If the loop has no items, it's varlist will be null*/
for(cursor = loop->item.l; cursor != NULL && cursor->varlist != NULL; cursor = cursor->next){
if(err != 0){
}
- TMPL_render_helper(nt,cursor->varlist);
+ if(t->breaks > 0){
+ t->breaks--;
+ break;
+ }
+ if(t->continues > 0){
+ t->continues--;
+ }else{
+ TMPL_render_helper(nt,cursor->varlist);
+ }
}
free(nt);
return 0;
@@ -1285,6 +1306,8 @@ int
render_any(struct TMPL_templates* t, struct TMPL_tagnode* node, struct TMPL_varlist* varlist){
/*Interpret the template*/
int err;
+ if(t->breaks > 0 || t->continues > 0)
+ return err;
switch(node->type){
case tag_text:
err = render_text(t,node,varlist);