all repos — openbox @ 1ab607765c231924f642d27aa3ac3b9294844704

openbox fork - make it a bit more like ryudo

node processing code/macros, and other fixes
Marius Nita marius@cs.pdx.edu
commit

1ab607765c231924f642d27aa3ac3b9294844704

parent

37e2ef05d5e0ae2edec6f51a6c52f701fd0ce9fd

5 files changed, 95 insertions(+), 31 deletions(-)

jump to
M obcl/Makefileobcl/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
M obcl/foo.confobcl/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";
M obcl/main.cobcl/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; }
M obcl/obcl.cobcl/obcl.c

@@ -57,24 +57,24 @@ tmpd = 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);
M obcl/obcl.hobcl/obcl.h

@@ -4,6 +4,31 @@

#include <stdio.h> #include <stdlib.h> #include <glib.h> +#include <stdarg.h> + +/* 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 @@ } CLNodeType;

typedef struct CLNode { CLNodeType type; + int lineno; union { struct { gchar *id;

@@ -28,12 +54,44 @@ } u;

} 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 */