X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=fml%2Ffml.c;h=82b825de952175019c6076574f6e16524efadee0;hb=3f6af0f3aa9f114cf562c28f2ed0b954e4c5d659;hp=9423b95c9e30c9c63d4937cde9a35a8ec7ad8f4a;hpb=5f82d212861388cc73741917b38f67d773d01549;p=egate.git diff --git a/fml/fml.c b/fml/fml.c index 9423b95..82b825d 100644 --- a/fml/fml.c +++ b/fml/fml.c @@ -1,8 +1,29 @@ /* * FML interpreter. Europagate, 1995 * - * $Log: fml.c,v $ - * Revision 1.6 1995/02/09 16:06:06 adam + * fml.c,v + * Revision 1.12 1995/02/22 15:20:13 adam + * Bug fix in fml_exec_space. + * + * Revision 1.11 1995/02/22 08:50:49 adam + * Definition of CPP changed. Output function can be customized. + * + * Revision 1.10 1995/02/21 17:46:08 adam + * Bug fix in fml_sub0. + * + * Revision 1.9 1995/02/21 14:00:03 adam + * Minor changes. + * + * Revision 1.8 1995/02/10 18:15:52 adam + * FML function 'strcmp' implemented. This function can be used to + * test for existence of MARC fields. + * + * Revision 1.7 1995/02/10 15:50:54 adam + * MARC interface implemented. Minor bugs fixed. fmltest can + * be used to format single MARC records. New function '\list' + * implemented. + * + * Revision 1.6 1995/02/09 16:06:06 adam * FML can be called from the outside multiple times by the functions: * fml_exec_call and fml_exec_call_str. * An interactive parameter (-i) to fmltest starts a shell-like @@ -41,6 +62,11 @@ static int default_read_func (void) return getchar (); } +static void default_write_func (int c) +{ + putchar (c); +} + static void default_err_handle (int no) { fprintf (stderr, "Error: %d\n", no); @@ -94,6 +120,7 @@ Fml fml_open (void) fml->white_chars = " \t\f\r\n"; fml->read_func = default_read_func; fml->err_handle = default_err_handle; + fml->write_func = default_write_func; fml->list = NULL; fml->sym_tab = fml_sym_open (); @@ -121,6 +148,7 @@ Fml fml_open (void) fml_list_init (fml); fml_arit_init (fml); fml_rel_init (fml); + fml_str_init (fml); sym_info = fml_sym_add (fml->sym_tab, "s"); sym_info->kind = FML_CPREFIX; @@ -281,7 +309,11 @@ static struct fml_node *fml_exec_space (Fml fml, struct fml_node **lp, struct token *tp) { fml_cmd_lex (lp, tp); - putchar ('_'); + if (fml->debug & 1) + (*fml->write_func) ('_'); + else + (*fml->write_func) (' '); + putchar (' '); return NULL; } @@ -289,7 +321,7 @@ static struct fml_node *fml_exec_nl (Fml fml, struct fml_node **lp, struct token *tp) { fml_cmd_lex (lp, tp); - putchar ('\n'); + (*fml->write_func) ('\n'); return NULL; } @@ -346,7 +378,7 @@ static struct fml_node *fml_exec_prefix (struct fml_sym_info *info, Fml fml, } -static void fml_emit (struct fml_node *list) +static void fml_emit (Fml fml, struct fml_node *list) { int s = 0; while (list) @@ -355,13 +387,17 @@ static void fml_emit (struct fml_node *list) { struct fml_atom *a; if (s) - printf (" "); + (*fml->write_func) (' '); s++; for (a = list->p[0]; a; a=a->next) - printf ("%s", a->buf); + { + int i = 0; + while (i < FML_ATOM_BUF && a->buf[i]) + (*fml->write_func) (a->buf[i++]); + } } else - fml_emit (list->p[0]); + fml_emit (fml, list->p[0]); list = list->p[1]; } } @@ -387,7 +423,6 @@ static struct fml_node *fml_sub2 (Fml fml, struct fml_node **lp, break; case FML_CPREFIX: fn = (*info->prefix) (fml, lp, tp); - fml_cmd_lex (lp, tp); break; default: fml_cmd_lex (lp, tp); @@ -520,9 +555,13 @@ static struct fml_node *fml_sub0 (Fml fml, struct fml_node *list) if (!list) return NULL; fml_init_token (&token, fml); - assert (list); fml_cmd_lex (&list, &token); fn1 = fn = fml_sub1 (fml, &list, &token); + if (!fn) + { + fml_del_token (&token, fml); + return fn; + } if (fn->p[1] && token.kind != '\0') { fn1 = fml_node_alloc (fml); @@ -567,8 +606,9 @@ static struct fml_node *fml_exec_foreach (struct fml_sym_info *info, Fml fml, } else { - fml_node_delete (fml, info->body); - info->body = NULL; + if (info_var->kind == FML_VAR) + fml_node_delete (fml, info_var->body); + info_var->body = NULL; } if (fml->debug & 1) { @@ -724,7 +764,7 @@ static void fml_emit_expr (Fml fml, struct fml_node **lp, struct token *tp) struct fml_node *fn; fn = fml_sub1 (fml, lp, tp); - fml_emit (fn); + fml_emit (fml, fn); fml_node_delete (fml, fn); } @@ -813,7 +853,7 @@ struct fml_node *fml_exec_group (struct fml_node *list, Fml fml) case FML_PREFIX: case FML_CPREFIX: if (token.separate && !first) - putchar (' '); + (*fml->write_func) (' '); first = 1; fml_emit_expr (fml, &list, &token); fml_node_stat (fml); @@ -867,7 +907,7 @@ struct fml_node *fml_exec_group (struct fml_node *list, Fml fml) break; case 't': if (token.separate && !first) - putchar (' '); + (*fml->write_func) (' '); first = 0; fml_emit_expr (fml, &list, &token); fml_node_stat (fml);