xref: /onnv-gate/usr/src/cmd/filebench/common/parser_lex.l (revision 9801:4a9784073e11)
15184Sek110237 /*
25184Sek110237  * CDDL HEADER START
35184Sek110237  *
45184Sek110237  * The contents of this file are subject to the terms of the
55184Sek110237  * Common Development and Distribution License (the "License").
65184Sek110237  * You may not use this file except in compliance with the License.
75184Sek110237  *
85184Sek110237  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95184Sek110237  * or http://www.opensolaris.org/os/licensing.
105184Sek110237  * See the License for the specific language governing permissions
115184Sek110237  * and limitations under the License.
125184Sek110237  *
135184Sek110237  * When distributing Covered Code, include this CDDL HEADER in each
145184Sek110237  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155184Sek110237  * If applicable, add the following below this CDDL HEADER, with the
165184Sek110237  * fields enclosed by brackets "[]" replaced with your own identifying
175184Sek110237  * information: Portions Copyright [yyyy] [name of copyright owner]
185184Sek110237  *
195184Sek110237  * CDDL HEADER END
205184Sek110237  */
215184Sek110237 
225184Sek110237 /*
239326SAndrew.W.Wilson@sun.com  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
245184Sek110237  * Use is subject to license terms.
256613Sek110237  *
266613Sek110237  * Portions Copyright 2008 Denis Cheng
275184Sek110237  */
285184Sek110237 
295184Sek110237 %{
305184Sek110237 
315184Sek110237 #include <stdlib.h>
325184Sek110237 #include <sys/types.h>
335184Sek110237 #include <assert.h>
345184Sek110237 #include <string.h>
355184Sek110237 #include <errno.h>
365184Sek110237 #ifdef HAVE_STDINT_H
375184Sek110237 #include <stdint.h>
385184Sek110237 #endif
396613Sek110237 
406613Sek110237 #include "filebench.h"
415184Sek110237 #include "parsertypes.h"
425184Sek110237 #include "utils.h"
435184Sek110237 #include "parser_gram.h"
445184Sek110237 
455184Sek110237 int lex_lineno = 1;		/* line-number for error reporting */
465184Sek110237 extern void yyerror(char *s);
475184Sek110237 extern int dofile;			/* are we processing a file? */
485184Sek110237 %}
495184Sek110237 
505184Sek110237 %s WHITESTRINGSTATE
515184Sek110237 
525184Sek110237 %a 50000
535184Sek110237 %p 50000
545184Sek110237 %o 50000
555184Sek110237 %n 5000
565184Sek110237 
575184Sek110237 %%
585184Sek110237 
595184Sek110237 \n			{ lex_lineno++; }
605184Sek110237 
615184Sek110237 <INITIAL>[ \t]+			;
625184Sek110237 
635184Sek110237 <INITIAL>#.*			;
645184Sek110237 
655184Sek110237 create                  { return FSC_CREATE; }
665184Sek110237 define			{ return FSC_DEFINE; }
675184Sek110237 debug                   { return FSC_DEBUG; }
687736SAndrew.W.Wilson@sun.com domultisync		{ return FSC_DOMULTISYNC; }
695184Sek110237 echo                    { return FSC_ECHO; }
707736SAndrew.W.Wilson@sun.com enable			{ return FSC_ENABLE; }
719513SAndrew.W.Wilson@sun.com eventgen                { return FSC_EVENTGEN; }
725184Sek110237 exit		        { return FSC_QUIT; }
735184Sek110237 foreach                 { return FSC_FOREACH; }
745184Sek110237 flowop		        { return FSC_FLOWOP; }
759513SAndrew.W.Wilson@sun.com fscheck		        { return FSC_FSCHECK; }
769513SAndrew.W.Wilson@sun.com fsflush		        { return FSC_FSFLUSH; }
775184Sek110237 help		        { return FSC_HELP; }
785184Sek110237 list		        { return FSC_LIST; }
795184Sek110237 load                    { return FSC_LOAD; }
805184Sek110237 log		        { return FSC_LOG; }
819356SAndrew.W.Wilson@sun.com nousestats		{ return FSC_NOUSESTATS; }
825184Sek110237 run                     { return FSC_RUN; }
835184Sek110237 set                     { return FSC_SET; }
845184Sek110237 shutdown                { return FSC_SHUTDOWN; }
855184Sek110237 sleep                   { return FSC_SLEEP; }
865184Sek110237 stats                   { return FSC_STATS; }
875184Sek110237 system                  { return FSC_SYSTEM; }
885184Sek110237 usage                   { return FSC_USAGE; }
895184Sek110237 vars                    { return FSC_VARS; }
906750Sek110237 version                 { return FSC_VERSION; }
919326SAndrew.W.Wilson@sun.com warmup                  { return FSC_WARMUP; }
925184Sek110237 quit		        { return FSC_QUIT; }
935184Sek110237 
945184Sek110237 file[s]*       	        { return FSE_FILE; }
955184Sek110237 fileset[s]*             { return FSE_FILESET; }
965184Sek110237 directory               { return FSE_DIRECTORY; }
975184Sek110237 command                 { return FSE_COMMAND; }
985184Sek110237 process[es]*	        { return FSE_PROC; }
995184Sek110237 thread		        { return FSE_THREAD; }
1006212Saw148015 randvar		        { return FSE_RAND; }
1015184Sek110237 clear                   { return FSE_CLEAR; }
1025184Sek110237 snap                    { return FSE_SNAP; }
1035184Sek110237 dump                    { return FSE_DUMP; }
1045184Sek110237 xmldump                 { return FSE_XMLDUMP; }
1057736SAndrew.W.Wilson@sun.com multidump               { return FSE_MULTIDUMP; }
1065184Sek110237 all                     { return FSE_ALL; }
1076084Saw148015 mode                    { return FSE_MODE; }
1087736SAndrew.W.Wilson@sun.com multi			{ return FSE_MULTI; }
1095184Sek110237 
1109326SAndrew.W.Wilson@sun.com alldone                 { return FSA_ALLDONE; }
1119326SAndrew.W.Wilson@sun.com blocking                { return FSA_BLOCKING; }
1125184Sek110237 cached                  { return FSA_CACHED; }
1139326SAndrew.W.Wilson@sun.com client			{ return FSA_CLIENT; }
1145184Sek110237 dirwidth                { return FSA_DIRWIDTH; }
1156212Saw148015 dirdepthrv              { return FSA_DIRDEPTHRV; }
1169326SAndrew.W.Wilson@sun.com directio                { return FSA_DIRECTIO; }
1175184Sek110237 dirgamma                { return FSA_DIRGAMMA; }
1189326SAndrew.W.Wilson@sun.com dsync                   { return FSA_DSYNC;  }
1199326SAndrew.W.Wilson@sun.com entries                 { return FSA_ENTRIES;}
1209326SAndrew.W.Wilson@sun.com fd                      { return FSA_FD; }
1219326SAndrew.W.Wilson@sun.com filename                { return FSA_FILE; }
1229326SAndrew.W.Wilson@sun.com filesetname             { return FSA_FILE; }
1236212Saw148015 filesize                { return FSA_SIZE; }
1245184Sek110237 filesizegamma           { return FSA_FILESIZEGAMMA; }
1259326SAndrew.W.Wilson@sun.com firstdone               { return FSA_FIRSTDONE; }
1269513SAndrew.W.Wilson@sun.com fstype		        { return FSA_FSTYPE; }
1279326SAndrew.W.Wilson@sun.com gamma                   { return FSA_RANDGAMMA; }
1289326SAndrew.W.Wilson@sun.com highwater               { return FSA_HIGHWATER; }
1299326SAndrew.W.Wilson@sun.com indexed                 { return FSA_INDEXED; }
1305184Sek110237 instances               { return FSA_INSTANCES;}
1315184Sek110237 iosize                  { return FSA_IOSIZE; }
1325184Sek110237 iters                   { return FSA_ITERS;}
1339326SAndrew.W.Wilson@sun.com leafdirs                { return FSA_LEAFDIRS;}
1347736SAndrew.W.Wilson@sun.com master			{ return FSA_MASTER; }
1359326SAndrew.W.Wilson@sun.com mean                    { return FSA_RANDMEAN; }
1365184Sek110237 memsize                 { return FSA_MEMSIZE; }
1379326SAndrew.W.Wilson@sun.com min                     { return FSA_RANDMIN; }
1385184Sek110237 name                    { return FSA_NAME;}
1397736SAndrew.W.Wilson@sun.com namelength              { return FSA_NAMELENGTH; }
1405184Sek110237 nice                    { return FSA_NICE;}
1419326SAndrew.W.Wilson@sun.com opennext                { return FSA_ROTATEFD; }
1429326SAndrew.W.Wilson@sun.com paralloc                { return FSA_PARALLOC; }
1439326SAndrew.W.Wilson@sun.com path                    { return FSA_PATH; }
1445184Sek110237 prealloc                { return FSA_PREALLOC; }
1455184Sek110237 procname                { return FSA_PROCESS; }
1465184Sek110237 random                  { return FSA_RANDOM;}
1479326SAndrew.W.Wilson@sun.com randsrc			{ return FSA_RANDSRC; }
1489326SAndrew.W.Wilson@sun.com randtable		{ return FSA_RANDTABLE; }
1495184Sek110237 rate                    { return FSA_RATE;}
1509326SAndrew.W.Wilson@sun.com readonly		{ return FSA_READONLY; }
1519326SAndrew.W.Wilson@sun.com reuse                   { return FSA_REUSE; }
1529326SAndrew.W.Wilson@sun.com round			{ return FSA_RANDROUND; }
1539326SAndrew.W.Wilson@sun.com seed			{ return FSA_RANDSEED; }
1545184Sek110237 size                    { return FSA_SIZE; }
1559326SAndrew.W.Wilson@sun.com srcfd                   { return FSA_SRCFD; }
1565184Sek110237 target                  { return FSA_TARGET;}
1579326SAndrew.W.Wilson@sun.com timeout                 { return FSA_TIMEOUT; }
1589326SAndrew.W.Wilson@sun.com trusttree		{ return FSA_TRUSTTREE; }
1599326SAndrew.W.Wilson@sun.com type			{ return FSA_TYPE; }
1605184Sek110237 useism                  { return FSA_USEISM;}
1615184Sek110237 value                   { return FSA_VALUE;}
1625184Sek110237 workingset              { return FSA_WSS; }
1639326SAndrew.W.Wilson@sun.com 
1646212Saw148015 uniform                 { return FSV_RANDUNI; }
1656212Saw148015 tabular			{ return FSV_RANDTAB; }
1666212Saw148015 "."type			{ return FSS_TYPE; }
1676212Saw148015 "."seed			{ return FSS_SEED; }
1686212Saw148015 "."gamma		{ return FSS_GAMMA; }
1696212Saw148015 "."mean			{ return FSS_MEAN; }
1706212Saw148015 "."min			{ return FSS_MIN; }
1716212Saw148015 "."round		{ return FSS_ROUND; }
1726212Saw148015 "."randsrc		{ return FSS_SRC; }
1736212Saw148015 urandom			{ return FSV_URAND; }
1746212Saw148015 rand48			{ return FSV_RAND48; }
1756212Saw148015 
1765184Sek110237 
1775184Sek110237 <INITIAL>\"			{
1785184Sek110237                                 BEGIN WHITESTRINGSTATE;
1795184Sek110237                                 return FSK_QUOTE;
1805184Sek110237                         }
1815184Sek110237 
1825184Sek110237 <WHITESTRINGSTATE>\"    {
1835184Sek110237                                 BEGIN INITIAL;
1845184Sek110237                                 return FSK_QUOTE;
1855184Sek110237                         }
1865184Sek110237 
1875184Sek110237 <WHITESTRINGSTATE>[^$^\\^"][^$^"]*[^\\^$^"] {
1885184Sek110237 				if ((yylval.sval = strdup(yytext)) == NULL) {
1895184Sek110237 					yyerror("Out of memory");
1905184Sek110237 					filebench_shutdown(E_ERROR);
1915184Sek110237 				}
1925184Sek110237  				return FSV_WHITESTRING;
1935184Sek110237 	       	}
1945184Sek110237 
1955184Sek110237 <WHITESTRINGSTATE>\\n	{
1965184Sek110237 				yylval.sval = "\n";
1975184Sek110237  				return FSV_WHITESTRING;
1985184Sek110237 	       	}
1995184Sek110237 
2005184Sek110237 
2015184Sek110237 <WHITESTRINGSTATE>\\$[^"^$^\\]+	{
2025184Sek110237 				if ((yylval.sval = strdup(yytext + 1)) == NULL) {
2035184Sek110237 					yyerror("Out of memory");
2045184Sek110237 					filebench_shutdown(E_ERROR);
2055184Sek110237 				}
2065184Sek110237  				return FSV_WHITESTRING;
2075184Sek110237 	       	}
2085184Sek110237 
2095184Sek110237 <WHITESTRINGSTATE>[^$^\\^"] {
2105184Sek110237 				if ((yylval.sval = strdup(yytext)) == NULL) {
2115184Sek110237 					yyerror("Out of memory");
2125184Sek110237 					filebench_shutdown(E_ERROR);
2135184Sek110237 				}
2145184Sek110237  				return FSV_WHITESTRING;
2155184Sek110237 	       	}
2165184Sek110237 
2175184Sek110237 
2185184Sek110237 <INITIAL>\{			{ return FSK_OPENLST; }
2195184Sek110237 <INITIAL>\}			{ return FSK_CLOSELST; }
2205184Sek110237 <INITIAL>=			{ return FSK_ASSIGN; }
2215184Sek110237 <INITIAL>\,			{ return FSK_SEPLST; }
2225184Sek110237 <INITIAL>in                     { return FSK_IN; }
223*9801SAndrew.W.Wilson@sun.com <INITIAL>\+                     { return FSK_PLUS; }
224*9801SAndrew.W.Wilson@sun.com <INITIAL>\-                     { return FSK_MINUS; }
225*9801SAndrew.W.Wilson@sun.com <INITIAL>\*                     { return FSK_MULTIPLY; }
226*9801SAndrew.W.Wilson@sun.com <INITIAL>\/                     { return FSK_DIVIDE; }
2275184Sek110237 
2285184Sek110237 <INITIAL>[0-9]+	{
2295184Sek110237                                 errno = 0;
2305184Sek110237 				yylval.ival = strtoll(yytext, NULL, 10);
2315184Sek110237 				if (errno == EINVAL || errno == ERANGE) {
2325184Sek110237                                         (void) filebench_log(LOG_ERROR,
2335184Sek110237 						"Invalid I value '%s':%s", yytext,
2345184Sek110237 						strerror(errno));
2355184Sek110237 				}
2365184Sek110237                                 return FSV_VAL_INT;
2375184Sek110237 }
2385184Sek110237 
2395184Sek110237 <INITIAL>[0-9]+k	{
2405184Sek110237                                 errno = 0;
2415184Sek110237 				yylval.ival = KB * strtoll(yytext, NULL, 10);
2425184Sek110237 				if (errno == EINVAL || errno == ERANGE) {
2435184Sek110237                                         (void) filebench_log(LOG_ERROR,
2445184Sek110237 						"Invalid I value '%s':%s", yytext,
2455184Sek110237 						strerror(errno));
2465184Sek110237 				}
2475184Sek110237                                 return FSV_VAL_INT;
2485184Sek110237 }
2495184Sek110237 
2505184Sek110237 <INITIAL>[0-9]+m	{
2515184Sek110237                                 errno = 0;
2525184Sek110237 				yylval.ival = MB * strtoll(yytext, NULL, 10);
2535184Sek110237 				if (errno == EINVAL || errno == ERANGE) {
2545184Sek110237                                         (void) filebench_log(LOG_ERROR,
2555184Sek110237 						"Invalid I value '%s':%s", yytext,
2565184Sek110237 						strerror(errno));
2575184Sek110237 				}
2585184Sek110237                                 return FSV_VAL_INT;
2595184Sek110237 }
2605184Sek110237 
2615184Sek110237 <INITIAL>[0-9]+g	{
2625184Sek110237                                 errno = 0;
2635184Sek110237 				yylval.ival = GB * strtoll(yytext, NULL, 10);
2645184Sek110237 				if (errno == EINVAL || errno == ERANGE) {
2655184Sek110237                                         (void) filebench_log(LOG_ERROR,
2665184Sek110237 						"Invalid I value '%s':%s", yytext,
2675184Sek110237 						strerror(errno));
2685184Sek110237 				}
2695184Sek110237                                 return FSV_VAL_INT;
2705184Sek110237 }
2715184Sek110237 
2726212Saw148015 <INITIAL>true	{
2736212Saw148015 				yylval.bval = TRUE;
2745184Sek110237 				return FSV_VAL_BOOLEAN;
2755184Sek110237 		}
2765184Sek110237 
2776212Saw148015 <INITIAL>false	{
2786212Saw148015 				yylval.bval = FALSE;
2796212Saw148015 				return FSV_VAL_BOOLEAN;
2806212Saw148015 		}
2815184Sek110237 
2826212Saw148015 $[({A-Za-z][A-Za-z0-9_]*[A-Za-z0-9][)}]*	{
2835184Sek110237 				if ((yylval.sval = strdup(yytext)) == NULL) {
2845184Sek110237 					yyerror("Out of memory");
2855184Sek110237 					filebench_shutdown(E_ERROR);
2865184Sek110237 				}
2876212Saw148015 
2885184Sek110237  				return FSV_VARIABLE;
2895184Sek110237 			}
2905184Sek110237 
2916212Saw148015 
2926212Saw148015 $[({A-Za-z][A-Za-z0-9_]*"."[A-Za-z0-9][)}]*	{
2936212Saw148015 				int backtrack;
2946212Saw148015 
2956212Saw148015 				if ((backtrack =
2966212Saw148015 				    var_is_set4_randvar(yytext)) != 0)
2976212Saw148015 					yyless(yyleng - backtrack);
2986212Saw148015 
2996212Saw148015 				if ((yylval.sval = strdup(yytext)) == NULL) {
3006212Saw148015 					yyerror("Out of memory");
3016212Saw148015 					filebench_shutdown(E_ERROR);
3026212Saw148015 				}
3036212Saw148015 
3046212Saw148015  				return FSV_RANDVAR;
3056212Saw148015 			}
3066212Saw148015 
3076212Saw148015 
3085184Sek110237 <INITIAL>[/A-Za-z-][/A-Za-z0-9._-]*	{
3095184Sek110237 				if ((yylval.sval = strdup(yytext)) == NULL) {
3105184Sek110237 					yyerror("Out of memory");
3115184Sek110237 					filebench_shutdown(E_ERROR);
3125184Sek110237 				}
3135184Sek110237  				return FSV_STRING;
3145184Sek110237 			}
3155184Sek110237 
3166212Saw148015 
3175184Sek110237 .			{
3185184Sek110237 				yyerror("Illegal character");
3195184Sek110237 			}
3205184Sek110237 
3215184Sek110237 %%
3225184Sek110237 
3235184Sek110237 void
3245184Sek110237 yyerror(char *s)
3255184Sek110237 {
3265184Sek110237 	if (dofile == FS_TRUE) {
3275184Sek110237 		if (yytext[0] == '\0') {
3285184Sek110237 			filebench_log(LOG_ERROR,
3295184Sek110237 				      "%s, token expected",
3305184Sek110237 				      s);
3315184Sek110237 			return;
3325184Sek110237 		}
3335184Sek110237 		(void) filebench_log(LOG_ERROR,
3345184Sek110237 				     "%s at '%s'",
3355184Sek110237 				     s,
3365184Sek110237 				     yytext);
3375184Sek110237 	} else {
3385184Sek110237 		if (yytext[0] == '\0') {
3395184Sek110237 			(void) filebench_log(LOG_ERROR,
3405184Sek110237 					     "%s, token expected", s);
3415184Sek110237 			return;
3425184Sek110237 		}
3435184Sek110237 		(void) filebench_log(LOG_ERROR, "%s at '%s'", s, yytext);
3445184Sek110237 	}
3455184Sek110237 }
3465184Sek110237 
3475184Sek110237 struct yy_buffer_state *parent;
3485184Sek110237 struct yy_buffer_state *script;
3495184Sek110237 
3505184Sek110237 int
3515184Sek110237 yy_switchfileparent(FILE *file)
3525184Sek110237 {
3535184Sek110237 	script = YY_CURRENT_BUFFER;
3545184Sek110237 	parent = (struct yy_buffer_state *)yy_create_buffer(yyin, 128);
3555184Sek110237 	yy_switch_to_buffer(parent);
3565184Sek110237 	return (0);
3575184Sek110237 }
3585184Sek110237 
3595184Sek110237 int
3605184Sek110237 yy_switchfilescript(FILE *file)
3615184Sek110237 {
3625184Sek110237 	yy_switch_to_buffer(script);
3635184Sek110237 	return (0);
3645184Sek110237 }
3655184Sek110237 
366