6c0232672c62dd34627cd7d699dbc074bdd165c2
[egate.git] / fml / fmlp.h
1 /*
2  * FML interpreter. Europagate, 1995
3  *
4  * $Log: fmlp.h,v $
5  * Revision 1.12  1995/03/02 08:06:05  adam
6  * Fml function strsub implemented. New test files marc[45].fml.
7  * New test options in fmltest.
8  *
9  * Revision 1.11  1995/02/27  09:01:21  adam
10  * Regular expression support. Argument passing by name option. New FML
11  * function strlen.
12  *
13  * Revision 1.10  1995/02/23  08:32:06  adam
14  * Changed header.
15  *
16  * Revision 1.8  1995/02/10  18:15:52  adam
17  * FML function 'strcmp' implemented. This function can be used to
18  * test for existence of MARC fields.
19  *
20  * Revision 1.7  1995/02/10  15:50:56  adam
21  * MARC interface implemented. Minor bugs fixed. fmltest can
22  * be used to format single MARC records. New function '\list'
23  * implemented.
24  *
25  * Revision 1.6  1995/02/09  16:06:07  adam
26  * FML can be called from the outside multiple times by the functions:
27  * fml_exec_call and fml_exec_call_str.
28  * An interactive parameter (-i) to fmltest starts a shell-like
29  * interface to FML by using the fml_exec_call_str function.
30  *
31  * Revision 1.5  1995/02/09  14:37:19  adam
32  * Removed .depend from cvs. Removed function fml_mk_list.
33  *
34  * Revision 1.4  1995/02/09  14:33:37  adam
35  * Split source fml.c and define relevant build-in functions in separate
36  * files. New operators mult, div, not, llen implemented.
37  *
38  * Revision 1.3  1995/02/09  13:07:15  adam
39  * Nodes are freed now. Many bugs fixed.
40  *
41  * Revision 1.2  1995/02/07  16:09:23  adam
42  * The \ character is no longer INCLUDED when terminating a token.
43  * Major changes in tokenization routines. Bug fixes in expressions
44  * with lists (fml_sub0).
45  *
46  * Revision 1.1.1.1  1995/02/06  13:48:10  adam
47  * First version of the FML interpreter. It's slow and memory isn't
48  * freed properly. In particular, the FML nodes aren't released yet.
49  *
50  */
51
52 #include <fml.h>
53
54 #ifndef FMLP_H
55 #define FMLP_H
56
57 #define FML_MAX_TOKEN 2048
58
59 #define FML_ATOM_BUF 12
60
61 struct fml_node {
62     void *p[2];
63     unsigned is_atom : 1;
64 };
65
66 struct fml_atom {
67     struct fml_atom *next;
68     char buf[FML_ATOM_BUF];
69 };
70
71 struct fml_node *fml_tokenize (Fml fml);
72 struct fml_node *fml_node_alloc (Fml fml);
73 struct fml_atom *fml_atom_alloc (Fml fml, char *str);
74 int fml_atom_str (struct fml_atom *a, char *str);
75 int fml_atom_len (struct fml_atom *a);
76 void fml_atom_strx (struct fml_atom *a, char *str, int max);
77 int fml_atom_val (struct fml_atom *a);
78 void fml_node_delete (Fml fml, struct fml_node *fn);
79 struct fml_node *fml_node_copy (Fml fml, struct fml_node *fn);
80 struct fml_node *fml_mk_node_val (Fml fml, int val);
81 int fml_atom_cmp (Fml fml, struct fml_atom *a1, struct fml_atom *a2);
82 struct fml_atom *fml_atom_strsub (Fml fml, struct fml_atom *a, int o, int l);
83
84 struct token {
85     int             kind;
86     int             separate;
87     int             maxbuf;
88     int             offset;
89     char            *atombuf;
90     char            *tokenbuf;
91
92     int             escape_char;
93
94     struct          fml_node *sub;
95     struct          fml_atom *atom;
96     char            sbuf[FML_ATOM_BUF*4];
97 };
98
99 struct fml_sym_info {
100     int kind;
101     struct fml_node *args;
102     struct fml_node *body;
103     struct fml_node *(*binary)(Fml fml, struct fml_node *l,
104                                struct fml_node *r);
105     struct fml_node *(*prefix)(Fml fml, struct fml_node **lp,
106                                struct token *tp);
107 };
108
109 struct fml_sym_tab *fml_sym_open (void);
110 void fml_sym_close (struct fml_sym_tab **tabp);
111 struct fml_sym_info *fml_sym_add (struct fml_sym_tab *tab, const char *s);
112 struct fml_sym_info *fml_sym_add_local (struct fml_sym_tab *tab,const char *s);
113
114 struct fml_sym_info *fml_sym_lookup (struct fml_sym_tab *tab, const char *s);
115 struct fml_sym_info *fml_sym_lookup_local (struct fml_sym_tab *tab,
116                                            const char *s);
117 void fml_sym_push (struct fml_sym_tab *tab);
118 void fml_sym_pop (struct fml_sym_tab *tab, void(*ph)(struct fml_sym_info *i));
119
120 void fml_pr_list (struct fml_node *p);
121 void fml_node_stat (Fml fml);
122
123 #define FML_FUNC     1
124 #define FML_IF       2
125 #define FML_ELSE     3
126 #define FML_PREFIX   4
127 #define FML_VAR      5
128 #define FML_FOREACH  6
129 #define FML_RETURN   7
130 #define FML_SET      8
131 #define FML_WHILE    9
132 #define FML_CBINARY 10
133 #define FML_CPREFIX 11
134 #define FML_BINARY  12
135 #define FML_BIN     13
136 #define FML_CODE    14
137
138 void fml_rel_init (Fml fml);
139 void fml_arit_init (Fml fml);
140 void fml_list_init (Fml fml);
141 void fml_str_init (Fml fml);
142 void fml_lr_values (Fml fml, struct fml_node *l, int *left_val,
143                            struct fml_node *r, int *right_val);
144 void fml_cmd_lex (struct fml_node **np, struct token *tp);
145 void fml_cmd_lex_s (struct fml_node **np, struct token *tp, int esc_stop);
146 void fml_init_token (struct token *tp, Fml fml);
147 void fml_del_token (struct token *tp, Fml fml);
148 struct fml_node *fml_expr_term (Fml fml, struct fml_node **lp, 
149                                 struct token *tp);
150 struct fml_node *fml_exec_group (struct fml_node *list, Fml fml);
151 #endif