17c478bd9Sstevel@tonic-gate %{ 27c478bd9Sstevel@tonic-gate /* 37c478bd9Sstevel@tonic-gate * CDDL HEADER START 47c478bd9Sstevel@tonic-gate * 57c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 6ffbafc53Scomay * Common Development and Distribution License (the "License"). 7ffbafc53Scomay * You may not use this file except in compliance with the License. 87c478bd9Sstevel@tonic-gate * 97c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 107c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 117c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 127c478bd9Sstevel@tonic-gate * and limitations under the License. 137c478bd9Sstevel@tonic-gate * 147c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 157c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 167c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 177c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 187c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 197c478bd9Sstevel@tonic-gate * 207c478bd9Sstevel@tonic-gate * CDDL HEADER END 21ffbafc53Scomay */ 22ffbafc53Scomay 23ffbafc53Scomay /* 24a20ee416SGlenn Faden * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 273869a938Sjv #include <assert.h> 287c478bd9Sstevel@tonic-gate #include <string.h> 297c478bd9Sstevel@tonic-gate #include <libintl.h> 307c478bd9Sstevel@tonic-gate #include "zonecfg.h" 317c478bd9Sstevel@tonic-gate #include "zonecfg_grammar.tab.h" 327c478bd9Sstevel@tonic-gate 333869a938Sjv /* 343869a938Sjv * This constant defines the number of entries added to unclaimed_tokens[] 353869a938Sjv * when it runs out of space. 363869a938Sjv */ 373869a938Sjv #define UNCLAIMED_TOKENS_BUFFER_GROWTH 4 383869a938Sjv 393869a938Sjv /* 403869a938Sjv * Invariants: 413869a938Sjv * 423869a938Sjv * unclaimed_tokens == NULL IFF unclaimed_tokens_size == 0 433869a938Sjv * unclaimed_tokens_size == 0 IFF num_unclaimed_tokens == 0 443869a938Sjv */ 453869a938Sjv static char **unclaimed_tokens; /* TOKENs produced by Lex (see below) */ 463869a938Sjv /* but not claimed by YACC reduction */ 473869a938Sjv /* rules */ 483869a938Sjv static unsigned int unclaimed_tokens_size; /* size of unclaimed_tokens */ 493869a938Sjv static unsigned int num_unclaimed_tokens; /* number of unclaimed TOKENs */ 503869a938Sjv 517c478bd9Sstevel@tonic-gate int lex_lineno = 1; /* line number for error reporting */ 527c478bd9Sstevel@tonic-gate static int state = INITIAL; 53bbec428eSgjelinek extern boolean_t cmd_file_mode; 54bbec428eSgjelinek extern boolean_t saw_error; 557c478bd9Sstevel@tonic-gate extern void yyerror(char *s); 563869a938Sjv 573869a938Sjv static char *create_token(char *s); 587c478bd9Sstevel@tonic-gate %} 597c478bd9Sstevel@tonic-gate 60cb8a054bSGlenn Faden %a 7000 61cb8a054bSGlenn Faden %p 5000 620209230bSgjelinek %e 2000 630209230bSgjelinek %n 1000 647c478bd9Sstevel@tonic-gate 657c478bd9Sstevel@tonic-gate %{ 667c478bd9Sstevel@tonic-gate /* 677c478bd9Sstevel@tonic-gate * The three states below are for tokens, lists and complex property values. 687c478bd9Sstevel@tonic-gate * Note that simple property values are a subset of tokens. 697c478bd9Sstevel@tonic-gate */ 707c478bd9Sstevel@tonic-gate %} 717c478bd9Sstevel@tonic-gate %s TSTATE 727c478bd9Sstevel@tonic-gate %s LSTATE 737c478bd9Sstevel@tonic-gate %s CSTATE 747c478bd9Sstevel@tonic-gate %% 757c478bd9Sstevel@tonic-gate 767c478bd9Sstevel@tonic-gate <INITIAL>"#"[^\n]* { } 777c478bd9Sstevel@tonic-gate 787c478bd9Sstevel@tonic-gate <INITIAL>add { 797c478bd9Sstevel@tonic-gate BEGIN TSTATE; 807c478bd9Sstevel@tonic-gate state = TSTATE; 817c478bd9Sstevel@tonic-gate return ADD; 827c478bd9Sstevel@tonic-gate } 837c478bd9Sstevel@tonic-gate 847c478bd9Sstevel@tonic-gate <INITIAL>cancel { 857c478bd9Sstevel@tonic-gate BEGIN TSTATE; 867c478bd9Sstevel@tonic-gate state = TSTATE; 877c478bd9Sstevel@tonic-gate return CANCEL; 887c478bd9Sstevel@tonic-gate } 897c478bd9Sstevel@tonic-gate 907c478bd9Sstevel@tonic-gate <INITIAL>commit { 917c478bd9Sstevel@tonic-gate BEGIN TSTATE; 927c478bd9Sstevel@tonic-gate state = TSTATE; 937c478bd9Sstevel@tonic-gate return COMMIT; 947c478bd9Sstevel@tonic-gate } 957c478bd9Sstevel@tonic-gate 967c478bd9Sstevel@tonic-gate <INITIAL>create { 977c478bd9Sstevel@tonic-gate BEGIN TSTATE; 987c478bd9Sstevel@tonic-gate state = TSTATE; 997c478bd9Sstevel@tonic-gate return CREATE; 1007c478bd9Sstevel@tonic-gate } 1017c478bd9Sstevel@tonic-gate 1027c478bd9Sstevel@tonic-gate <INITIAL>delete { 1037c478bd9Sstevel@tonic-gate BEGIN TSTATE; 1047c478bd9Sstevel@tonic-gate state = TSTATE; 1057c478bd9Sstevel@tonic-gate return DELETE; 1067c478bd9Sstevel@tonic-gate } 1077c478bd9Sstevel@tonic-gate 1087c478bd9Sstevel@tonic-gate <INITIAL>end { 1097c478bd9Sstevel@tonic-gate BEGIN TSTATE; 1107c478bd9Sstevel@tonic-gate state = TSTATE; 1117c478bd9Sstevel@tonic-gate return END; 1127c478bd9Sstevel@tonic-gate } 1137c478bd9Sstevel@tonic-gate 1147c478bd9Sstevel@tonic-gate <INITIAL>exit { 1157c478bd9Sstevel@tonic-gate BEGIN TSTATE; 1167c478bd9Sstevel@tonic-gate state = TSTATE; 1177c478bd9Sstevel@tonic-gate return EXIT; 1187c478bd9Sstevel@tonic-gate } 1197c478bd9Sstevel@tonic-gate 1207c478bd9Sstevel@tonic-gate <INITIAL>export { 1217c478bd9Sstevel@tonic-gate BEGIN TSTATE; 1227c478bd9Sstevel@tonic-gate state = TSTATE; 1237c478bd9Sstevel@tonic-gate return EXPORT; 1247c478bd9Sstevel@tonic-gate } 1257c478bd9Sstevel@tonic-gate 1267c478bd9Sstevel@tonic-gate <INITIAL>"?"|help { 1277c478bd9Sstevel@tonic-gate BEGIN TSTATE; 1287c478bd9Sstevel@tonic-gate state = TSTATE; 1297c478bd9Sstevel@tonic-gate return HELP; 1307c478bd9Sstevel@tonic-gate } 1317c478bd9Sstevel@tonic-gate 1327c478bd9Sstevel@tonic-gate <INITIAL>info { 1337c478bd9Sstevel@tonic-gate BEGIN TSTATE; 1347c478bd9Sstevel@tonic-gate state = TSTATE; 1357c478bd9Sstevel@tonic-gate return INFO; 1367c478bd9Sstevel@tonic-gate } 1377c478bd9Sstevel@tonic-gate 1387c478bd9Sstevel@tonic-gate <INITIAL>remove { 1397c478bd9Sstevel@tonic-gate BEGIN TSTATE; 1407c478bd9Sstevel@tonic-gate state = TSTATE; 1417c478bd9Sstevel@tonic-gate return REMOVE; 1427c478bd9Sstevel@tonic-gate } 1437c478bd9Sstevel@tonic-gate 1447c478bd9Sstevel@tonic-gate <INITIAL>revert { 1457c478bd9Sstevel@tonic-gate BEGIN TSTATE; 1467c478bd9Sstevel@tonic-gate state = TSTATE; 1477c478bd9Sstevel@tonic-gate return REVERT; 1487c478bd9Sstevel@tonic-gate } 1497c478bd9Sstevel@tonic-gate 1507c478bd9Sstevel@tonic-gate <INITIAL>select { 1517c478bd9Sstevel@tonic-gate BEGIN TSTATE; 1527c478bd9Sstevel@tonic-gate state = TSTATE; 1537c478bd9Sstevel@tonic-gate return SELECT; 1547c478bd9Sstevel@tonic-gate } 1557c478bd9Sstevel@tonic-gate 1567c478bd9Sstevel@tonic-gate <INITIAL>set { 1577c478bd9Sstevel@tonic-gate BEGIN TSTATE; 1587c478bd9Sstevel@tonic-gate state = TSTATE; 1597c478bd9Sstevel@tonic-gate return SET; 1607c478bd9Sstevel@tonic-gate } 1617c478bd9Sstevel@tonic-gate 1620209230bSgjelinek <INITIAL>clear { 1630209230bSgjelinek BEGIN TSTATE; 1640209230bSgjelinek state = TSTATE; 1650209230bSgjelinek return CLEAR; 1660209230bSgjelinek } 1670209230bSgjelinek 1687c478bd9Sstevel@tonic-gate <INITIAL>verify { 1697c478bd9Sstevel@tonic-gate BEGIN TSTATE; 1707c478bd9Sstevel@tonic-gate state = TSTATE; 1717c478bd9Sstevel@tonic-gate return VERIFY; 1727c478bd9Sstevel@tonic-gate } 1737c478bd9Sstevel@tonic-gate 1747c478bd9Sstevel@tonic-gate <TSTATE>net { return NET; } 1757c478bd9Sstevel@tonic-gate 1767c478bd9Sstevel@tonic-gate <TSTATE>fs { return FS; } 1777c478bd9Sstevel@tonic-gate 1787c478bd9Sstevel@tonic-gate <TSTATE>device { return DEVICE; } 1797c478bd9Sstevel@tonic-gate 1807c478bd9Sstevel@tonic-gate <TSTATE>rctl { return RCTL; } 1817c478bd9Sstevel@tonic-gate 1827c478bd9Sstevel@tonic-gate <TSTATE>attr { return ATTR; } 1837c478bd9Sstevel@tonic-gate 184cb8a054bSGlenn Faden <TSTATE>admin { return ADMIN; } 185cb8a054bSGlenn Faden 186*d2a70789SRichard Lowe <TSTATE>security-flags { return SECFLAGS; } 187*d2a70789SRichard Lowe 188087719fdSdp <TSTATE>zonename { return ZONENAME; } 189087719fdSdp <CSTATE>zonename { return ZONENAME; } 190087719fdSdp 191fa9e4066Sahrens <TSTATE>dataset { return DATASET; } 192fa9e4066Sahrens 1930209230bSgjelinek <TSTATE>dedicated-cpu { return PSET; } 1940209230bSgjelinek 195c97ad5cdSakolb <TSTATE>capped-cpu { return PCAP; } 196c97ad5cdSakolb 1970209230bSgjelinek <TSTATE>capped-memory { return MCAP; } 1980209230bSgjelinek 1997c478bd9Sstevel@tonic-gate <TSTATE>zonepath { return ZONEPATH; } 2007c478bd9Sstevel@tonic-gate <CSTATE>zonepath { return ZONEPATH; } 2017c478bd9Sstevel@tonic-gate 2029acbbeafSnn <TSTATE>brand { return BRAND; } 2039acbbeafSnn <CSTATE>brand { return BRAND; } 2049acbbeafSnn 2057c478bd9Sstevel@tonic-gate <TSTATE>autoboot { return AUTOBOOT; } 2067c478bd9Sstevel@tonic-gate <CSTATE>autoboot { return AUTOBOOT; } 2077c478bd9Sstevel@tonic-gate 208f4b3ec61Sdh <TSTATE>ip-type { return IPTYPE; } 209f4b3ec61Sdh <CSTATE>ip-type { return IPTYPE; } 210f4b3ec61Sdh 2117c478bd9Sstevel@tonic-gate <TSTATE>pool { return POOL; } 2127c478bd9Sstevel@tonic-gate <CSTATE>pool { return POOL; } 2137c478bd9Sstevel@tonic-gate 214ffbafc53Scomay <TSTATE>limitpriv { return LIMITPRIV; } 215ffbafc53Scomay <CSTATE>limitpriv { return LIMITPRIV; } 216ffbafc53Scomay 2173f2f09c1Sdp <TSTATE>bootargs { return BOOTARGS; } 2183f2f09c1Sdp <CSTATE>bootargs { return BOOTARGS; } 2193f2f09c1Sdp 2207c478bd9Sstevel@tonic-gate <TSTATE>type { return TYPE; } 2217c478bd9Sstevel@tonic-gate <CSTATE>type { return TYPE; } 2227c478bd9Sstevel@tonic-gate 2237c478bd9Sstevel@tonic-gate <TSTATE>value { return VALUE; } 2247c478bd9Sstevel@tonic-gate <CSTATE>value { return VALUE; } 2257c478bd9Sstevel@tonic-gate 2267c478bd9Sstevel@tonic-gate <TSTATE>options { return OPTIONS; } 2277c478bd9Sstevel@tonic-gate <CSTATE>options { return OPTIONS; } 2287c478bd9Sstevel@tonic-gate 229550b6e40SSowmini Varadhan <TSTATE>allowed-address { return ALLOWED_ADDRESS; } 230550b6e40SSowmini Varadhan <CSTATE>allowed-address { return ALLOWED_ADDRESS; } 231550b6e40SSowmini Varadhan 2327c478bd9Sstevel@tonic-gate <TSTATE>address { return ADDRESS; } 2337c478bd9Sstevel@tonic-gate <CSTATE>address { return ADDRESS; } 2347c478bd9Sstevel@tonic-gate 2357c478bd9Sstevel@tonic-gate <TSTATE>physical { return PHYSICAL; } 2367c478bd9Sstevel@tonic-gate <CSTATE>physical { return PHYSICAL; } 2377c478bd9Sstevel@tonic-gate 238de860bd9Sgfaden <TSTATE>defrouter { return DEFROUTER; } 239de860bd9Sgfaden <CSTATE>defrouter { return DEFROUTER; } 240de860bd9Sgfaden 2417c478bd9Sstevel@tonic-gate <TSTATE>dir { return DIR; } 2427c478bd9Sstevel@tonic-gate <CSTATE>dir { return DIR; } 2437c478bd9Sstevel@tonic-gate 2447c478bd9Sstevel@tonic-gate <TSTATE>special { return SPECIAL; } 2457c478bd9Sstevel@tonic-gate <CSTATE>special { return SPECIAL; } 2467c478bd9Sstevel@tonic-gate 2477c478bd9Sstevel@tonic-gate <TSTATE>raw { return RAW; } 2487c478bd9Sstevel@tonic-gate <CSTATE>raw { return RAW; } 2497c478bd9Sstevel@tonic-gate 2507c478bd9Sstevel@tonic-gate <TSTATE>name { return NAME; } 2517c478bd9Sstevel@tonic-gate <CSTATE>name { return NAME; } 2527c478bd9Sstevel@tonic-gate 2537c478bd9Sstevel@tonic-gate <TSTATE>match { return MATCH; } 2547c478bd9Sstevel@tonic-gate <CSTATE>match { return MATCH; } 2557c478bd9Sstevel@tonic-gate 2567c478bd9Sstevel@tonic-gate <TSTATE>priv { return PRIV; } 2577c478bd9Sstevel@tonic-gate <CSTATE>priv { return PRIV; } 2587c478bd9Sstevel@tonic-gate 2597c478bd9Sstevel@tonic-gate <TSTATE>limit { return LIMIT; } 2607c478bd9Sstevel@tonic-gate <CSTATE>limit { return LIMIT; } 2617c478bd9Sstevel@tonic-gate 2627c478bd9Sstevel@tonic-gate <TSTATE>action { return ACTION; } 2637c478bd9Sstevel@tonic-gate <CSTATE>action { return ACTION; } 2647c478bd9Sstevel@tonic-gate 2650209230bSgjelinek <TSTATE>ncpus { return NCPUS; } 2660209230bSgjelinek <CSTATE>ncpus { return NCPUS; } 2670209230bSgjelinek 2680209230bSgjelinek <TSTATE>locked { return LOCKED; } 2690209230bSgjelinek <CSTATE>locked { return LOCKED; } 2700209230bSgjelinek 2710209230bSgjelinek <TSTATE>swap { return SWAP; } 2720209230bSgjelinek <CSTATE>swap { return SWAP; } 2730209230bSgjelinek 2740209230bSgjelinek <TSTATE>importance { return IMPORTANCE; } 2750209230bSgjelinek <CSTATE>importance { return IMPORTANCE; } 2760209230bSgjelinek 2770209230bSgjelinek <TSTATE>cpu-shares { return SHARES; } 2780209230bSgjelinek <CSTATE>cpu-shares { return SHARES; } 2790209230bSgjelinek 2800209230bSgjelinek <TSTATE>max-lwps { return MAXLWPS; } 2810209230bSgjelinek <CSTATE>max-lwps { return MAXLWPS; } 2820209230bSgjelinek 283ff19e029SMenno Lageman <TSTATE>max-processes { return MAXPROCS; } 284ff19e029SMenno Lageman <CSTATE>max-processes { return MAXPROCS; } 285ff19e029SMenno Lageman 2860209230bSgjelinek <TSTATE>max-shm-memory { return MAXSHMMEM; } 2870209230bSgjelinek <CSTATE>max-shm-memory { return MAXSHMMEM; } 2880209230bSgjelinek 2890209230bSgjelinek <TSTATE>max-shm-ids { return MAXSHMIDS; } 2900209230bSgjelinek <CSTATE>max-shm-ids { return MAXSHMIDS; } 2910209230bSgjelinek 2920209230bSgjelinek <TSTATE>max-msg-ids { return MAXMSGIDS; } 2930209230bSgjelinek <CSTATE>max-msg-ids { return MAXMSGIDS; } 2940209230bSgjelinek 2950209230bSgjelinek <TSTATE>max-sem-ids { return MAXSEMIDS; } 2960209230bSgjelinek <CSTATE>max-sem-ids { return MAXSEMIDS; } 2970209230bSgjelinek 2980209230bSgjelinek <TSTATE>scheduling-class { return SCHED; } 2990209230bSgjelinek <CSTATE>scheduling-class { return SCHED; } 3000209230bSgjelinek 3015679c89fSjv <TSTATE>hostid { return HOSTID; } 3025679c89fSjv <CSTATE>hostid { return HOSTID; } 3035679c89fSjv 304cb8a054bSGlenn Faden <TSTATE>user { return USER; } 305cb8a054bSGlenn Faden <CSTATE>user { return USER; } 306cb8a054bSGlenn Faden 307cb8a054bSGlenn Faden <TSTATE>auths { return AUTHS; } 308cb8a054bSGlenn Faden <CSTATE>auths { return AUTHS; } 309cb8a054bSGlenn Faden 3100fbb751dSJohn Levon <TSTATE>fs-allowed { return FS_ALLOWED; } 3110fbb751dSJohn Levon <CSTATE>fs-allowed { return FS_ALLOWED; } 3120fbb751dSJohn Levon 313*d2a70789SRichard Lowe <TSTATE>default { return DEFAULT; } 314*d2a70789SRichard Lowe <CSTATE>default { return DEFAULT; } 315*d2a70789SRichard Lowe 316*d2a70789SRichard Lowe <TSTATE>lower { return LOWER; } 317*d2a70789SRichard Lowe <CSTATE>lower { return LOWER; } 318*d2a70789SRichard Lowe 319*d2a70789SRichard Lowe <TSTATE>upper { return UPPER; } 320*d2a70789SRichard Lowe <CSTATE>upper { return UPPER; } 321*d2a70789SRichard Lowe 3227c478bd9Sstevel@tonic-gate <TSTATE>= { return EQUAL; } 3237c478bd9Sstevel@tonic-gate <LSTATE>= { return EQUAL; } 3247c478bd9Sstevel@tonic-gate <CSTATE>= { return EQUAL; } 3257c478bd9Sstevel@tonic-gate 3267c478bd9Sstevel@tonic-gate <TSTATE>"[" { 3277c478bd9Sstevel@tonic-gate BEGIN LSTATE; 3287c478bd9Sstevel@tonic-gate state = LSTATE; 3297c478bd9Sstevel@tonic-gate return OPEN_SQ_BRACKET; 3307c478bd9Sstevel@tonic-gate } 3317c478bd9Sstevel@tonic-gate 3327c478bd9Sstevel@tonic-gate <LSTATE>"]" { 3337c478bd9Sstevel@tonic-gate BEGIN TSTATE; 3347c478bd9Sstevel@tonic-gate state = TSTATE; 3357c478bd9Sstevel@tonic-gate return CLOSE_SQ_BRACKET; 3367c478bd9Sstevel@tonic-gate } 3377c478bd9Sstevel@tonic-gate 3387c478bd9Sstevel@tonic-gate <TSTATE>"(" { 3397c478bd9Sstevel@tonic-gate BEGIN CSTATE; 3407c478bd9Sstevel@tonic-gate return OPEN_PAREN; 3417c478bd9Sstevel@tonic-gate } 3427c478bd9Sstevel@tonic-gate 3437c478bd9Sstevel@tonic-gate <LSTATE>"(" { 3447c478bd9Sstevel@tonic-gate BEGIN CSTATE; 3457c478bd9Sstevel@tonic-gate return OPEN_PAREN; 3467c478bd9Sstevel@tonic-gate } 3477c478bd9Sstevel@tonic-gate 3487c478bd9Sstevel@tonic-gate <CSTATE>")" { 3497c478bd9Sstevel@tonic-gate BEGIN state; 3507c478bd9Sstevel@tonic-gate return CLOSE_PAREN; 3517c478bd9Sstevel@tonic-gate } 3527c478bd9Sstevel@tonic-gate 3537c478bd9Sstevel@tonic-gate <LSTATE>"," { return COMMA; } 3547c478bd9Sstevel@tonic-gate <CSTATE>"," { return COMMA; } 3557c478bd9Sstevel@tonic-gate 3567c478bd9Sstevel@tonic-gate <TSTATE>[^ \t\n\";=\[\]\(\)]+ { 3573869a938Sjv yylval.strval = create_token(yytext); 3587c478bd9Sstevel@tonic-gate return TOKEN; 3597c478bd9Sstevel@tonic-gate } 3607c478bd9Sstevel@tonic-gate 3617c478bd9Sstevel@tonic-gate <LSTATE>[^ \t\n\",;=\[\]\(\)]+ { 3623869a938Sjv yylval.strval = create_token(yytext); 3637c478bd9Sstevel@tonic-gate return TOKEN; 3647c478bd9Sstevel@tonic-gate } 3657c478bd9Sstevel@tonic-gate 3667c478bd9Sstevel@tonic-gate <CSTATE>[^ \t\n\",;=\(\)]+ { 3673869a938Sjv yylval.strval = create_token(yytext); 3687c478bd9Sstevel@tonic-gate return TOKEN; 3697c478bd9Sstevel@tonic-gate } 3707c478bd9Sstevel@tonic-gate 3717c478bd9Sstevel@tonic-gate <TSTATE>\"[^\"\n]*[\"\n] { 3723869a938Sjv yylval.strval = create_token(yytext + 1); 3737c478bd9Sstevel@tonic-gate if (yylval.strval[yyleng - 2] == '"') 3747c478bd9Sstevel@tonic-gate yylval.strval[yyleng - 2] = 0; 3757c478bd9Sstevel@tonic-gate return TOKEN; 3767c478bd9Sstevel@tonic-gate } 3777c478bd9Sstevel@tonic-gate 3787c478bd9Sstevel@tonic-gate <LSTATE>\"[^\"\n]*[\"\n] { 3793869a938Sjv yylval.strval = create_token(yytext + 1); 3807c478bd9Sstevel@tonic-gate if (yylval.strval[yyleng - 2] == '"') 3817c478bd9Sstevel@tonic-gate yylval.strval[yyleng - 2] = 0; 3827c478bd9Sstevel@tonic-gate return TOKEN; 3837c478bd9Sstevel@tonic-gate } 3847c478bd9Sstevel@tonic-gate 3857c478bd9Sstevel@tonic-gate ";" { 3867c478bd9Sstevel@tonic-gate BEGIN INITIAL; 3877c478bd9Sstevel@tonic-gate return (yytext[0]); 3887c478bd9Sstevel@tonic-gate } 3897c478bd9Sstevel@tonic-gate 3907c478bd9Sstevel@tonic-gate \n { 3917c478bd9Sstevel@tonic-gate lex_lineno++; 3927c478bd9Sstevel@tonic-gate BEGIN INITIAL; 3937c478bd9Sstevel@tonic-gate return (yytext[0]); 3947c478bd9Sstevel@tonic-gate } 3957c478bd9Sstevel@tonic-gate 3967c478bd9Sstevel@tonic-gate [ \t] ; /* Ignore whitespace */ 3977c478bd9Sstevel@tonic-gate 3987c478bd9Sstevel@tonic-gate . { 3997c478bd9Sstevel@tonic-gate return (yytext[0]); 4007c478bd9Sstevel@tonic-gate } 4017c478bd9Sstevel@tonic-gate 4027c478bd9Sstevel@tonic-gate %% 4037c478bd9Sstevel@tonic-gate 4043869a938Sjv /* 4053869a938Sjv * Assert that there are no unclaimed tokens. This function enforces the 4063869a938Sjv * invariants mentioned at the top of this file. 4073869a938Sjv */ 4083869a938Sjv void 4093869a938Sjv assert_no_unclaimed_tokens(void) 4103869a938Sjv { 4113869a938Sjv assert(num_unclaimed_tokens == 0); 4123869a938Sjv assert(unclaimed_tokens == NULL); 4133869a938Sjv assert(unclaimed_tokens_size == 0); 4143869a938Sjv } 4153869a938Sjv 4163869a938Sjv /* 4173869a938Sjv * Claim the specified unclaimed TOKEN. YACC reduction rules that 4183869a938Sjv * use TOKENs should invoke this function immediately before freeing the TOKENs 4193869a938Sjv * or adding them to data structures that will be cleaned up when the YACC 4203869a938Sjv * parser finishes or encounters errors. Reduction rules should only claim the 4213869a938Sjv * TOKENs that they use. 4223869a938Sjv * 4233869a938Sjv * This function returns its argument but does not free its memory. 4243869a938Sjv */ 4257c478bd9Sstevel@tonic-gate char * 4263869a938Sjv claim_token(char *token) 4273869a938Sjv { 4283869a938Sjv unsigned int index; 4293869a938Sjv 4303869a938Sjv /* 4313869a938Sjv * Find the token in the list of unclaimed tokens. 4323869a938Sjv */ 4333869a938Sjv assert(num_unclaimed_tokens > 0); 4343869a938Sjv for (index = 0; index < num_unclaimed_tokens; index++) { 4353869a938Sjv if (unclaimed_tokens[index] == token) 4363869a938Sjv break; 4373869a938Sjv } 4383869a938Sjv 4393869a938Sjv /* 4403869a938Sjv * Abort if we didn't find the token. 4413869a938Sjv */ 4423869a938Sjv assert(index != num_unclaimed_tokens); 4433869a938Sjv 4443869a938Sjv /* 4453869a938Sjv * Replace the token with the last unclaimed token. 4463869a938Sjv */ 4473869a938Sjv num_unclaimed_tokens--; 4483869a938Sjv unclaimed_tokens[index] = unclaimed_tokens[num_unclaimed_tokens]; 4493869a938Sjv 4503869a938Sjv /* 4513869a938Sjv * Delete the list of unclaimed tokens if it's empty. 4523869a938Sjv */ 4533869a938Sjv if (num_unclaimed_tokens == 0) { 4543869a938Sjv free(unclaimed_tokens); 4553869a938Sjv unclaimed_tokens = NULL; 4563869a938Sjv unclaimed_tokens_size = 0; 4573869a938Sjv } 4583869a938Sjv 4593869a938Sjv return (token); 4603869a938Sjv } 4613869a938Sjv 4623869a938Sjv /* 4633869a938Sjv * Free all unclaimed TOKENs. This should only be invoked when the YACC 4643869a938Sjv * parser encounters errors. 4653869a938Sjv */ 4663869a938Sjv static void 4673869a938Sjv free_tokens(void) 4683869a938Sjv { 4693869a938Sjv if (unclaimed_tokens != NULL) { 4703869a938Sjv while (num_unclaimed_tokens > 0) 4713869a938Sjv free(unclaimed_tokens[--num_unclaimed_tokens]); 4723869a938Sjv free(unclaimed_tokens); 4733869a938Sjv unclaimed_tokens = NULL; 4743869a938Sjv unclaimed_tokens_size = 0; 4753869a938Sjv } 4763869a938Sjv assert_no_unclaimed_tokens(); 4773869a938Sjv } 4783869a938Sjv 4793869a938Sjv /* 4803869a938Sjv * Create a TOKEN from the specified string. The TOKEN is merely a duplicate 4813869a938Sjv * of the specified string. TOKENs must be claimed by the YACC reduction rules 4823869a938Sjv * that use them; see claim_token() above. 4833869a938Sjv */ 4843869a938Sjv char * 4853869a938Sjv create_token(char *s) 4867c478bd9Sstevel@tonic-gate { 4877c478bd9Sstevel@tonic-gate char *result; 4887c478bd9Sstevel@tonic-gate 4897c478bd9Sstevel@tonic-gate if ((result = strdup(s)) == NULL) { 4907c478bd9Sstevel@tonic-gate yyerror("Out of memory"); 4917c478bd9Sstevel@tonic-gate exit(Z_ERR); 4927c478bd9Sstevel@tonic-gate } 4933869a938Sjv 4943869a938Sjv /* 4953869a938Sjv * Add the new TOKEN to the list of unclaimed TOKENs. The list might 4963869a938Sjv * have to be resized. 4973869a938Sjv * 4983869a938Sjv * Reduction rules should claim TOKENs via claim_token() (see above). 4993869a938Sjv */ 5003869a938Sjv if (num_unclaimed_tokens == unclaimed_tokens_size) { 5013869a938Sjv char **new_unclaimed_tokens; 5023869a938Sjv 5033869a938Sjv unclaimed_tokens_size += UNCLAIMED_TOKENS_BUFFER_GROWTH; 5043869a938Sjv new_unclaimed_tokens = (char **)realloc(unclaimed_tokens, 5053869a938Sjv unclaimed_tokens_size * sizeof (char *)); 5063869a938Sjv if (new_unclaimed_tokens == NULL) { 5073869a938Sjv yyerror("Out of memory"); 5083869a938Sjv free(result); 5093869a938Sjv exit(Z_ERR); 5103869a938Sjv } 5113869a938Sjv unclaimed_tokens = new_unclaimed_tokens; 5123869a938Sjv } 5133869a938Sjv unclaimed_tokens[num_unclaimed_tokens] = result; 5143869a938Sjv num_unclaimed_tokens++; 5157c478bd9Sstevel@tonic-gate return (result); 5167c478bd9Sstevel@tonic-gate } 5177c478bd9Sstevel@tonic-gate 5187c478bd9Sstevel@tonic-gate void 5197c478bd9Sstevel@tonic-gate yyerror(char *s) 5207c478bd9Sstevel@tonic-gate { 5213869a938Sjv /* 5223869a938Sjv * Ensure that we won't leak unclaimed tokens. 5233869a938Sjv */ 5243869a938Sjv free_tokens(); 5253869a938Sjv 5267c478bd9Sstevel@tonic-gate /* feof(yyin) is not an error; anything else is, so we set saw_error */ 5277c478bd9Sstevel@tonic-gate if (yytext[0] == '\0') { 5287c478bd9Sstevel@tonic-gate if (!feof(yyin)) { 529bbec428eSgjelinek saw_error = B_TRUE; 5307c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext("%s, token expected\n"), 5317c478bd9Sstevel@tonic-gate s); 5327c478bd9Sstevel@tonic-gate } 5337c478bd9Sstevel@tonic-gate return; 5347c478bd9Sstevel@tonic-gate } 5357c478bd9Sstevel@tonic-gate 536bbec428eSgjelinek saw_error = B_TRUE; 5377c478bd9Sstevel@tonic-gate if (cmd_file_mode) 5387c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext("%s on line %d at '%s'\n"), s, 5397c478bd9Sstevel@tonic-gate lex_lineno, (yytext[0] == '\n') ? "\\n" : yytext); 5407c478bd9Sstevel@tonic-gate else 5417c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext("%s at '%s'\n"), s, 5427c478bd9Sstevel@tonic-gate (yytext[0] == '\n') ? "\\n" : yytext); 543bbec428eSgjelinek usage(B_FALSE, HELP_SUBCMDS); 5447c478bd9Sstevel@tonic-gate } 545