/*
* FML interpreter. Europagate, 1995
*
- * $Log: fml.c,v $
- * Revision 1.7 1995/02/10 15:50:54 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.
return getchar ();
}
+static void default_write_func (int c)
+{
+ putchar (c);
+}
+
static void default_err_handle (int no)
{
fprintf (stderr, "Error: %d\n", no);
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 ();
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;
struct token *tp)
{
fml_cmd_lex (lp, tp);
- if (fml->debug & 1)
- putchar ('_');
+ if (fml->debug & 1)
+ (*fml->write_func) ('_');
else
+ (*fml->write_func) (' ');
putchar (' ');
return NULL;
}
struct token *tp)
{
fml_cmd_lex (lp, tp);
- putchar ('\n');
+ (*fml->write_func) ('\n');
return NULL;
}
}
-static void fml_emit (struct fml_node *list)
+static void fml_emit (Fml fml, struct fml_node *list)
{
int s = 0;
while (list)
{
struct fml_atom *a;
if (s)
- printf (" ");
+ (*fml->write_func) (' ');
s++;
for (a = list->p[0]; a; a=a->next)
- printf ("%.*s", FML_ATOM_BUF, 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];
}
}
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);
struct fml_node *fn;
fn = fml_sub1 (fml, lp, tp);
- fml_emit (fn);
+ fml_emit (fml, fn);
fml_node_delete (fml, fn);
}
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);
break;
case 't':
if (token.separate && !first)
- putchar (' ');
+ (*fml->write_func) (' ');
first = 0;
fml_emit_expr (fml, &list, &token);
fml_node_stat (fml);