xref: /onnv-gate/usr/src/cmd/filebench/common/parser_lex.l (revision 9801:4a9784073e11)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  *
26  * Portions Copyright 2008 Denis Cheng
27  */
28 
29 %{
30 
31 #include <stdlib.h>
32 #include <sys/types.h>
33 #include <assert.h>
34 #include <string.h>
35 #include <errno.h>
36 #ifdef HAVE_STDINT_H
37 #include <stdint.h>
38 #endif
39 
40 #include "filebench.h"
41 #include "parsertypes.h"
42 #include "utils.h"
43 #include "parser_gram.h"
44 
45 int lex_lineno = 1;		/* line-number for error reporting */
46 extern void yyerror(char *s);
47 extern int dofile;			/* are we processing a file? */
48 %}
49 
50 %s WHITESTRINGSTATE
51 
52 %a 50000
53 %p 50000
54 %o 50000
55 %n 5000
56 
57 %%
58 
59 \n			{ lex_lineno++; }
60 
61 <INITIAL>[ \t]+			;
62 
63 <INITIAL>#.*			;
64 
65 create                  { return FSC_CREATE; }
66 define			{ return FSC_DEFINE; }
67 debug                   { return FSC_DEBUG; }
68 domultisync		{ return FSC_DOMULTISYNC; }
69 echo                    { return FSC_ECHO; }
70 enable			{ return FSC_ENABLE; }
71 eventgen                { return FSC_EVENTGEN; }
72 exit		        { return FSC_QUIT; }
73 foreach                 { return FSC_FOREACH; }
74 flowop		        { return FSC_FLOWOP; }
75 fscheck		        { return FSC_FSCHECK; }
76 fsflush		        { return FSC_FSFLUSH; }
77 help		        { return FSC_HELP; }
78 list		        { return FSC_LIST; }
79 load                    { return FSC_LOAD; }
80 log		        { return FSC_LOG; }
81 nousestats		{ return FSC_NOUSESTATS; }
82 run                     { return FSC_RUN; }
83 set                     { return FSC_SET; }
84 shutdown                { return FSC_SHUTDOWN; }
85 sleep                   { return FSC_SLEEP; }
86 stats                   { return FSC_STATS; }
87 system                  { return FSC_SYSTEM; }
88 usage                   { return FSC_USAGE; }
89 vars                    { return FSC_VARS; }
90 version                 { return FSC_VERSION; }
91 warmup                  { return FSC_WARMUP; }
92 quit		        { return FSC_QUIT; }
93 
94 file[s]*       	        { return FSE_FILE; }
95 fileset[s]*             { return FSE_FILESET; }
96 directory               { return FSE_DIRECTORY; }
97 command                 { return FSE_COMMAND; }
98 process[es]*	        { return FSE_PROC; }
99 thread		        { return FSE_THREAD; }
100 randvar		        { return FSE_RAND; }
101 clear                   { return FSE_CLEAR; }
102 snap                    { return FSE_SNAP; }
103 dump                    { return FSE_DUMP; }
104 xmldump                 { return FSE_XMLDUMP; }
105 multidump               { return FSE_MULTIDUMP; }
106 all                     { return FSE_ALL; }
107 mode                    { return FSE_MODE; }
108 multi			{ return FSE_MULTI; }
109 
110 alldone                 { return FSA_ALLDONE; }
111 blocking                { return FSA_BLOCKING; }
112 cached                  { return FSA_CACHED; }
113 client			{ return FSA_CLIENT; }
114 dirwidth                { return FSA_DIRWIDTH; }
115 dirdepthrv              { return FSA_DIRDEPTHRV; }
116 directio                { return FSA_DIRECTIO; }
117 dirgamma                { return FSA_DIRGAMMA; }
118 dsync                   { return FSA_DSYNC;  }
119 entries                 { return FSA_ENTRIES;}
120 fd                      { return FSA_FD; }
121 filename                { return FSA_FILE; }
122 filesetname             { return FSA_FILE; }
123 filesize                { return FSA_SIZE; }
124 filesizegamma           { return FSA_FILESIZEGAMMA; }
125 firstdone               { return FSA_FIRSTDONE; }
126 fstype		        { return FSA_FSTYPE; }
127 gamma                   { return FSA_RANDGAMMA; }
128 highwater               { return FSA_HIGHWATER; }
129 indexed                 { return FSA_INDEXED; }
130 instances               { return FSA_INSTANCES;}
131 iosize                  { return FSA_IOSIZE; }
132 iters                   { return FSA_ITERS;}
133 leafdirs                { return FSA_LEAFDIRS;}
134 master			{ return FSA_MASTER; }
135 mean                    { return FSA_RANDMEAN; }
136 memsize                 { return FSA_MEMSIZE; }
137 min                     { return FSA_RANDMIN; }
138 name                    { return FSA_NAME;}
139 namelength              { return FSA_NAMELENGTH; }
140 nice                    { return FSA_NICE;}
141 opennext                { return FSA_ROTATEFD; }
142 paralloc                { return FSA_PARALLOC; }
143 path                    { return FSA_PATH; }
144 prealloc                { return FSA_PREALLOC; }
145 procname                { return FSA_PROCESS; }
146 random                  { return FSA_RANDOM;}
147 randsrc			{ return FSA_RANDSRC; }
148 randtable		{ return FSA_RANDTABLE; }
149 rate                    { return FSA_RATE;}
150 readonly		{ return FSA_READONLY; }
151 reuse                   { return FSA_REUSE; }
152 round			{ return FSA_RANDROUND; }
153 seed			{ return FSA_RANDSEED; }
154 size                    { return FSA_SIZE; }
155 srcfd                   { return FSA_SRCFD; }
156 target                  { return FSA_TARGET;}
157 timeout                 { return FSA_TIMEOUT; }
158 trusttree		{ return FSA_TRUSTTREE; }
159 type			{ return FSA_TYPE; }
160 useism                  { return FSA_USEISM;}
161 value                   { return FSA_VALUE;}
162 workingset              { return FSA_WSS; }
163 
164 uniform                 { return FSV_RANDUNI; }
165 tabular			{ return FSV_RANDTAB; }
166 "."type			{ return FSS_TYPE; }
167 "."seed			{ return FSS_SEED; }
168 "."gamma		{ return FSS_GAMMA; }
169 "."mean			{ return FSS_MEAN; }
170 "."min			{ return FSS_MIN; }
171 "."round		{ return FSS_ROUND; }
172 "."randsrc		{ return FSS_SRC; }
173 urandom			{ return FSV_URAND; }
174 rand48			{ return FSV_RAND48; }
175 
176 
177 <INITIAL>\"			{
178                                 BEGIN WHITESTRINGSTATE;
179                                 return FSK_QUOTE;
180                         }
181 
182 <WHITESTRINGSTATE>\"    {
183                                 BEGIN INITIAL;
184                                 return FSK_QUOTE;
185                         }
186 
187 <WHITESTRINGSTATE>[^$^\\^"][^$^"]*[^\\^$^"] {
188 				if ((yylval.sval = strdup(yytext)) == NULL) {
189 					yyerror("Out of memory");
190 					filebench_shutdown(E_ERROR);
191 				}
192  				return FSV_WHITESTRING;
193 	       	}
194 
195 <WHITESTRINGSTATE>\\n	{
196 				yylval.sval = "\n";
197  				return FSV_WHITESTRING;
198 	       	}
199 
200 
201 <WHITESTRINGSTATE>\\$[^"^$^\\]+	{
202 				if ((yylval.sval = strdup(yytext + 1)) == NULL) {
203 					yyerror("Out of memory");
204 					filebench_shutdown(E_ERROR);
205 				}
206  				return FSV_WHITESTRING;
207 	       	}
208 
209 <WHITESTRINGSTATE>[^$^\\^"] {
210 				if ((yylval.sval = strdup(yytext)) == NULL) {
211 					yyerror("Out of memory");
212 					filebench_shutdown(E_ERROR);
213 				}
214  				return FSV_WHITESTRING;
215 	       	}
216 
217 
218 <INITIAL>\{			{ return FSK_OPENLST; }
219 <INITIAL>\}			{ return FSK_CLOSELST; }
220 <INITIAL>=			{ return FSK_ASSIGN; }
221 <INITIAL>\,			{ return FSK_SEPLST; }
222 <INITIAL>in                     { return FSK_IN; }
223 <INITIAL>\+                     { return FSK_PLUS; }
224 <INITIAL>\-                     { return FSK_MINUS; }
225 <INITIAL>\*                     { return FSK_MULTIPLY; }
226 <INITIAL>\/                     { return FSK_DIVIDE; }
227 
228 <INITIAL>[0-9]+	{
229                                 errno = 0;
230 				yylval.ival = strtoll(yytext, NULL, 10);
231 				if (errno == EINVAL || errno == ERANGE) {
232                                         (void) filebench_log(LOG_ERROR,
233 						"Invalid I value '%s':%s", yytext,
234 						strerror(errno));
235 				}
236                                 return FSV_VAL_INT;
237 }
238 
239 <INITIAL>[0-9]+k	{
240                                 errno = 0;
241 				yylval.ival = KB * strtoll(yytext, NULL, 10);
242 				if (errno == EINVAL || errno == ERANGE) {
243                                         (void) filebench_log(LOG_ERROR,
244 						"Invalid I value '%s':%s", yytext,
245 						strerror(errno));
246 				}
247                                 return FSV_VAL_INT;
248 }
249 
250 <INITIAL>[0-9]+m	{
251                                 errno = 0;
252 				yylval.ival = MB * strtoll(yytext, NULL, 10);
253 				if (errno == EINVAL || errno == ERANGE) {
254                                         (void) filebench_log(LOG_ERROR,
255 						"Invalid I value '%s':%s", yytext,
256 						strerror(errno));
257 				}
258                                 return FSV_VAL_INT;
259 }
260 
261 <INITIAL>[0-9]+g	{
262                                 errno = 0;
263 				yylval.ival = GB * strtoll(yytext, NULL, 10);
264 				if (errno == EINVAL || errno == ERANGE) {
265                                         (void) filebench_log(LOG_ERROR,
266 						"Invalid I value '%s':%s", yytext,
267 						strerror(errno));
268 				}
269                                 return FSV_VAL_INT;
270 }
271 
272 <INITIAL>true	{
273 				yylval.bval = TRUE;
274 				return FSV_VAL_BOOLEAN;
275 		}
276 
277 <INITIAL>false	{
278 				yylval.bval = FALSE;
279 				return FSV_VAL_BOOLEAN;
280 		}
281 
282 $[({A-Za-z][A-Za-z0-9_]*[A-Za-z0-9][)}]*	{
283 				if ((yylval.sval = strdup(yytext)) == NULL) {
284 					yyerror("Out of memory");
285 					filebench_shutdown(E_ERROR);
286 				}
287 
288  				return FSV_VARIABLE;
289 			}
290 
291 
292 $[({A-Za-z][A-Za-z0-9_]*"."[A-Za-z0-9][)}]*	{
293 				int backtrack;
294 
295 				if ((backtrack =
296 				    var_is_set4_randvar(yytext)) != 0)
297 					yyless(yyleng - backtrack);
298 
299 				if ((yylval.sval = strdup(yytext)) == NULL) {
300 					yyerror("Out of memory");
301 					filebench_shutdown(E_ERROR);
302 				}
303 
304  				return FSV_RANDVAR;
305 			}
306 
307 
308 <INITIAL>[/A-Za-z-][/A-Za-z0-9._-]*	{
309 				if ((yylval.sval = strdup(yytext)) == NULL) {
310 					yyerror("Out of memory");
311 					filebench_shutdown(E_ERROR);
312 				}
313  				return FSV_STRING;
314 			}
315 
316 
317 .			{
318 				yyerror("Illegal character");
319 			}
320 
321 %%
322 
323 void
324 yyerror(char *s)
325 {
326 	if (dofile == FS_TRUE) {
327 		if (yytext[0] == '\0') {
328 			filebench_log(LOG_ERROR,
329 				      "%s, token expected",
330 				      s);
331 			return;
332 		}
333 		(void) filebench_log(LOG_ERROR,
334 				     "%s at '%s'",
335 				     s,
336 				     yytext);
337 	} else {
338 		if (yytext[0] == '\0') {
339 			(void) filebench_log(LOG_ERROR,
340 					     "%s, token expected", s);
341 			return;
342 		}
343 		(void) filebench_log(LOG_ERROR, "%s at '%s'", s, yytext);
344 	}
345 }
346 
347 struct yy_buffer_state *parent;
348 struct yy_buffer_state *script;
349 
350 int
351 yy_switchfileparent(FILE *file)
352 {
353 	script = YY_CURRENT_BUFFER;
354 	parent = (struct yy_buffer_state *)yy_create_buffer(yyin, 128);
355 	yy_switch_to_buffer(parent);
356 	return (0);
357 }
358 
359 int
360 yy_switchfilescript(FILE *file)
361 {
362 	yy_switch_to_buffer(script);
363 	return (0);
364 }
365 
366