2 * FML interpreter. Europagate, 1995
5 * Revision 1.4 1995/02/09 13:07:14 adam
6 * Nodes are freed now. Many bugs fixed.
8 * Revision 1.3 1995/02/07 16:09:23 adam
9 * The \ character is no longer INCLUDED when terminating a token.
10 * Major changes in tokenization routines. Bug fixes in expressions
11 * with lists (fml_sub0).
13 * Revision 1.2 1995/02/06 15:23:25 adam
14 * Added some more relational operators (le,ne,ge). Added increment
15 * and decrement operators. Function index changed, so that first
16 * element is 1 - not 0. Function fml_atom_val edited.
18 * Revision 1.1.1.1 1995/02/06 13:48:10 adam
19 * First version of the FML interpreter. It's slow and memory isn't
20 * freed properly. In particular, the FML nodes aren't released yet.
29 static int default_read_func (void)
34 static void default_err_handle (int no)
36 fprintf (stderr, "Error: %d\n", no);
39 static struct fml_node *fml_sub0 (Fml fml, struct fml_node *list);
40 static struct fml_node *fml_sub1 (Fml fml, struct fml_node **lp,
42 static struct fml_node *fml_sub2 (Fml fml, struct fml_node **lp,
45 static struct fml_node *fml_exec_space (Fml fml, struct fml_node **lp,
47 static struct fml_node *fml_exec_nl (Fml fml, struct fml_node **lp,
49 static struct fml_node *fml_exec_incr (Fml fml, struct fml_node **lp,
51 static struct fml_node *fml_exec_decr (Fml fml, struct fml_node **lp,
54 static struct fml_node *fml_exec_plus (Fml fml, struct fml_node *l,
56 static struct fml_node *fml_exec_minus (Fml fml, struct fml_node *l,
58 static struct fml_node *fml_exec_gt (Fml fml, struct fml_node *l,
60 static struct fml_node *fml_exec_lt (Fml fml, struct fml_node *l,
62 static struct fml_node *fml_exec_eq (Fml fml, struct fml_node *l,
64 static struct fml_node *fml_exec_ge (Fml fml, struct fml_node *l,
66 static struct fml_node *fml_exec_le (Fml fml, struct fml_node *l,
68 static struct fml_node *fml_exec_ne (Fml fml, struct fml_node *l,
70 static struct fml_node *fml_exec_and (Fml fml, struct fml_node *l,
72 static struct fml_node *fml_exec_or (Fml fml, struct fml_node *l,
74 static struct fml_node *fml_exec_indx (Fml fml, struct fml_node *l,
77 static int indent = 0;
79 static void pr_indent (int n)
102 struct fml_sym_info *sym_info;
104 Fml fml = malloc (sizeof(*fml));
109 fml->escape_char = '\\';
110 fml->comment_char = '#';
112 fml->white_chars = " \t\f\r\n";
113 fml->read_func = default_read_func;
114 fml->err_handle = default_err_handle;
117 fml->sym_tab = fml_sym_open ();
118 fml->atom_free_list = NULL;
119 fml->node_free_list = NULL;
122 sym_info = fml_sym_add (fml->sym_tab, "func");
123 sym_info->kind = FML_FUNC;
124 sym_info = fml_sym_add (fml->sym_tab, "bin");
125 sym_info->kind = FML_BIN;
126 sym_info = fml_sym_add (fml->sym_tab, "if");
127 sym_info->kind = FML_IF;
128 sym_info = fml_sym_add (fml->sym_tab, "else");
129 sym_info->kind = FML_ELSE;
130 sym_info = fml_sym_add (fml->sym_tab, "foreach");
131 sym_info->kind = FML_FOREACH;
132 sym_info = fml_sym_add (fml->sym_tab, "set");
133 sym_info->kind = FML_SET;
134 sym_info = fml_sym_add (fml->sym_tab, "while");
135 sym_info->kind = FML_WHILE;
136 sym_info = fml_sym_add (fml->sym_tab, "return");
137 sym_info->kind = FML_RETURN;
140 sym_info = fml_sym_add (fml->sym_tab, "and");
141 sym_info->kind = FML_CBINARY;
142 sym_info->binary = fml_exec_and;
143 sym_info = fml_sym_add (fml->sym_tab, "or");
144 sym_info->kind = FML_CBINARY;
145 sym_info->binary = fml_exec_or;
146 sym_info = fml_sym_add (fml->sym_tab, "index");
147 sym_info->kind = FML_CBINARY;
148 sym_info->binary = fml_exec_indx;
150 sym_info = fml_sym_add (fml->sym_tab, "plus");
151 sym_info->kind = FML_CBINARY;
152 sym_info->binary = fml_exec_plus;
153 sym_info = fml_sym_add (fml->sym_tab, "minus");
154 sym_info->kind = FML_CBINARY;
155 sym_info->binary = fml_exec_minus;
157 sym_info = fml_sym_add (fml->sym_tab, "gt");
158 sym_info->kind = FML_CBINARY;
159 sym_info->binary = fml_exec_gt;
160 sym_info = fml_sym_add (fml->sym_tab, "lt");
161 sym_info->kind = FML_CBINARY;
162 sym_info->binary = fml_exec_lt;
163 sym_info = fml_sym_add (fml->sym_tab, "eq");
164 sym_info->kind = FML_CBINARY;
165 sym_info->binary = fml_exec_eq;
167 sym_info = fml_sym_add (fml->sym_tab, "ge");
168 sym_info->kind = FML_CBINARY;
169 sym_info->binary = fml_exec_ge;
170 sym_info = fml_sym_add (fml->sym_tab, "le");
171 sym_info->kind = FML_CBINARY;
172 sym_info->binary = fml_exec_le;
173 sym_info = fml_sym_add (fml->sym_tab, "ne");
174 sym_info->kind = FML_CBINARY;
175 sym_info->binary = fml_exec_ne;
177 sym_info = fml_sym_add (fml->sym_tab, "incr");
178 sym_info->kind = FML_CPREFIX;
179 sym_info->prefix = fml_exec_incr;
180 sym_info = fml_sym_add (fml->sym_tab, "decr");
181 sym_info->kind = FML_CPREFIX;
182 sym_info->prefix = fml_exec_decr;
184 sym_info = fml_sym_add (fml->sym_tab, "s");
185 sym_info->kind = FML_CPREFIX;
186 sym_info->prefix = fml_exec_space;
187 sym_info = fml_sym_add (fml->sym_tab, " ");
188 sym_info->kind = FML_CPREFIX;
189 sym_info->prefix = fml_exec_space;
190 sym_info = fml_sym_add (fml->sym_tab, "n");
191 sym_info->kind = FML_CPREFIX;
192 sym_info->prefix = fml_exec_nl;
197 static Fml fml_pop_handler = NULL;
198 static void pop_handler (struct fml_sym_info *info)
200 assert (fml_pop_handler);
204 fml_node_delete (fml_pop_handler, info->body);
208 static void fml_do_pop (Fml fml)
210 fml_pop_handler = fml;
211 fml_sym_pop (fml->sym_tab, pop_handler);
214 int fml_preprocess (Fml fml)
216 fml->list = fml_tokenize (fml);
221 static void fml_init_token (struct token *tp, Fml fml)
223 tp->maxbuf = FML_ATOM_BUF*2;
225 tp->atombuf = tp->sbuf;
226 tp->tokenbuf = tp->sbuf + tp->maxbuf;
227 tp->escape_char = fml->escape_char;
230 static void fml_del_token (struct token *tp, Fml fml)
232 if (tp->maxbuf != FML_ATOM_BUF*2)
236 static void fml_cmd_lex (struct fml_node **np, struct token *tp)
250 tp->atom = (*np)->p[0];
252 fml_atom_str (tp->atom, tp->atombuf);
255 int l = fml_atom_str (tp->atom, NULL);
256 if (l >= tp->maxbuf-1)
258 if (tp->maxbuf != FML_ATOM_BUF*2)
261 tp->atombuf = malloc (tp->maxbuf*2);
262 tp->tokenbuf = tp->atombuf + tp->maxbuf;
264 fml_atom_str (tp->atom, tp->atombuf);
269 tp->sub = (*np)->p[0];
277 cp = tp->atombuf + tp->offset;
279 if (*cp == tp->escape_char)
297 if (*cp == tp->escape_char)
300 tp->offset = cp - tp->atombuf;
310 static struct fml_node *fml_exec_group (struct fml_node *list, Fml fml);
312 static void fml_lr_values (Fml fml, struct fml_node *l, int *left_val,
313 struct fml_node *r, int *right_val)
316 *left_val = fml_atom_val (l->p[0]);
320 *right_val = fml_atom_val (r->p[0]);
323 fml_node_delete (fml, l);
324 fml_node_delete (fml, r);
327 static struct fml_node *fml_exec_and (Fml fml, struct fml_node *l,
332 fml_node_delete (fml, l);
335 fml_node_delete (fml, l);
336 fml_node_delete (fml, r);
340 static struct fml_node *fml_exec_or (Fml fml, struct fml_node *l,
345 fml_node_delete (fml, l);
351 static struct fml_node *fml_exec_indx (Fml fml, struct fml_node *l,
354 struct fml_node *list = l;
358 if (!l || !r || !r->is_atom)
360 fml_node_delete (fml, l);
361 fml_node_delete (fml, r);
364 indx = fml_atom_val (r->p[0]);
365 fml_node_delete (fml, r);
366 while (--indx >= 1 && list)
370 else if (list->is_atom)
372 fn = fml_node_alloc (fml);
374 fn->p[0] = list->p[0];
383 fml_node_delete (fml, l);
387 static struct fml_node *fml_exec_plus (Fml fml, struct fml_node *l,
390 int left_val, right_val;
394 fml_lr_values (fml, l, &left_val, r, &right_val);
395 sprintf (arg, "%d", left_val + right_val);
396 fn = fml_node_alloc (fml);
398 fn->p[0] = fml_atom_alloc (fml, arg);
402 static struct fml_node *fml_exec_minus (Fml fml, struct fml_node *l,
405 int left_val, right_val;
409 fml_lr_values (fml, l, &left_val, r, &right_val);
410 sprintf (arg, "%d", left_val - right_val);
411 fn = fml_node_alloc (fml);
413 fn->p[0] = fml_atom_alloc (fml, arg);
418 static struct fml_node *fml_exec_gt (Fml fml, struct fml_node *l,
421 int left_val, right_val;
423 fml_lr_values (fml, l, &left_val, r, &right_val);
424 if (left_val > right_val)
426 fn = fml_node_alloc (fml);
428 fn->p[0] = fml_atom_alloc (fml, "1");
436 static struct fml_node *fml_exec_lt (Fml fml, struct fml_node *l,
439 int left_val, right_val;
441 fml_lr_values (fml, l, &left_val, r, &right_val);
442 if (left_val < right_val)
444 fn = fml_node_alloc (fml);
446 fn->p[0] = fml_atom_alloc (fml, "1");
453 static struct fml_node *fml_exec_eq (Fml fml, struct fml_node *l,
456 int left_val, right_val;
458 fml_lr_values (fml, l, &left_val, r, &right_val);
459 if (left_val == right_val)
461 fn = fml_node_alloc (fml);
463 fn->p[0] = fml_atom_alloc (fml, "1");
470 static struct fml_node *fml_exec_ne (Fml fml, struct fml_node *l,
473 int left_val, right_val;
475 fml_lr_values (fml, l, &left_val, r, &right_val);
476 if (left_val != right_val)
478 fn = fml_node_alloc (fml);
480 fn->p[0] = fml_atom_alloc (fml, "1");
487 static struct fml_node *fml_exec_le (Fml fml, struct fml_node *l,
490 int left_val, right_val;
492 fml_lr_values (fml, l, &left_val, r, &right_val);
493 if (left_val <= right_val)
495 fn = fml_node_alloc (fml);
497 fn->p[0] = fml_atom_alloc (fml, "1");
504 static struct fml_node *fml_exec_ge (Fml fml, struct fml_node *l,
507 int left_val, right_val;
509 fml_lr_values (fml, l, &left_val, r, &right_val);
510 if (left_val >= right_val)
512 fn = fml_node_alloc (fml);
514 fn->p[0] = fml_atom_alloc (fml, "1");
522 static struct fml_node *fml_exec_space (Fml fml, struct fml_node **lp,
529 static struct fml_node *fml_exec_nl (Fml fml, struct fml_node **lp,
536 static struct fml_node *fml_exec_incr (Fml fml, struct fml_node **lp,
539 struct fml_node *fn = NULL;
540 struct fml_sym_info *info;
541 fml_cmd_lex (lp, tp);
544 info = fml_sym_lookup (fml->sym_tab, tp->tokenbuf);
546 if (info->kind == FML_VAR && info->body && info->body->is_atom)
551 val = fml_atom_val (info->body->p[0]);
552 fml_node_delete (fml, info->body);
553 sprintf (arg, "%d", val+1);
554 info->body = fn = fml_node_alloc (fml);
556 fn->p[0] = fml_atom_alloc (fml, arg);
562 static struct fml_node *fml_exec_decr (Fml fml, struct fml_node **lp,
565 struct fml_node *fn = NULL;
566 struct fml_sym_info *info;
567 fml_cmd_lex (lp, tp);
570 info = fml_sym_lookup (fml->sym_tab, tp->tokenbuf);
572 if (info->kind == FML_VAR && info->body && info->body->is_atom)
577 val = fml_atom_val (info->body->p[0]);
578 sprintf (arg, "%d", val-1);
579 info->body = fn = fml_node_alloc (fml);
581 fn->p[0] = fml_atom_alloc (fml, arg);
587 static struct fml_node *fml_exec_prefix (struct fml_sym_info *info, Fml fml,
588 struct fml_node **lp,
592 struct fml_sym_info *arg_info;
593 struct fml_node *return_value;
594 static char arg[128];
599 printf ("exec_prefix ");
601 fml_sym_push (fml->sym_tab);
602 fml_cmd_lex (lp, tp);
603 for (fn = info->args; fn; fn = fn->p[1])
606 assert (fn->is_atom);
607 fml_atom_strx (fn->p[0], arg, 127);
613 arg_info = fml_sym_add_local (fml->sym_tab, arg);
614 arg_info->kind = FML_VAR;
618 arg_info->body = fml_sub0 (fml, tp->sub);
619 fml_cmd_lex (lp, tp);
622 arg_info->body = fml_sub2 (fml, lp, tp);
625 fml_pr_list (arg_info->body);
629 return_value = fml_exec_group (info->body, fml);
640 static void fml_emit (struct fml_node *list)
651 for (a = list->p[0]; a; a=a->next)
652 printf ("%s", a->buf);
655 fml_emit (list->p[0]);
661 static struct fml_node *fml_sub2 (Fml fml, struct fml_node **lp,
665 struct fml_sym_info *info;
668 info = fml_sym_lookup (fml->sym_tab, tp->tokenbuf);
673 fn = fml_node_copy (fml, info->body);
674 fml_cmd_lex (lp, tp);
677 fn = fml_exec_prefix (info, fml, lp, tp);
680 fn = (*info->prefix) (fml, lp, tp);
681 fml_cmd_lex (lp, tp);
684 fml_cmd_lex (lp, tp);
688 else if (tp->kind == 'g')
691 fn = fml_sub0 (fml, tp->sub);
694 fml_cmd_lex (lp, tp);
696 else if (tp->kind == 't')
698 fn = fml_node_alloc (fml);
700 fn->p[0] = fml_atom_alloc (fml, tp->tokenbuf);
701 fml_cmd_lex (lp, tp);
708 static struct fml_node *fml_sub1 (Fml fml, struct fml_node **lp,
711 struct fml_node *f1, *f2, *fn;
712 struct fml_sym_info *info;
714 f1 = fml_sub2 (fml, lp, tp);
715 while (tp->kind == 'e')
717 info = fml_sym_lookup (fml->sym_tab, tp->tokenbuf);
720 fprintf (stderr, "cannot locate `%s'", tp->tokenbuf);
723 if (info->kind == FML_CBINARY)
725 fml_cmd_lex (lp, tp);
726 f2 = fml_sub2 (fml, lp, tp);
727 fn = (*info->binary) (fml, f1, f2);
731 else if (info->kind == FML_BINARY)
733 struct fml_sym_info *arg_info;
739 printf ("exec binary %s", tp->tokenbuf);
741 fml_cmd_lex (lp, tp);
742 f2 = fml_sub2 (fml, lp, tp);
743 fml_sym_push (fml->sym_tab);
745 fml_atom_strx (info->args->p[0], arg, 127);
746 arg_info = fml_sym_add_local (fml->sym_tab, arg);
747 arg_info->kind = FML_VAR;
754 fml_atom_strx ( ((struct fml_node *) info->args->p[1])->p[0],
756 arg_info = fml_sym_add_local (fml->sym_tab, arg);
757 arg_info->kind = FML_VAR;
765 f1 = fml_exec_group (info->body, fml);
780 static struct fml_node *fml_sub0 (Fml fml, struct fml_node *list)
783 struct fml_node *fn, *fn1;
785 fml_init_token (&token, fml);
787 fml_cmd_lex (&list, &token);
788 fn = fml_sub1 (fml, &list, &token);
789 if (token.kind == '\0')
791 fml_del_token (&token, fml);
794 fn1 = fml_node_alloc (fml);
797 while (token.kind != '\0')
799 fn1 = fn1->p[1] = fml_node_alloc (fml);
800 fn1->p[0] = fml_sub1 (fml, &list, &token);
802 fml_del_token (&token, fml);
806 static struct fml_node *fml_sub0 (Fml fml, struct fml_node *list)
809 struct fml_node *fn, *fn0, *fn1;
813 fml_init_token (&token, fml);
815 fml_cmd_lex (&list, &token);
816 fn1 = fn = fml_sub1 (fml, &list, &token);
817 if (fn->p[1] && token.kind != '\0')
819 fn1 = fml_node_alloc (fml);
823 while (token.kind != '\0')
825 fn = fml_sub1 (fml, &list, &token);
828 fn1 = fn1->p[1] = fml_node_alloc (fml);
833 fn1 = fn1->p[1] = fn;
836 fml_del_token (&token, fml);
841 static struct fml_node *fml_exec_foreach (struct fml_sym_info *info, Fml fml,
842 struct fml_node **lp,
845 struct fml_sym_info *info_var;
846 struct fml_node *fn, *body;
847 struct fml_node *return_value = NULL, *rv;
849 fml_cmd_lex (lp, tp);
850 assert (tp->kind == 't');
852 info_var = fml_sym_lookup_local (fml->sym_tab, tp->tokenbuf);
855 info_var = fml_sym_add_local (fml->sym_tab, tp->tokenbuf);
856 info_var->body = NULL;
857 info_var->kind = FML_VAR;
861 fml_node_delete (fml, info->body);
867 printf ("[foreach %s ", tp->tokenbuf);
869 fml_cmd_lex (lp, tp);
870 assert (tp->kind == 'g');
871 fn = fml_sub0 (fml, tp->sub);
873 fml_cmd_lex (lp, tp);
874 assert (tp->kind == 'g');
879 struct fml_node *fn1;
886 info_var->body = fn->p[0];
890 printf ("[foreach loop var=");
891 fml_pr_list (info_var->body);
894 rv = fml_exec_group (body, fml);
897 fml_node_delete (fml, fn);
900 info_var->body = NULL;
906 static struct fml_node *fml_exec_if (struct fml_sym_info *info, Fml fml,
907 struct fml_node **lp, struct token *tp)
909 struct fml_node *fn, *body;
910 struct fml_node *rv, *return_value = NULL;
912 fml_cmd_lex (lp, tp);
913 assert (tp->kind == 'g');
914 fn = fml_sub0 (fml, tp->sub);
915 fml_cmd_lex (lp, tp);
916 assert (tp->kind == 'g');
919 rv = fml_exec_group (tp->sub, fml);
923 fml_cmd_lex (lp, tp);
926 info = fml_sym_lookup (fml->sym_tab, tp->tokenbuf);
927 if (info->kind == FML_ELSE)
929 fml_cmd_lex (lp, tp);
930 assert (tp->kind == 'g');
934 rv = fml_exec_group (body, fml);
938 fml_cmd_lex (lp, tp);
941 fml_node_delete (fml, fn);
945 static struct fml_node *fml_exec_while (struct fml_sym_info *info, Fml fml,
946 struct fml_node **lp, struct token *tp)
948 struct fml_node *fn, *body;
949 struct fml_node *return_value = NULL;
951 fml_cmd_lex (lp, tp);
952 assert (tp->kind == 'g');
955 fml_cmd_lex (lp, tp);
956 assert (tp->kind == 'g');
961 struct fml_node *fn_expr;
965 fn_expr = fml_sub0 (fml, fn);
968 fml_node_delete (fml, fn_expr);
969 rv = fml_exec_group (body, fml);
976 static void fml_exec_set (struct fml_sym_info *info, Fml fml,
977 struct fml_node **lp, struct token *tp)
980 struct fml_sym_info *info_var;
982 fml_cmd_lex (lp, tp);
983 info_var = fml_sym_lookup_local (fml->sym_tab, tp->tokenbuf);
986 info_var = fml_sym_add_local (fml->sym_tab, tp->tokenbuf);
987 info_var->body = NULL;
992 printf ("set %s ", tp->tokenbuf);
994 info_var->kind = FML_VAR;
995 fml_cmd_lex (lp, tp);
999 fn = fml_sub0 (fml, tp->sub);
1000 fml_cmd_lex (lp, tp);
1003 fn = fml_sub2 (fml, lp, tp);
1004 fml_node_delete (fml, info_var->body);
1005 info_var->body = fn;
1008 fml_pr_list (info_var->body);
1013 static void fml_emit_expr (Fml fml, struct fml_node **lp, struct token *tp)
1015 struct fml_node *fn;
1017 fn = fml_sub1 (fml, lp, tp);
1019 fml_node_delete (fml, fn);
1022 static struct fml_node *fml_exec_group (struct fml_node *list, Fml fml)
1025 struct fml_sym_info *info;
1027 struct fml_node *return_value = NULL, *rv;
1031 fml_init_token (&token, fml);
1032 fml_cmd_lex (&list, &token);
1038 rv = fml_exec_group (token.sub, fml);
1043 info = fml_sym_lookup (fml->sym_tab, token.tokenbuf);
1046 struct fml_node *fn;
1051 fml_cmd_lex (&list, &token);
1052 assert (token.kind == 't');
1053 info = fml_sym_lookup (fml->sym_tab, token.tokenbuf);
1055 info = fml_sym_add (fml->sym_tab, token.tokenbuf);
1056 info->kind = FML_PREFIX;
1060 fml_cmd_lex (&list, &token);
1061 if (token.kind != 't')
1065 info->args = fn = fml_node_alloc (fml);
1069 for (fn = info->args; fn->p[1]; fn=fn->p[1])
1071 fn = fn->p[1] = fml_node_alloc (fml);
1073 fn->p[0] = token.atom;
1076 assert (token.kind == 'g');
1077 info->body = token.sub;
1080 fml_cmd_lex (&list, &token);
1081 assert (token.kind == 't');
1082 info = fml_sym_lookup (fml->sym_tab, token.tokenbuf);
1084 info = fml_sym_add (fml->sym_tab, token.tokenbuf);
1085 info->kind = FML_BINARY;
1087 fml_cmd_lex (&list, &token);
1088 assert (token.kind == 't');
1089 info->args = fn = fml_node_alloc (fml);
1090 fn->p[0] = token.atom;
1093 fml_cmd_lex (&list, &token);
1094 assert (token.kind == 't');
1095 fn = fn->p[1] = fml_node_alloc (fml);
1096 fn->p[0] = token.atom;
1099 fml_cmd_lex (&list, &token);
1100 assert (token.kind == 'g');
1101 info->body = token.sub;
1106 if (token.separate && !first)
1109 fml_emit_expr (fml, &list, &token);
1110 fml_node_stat (fml);
1113 rv = fml_exec_foreach (info, fml, &list, &token);
1118 rv = fml_exec_if (info, fml, &list, &token);
1123 fml_exec_set (info, fml, &list, &token);
1124 fml_node_stat (fml);
1127 rv = fml_exec_while (info, fml, &list, &token);
1132 fml_cmd_lex (&list, &token);
1134 if (token.kind == 'g')
1136 return_value = fml_sub0 (fml, token.sub);
1137 fml_cmd_lex (&list, &token);
1140 return_value = fml_sub2 (fml, &list, &token);
1144 printf ("return of:");
1145 fml_pr_list (return_value);
1150 printf ("unknown token: `%s'", token.tokenbuf);
1151 fml_cmd_lex (&list, &token);
1156 printf ("<unknown>");
1161 printf ("<token.tokenbuf=%s>", token.tokenbuf);
1163 if (token.separate && !first)
1166 fml_emit_expr (fml, &list, &token);
1167 fml_node_stat (fml);
1170 fml_cmd_lex (&list, &token);
1172 fml_del_token (&token, fml);
1173 return return_value;
1176 void fml_exec (Fml fml)
1178 fml_node_stat (fml);
1179 fml_exec_group (fml->list, fml);