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