Changed header.
[egate.git] / fml / fmlrel.c
1 /*
2  * FML interpreter. Europagate, 1995
3  *
4  * $Log: fmlrel.c,v $
5  * Revision 1.3  1995/02/23 08:32:06  adam
6  * Changed header.
7  *
8  * Revision 1.1  1995/02/09  14:33:37  adam
9  * Split source fml.c and define relevant build-in functions in separate
10  * files. New operators mult, div, not, llen implemented.
11  *
12  */
13
14 #include <assert.h>
15 #include <stdlib.h>
16 #include <stdio.h>
17
18 #include "fmlp.h"
19
20 static struct fml_node *fml_exec_gt (Fml fml, struct fml_node *l,
21                                      struct fml_node *r)
22 {
23     int left_val, right_val;
24     struct fml_node *fn;
25     fml_lr_values (fml, l, &left_val, r, &right_val);
26     if (left_val > right_val)
27     {
28         fn = fml_node_alloc (fml);
29         fn->is_atom = 1;
30         fn->p[0] = fml_atom_alloc (fml, "1");
31     }
32     else
33         fn = NULL;
34     return fn;
35 }
36
37 static struct fml_node *fml_exec_lt (Fml fml, struct fml_node *l,
38                                      struct fml_node *r)
39 {
40     int left_val, right_val;
41     struct fml_node *fn;
42     fml_lr_values (fml, l, &left_val, r, &right_val);
43     if (left_val < right_val)
44     {
45         fn = fml_node_alloc (fml);
46         fn->is_atom = 1;
47         fn->p[0] = fml_atom_alloc (fml, "1");
48     }
49     else
50         fn = NULL;
51     return fn;
52 }
53
54 static struct fml_node *fml_exec_eq (Fml fml, struct fml_node *l,
55                                      struct fml_node *r)
56 {
57     int left_val, right_val;
58     struct fml_node *fn;
59     fml_lr_values (fml, l, &left_val, r, &right_val);
60     if (left_val == right_val)
61     {
62         fn = fml_node_alloc (fml);
63         fn->is_atom = 1;
64         fn->p[0] = fml_atom_alloc (fml, "1");
65     }
66     else
67         fn = NULL;
68     return fn;
69 }
70
71 static struct fml_node *fml_exec_ne (Fml fml, struct fml_node *l,
72                                      struct fml_node *r)
73 {
74     int left_val, right_val;
75     struct fml_node *fn;
76     fml_lr_values (fml, l, &left_val, r, &right_val);
77     if (left_val != right_val)
78     {
79         fn = fml_node_alloc (fml);
80         fn->is_atom = 1;
81         fn->p[0] = fml_atom_alloc (fml, "1");
82     }
83     else
84         fn = NULL;
85     return fn;
86 }
87
88 static struct fml_node *fml_exec_le (Fml fml, struct fml_node *l,
89                                      struct fml_node *r)
90 {
91     int left_val, right_val;
92     struct fml_node *fn;
93     fml_lr_values (fml, l, &left_val, r, &right_val);
94     if (left_val <= right_val)
95     {
96         fn = fml_node_alloc (fml);
97         fn->is_atom = 1;
98         fn->p[0] = fml_atom_alloc (fml, "1");
99     }
100     else
101         fn = NULL;
102     return fn;
103 }
104
105 static struct fml_node *fml_exec_ge (Fml fml, struct fml_node *l,
106                                      struct fml_node *r)
107 {
108     int left_val, right_val;
109     struct fml_node *fn;
110     fml_lr_values (fml, l, &left_val, r, &right_val);
111     if (left_val >= right_val)
112     {
113         fn = fml_node_alloc (fml);
114         fn->is_atom = 1;
115         fn->p[0] = fml_atom_alloc (fml, "1");
116     }
117     else
118         fn = NULL;
119     return fn;
120 }
121
122 static struct fml_node *fml_exec_and (Fml fml, struct fml_node *l,
123                                       struct fml_node *r)
124 {
125     if (l && r)
126     {
127         fml_node_delete (fml, l);
128         return r;
129     }
130     fml_node_delete (fml, l);
131     fml_node_delete (fml, r);
132     return NULL;
133 }
134
135 static struct fml_node *fml_exec_or (Fml fml, struct fml_node *l,
136                                       struct fml_node *r)
137 {
138     if (r)
139     {
140         fml_node_delete (fml, l);
141         return r;
142     }
143     return l;
144 }
145
146 static struct fml_node *fml_exec_not (Fml fml, struct fml_node **lp, 
147                                       struct token *tp)
148 {
149     struct fml_node *fn;
150     fml_cmd_lex (lp, tp);
151
152     fn = fml_expr_term (fml, lp, tp);
153     if (fn)
154     {
155         fml_node_delete (fml, fn);
156         return NULL;
157     }
158     fn = fml_node_alloc (fml);
159     fn->is_atom = 1;
160     fn->p[0] = fml_atom_alloc (fml, "1");
161     return fn;
162 }
163
164 void fml_rel_init (Fml fml)
165 {
166     struct fml_sym_info *sym_info;
167
168     sym_info = fml_sym_add (fml->sym_tab, "gt");
169     sym_info->kind = FML_CBINARY;
170     sym_info->binary = fml_exec_gt;
171     sym_info = fml_sym_add (fml->sym_tab, "lt");
172     sym_info->kind = FML_CBINARY;
173     sym_info->binary = fml_exec_lt;
174     sym_info = fml_sym_add (fml->sym_tab, "eq");
175     sym_info->kind = FML_CBINARY;
176     sym_info->binary = fml_exec_eq;
177
178     sym_info = fml_sym_add (fml->sym_tab, "ge");
179     sym_info->kind = FML_CBINARY;
180     sym_info->binary = fml_exec_ge;
181     sym_info = fml_sym_add (fml->sym_tab, "le");
182     sym_info->kind = FML_CBINARY;
183     sym_info->binary = fml_exec_le;
184     sym_info = fml_sym_add (fml->sym_tab, "ne");
185     sym_info->kind = FML_CBINARY;
186     sym_info->binary = fml_exec_ne;
187
188     sym_info = fml_sym_add (fml->sym_tab, "and");
189     sym_info->kind = FML_CBINARY;
190     sym_info->binary = fml_exec_and;
191     sym_info = fml_sym_add (fml->sym_tab, "or");
192     sym_info->kind = FML_CBINARY;
193     sym_info->binary = fml_exec_or;
194
195     sym_info = fml_sym_add (fml->sym_tab, "not");
196     sym_info->kind = FML_CPREFIX;
197     sym_info->prefix = fml_exec_not;
198 }