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