diff options
| author | Alexander Pickering <alexandermpickering@gmail.com> | 2019-11-21 18:17:18 -0500 |
|---|---|---|
| committer | Alexander Pickering <alexandermpickering@gmail.com> | 2019-11-21 18:24:30 -0500 |
| commit | d917129d502a753f13bd26ecf47a30d31f738fc1 (patch) | |
| tree | a31bb887c0b27b47939eb377535388b1fea552c2 /src | |
| parent | d8987084b7aa3c47642af30a87c0673a2df01fd0 (diff) | |
| download | libctemplates-d917129d502a753f13bd26ecf47a30d31f738fc1.tar.gz libctemplates-d917129d502a753f13bd26ecf47a30d31f738fc1.tar.bz2 libctemplates-d917129d502a753f13bd26ecf47a30d31f738fc1.zip | |
Fixed empty loop causeing infinite loop
If a loop was defined in the template, but no loop was defined
in the varlist, render() would infinite loop while trying to
execute. Fixs that.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ctemplates.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/src/ctemplates.c b/src/ctemplates.c index 9a3b890..fb055e6 100644 --- a/src/ctemplates.c +++ b/src/ctemplates.c @@ -138,7 +138,7 @@ int render_any( struct TMPL_templates* t, struct TMPL_varlist* varlist ); -void TMPL_render_helper( +int TMPL_render_helper( struct TMPL_templates* t, struct TMPL_varlist* varlist ); @@ -1055,7 +1055,8 @@ render_if(struct TMPL_templates* t, struct TMPL_varlist* varlist){ char* varname = t->cursor->TMPL_tag.ifelse.varname; char* testval = t->cursor->TMPL_tag.ifelse.testval; struct TMPL_varitem* vi; - int err = hashmap_get(varlist->map,varname,(void**)&vi); + int err; + err = hashmap_get(varlist->map,varname,(void**)&vi); struct TMPL_templates* nt = (struct TMPL_templates*)malloc(sizeof(struct TMPL_templates)); nt->out = t->out; nt->errout = t->errout; @@ -1068,7 +1069,7 @@ render_if(struct TMPL_templates* t, struct TMPL_varlist* varlist){ if(testval == NULL || strcmp(vi->item.s, testval) == 0){ nt->roottag = t->cursor->TMPL_tag.ifelse.tbranch; nt->cursor = nt->roottag; - TMPL_render_helper(nt,varlist); + err = TMPL_render_helper(nt,varlist); if(nt->jumping) t->cursor = nt->cursor; t->breaks += nt->breaks; @@ -1081,7 +1082,7 @@ render_if(struct TMPL_templates* t, struct TMPL_varlist* varlist){ }else if(t->cursor->TMPL_tag.ifelse.fbranch != NULL){ nt->roottag = t->cursor->TMPL_tag.ifelse.fbranch; nt->cursor = nt->roottag; - TMPL_render_helper(nt,varlist); + err = TMPL_render_helper(nt,varlist); if(nt->jumping) t->cursor = nt->cursor; t->breaks += nt->breaks; @@ -1090,7 +1091,7 @@ render_if(struct TMPL_templates* t, struct TMPL_varlist* varlist){ }else{ } advance_cursor(t); - return 0; + return err; } /*Exactly the same thing as if*/ @@ -1139,8 +1140,15 @@ render_loop(struct TMPL_templates* t, struct TMPL_varlist* varlist){ char* loopname = t->cursor->TMPL_tag.loop.loopname; struct TMPL_tagnode* loopnode = t->cursor; struct TMPL_varitem* loop; - int err = resolve_name(varlist,loopname,&loop); + int err; + err = resolve_name(varlist,loopname,&loop); + printf("When resolving name, err is %d\n",err); + /*What should happen when we get to a loop that does not have a name? + We follow the precident set for variables, and throw an error.*/ if(err != MAP_OK){ + bputs(t->errout,"Render error: Variable \""); + bputs(t->errout,loopname); + bputs(t->errout,"\" was not bound to a value\n"); return -1; } struct TMPL_templates* nt = (struct TMPL_templates*)malloc(sizeof(struct TMPL_templates)); @@ -1172,7 +1180,7 @@ render_loop(struct TMPL_templates* t, struct TMPL_varlist* varlist){ } } }else{ - TMPL_render_helper(nt,cursor->varlist); + err = TMPL_render_helper(nt,cursor->varlist); t->breaks += nt->breaks; t->continues += nt->continues; t->jumping += nt->jumping; @@ -1193,7 +1201,7 @@ render_loop(struct TMPL_templates* t, struct TMPL_varlist* varlist){ if(t->cursor == loopnode) advance_cursor(t); free(nt); - return 0; + return err; } int @@ -1237,21 +1245,27 @@ render_any(struct TMPL_templates* t, struct TMPL_varlist* varlist){ return err; } -void +int TMPL_render_helper(struct TMPL_templates* t, struct TMPL_varlist* varlist){ - while(t->cursor != NULL && t->jumping == 0){ - render_any(t,varlist); + int err; + while(t->cursor != NULL && t->jumping == 0 && err == 0){ + err = render_any(t,varlist); } + return err; } char* TMPL_render(struct TMPL_templates* t, struct TMPL_varlist* varlist, size_t* size_p){ + int err; if(t->out != NULL){ free_tmpl_buf(t->out); } t->out = alloc_tmpl_buf(); t->cursor = t->roottag; - TMPL_render_helper(t,varlist); + err = TMPL_render_helper(t,varlist); + if(err){ + return NULL; + } char* ret = bstringify(t->out,size_p); return ret; } |
