diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ctemplates.c | 31 | ||||
| -rw-r--r-- | src/ctemplates.h | 2 |
2 files changed, 29 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); diff --git a/src/ctemplates.h b/src/ctemplates.h index 8bf567d..f84876c 100644 --- a/src/ctemplates.h +++ b/src/ctemplates.h @@ -172,6 +172,8 @@ struct TMPL_templates{ struct TMPL_buf* out; struct TMPL_buf* errout; struct TMPL_tagnode* roottag; + int breaks; + int continues; int linenum; int error; } TMPL_templates; |
