summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Nita <marius@cs.pdx.edu>2003-04-15 00:13:03 +0000
committerMarius Nita <marius@cs.pdx.edu>2003-04-15 00:13:03 +0000
commit1ab607765c231924f642d27aa3ac3b9294844704 (patch)
tree0de67f67b98f368df2bc74e943c75a387a290a87
parent37e2ef05d5e0ae2edec6f51a6c52f701fd0ce9fd (diff)
node processing code/macros, and other fixes
-rw-r--r--obcl/Makefile2
-rw-r--r--obcl/foo.conf25
-rw-r--r--obcl/main.c27
-rw-r--r--obcl/obcl.c12
-rw-r--r--obcl/obcl.h60
5 files changed, 95 insertions, 31 deletions
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 <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 @@ 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 */