node processing code/macros, and other fixes

This commit is contained in:
Marius Nita 2003-04-15 00:13:03 +00:00
parent 37e2ef05d5
commit 1ab607765c
5 changed files with 95 additions and 31 deletions

View file

@ -3,7 +3,7 @@ LIBS=`pkg-config --libs glib-2.0` -ll
targets = cltest 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 headers = obcl.h
.PHONY: all clean .PHONY: all clean

View file

@ -1,21 +1,4 @@
include "meh.conf"; foo "marius", 23;
include "bummy.conf"; foo "kyle", 15;
foo "soren", 7;
section mouse { bah "blef","bummy";
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";
}

View file

@ -1,9 +1,32 @@
#include "obcl.h" #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() int main()
{ {
GList *lst = cl_parse("foo.conf"); GList *lst = cl_parse("foo.conf");
cl_tree_print(lst,0); /* cl_tree_print(lst,0); */
cl_tree_free(lst); /* 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; return 0;
} }

View file

@ -57,24 +57,24 @@ void cl_tree_print(GList *tree, int depth)
switch(tmp->type) { switch(tmp->type) {
case CL_ID: case CL_ID:
printf("--ID-- %s\n", tmp->u.str); printf("[ID] '%s'\n", tmp->u.str);
break; break;
case CL_STR: case CL_STR:
printf("--STR-- %s\n", tmp->u.str); printf("[STR] '%s'\n", tmp->u.str);
break; break;
case CL_NUM: case CL_NUM:
printf("--NUM-- %.2f\n", tmp->u.num); printf("[NUM] %.2f\n", tmp->u.num);
break; break;
case CL_LIST: 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); cl_tree_print(tmp->u.lb.list, depth+2);
break; break;
case CL_BLOCK: 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); cl_tree_print(tmp->u.lb.block, depth+2);
break; break;
case CL_LISTBLOCK: 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); cl_tree_print(tmp->u.lb.list, depth+2);
printf("\n"); printf("\n");
cl_tree_print(tmp->u.lb.block, depth+2); cl_tree_print(tmp->u.lb.block, depth+2);

View file

@ -4,6 +4,31 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <glib.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 { typedef enum CLNodeType {
CL_ID, CL_ID,
@ -16,6 +41,7 @@ typedef enum CLNodeType {
typedef struct CLNode { typedef struct CLNode {
CLNodeType type; CLNodeType type;
int lineno;
union { union {
struct { struct {
gchar *id; gchar *id;
@ -28,12 +54,44 @@ typedef struct CLNode {
} 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(gchar *file);
GList *cl_parse_fh(FILE *file); GList *cl_parse_fh(FILE *file);
void cl_tree_free(GList *tree); void cl_tree_free(GList *tree);
void cl_tree_print(GList *tree, int depth); 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 */ #endif /* __obcl_h */