all repos — openbox @ 70f63e4c9e6d47a51345d19f40ebf9aebab5553e

openbox fork - make it a bit more like ryudo

obcl/obcl.h (raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#ifndef __obcl_h
#define __obcl_h

#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,
    CL_NUM,
    CL_STR,
    CL_LIST,
    CL_BLOCK,
    CL_LISTBLOCK
} CLNodeType;

typedef struct CLNode {
    CLNodeType type;
    int lineno;
    union {
        struct {
            gchar *id;
            GList *list;
            GList *block;
        } lb;
        double num;
        gchar *str;
    } 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);

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