From 981217b98220f7dc94c70fd6f4b7078ecca6020b Mon Sep 17 00:00:00 2001 From: Alexander Pickering Date: Sat, 13 Oct 2018 19:35:08 -0400 Subject: Allowed spaces to be used in attributes * Added an is_whitespace() function * may have whitespace between * name = "..." * default = "..." * may have whitespace between * name = "..." * value = "..." * may have whitespace between * name = "..." * value = "..." --- ctemplates.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) (limited to 'ctemplates.c') diff --git a/ctemplates.c b/ctemplates.c index 8d4bbd6..aa7c650 100644 --- a/ctemplates.c +++ b/ctemplates.c @@ -62,6 +62,7 @@ void print_ast(struct TMPL_tagnode* root); struct TMPL_token* TMPL_tokenize(char* tmplstr, size_t strlen); struct TMPL_tagnode* alloc_tagnode(void); size_t get_quoted_string(char* start, size_t len); +int is_whitespace(char c); struct TMPL_tagnode* parse_text( struct TMPL_token* head, struct TMPL_buf* errbuf @@ -163,6 +164,7 @@ TMPL_alloc_token(){ ret->next = NULL; return ret; } + /*Frees an allocated token*/ void TMPL_free_token(struct TMPL_token* token){ @@ -492,6 +494,11 @@ get_quoted_string(char* start, size_t len){ return i; } +int +is_whitespace(char c){ + return (c == ' ' || c == '\t' || c == '\n') ? 1 : 0; +} + struct TMPL_tagnode* parse_text(struct TMPL_token* head, struct TMPL_buf* errbuf){ struct TMPL_tagnode* t = alloc_tagnode(); @@ -515,6 +522,18 @@ parse_elseif(struct TMPL_token* head, struct TMPL_buf* errbuf){ char* start_of_attribs = head->start + TAG_ELSEIF_LENGTH; int name_offset = kmp(start_of_attribs,head->length, ATTRIBUTE_VARNAME,ATTRIBUTE_VARNAME_LENGTH); char* start_of_name = start_of_attribs + name_offset + ATTRIBUTE_VARNAME_LENGTH; + while(is_whitespace(*start_of_name)) + start_of_name++; + if(*start_of_name != '='){ + bputs(errbuf,"Parsing error: Expected \"=\" in after name near "); + bputsn(errbuf,head->start, ERR_MSG_LEN); + bputs(errbuf,"\n"); + }else{ + start_of_name++; + } + while(is_whitespace(*start_of_name)) + start_of_name++; + start_of_name++;//consume " size_t name_length = get_quoted_string(start_of_name,head->length); char* name = (char*)malloc(sizeof(char)*name_length); memcpy(name,start_of_name,name_length); @@ -526,6 +545,18 @@ parse_elseif(struct TMPL_token* head, struct TMPL_buf* errbuf){ t->TMPL_tag.ifelse.testval = NULL; }else{ char* start_of_value = start_of_attribs + testval_offset + ATTRIBUTE_VALUE_LENGTH; + while(is_whitespace(*start_of_value)) + start_of_value++; + if(*start_of_value != '='){ + bputs(errbuf,"Parsing error: Expected \"=\" in after value near "); + bputsn(errbuf,head->start,ERR_MSG_LEN); + bputs(errbuf,"\n"); + }else{ + start_of_value++;//consume = + } + while(is_whitespace(*start_of_value)) + start_of_value++; + start_of_value++;//consume " size_t value_length = get_quoted_string(start_of_value,head->length); char* value = (char*)malloc(sizeof(char)*value_length); memcpy(value,start_of_value,value_length); @@ -577,6 +608,18 @@ parse_if(struct TMPL_token* head, struct TMPL_buf* errbuf){ /*Find the name of the varialbe*/ int name_offset = kmp(start_of_attribs,head->length,ATTRIBUTE_VARNAME,ATTRIBUTE_VARNAME_LENGTH); char* start_of_name = start_of_attribs + name_offset + ATTRIBUTE_VARNAME_LENGTH; + while(is_whitespace(*start_of_name)) + start_of_name++; + if(*start_of_name != '='){ + bputs(errbuf,"Parsing error: Expected \"=\" in after name near "); + bputsn(errbuf, head->start, ERR_MSG_LEN); + bputs(errbuf,"\n"); + }else{ + start_of_name++; + } + while(is_whitespace(*start_of_name)) + start_of_name++; + start_of_name++;//consume " size_t name_length = get_quoted_string(start_of_name,head->length); char* name = (char*)malloc(sizeof(char)*name_length); memcpy(name,start_of_name,name_length); @@ -588,6 +631,18 @@ parse_if(struct TMPL_token* head, struct TMPL_buf* errbuf){ t->TMPL_tag.ifelse.testval = NULL; }else{ char* start_of_value = start_of_attribs + testval_offset + ATTRIBUTE_VALUE_LENGTH; + while(is_whitespace(*start_of_value)) + start_of_value++; + if(*start_of_value != '='){ + bputs(errbuf,"Parsing error: Expected \"=\" in after value near "); + bputsn(errbuf,head->start,ERR_MSG_LEN); + bputs(errbuf,"\n"); + }else{ + start_of_value++; + } + while(is_whitespace(*start_of_value)) + start_of_value++; + start_of_value++;//consume " size_t value_length = get_quoted_string(start_of_value,head->length); char* value = (char*)malloc(sizeof(char)*value_length); memcpy(value,start_of_value,value_length); @@ -647,6 +702,18 @@ parse_loop(struct TMPL_token* head, struct TMPL_buf* errbuf){ } if(name_offset >= 0){ char* start_of_name = loop_start + name_offset + ATTRIBUTE_VARNAME_LENGTH; + while(is_whitespace(*start_of_name)) + start_of_name++; + if(*start_of_name != '='){ + bputs(errbuf,"Parsing error: Expected \"=\" in after name near "); + bputsn(errbuf, head->start, ERR_MSG_LEN); + bputs(errbuf,"\n"); + }else{ + start_of_name++;//consume '=' + } + while(is_whitespace(*start_of_name)) + start_of_name++; + start_of_name++;//consume " 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); @@ -681,20 +748,38 @@ parse_loop(struct TMPL_token* head, struct TMPL_buf* errbuf){ return t; } +/*Parses the tokens*/ struct TMPL_tagnode* parse_variable(struct TMPL_token* head, struct TMPL_buf* errbuf){ struct TMPL_tagnode* t = alloc_tagnode(); + /* + ^*/ char* start_of_attribs = head->start + TAG_VAR_LENGTH; + /*Find the length of attributes*/ int attribs_length = head->length - TAG_VAR_LENGTH; + /*Find where the "name" attribute is*/ int in_name = kmp(start_of_attribs,attribs_length,ATTRIBUTE_VARNAME,ATTRIBUTE_VARNAME_LENGTH); + /*Find where the "default" attribute is*/ int in_default = kmp(start_of_attribs,attribs_length,ATTRIBUTE_DEFAULT,ATTRIBUTE_DEFAULT_LENGTH); if(in_name == -1){ - bputs(errbuf,"Parsing error: Could not find \"name\" field in variable near"); + bputs(errbuf,"Parsing error: Could not find \"name\" field in near "); bputsn(errbuf,head->start,ERR_MSG_LEN); bputs(errbuf,"\n"); } if(in_name >= 0){ char* start_of_name = start_of_attribs + in_name + ATTRIBUTE_VARNAME_LENGTH; + while(is_whitespace(*start_of_name)) + start_of_name++; + if(*start_of_name != '='){ + bputs(errbuf,"Parsing error: Expected \"=\" in after name near "); + bputsn(errbuf,head->start, ERR_MSG_LEN); + bputs(errbuf,"\n"); + }else{ + start_of_name++;//consume = + } + while(is_whitespace(*start_of_name)) + start_of_name++; + start_of_name++; //consume " size_t name_size = get_quoted_string(start_of_name,head->length); char* name = (char*)malloc(sizeof(char)*name_size); memcpy(name,start_of_name,name_size); @@ -704,6 +789,18 @@ parse_variable(struct TMPL_token* head, struct TMPL_buf* errbuf){ } if(in_default >= 0){ char* start_of_default = start_of_attribs + in_default + ATTRIBUTE_DEFAULT_LENGTH; + while(is_whitespace(*start_of_default)) + start_of_default++; + if(*start_of_default != '='){ + bputs(errbuf,"Parsing error: Expected \"=\" in after default near "); + bputsn(errbuf,head->start, ERR_MSG_LEN); + bputs(errbuf,"\n"); + }else{ + start_of_default++;//consume = + } + while(is_whitespace(*start_of_default)) + start_of_default++; + start_of_default++; //consume " size_t default_size = get_quoted_string(start_of_default,head->length); char* def = (char*) malloc(sizeof(char)*default_size); def[default_size] = '\0'; -- cgit v1.2.3-70-g09d2