Merge branch 'vendor/EXPAT'
[dragonfly.git] / contrib / flex / yylex.c
1 /* yylex - scanner front-end for flex */
2
3 /*  Copyright (c) 1990 The Regents of the University of California. */
4 /*  All rights reserved. */
5
6 /*  This code is derived from software contributed to Berkeley by */
7 /*  Vern Paxson. */
8
9 /*  The United States Government has rights in this work pursuant */
10 /*  to contract no. DE-AC03-76SF00098 between the United States */
11 /*  Department of Energy and the University of California. */
12
13 /*  This file is part of flex. */
14
15 /*  Redistribution and use in source and binary forms, with or without */
16 /*  modification, are permitted provided that the following conditions */
17 /*  are met: */
18
19 /*  1. Redistributions of source code must retain the above copyright */
20 /*     notice, this list of conditions and the following disclaimer. */
21 /*  2. Redistributions in binary form must reproduce the above copyright */
22 /*     notice, this list of conditions and the following disclaimer in the */
23 /*     documentation and/or other materials provided with the distribution. */
24
25 /*  Neither the name of the University nor the names of its contributors */
26 /*  may be used to endorse or promote products derived from this software */
27 /*  without specific prior written permission. */
28
29 /*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
30 /*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
31 /*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
32 /*  PURPOSE. */
33
34 #include <ctype.h>
35 #include "flexdef.h"
36 #include "parse.h"
37
38
39 /* yylex - scan for a regular expression token */
40
41 int     yylex ()
42 {
43         int     toktype;
44         static int beglin = false;
45         extern char *yytext;
46
47         if (eofseen)
48                 toktype = EOF;
49         else
50                 toktype = flexscan ();
51
52         if (toktype == EOF || toktype == 0) {
53                 eofseen = 1;
54
55                 if (sectnum == 1) {
56                         synerr (_("premature EOF"));
57                         sectnum = 2;
58                         toktype = SECTEND;
59                 }
60
61                 else
62                         toktype = 0;
63         }
64
65         if (trace) {
66                 if (beglin) {
67                         fprintf (stderr, "%d\t", num_rules + 1);
68                         beglin = 0;
69                 }
70
71                 switch (toktype) {
72                 case '<':
73                 case '>':
74                 case '^':
75                 case '$':
76                 case '"':
77                 case '[':
78                 case ']':
79                 case '{':
80                 case '}':
81                 case '|':
82                 case '(':
83                 case ')':
84                 case '-':
85                 case '/':
86                 case '\\':
87                 case '?':
88                 case '.':
89                 case '*':
90                 case '+':
91                 case ',':
92                         (void) putc (toktype, stderr);
93                         break;
94
95                 case '\n':
96                         (void) putc ('\n', stderr);
97
98                         if (sectnum == 2)
99                                 beglin = 1;
100
101                         break;
102
103                 case SCDECL:
104                         fputs ("%s", stderr);
105                         break;
106
107                 case XSCDECL:
108                         fputs ("%x", stderr);
109                         break;
110
111                 case SECTEND:
112                         fputs ("%%\n", stderr);
113
114                         /* We set beglin to be true so we'll start
115                          * writing out numbers as we echo rules.
116                          * flexscan() has already assigned sectnum.
117                          */
118                         if (sectnum == 2)
119                                 beglin = 1;
120
121                         break;
122
123                 case NAME:
124                         fprintf (stderr, "'%s'", nmstr);
125                         break;
126
127                 case CHAR:
128                         switch (yylval) {
129                         case '<':
130                         case '>':
131                         case '^':
132                         case '$':
133                         case '"':
134                         case '[':
135                         case ']':
136                         case '{':
137                         case '}':
138                         case '|':
139                         case '(':
140                         case ')':
141                         case '-':
142                         case '/':
143                         case '\\':
144                         case '?':
145                         case '.':
146                         case '*':
147                         case '+':
148                         case ',':
149                                 fprintf (stderr, "\\%c", yylval);
150                                 break;
151
152                         default:
153                                 if (!isascii (yylval) || !isprint (yylval))
154                                         fprintf (stderr,
155                                                  "\\%.3o",
156                                                  (unsigned int) yylval);
157                                 else
158                                         (void) putc (yylval, stderr);
159                                 break;
160                         }
161
162                         break;
163
164                 case NUMBER:
165                         fprintf (stderr, "%d", yylval);
166                         break;
167
168                 case PREVCCL:
169                         fprintf (stderr, "[%d]", yylval);
170                         break;
171
172                 case EOF_OP:
173                         fprintf (stderr, "<<EOF>>");
174                         break;
175
176                 case OPTION_OP:
177                         fprintf (stderr, "%s ", yytext);
178                         break;
179
180                 case OPT_OUTFILE:
181                 case OPT_PREFIX:
182                 case CCE_ALNUM:
183                 case CCE_ALPHA:
184                 case CCE_BLANK:
185                 case CCE_CNTRL:
186                 case CCE_DIGIT:
187                 case CCE_GRAPH:
188                 case CCE_LOWER:
189                 case CCE_PRINT:
190                 case CCE_PUNCT:
191                 case CCE_SPACE:
192                 case CCE_UPPER:
193                 case CCE_XDIGIT:
194                         fprintf (stderr, "%s", yytext);
195                         break;
196
197                 case 0:
198                         fprintf (stderr, _("End Marker\n"));
199                         break;
200
201                 default:
202                         fprintf (stderr,
203                                  _
204                                  ("*Something Weird* - tok: %d val: %d\n"),
205                                  toktype, yylval);
206                         break;
207                 }
208         }
209
210         return toktype;
211 }