GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.bin/lex/yylex.c Lines: 7 49 14.3 %
Date: 2017-11-07 Branches: 5 91 5.5 %

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