Report 'too many characters in search..'
[idzebra-moved-to-github.git] / dfa / readfile.c
1 /* This file is part of the Zebra server.
2    Copyright (C) 1994-2011 Index Data
3
4 Zebra is free software; you can redistribute it and/or modify it under
5 the terms of the GNU General Public License as published by the Free
6 Software Foundation; either version 2, or (at your option) any later
7 version.
8
9 Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
10 WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
18 */
19
20
21 #if HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24 #include <stdio.h>
25 #include <assert.h>
26
27 #include <stdlib.h>
28 #include <string.h>
29 #include <ctype.h>
30
31 #include <idzebra/util.h>
32 #include <dfa.h>
33 #include "lexer.h"
34
35 #define MAXLINE 512
36
37 static FILE *inf;
38 static FILE *outf;
39 static const char *inf_name;
40 static int line_no;
41 static int err_no;
42
43 static void
44     prep        (char **s),
45     read_defs   (void),
46     read_rules  (struct DFA *dfap),
47     read_tail   (void);
48
49 static char
50     *read_line  (void);
51
52 static void prep (char **s)
53 {
54     static char expr_buf[MAXLINE+1];
55     char *dst = expr_buf;
56     const char *src = *s;
57     int c;
58
59     while ((c = *src++))
60         *dst++ = c;
61
62     *dst = '\0';
63     *s = expr_buf;
64 }
65
66 static char *read_line (void)
67 {
68     static char linebuf[MAXLINE+1];
69     ++line_no;
70     return fgets (linebuf, MAXLINE, inf);
71 }
72
73 static void read_defs (void)
74 {
75     const char *s;
76     while ((s=read_line()))
77     {
78         if (*s == '%' && s[1] == '%')
79             return;
80         else if (*s == '\0' || isspace (*s))
81             fputs (s, outf);
82     }
83     error ("missing rule section");
84 }
85
86 static void read_rules (struct DFA *dfa)
87 {
88     char *s;
89     const char *sc;
90     int i;
91     int no = 0;
92
93     fputs ("\n#ifndef YY_BREAK\n#define YY_BREAK break;\n#endif\n", outf);
94     fputs ("void lexact (int no)\n{\n", outf);
95     fputs (  "\tswitch (no)\n\t{\n", outf);
96     while ((s=read_line()))
97     {
98         if (*s == '%' && s[1] == '%')
99             break;
100         else if (*s == '\0' || isspace (*s))
101             /* copy rest of line to output */
102             fputs (s, outf);
103         else
104         { 
105             /* preprocess regular expression */
106             prep (&s);                   
107             /* now parse regular expression */
108             sc = s;
109             i = dfa_parse (dfa, &sc);
110             if (i)
111             {
112                 fprintf (stderr, "%s #%d: regular expression syntax error\n",
113                         inf_name, line_no);
114                 assert (0);
115                 err_no++;
116             }
117             else
118             {
119                 if (no)
120                     fputs ("\t\tYY_BREAK\n", outf);
121                 no++;
122                 fprintf (outf, "\tcase %d:\n#line %d\n\t\t", no, line_no);
123             }
124             while (*sc == '\t' || *sc == ' ')
125                 sc++;
126             fputs (sc, outf);
127         }
128     }
129     fputs ("\tYY_BREAK\n\t}\n}\n", outf);
130     if (!no)
131         error ("no regular expressions in rule section");
132 }
133
134 static void read_tail (void)
135 {
136     const char *s;
137     while ((s=read_line()))
138         fputs (s, outf);
139 }
140
141 int read_file (const char *s, struct DFA *dfa)
142 {
143     inf_name = s;
144     if (!(inf=fopen (s,"r")))
145     {
146         error ("cannot open `%s'", s);
147         return -1;
148     }
149
150     if (!(outf=fopen ("lex.yy.c", "w")))
151     {
152         error ("cannot open `%s'", "lex.yy.c");
153         return -2;
154     }
155
156     line_no = 0;
157     err_no = 0;
158
159     read_defs ();
160     read_rules (dfa);
161     read_tail ();
162
163     fclose (outf);
164     fclose (inf);
165     return err_no;
166 }
167 /*
168  * Local variables:
169  * c-basic-offset: 4
170  * c-file-style: "Stroustrup"
171  * indent-tabs-mode: nil
172  * End:
173  * vim: shiftwidth=4 tabstop=8 expandtab
174  */
175