Initial revision
[egate.git] / fml / fmlp.h
1 /*
2  * FML interpreter. Europagate, 1995
3  *
4  * $Log: fmlp.h,v $
5  * Revision 1.1  1995/02/06 13:48:09  adam
6  * Initial revision
7  *
8  */
9
10 #include "fml.h"
11
12 #define FML_MAX_TOKEN 2048
13
14 #define FML_ATOM_BUF 12
15
16 struct fml_node {
17     void *p[2];
18     unsigned is_atom : 1;
19 };
20
21 struct fml_atom {
22     struct fml_atom *next;
23     char buf[FML_ATOM_BUF];
24 };
25
26 struct fml_node *fml_tokenize (Fml fml);
27 struct fml_node *fml_node_alloc (Fml fml);
28 struct fml_atom *fml_atom_alloc (Fml fml, char *str);
29 int fml_atom_str (struct fml_atom *a, char *str);
30 void fml_atom_strx (struct fml_atom *a, char *str, int max);
31 int fml_atom_val (struct fml_atom *a);
32 struct fml_node *fml_mk_list (Fml fml, struct fml_node *fn);
33 void fml_node_delete (Fml fml, struct fml_node *fn);
34 struct fml_node *fml_node_copy (Fml fml, struct fml_node *fn);
35
36 struct token {
37     int             kind;
38     int             after_char;
39     int             maxbuf;
40     int             offset;
41     char            *atombuf;
42     char            *tokenbuf;
43
44     int             escape_char;
45
46     struct          fml_node *sub;
47     struct          fml_atom *atom;
48     char            sbuf[FML_ATOM_BUF*4];
49 };
50
51 struct fml_sym_info {
52     int kind;
53     struct fml_node *args;
54     struct fml_node *body;
55     struct fml_node *(*binary)(Fml fml, struct fml_node *l,
56                                struct fml_node *r);
57     struct fml_node *(*prefix)(Fml fml, struct fml_node **lp,
58                                struct token *tp);
59 };
60
61 struct fml_sym_tab *fml_sym_open (void);
62 void fml_sym_close (struct fml_sym_tab **tabp);
63 struct fml_sym_info *fml_sym_add (struct fml_sym_tab *tab, const char *s);
64 struct fml_sym_info *fml_sym_add_local (struct fml_sym_tab *tab,const char *s);
65
66 struct fml_sym_info *fml_sym_lookup (struct fml_sym_tab *tab, const char *s);
67 struct fml_sym_info *fml_sym_lookup_local (struct fml_sym_tab *tab,
68                                            const char *s);
69 void fml_sym_push (struct fml_sym_tab *tab);
70 void fml_sym_pop (struct fml_sym_tab *tab, void(*ph)(struct fml_sym_info *i));
71
72 void fml_pr_list (struct fml_node *p);
73
74 #define FML_FUNC     1
75 #define FML_IF       2
76 #define FML_ELSE     3
77 #define FML_PREFIX   4
78 #define FML_VAR      5
79 #define FML_FOREACH  6
80 #define FML_RETURN   7
81 #define FML_SET      8
82 #define FML_WHILE    9
83 #define FML_CBINARY 10
84 #define FML_CPREFIX 11
85 #define FML_BINARY  12
86 #define FML_BIN     13
87
88