diff options
| author | Alexander Pickering <alexandermpickering@gmail.com> | 2017-12-28 00:49:06 -0500 |
|---|---|---|
| committer | Alexander Pickering <alexandermpickering@gmail.com> | 2017-12-28 00:49:06 -0500 |
| commit | 25dbc260962154cc07fa6e131d096bdcf55a6693 (patch) | |
| tree | 6f718f6cd17633cf4c358d445af4a2da3897ca89 | |
| parent | a24dd899cea722ad83839c8adab6b5a1b401868c (diff) | |
| download | libctemplates-25dbc260962154cc07fa6e131d096bdcf55a6693.tar.gz libctemplates-25dbc260962154cc07fa6e131d096bdcf55a6693.tar.bz2 libctemplates-25dbc260962154cc07fa6e131d096bdcf55a6693.zip | |
Made ctemplates more like a library
Combined ctemplates.h and ctemplates_i.h into a single file,
also included all header files as things to be installed in a library
| -rw-r--r-- | Makefile | 3 | ||||
| -rw-r--r-- | ctemplates.h | 258 | ||||
| -rw-r--r-- | ctemplates_i.h | 26 |
3 files changed, 233 insertions, 54 deletions
@@ -26,4 +26,5 @@ test: install: $(LIBNAME) cp $(LIBNAME) /usr/local/lib - cp ctemplates.h /usr/local/include/ + mkdir /usr/local/include/ctemplates + cp *.h /usr/local/include/ctemplates/ diff --git a/ctemplates.h b/ctemplates.h index 4479141..0e76fc3 100644 --- a/ctemplates.h +++ b/ctemplates.h @@ -9,48 +9,252 @@ #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_varlist; -struct TMPL_loop; +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); -/*Things to do with varlists*/ -extern struct TMPL_varlist* TMPL_alloc_varlist(); -extern struct TMPL_loop* TMPL_alloc_loop(); -extern void TMPL_add_var_to_varlist( - struct TMPL_varlist* t, - char* varname, - char* value - ); -extern void TMPL_add_loop_to_varlist( - struct TMPL_varlist* t, - char* name, - struct TMPL_loop* l - ); -extern void TMPL_add_varlist_to_loop( - struct TMPL_loop* l, - struct TMPL_varlist* t - ); - -extern void TMPL_free_varlist(struct TMPL_varlist* t); -extern void TMPL_free_loop(struct TMPL_loop* l); +/*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); -extern struct TMPL_templates* TMPL_alloc_template(char* t); -extern void TMPL_free_template(struct TMPL_templates* t); +char* TMPL_render(struct TMPL_templates* t, struct TMPL_varlist* varlist); -extern 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); -extern char* TMPL_get_error(struct TMPL_templates* t); +/* TODO: Remove this after testing is done */ +struct TMPL_token* TMPL_tokenize(char* tmplstr, size_t strlen); #endif diff --git a/ctemplates_i.h b/ctemplates_i.h index 0e76fc3..767c1c2 100644 --- a/ctemplates_i.h +++ b/ctemplates_i.h @@ -10,11 +10,9 @@ #define _CTEMPLATE_H - #include "fbuf.h" #include "kmp.h" #include "hashmap.h" -#include "ctemplates.h" #define MAX_TEMPLATE_LENGTH 2147384647 @@ -159,30 +157,6 @@ struct TMPL_fmtlist{ 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; |
