X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=obcl%2Fobcl.h;h=78415c1bd51a27ef0b633dd920592ccaf47e86cb;hb=6a237b91bcbc2c25f2bf8d368535430ba6a1bf26;hp=a940e89dbd5b257cbbb0f5d70291458916c57818;hpb=7aae14e9b83242c2778e57c069fb8f299b8172f3;p=chaz%2Fopenbox diff --git a/obcl/obcl.h b/obcl/obcl.h index a940e89d..78415c1b 100644 --- a/obcl/obcl.h +++ b/obcl/obcl.h @@ -4,6 +4,31 @@ #include #include #include +#include + +/* TEH MACROS FROM MOUNT DOOM */ + +#define CL_IS_NODE(X) \ + (((CLNode*)(X))->type == CL_LIST || \ + ((CLNode*)(X))->type == CL_BLOCK || \ + ((CLNode*)(X))->type == CL_LISTBLOCK) +#define CL_NODE(X) ((CLNode*)(X)) +#define CL_ID(X) (((CLNode*)(X))->u.lb.id) +#define CL_LIST(X) (((CLNode*)(X))->u.lb.list) +#define CL_BLOCK(X) (((CLNode*)(X))->u.lb.block) +#define CL_NUMVAL(X) (((CLNode*)(X))->u.num) +#define CL_STRVAL(X) (((CLNode*)(X))->u.str) +#define CL_LINE(X) (((CLNode*)(X))->lineno) + +#define CL_ASSERT_NODE(X) \ + g_assert(CL_IS_NODE(X)) +#define CL_ASSERT_NUM(X) \ + g_assert(((CLNode*)(X))->type == CL_NUM) +#define CL_ASSERT_STR(X) \ + g_assert(((CLNode*)(X))->type == CL_STR) + +#define CL_LIST_NTH(X,Y)\ + CL_NODE(g_list_nth(CL_LIST(X),(Y))->data) typedef enum CLNodeType { CL_ID, @@ -16,6 +41,7 @@ typedef enum CLNodeType { typedef struct CLNode { CLNodeType type; + int lineno; union { struct { gchar *id; @@ -28,11 +54,46 @@ typedef struct CLNode { } CLNode; -void free_cl_tree(GList *tree); +typedef void (*CLProcFunc)(CLNode *); + +struct CLProcHandler; + +typedef struct CLProc { + GHashTable *table; + struct CLProcHandler *default_h; +} CLProc; + +typedef enum CLProcHandlerType { + CLPROC_FUNC, + CLPROC_PROC +} CLProcHandlerType; + +typedef struct CLProcHandler { + CLProcHandlerType type; + union { + CLProcFunc func; + CLProc *proc; + } u; +} CLProcHandler; + GList *cl_parse(gchar *file); GList *cl_parse_fh(FILE *file); -void cl_print_tree(GList *tree, int depth); -GList *parse_file(FILE *fh); +void cl_tree_free(GList *tree); +void cl_tree_print(GList *tree, int depth); + +CLProcHandler *cl_proc_handler_new_func(CLProcFunc f); +CLProcHandler *cl_proc_handler_new_proc(CLProc *cp); +CLProc *cl_proc_new(void); +void cl_proc_free(CLProc *proc); +void cl_proc_add_handler(CLProc *proc, gchar *str, + CLProcHandler *handler); +void cl_proc_add_handler_func(CLProc *proc, gchar *str, + CLProcFunc func); +void cl_proc_add_handler_proc(CLProc *proc, gchar *str, + CLProc *hproc); +void cl_proc_set_default(CLProc *proc, CLProcHandler *pf); +void cl_proc_register_keywords(CLProc *proc, ...); +void cl_process(GList *tree, CLProc *proc); #endif /* __obcl_h */