Changed header.
[egate.git] / fml / fmltest.c
1 /*
2  * FML interpreter. Europagate, 1995
3  *
4  * $Log: fmltest.c,v $
5  * Revision 1.7  1995/02/23 08:32:06  adam
6  * Changed header.
7  *
8  * Revision 1.5  1995/02/10  15:50:56  adam
9  * MARC interface implemented. Minor bugs fixed. fmltest can
10  * be used to format single MARC records. New function '\list'
11  * implemented.
12  *
13  * Revision 1.4  1995/02/09  16:06:08  adam
14  * FML can be called from the outside multiple times by the functions:
15  * fml_exec_call and fml_exec_call_str.
16  * An interactive parameter (-i) to fmltest starts a shell-like
17  * interface to FML by using the fml_exec_call_str function.
18  *
19  * Revision 1.3  1995/02/09  13:07:15  adam
20  * Nodes are freed now. Many bugs fixed.
21  *
22  * Revision 1.2  1995/02/07  16:09:24  adam
23  * The \ character is no longer INCLUDED when terminating a token.
24  * Major changes in tokenization routines. Bug fixes in expressions
25  * with lists (fml_sub0).
26  *
27  * Revision 1.1.1.1  1995/02/06  13:48:10  adam
28  * First version of the FML interpreter. It's slow and memory isn't
29  * freed properly. In particular, the FML nodes aren't released yet.
30  *
31  */
32
33 #include <stdio.h>
34 #include <string.h>
35 #include <stdlib.h>
36
37 #include <fmlmarc.h>
38
39 static FILE *inf;
40
41 static int inf_read (void)
42 {
43     return getc (inf);
44 }
45
46 int main (int argc, char **argv)
47 {
48     Fml fml;
49     int nfiles = 0;
50     int interactive = 0;
51     Iso2709Rec rec = NULL;
52
53     fml = fml_open ();
54     while (-- argc > 0)
55     {
56         ++argv;
57         if (**argv == '-')
58         {
59             if (argv[0][1] == 'd')
60                 fml->debug |= 1;
61             else if (argv[0][1] == 'm')
62                 fml->debug |= 2;
63             else if (argv[0][1] == 'i')
64                 interactive = 1;
65             else if (argv[0][1] == '2')
66             {
67                 if (argc > 1)
68                 {
69                     char *buf;
70                     FILE *inf;
71                     ++argv;
72                     --argc;
73
74                     inf = fopen (*argv, "r");
75                     if (!inf)
76                     {
77                         fprintf (stderr, "cannot open record `%s'\n", *argv);
78                         exit (1);
79                     }
80                     if ((buf = iso2709_read (inf)))
81                     {
82                         rec = iso2709_cvt (buf);
83                         free (buf);
84                     }
85                     else
86                     {
87                         fprintf (stderr, "no record in `%s'\n", *argv);
88                         exit (1);
89                     }
90                     fclose (inf);
91                 }
92             }
93             else
94             {
95                 fprintf (stderr, "unknown option `%s'\n", *argv);
96                 exit (1);
97             }
98         }
99         else
100         {
101             nfiles++;
102             inf = fopen (*argv, "r");
103             if (!inf)
104             {
105                 fprintf (stderr, "cannot open FML file `%s'\n", *argv);
106                 exit (1);
107             }
108             fml->read_func = inf_read;
109             fml_preprocess (fml);
110             fml_exec (fml);
111             fclose (inf);
112         }
113     }
114     if (!nfiles)
115     {
116         fml_preprocess (fml);
117         fml_exec (fml);
118     }
119     else
120     {
121         if (interactive)
122         {
123             char arg[128];
124
125             while (1)
126             {
127                 char *cp;
128                 const char *nargv[4];
129
130                 printf ("\nFML>");
131                 fflush (stdout);
132
133                 if (!fgets (arg, 127, stdin))
134                     break;
135                 if ((cp = strchr (arg, '\n')))
136                     *cp = '\0';
137                 if (*arg == '!' && rec)
138                 {
139                     nargv[0] = arg+1;
140                     nargv[1] = " ";
141                     nargv[2] = marc_to_str (fml, rec);
142                     printf ("passing '%s'\n", nargv[2]);
143                     nargv[3] = NULL;
144                 }
145                 else
146                 {
147                     nargv[0] = arg;
148                     nargv[1] = NULL;
149                 }
150                 fml_exec_call_argv (fml, nargv);
151             }
152         }
153     }
154     return 0;
155 }