X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=obcl%2Fobcl.h;h=78415c1bd51a27ef0b633dd920592ccaf47e86cb;hb=6a237b91bcbc2c25f2bf8d368535430ba6a1bf26;hp=1002964d76a75e5235ea17e58971b97ed415817f;hpb=99fd65baf0b14356812ddc6881fd3fe2b996bd3b;p=chaz%2Fopenbox diff --git a/obcl/obcl.h b/obcl/obcl.h index 1002964d..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,12 +54,46 @@ typedef struct CLNode { } CLNode; +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_tree_free(GList *tree); void cl_tree_print(GList *tree, int depth); -void cl_tree_process(GList *tree); +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 */