From: Marius Nita Date: Tue, 15 Apr 2003 00:13:03 +0000 (+0000) Subject: node processing code/macros, and other fixes X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=1ab607765c231924f642d27aa3ac3b9294844704;p=chaz%2Fopenbox node processing code/macros, and other fixes --- diff --git a/obcl/Makefile b/obcl/Makefile index 03c3a5dc..1284a735 100644 --- a/obcl/Makefile +++ b/obcl/Makefile @@ -3,7 +3,7 @@ LIBS=`pkg-config --libs glib-2.0` -ll targets = cltest -sources = obcl.c main.c parse.c lex.c +sources = obcl.c main.c parse.c lex.c process.c headers = obcl.h .PHONY: all clean diff --git a/obcl/foo.conf b/obcl/foo.conf index 648bb01c..b1fc57f4 100644 --- a/obcl/foo.conf +++ b/obcl/foo.conf @@ -1,21 +1,4 @@ -include "meh.conf"; -include "bummy.conf"; - -section mouse { - mbind titlebar, frame { - event click; - button middle; - action lower; - } - - mbind frame { - event click; - button right; - action launch_nukes; - } -} - -section theme { - theme "merry"; - font "tahoma-12 bold"; -} +foo "marius", 23; +foo "kyle", 15; +foo "soren", 7; +bah "blef","bummy"; diff --git a/obcl/main.c b/obcl/main.c index 9ae109a9..a38b4cf6 100644 --- a/obcl/main.c +++ b/obcl/main.c @@ -1,9 +1,32 @@ #include "obcl.h" +void process_foo(CLNode *node) +{ + if (CL_IS_NODE(node)) { + printf("foo name: %s\n" + "foo age: %.2f\n", + CL_STRVAL(CL_LIST_NTH(node,0)), + CL_NUMVAL(CL_LIST_NTH(node,1))); + } +} + +void process_bah(CLNode *node) +{ + printf("handling bah\n"); +} + int main() { GList *lst = cl_parse("foo.conf"); - cl_tree_print(lst,0); - cl_tree_free(lst); +/* cl_tree_print(lst,0); */ +/* cl_tree_free(lst); */ + + + CLProc *p = cl_proc_new(); + cl_proc_add_handler_func(p, "foo", process_foo); + cl_proc_add_handler_func(p, "bah", process_bah); + + cl_process(lst, p); + return 0; } diff --git a/obcl/obcl.c b/obcl/obcl.c index a4b58eec..408a67ce 100644 --- a/obcl/obcl.c +++ b/obcl/obcl.c @@ -57,24 +57,24 @@ void cl_tree_print(GList *tree, int depth) switch(tmp->type) { case CL_ID: - printf("--ID-- %s\n", tmp->u.str); + printf("[ID] '%s'\n", tmp->u.str); break; case CL_STR: - printf("--STR-- %s\n", tmp->u.str); + printf("[STR] '%s'\n", tmp->u.str); break; case CL_NUM: - printf("--NUM-- %.2f\n", tmp->u.num); + printf("[NUM] %.2f\n", tmp->u.num); break; case CL_LIST: - printf("--LIST-- %s\n", tmp->u.lb.id); + printf("[LIST] '%s'\n", tmp->u.lb.id); cl_tree_print(tmp->u.lb.list, depth+2); break; case CL_BLOCK: - printf("--BLOCK-- %s\n", tmp->u.lb.id); + printf("[BLOCK] '%s'\n", tmp->u.lb.id); cl_tree_print(tmp->u.lb.block, depth+2); break; case CL_LISTBLOCK: - printf("--LISTBLOCK-- %s\n", tmp->u.lb.id); + printf("[LISTBLOCK] %s\n", tmp->u.lb.id); cl_tree_print(tmp->u.lb.list, depth+2); printf("\n"); cl_tree_print(tmp->u.lb.block, depth+2); diff --git a/obcl/obcl.h b/obcl/obcl.h index 1002964d..37a04161 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,44 @@ 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_set_default(CLProc *proc, CLProcHandler *pf); +void cl_proc_register_keywords(CLProc *proc, ...); +void cl_process(GList *tree, CLProc *proc); #endif /* __obcl_h */