aboutsummaryrefslogtreecommitdiff
path: root/ctemplates.h
diff options
context:
space:
mode:
Diffstat (limited to 'ctemplates.h')
-rw-r--r--ctemplates.h258
1 files changed, 231 insertions, 27 deletions
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