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