diff options
| author | Alexander Pickering <alexandermpickering@gmail.com> | 2017-12-22 23:03:44 -0500 |
|---|---|---|
| committer | Alexander Pickering <alexandermpickering@gmail.com> | 2017-12-22 23:03:44 -0500 |
| commit | 3e4c76bf41011d8f40136a4010e9ff331b00b4ea (patch) | |
| tree | 82349a7c9f95b6c95c68daa8176cb42f75f182a9 /ctemplates_i.h | |
| parent | 5926e6122a8eaf70aac25fa7b2c3bf12c7025978 (diff) | |
| download | libctemplates-3e4c76bf41011d8f40136a4010e9ff331b00b4ea.tar.gz libctemplates-3e4c76bf41011d8f40136a4010e9ff331b00b4ea.tar.bz2 libctemplates-3e4c76bf41011d8f40136a4010e9ff331b00b4ea.zip | |
Renamed files
Renamed everything that needed to be rename from libctemplate to
libctemplates
Diffstat (limited to 'ctemplates_i.h')
| -rw-r--r-- | ctemplates_i.h | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/ctemplates_i.h b/ctemplates_i.h new file mode 100644 index 0000000..0e76fc3 --- /dev/null +++ b/ctemplates_i.h @@ -0,0 +1,260 @@ +/* + * C TemplateS Library 0.1 - + * Forked from C Template Library 1.0 by Stephen C. Losen. + * + * Copyright 2017 Alexander M. Pickering Distributed under the terms + * of the GNU General Public License (GPL) + */ + +#ifndef _CTEMPLATE_H +#define _CTEMPLATE_H + + + +#include "fbuf.h" +#include "kmp.h" +#include "hashmap.h" +#include "ctemplates.h" + +#define MAX_TEMPLATE_LENGTH 2147384647 + +/* +typedef struct TMPL_varlist TMPL_varlist; +typedef struct TMPL_loop TMPL_loop; +typedef struct TMPL_fmtlist TMPL_fmtlist; +typedef struct TMPL_fmtlists TMPL_fmtlists; +*/ +#define TAG_NULL_TEXT "" +#define TAG_TEXT_TEXT "" +#define TAG_VAR_TEXT "TMPL_VAR" +#define TAG_IF_TEXT "TMPL_IF" +#define TAG_ELSEIF_TEXT "TMPL_ELSEIF" +#define TAG_ELSE_TEXT "TMPL_ELSE" +#define TAG_LOOP_TEXT "TMPL_LOOP" +#define TAG_BREAK_TEXT "TMPL_BREAK" +#define TAG_CONTINUE_TEXT "TMPL_CONTINUE" +#define TAG_END_TEXT "TMPL_END" + +#define ATTRIBUTE_VARNAME "name=\"" +#define ATTRIBUTE_DEFAULT "default=\"" +#define ATTRIBUTE_VALUE "value=\"" + +#define ERRBUF_HINTLEN 50 + +#define SIZEOF(x) (sizeof(x) / sizeof(x[0])) + +#define TAG_NULL_LENGTH 0 +#define TAG_TEXT_LENGTH 0 +#define TAG_VAR_LENGTH SIZEOF(TAG_VAR_TEXT) +#define TAG_IF_LENGTH SIZEOF(TAG_IF_TEXT) +#define TAG_ELSEIF_LENGTH SIZEOF(TAG_ELSEIF_TEXT) +#define TAG_ELSE_LENGTH SIZEOF(TAG_ELSE_TEXT) +#define TAG_LOOP_LENGTH SIZEOF(TAG_LOOP_TEXT) +#define TAG_BREAK_LENGTH SIZEOF(TAG_BREAK_TEXT) +#define TAG_CONTINUE_LENGTH SIZEOF(TAG_CONTINUE_TEXT) +#define TAG_END_LENGTH SIZEOF(TAG_END_TEXT) + +//I guess it counts the backslash? +#define ATTRIBUTE_VARNAME_LENGTH SIZEOF(ATTRIBUTE_VARNAME) - 1 +#define ATTRIBUTE_DEFAULT_LENGTH SIZEOF(ATTRIBUTE_DEFAULT) - 1 +#define ATTRIBUTE_VALUE_LENGTH SIZEOF(ATTRIBUTE_VALUE) - 1 + +//Define to 0 for slight speedup improvements, no errors +#define DEBUGGING 1 +//Length of error messages +#define ERR_MSG_LEN 500 + +/*The different kind of nodes we can have*/ +enum TMPL_tagtype{ + tag_null = 0,/*Should never show up*/ + tag_text = 1,/*A text sequence*/ + tag_var = 2,/*A variable to replace*/ + tag_if = 3,/*If*/ + tag_elseif = 4,/*Else if*/ + tag_else = 5,/*Else*/ + tag_end = 6,/*end if, end loop*/ + tag_loop = 7,/*Loop*/ + tag_break = 9,/*Break*/ + tag_continue = 10,/*Skip the rest of the loop and go again*/ +}; + +struct TMPL_light_string{ + const char* start; + size_t len; +}; + +enum TMPL_vartype{ + vartype_loop, + vartype_var +}; + + +struct TMPL_varlist{ + map_t map; +}TMPL_varlist; + +struct TMPL_loop{ + struct TMPL_varlist* varlist; + size_t loop_len; + struct TMPL_loop* next; + struct TMPL_loop* tail; +}; + +struct TMPL_varitem{ + enum TMPL_vartype type; + union { + struct TMPL_loop* l; + char* s; + }item; +}; + +/*Holds all the data needed for a single node in a template*/ +struct TMPL_tagnode{ + enum TMPL_tagtype type; + struct TMPL_tagnode* next; + union{ + /*Text*/ + struct{ + const char* start; + size_t len; + }text; + /*Var*/ + struct{ + char* varname; + size_t name_len; + char* defaultval; + size_t default_len; + }var; + + /*If, elseif*/ + struct{ + char* varname; + char* testval; + struct TMPL_tagnode* tbranch; + struct TMPL_tagnode* fbranch; + }ifelse; + + /*Loop*/ + struct{ + char* loopname; + struct TMPL_tagnode* body; + }loop; + + /*Break and Continue*/ + struct{ + int level; + }breakcont; + }TMPL_tag; +}TMPL_tagnode; + +//typedef void (*TMPL_fmtfuncs) (const char*, struct TMPL_buf*); +/* + * TMPL_fmtlist is a list of format functions, which are passed to + * a template. A TMPL_VAR tag can specify a format function for + * outputting the variable with the fmt="fmtname" attribute. + */ +struct TMPL_fmtlist{ + struct TMPL_fmtlist* next; + void* fmtfunc; + char* name; +} TMPL_fmtlist; + +struct TMPL_varlist; +struct TMPL_loop; + +/* + * TMPL_varlist is a variable list of simple variables and/or + * loop variables + */ +//struct TMPL_varlist { + //struct TMPL_varlist *next; [> next variable list on a list <] + //struct TMPL_var *var; [> list of my simple variables <] + //struct TMPL_loop *loop; [> list of my loop variables <] + //struct TMPL_loop *parent; [> my parent loop variable (if any) <] +//}; + +/* TMPL_loop is a loop variable, which is a list of variable lists */ + +//struct TMPL_loop { + //struct TMPL_loop *next; [> next loop variable on a list <] + //const char *name; [> my name <] + //struct TMPL_varlist *varlist; [> list of my variable lists <] + //struct TMPL_varlist *tail; [> tail of "varlist" <] + //struct TMPL_varlist *parent; [> my parent variable list <] +//}; + +/* Holdes all the data needed for a template*/ +struct TMPL_templates{ + struct TMPL_buf* out; + struct TMPL_buf* errout; + struct TMPL_tagnode* roottag; + int linenum; + int error; +} TMPL_templates; + + +struct TMPL_token{ + char* start;//Start of token + char* end;//End of token + enum TMPL_tagtype type;//The type of token + size_t length;//Length of token, should always be end-start + struct TMPL_token* next;//The next token +}TMPL_token; + + + +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 TMPL_free_varlist(struct TMPL_varlist* t); + +struct TMPL_varitem* TMPL_alloc_varitem(); +void TMPL_free_varitem(struct TMPL_varitem* vi); + +struct TMPL_templates* TMPL_alloc_template(char* t); +void TMPL_free_template(struct TMPL_templates* t); + +char* TMPL_render(struct TMPL_templates* t, struct TMPL_varlist* varlist); + +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 |
