aboutsummaryrefslogtreecommitdiff
path: root/src/ctemplates.c
diff options
context:
space:
mode:
authorAlexander Pickering <alexandermpickering@gmail.com>2019-11-21 18:17:18 -0500
committerAlexander Pickering <alexandermpickering@gmail.com>2019-11-21 18:24:30 -0500
commitd917129d502a753f13bd26ecf47a30d31f738fc1 (patch)
treea31bb887c0b27b47939eb377535388b1fea552c2 /src/ctemplates.c
parentd8987084b7aa3c47642af30a87c0673a2df01fd0 (diff)
downloadlibctemplates-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/ctemplates.c')
-rw-r--r--src/ctemplates.c38
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;
}