aboutsummaryrefslogtreecommitdiff
path: root/src/ctemplates.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ctemplates.c')
-rw-r--r--src/ctemplates.c44
1 files changed, 32 insertions, 12 deletions
diff --git a/src/ctemplates.c b/src/ctemplates.c
index 559733f..ae2ed2a 100644
--- a/src/ctemplates.c
+++ b/src/ctemplates.c
@@ -139,7 +139,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
);
@@ -1065,7 +1065,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;
@@ -1078,7 +1079,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;
@@ -1091,7 +1092,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;
@@ -1101,7 +1102,7 @@ render_if(struct TMPL_templates* t, struct TMPL_varlist* varlist){
}
free(nt);
advance_cursor(t);
- return 0;
+ return err;
}
/*Exactly the same thing as if*/
@@ -1150,8 +1151,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));
@@ -1183,7 +1191,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;
@@ -1204,7 +1212,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
@@ -1248,21 +1256,33 @@ 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;
+ /*Reset the output buffer*/
if(t->out != NULL){
free_tmpl_buf(t->out);
}
+ /*Reset the error buffer, if needed*/
+ if(t->errout != NULL && t->errout->total_len > 0){
+ free_tmpl_buf(t->errout);
+ t->errout = alloc_tmpl_buf();
+ }
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;
}