aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Pickering <alexandermpickering@gmail.com>2017-12-29 01:21:32 -0500
committerAlexander Pickering <alexandermpickering@gmail.com>2017-12-29 01:21:32 -0500
commite81f26718e5c95de6140631652f1319857602ff8 (patch)
treefee2cc5f7d0c97c3d92309144f8022ad053f7d98
parent1d1cb9e3d003f23bddce0a744ffc60a7e82bf23c (diff)
downloadlibctemplates-e81f26718e5c95de6140631652f1319857602ff8.tar.gz
libctemplates-e81f26718e5c95de6140631652f1319857602ff8.tar.bz2
libctemplates-e81f26718e5c95de6140631652f1319857602ff8.zip
Fixed bugfixes
Fixed bug with tokenizing, also fixed a bug with parsing loops also fixed a bug with adding vars to a varlist
-rw-r--r--ctemplates.c39
-rw-r--r--ctemplates.h48
2 files changed, 31 insertions, 56 deletions
diff --git a/ctemplates.c b/ctemplates.c
index a470ebc..fb32b67 100644
--- a/ctemplates.c
+++ b/ctemplates.c
@@ -286,7 +286,8 @@ scan_text(char* start, size_t strlen, size_t* consumed){
enum TMPL_tagtype type = tag_null;
char* cursor = start;
while(type == tag_null){
- cursor = (char*)memchr(cursor,'<',strlen);
+ int left = strlen - (cursor - start);
+ cursor = (char*)memchr(cursor,'<',left);
if(cursor == NULL){
cursor = start + (strlen > 0 ? strlen : 1);
break;
@@ -353,6 +354,7 @@ TMPL_add_var_to_varlist(struct TMPL_varlist* t, char* varname, char* var){
vi->type = vartype_var;
size_t slen = strlen(var);
vi->item.s = (char*)malloc(sizeof(char)*slen);
+ vi->item.s[slen] = '\0';
memcpy(vi->item.s,var,slen);
int succ = hashmap_put(t->map,varname,vi);
if(succ != MAP_OK){
@@ -426,38 +428,38 @@ print_ast(struct TMPL_tagnode* root){
}
struct TMPL_token*
-TMPL_tokenize(char* tmplstr, size_t strlen){
- if(strlen == 0) return NULL;
+TMPL_tokenize(char* tmplstr, size_t m_strlen){
+ if(m_strlen == 0) return NULL;
struct TMPL_token* first;
char* textcursor = tmplstr;
size_t newlength;
enum TMPL_tagtype ttype;
- ttype = starts_with_token(tmplstr+1,strlen);
- if(ttype == tag_null){
- first = scan_text(textcursor,strlen,&newlength);
- first->type = tag_text;
- }else{
- first = scan_tag(textcursor,strlen,&newlength);
+ ttype = starts_with_token(tmplstr+1,m_strlen);
+ if(*tmplstr == '<' && ttype != tag_null){
+ first = scan_tag(textcursor,m_strlen,&newlength);
first->type = ttype;
+ }else{
+ first = scan_text(textcursor,m_strlen,&newlength);
+ first->type = tag_text;
}
textcursor += newlength;
first->end = textcursor;
first->length = newlength;
- strlen -= newlength;
+ m_strlen -= newlength;
struct TMPL_token* tokencursor = first;
struct TMPL_token* newnode;
while(*textcursor != '\0'){
- ttype = starts_with_token(textcursor+1,strlen);
+ ttype = starts_with_token(textcursor+1,m_strlen);
if(ttype == tag_null){
- newnode = scan_text(textcursor,strlen,&newlength);
+ newnode = scan_text(textcursor,m_strlen,&newlength);
newnode->type = tag_text;
}else{
- newnode = scan_tag(textcursor,strlen,&newlength);
+ newnode = scan_tag(textcursor,m_strlen,&newlength);
newnode->type = ttype;
}
tokencursor->next = newnode;
textcursor += newlength;
- strlen -= newlength;
+ m_strlen -= newlength;
tokencursor = newnode;
}
return first;
@@ -639,6 +641,7 @@ parse_loop(struct TMPL_token* head, struct TMPL_buf* errbuf){
char* start_of_name = loop_start + name_offset + ATTRIBUTE_VARNAME_LENGTH;
size_t name_size = get_quoted_string(start_of_name,head->length);
char* loopname = (char*)malloc(sizeof(char)*name_size);
+ memcpy(loopname,start_of_name,name_size);
loopname[name_size] = '\0';
t->TMPL_tag.loop.loopname = loopname;
@@ -782,6 +785,7 @@ parse(struct TMPL_token* head, struct TMPL_buf* errbuf){
if(head == NULL){
return NULL;
}
+ printf("Parsing token of type: %d\n",head->type);
switch(head->type){
case tag_text:
root = parse_text(head,errbuf);
@@ -805,6 +809,7 @@ parse(struct TMPL_token* head, struct TMPL_buf* errbuf){
root = NULL;
break;
default:
+ printf("Hit token of type: %d, exiting\n", head->type);
exit(-1);
break;
}
@@ -826,9 +831,15 @@ compile(char* tmplstr){
struct TMPL_templates* ret = alloc_templates();
ret->out = alloc_tmpl_buf();
ret->errout = alloc_tmpl_buf();
+ printf("About to do hard things\n");
struct TMPL_token* tokens = TMPL_tokenize(tmplstr,slen);
+ print_tokens(tokens);
+ printf("Done tokenizeing\n");
struct TMPL_tagnode* ast = parse(tokens,ret->errout);
+ printf("Done making ast\n");
+ print_ast(ast);
if(ast == NULL){
+ printf("Failed to compile\n");
}else{
ret->roottag = ast;
}
diff --git a/ctemplates.h b/ctemplates.h
index e0e4a63..3dba429 100644
--- a/ctemplates.h
+++ b/ctemplates.h
@@ -9,11 +9,9 @@
#ifndef _CTEMPLATE_H
#define _CTEMPLATE_H
-
#include "fbuf.h"
#include "kmp.h"
#include "hashmap.h"
-#include "ctemplates.h"
#define MAX_TEMPLATE_LENGTH 2147384647
@@ -176,44 +174,11 @@ struct TMPL_token{
struct TMPL_token* next;//The next token
}TMPL_token;
+void TMPL_add_var_to_varlist(struct TMPL_varlist* vl, char* name, char* value);
+void TMPL_add_loop_to_varlist(struct TMPL_varlist* vl, char* name, struct TMPL_loop* loop);
+void TMPL_add_varlist_to_loop(struct TMPL_loop* l, struct TMPL_varlist* vl);
-typedef void (*TMPL_fmtfunc) (const char *, FILE *);
-
-/*
-
-TMPL_varlist *TMPL_add_var(TMPL_varlist *varlist,
- const char *varname1, const char *value1, ... , 0);
-*/
-
-//TMPL_varlist *TMPL_add_var(TMPL_varlist *varlist, ...);
-extern struct TMPL_varlist* TMPL_add_var(struct TMPL_varlist* varlist, ...);
-
-/*TMPL_varlist *TMPL_add_loop(TMPL_varlist *varlist,
- const char *name, TMPL_loop *loop);
- */
-extern struct TMPL_varlist* TMPL_add_loop(struct TMPL_varlist* varlist,
- const char* name, struct TMPL_loop* loop);
-
-
-//TMPL_loop *TMPL_add_varlist(TMPL_loop *loop, TMPL_varlist *varlist);
-struct TMPL_loop* TMPL_add_varlist(struct TMPL_loop* loop, struct TMPL_varlist* varlist);
-
-//void TMPL_free_varlist(TMPL_varlist *varlist);
-void TMPL_free_varlist(struct TMPL_varlist* varlist);
-
-//TMPL_fmtlist *TMPL_add_fmt(TMPL_fmtlist *fmtlist,
- //const char *name, TMPL_fmtfunc fmtfunc);
-struct TMPL_fmtlist* TMPL_add_fmt(struct TMPL_fmtlist* fmtlist,
- const char* name, void* fmtfunc);
-
-void TMPL_free_fmtlist(struct TMPL_fmtlist* fmtlist);
-
-/*int TMPL_write(const char *filename, const char *tmplstr,
- const TMPL_fmtlist *fmtlist, const TMPL_varlist *varlist,
- FILE *out, FILE *errout);
-*/
-
struct TMPL_varlist* TMPL_alloc_varlist(void);
void TMPL_free_varlist(struct TMPL_varlist* t);
@@ -223,13 +188,12 @@ void TMPL_free_varitem(struct TMPL_varitem* vi);
struct TMPL_templates* TMPL_alloc_template(char* t);
void TMPL_free_template(struct TMPL_templates* t);
+struct TMPL_loop* TMPL_alloc_loop(void);
+void TMPL_free_loop(struct TMPL_loop* tl);
+
char* TMPL_render(struct TMPL_templates* t, struct TMPL_varlist* varlist, size_t* size_p);
struct TMPL_tagnode* TMPL_alloc_tagnode(enum TMPL_tagtype);
void TMPL_free_tagnode(struct TMPL_tagnode* tn);
-/* TODO: Remove this after testing is done */
-struct TMPL_token* TMPL_tokenize(char* tmplstr, size_t strlen);
-
-
#endif