xref: /illumos-gate/usr/src/cmd/zonecfg/zonecfg_lex.l (revision d2a70789)
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