xref: /titanic_50/usr/src/cmd/zonecfg/zonecfg_lex.l (revision 803376f094adaaf2e4d9aa1c1d0efd56b642d838)
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 
27*3869a938Sjv227347 #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 
33*3869a938Sjv227347 /*
34*3869a938Sjv227347  * This constant defines the number of entries added to unclaimed_tokens[]
35*3869a938Sjv227347  * when it runs out of space.
36*3869a938Sjv227347  */
37*3869a938Sjv227347 #define	UNCLAIMED_TOKENS_BUFFER_GROWTH	4
38*3869a938Sjv227347 
39*3869a938Sjv227347 /*
40*3869a938Sjv227347  * Invariants:
41*3869a938Sjv227347  *
42*3869a938Sjv227347  *	unclaimed_tokens == NULL IFF unclaimed_tokens_size == 0
43*3869a938Sjv227347  *	unclaimed_tokens_size == 0 IFF num_unclaimed_tokens == 0
44*3869a938Sjv227347  */
45*3869a938Sjv227347 static char **unclaimed_tokens;		/* TOKENs produced by Lex (see below) */
46*3869a938Sjv227347 					/* but not claimed by YACC reduction */
47*3869a938Sjv227347 					/* rules */
48*3869a938Sjv227347 static unsigned int unclaimed_tokens_size;	/* size of unclaimed_tokens */
49*3869a938Sjv227347 static unsigned int num_unclaimed_tokens;	/* number of unclaimed TOKENs */
50*3869a938Sjv227347 
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);
56*3869a938Sjv227347 
57*3869a938Sjv227347 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 
186087719fdSdp <TSTATE>zonename	{ return ZONENAME; }
187087719fdSdp <CSTATE>zonename	{ return ZONENAME; }
188087719fdSdp 
189fa9e4066Sahrens <TSTATE>dataset	{ return DATASET; }
190fa9e4066Sahrens 
1910209230bSgjelinek <TSTATE>dedicated-cpu	{ return PSET; }
1920209230bSgjelinek 
193c97ad5cdSakolb <TSTATE>capped-cpu	{ return PCAP; }
194c97ad5cdSakolb 
1950209230bSgjelinek <TSTATE>capped-memory	{ return MCAP; }
1960209230bSgjelinek 
1977c478bd9Sstevel@tonic-gate <TSTATE>zonepath	{ return ZONEPATH; }
1987c478bd9Sstevel@tonic-gate <CSTATE>zonepath	{ return ZONEPATH; }
1997c478bd9Sstevel@tonic-gate 
2009acbbeafSnn35248 <TSTATE>brand	{ return BRAND; }
2019acbbeafSnn35248 <CSTATE>brand	{ return BRAND; }
2029acbbeafSnn35248 
2037c478bd9Sstevel@tonic-gate <TSTATE>autoboot	{ return AUTOBOOT; }
2047c478bd9Sstevel@tonic-gate <CSTATE>autoboot	{ return AUTOBOOT; }
2057c478bd9Sstevel@tonic-gate 
206f4b3ec61Sdh155122 <TSTATE>ip-type		{ return IPTYPE; }
207f4b3ec61Sdh155122 <CSTATE>ip-type		{ return IPTYPE; }
208f4b3ec61Sdh155122 
2097c478bd9Sstevel@tonic-gate <TSTATE>pool	{ return POOL; }
2107c478bd9Sstevel@tonic-gate <CSTATE>pool	{ return POOL; }
2117c478bd9Sstevel@tonic-gate 
212ffbafc53Scomay <TSTATE>limitpriv	{ return LIMITPRIV; }
213ffbafc53Scomay <CSTATE>limitpriv	{ return LIMITPRIV; }
214ffbafc53Scomay 
2153f2f09c1Sdp <TSTATE>bootargs	{ return BOOTARGS; }
2163f2f09c1Sdp <CSTATE>bootargs	{ return BOOTARGS; }
2173f2f09c1Sdp 
2187c478bd9Sstevel@tonic-gate <TSTATE>type	{ return TYPE; }
2197c478bd9Sstevel@tonic-gate <CSTATE>type	{ return TYPE; }
2207c478bd9Sstevel@tonic-gate 
2217c478bd9Sstevel@tonic-gate <TSTATE>value	{ return VALUE; }
2227c478bd9Sstevel@tonic-gate <CSTATE>value	{ return VALUE; }
2237c478bd9Sstevel@tonic-gate 
2247c478bd9Sstevel@tonic-gate <TSTATE>options	{ return OPTIONS; }
2257c478bd9Sstevel@tonic-gate <CSTATE>options	{ return OPTIONS; }
2267c478bd9Sstevel@tonic-gate 
227550b6e40SSowmini Varadhan <TSTATE>allowed-address { return ALLOWED_ADDRESS; }
228550b6e40SSowmini Varadhan <CSTATE>allowed-address { return ALLOWED_ADDRESS; }
229550b6e40SSowmini Varadhan 
2307c478bd9Sstevel@tonic-gate <TSTATE>address	{ return ADDRESS; }
2317c478bd9Sstevel@tonic-gate <CSTATE>address	{ return ADDRESS; }
2327c478bd9Sstevel@tonic-gate 
2337c478bd9Sstevel@tonic-gate <TSTATE>physical	{ return PHYSICAL; }
2347c478bd9Sstevel@tonic-gate <CSTATE>physical	{ return PHYSICAL; }
2357c478bd9Sstevel@tonic-gate 
236de860bd9Sgfaden <TSTATE>defrouter	{ return DEFROUTER; }
237de860bd9Sgfaden <CSTATE>defrouter	{ return DEFROUTER; }
238de860bd9Sgfaden 
2397c478bd9Sstevel@tonic-gate <TSTATE>dir	{ return DIR; }
2407c478bd9Sstevel@tonic-gate <CSTATE>dir	{ return DIR; }
2417c478bd9Sstevel@tonic-gate 
2427c478bd9Sstevel@tonic-gate <TSTATE>special	{ return SPECIAL; }
2437c478bd9Sstevel@tonic-gate <CSTATE>special	{ return SPECIAL; }
2447c478bd9Sstevel@tonic-gate 
2457c478bd9Sstevel@tonic-gate <TSTATE>raw	{ return RAW; }
2467c478bd9Sstevel@tonic-gate <CSTATE>raw	{ return RAW; }
2477c478bd9Sstevel@tonic-gate 
2487c478bd9Sstevel@tonic-gate <TSTATE>name	{ return NAME; }
2497c478bd9Sstevel@tonic-gate <CSTATE>name	{ return NAME; }
2507c478bd9Sstevel@tonic-gate 
2517c478bd9Sstevel@tonic-gate <TSTATE>match	{ return MATCH; }
2527c478bd9Sstevel@tonic-gate <CSTATE>match	{ return MATCH; }
2537c478bd9Sstevel@tonic-gate 
2547c478bd9Sstevel@tonic-gate <TSTATE>priv	{ return PRIV; }
2557c478bd9Sstevel@tonic-gate <CSTATE>priv	{ return PRIV; }
2567c478bd9Sstevel@tonic-gate 
2577c478bd9Sstevel@tonic-gate <TSTATE>limit	{ return LIMIT; }
2587c478bd9Sstevel@tonic-gate <CSTATE>limit	{ return LIMIT; }
2597c478bd9Sstevel@tonic-gate 
2607c478bd9Sstevel@tonic-gate <TSTATE>action	{ return ACTION; }
2617c478bd9Sstevel@tonic-gate <CSTATE>action	{ return ACTION; }
2627c478bd9Sstevel@tonic-gate 
2630209230bSgjelinek <TSTATE>ncpus	{ return NCPUS; }
2640209230bSgjelinek <CSTATE>ncpus	{ return NCPUS; }
2650209230bSgjelinek 
2660209230bSgjelinek <TSTATE>locked	{ return LOCKED; }
2670209230bSgjelinek <CSTATE>locked	{ return LOCKED; }
2680209230bSgjelinek 
2690209230bSgjelinek <TSTATE>swap	{ return SWAP; }
2700209230bSgjelinek <CSTATE>swap	{ return SWAP; }
2710209230bSgjelinek 
2720209230bSgjelinek <TSTATE>importance	{ return IMPORTANCE; }
2730209230bSgjelinek <CSTATE>importance	{ return IMPORTANCE; }
2740209230bSgjelinek 
2750209230bSgjelinek <TSTATE>cpu-shares	{ return SHARES; }
2760209230bSgjelinek <CSTATE>cpu-shares	{ return SHARES; }
2770209230bSgjelinek 
2780209230bSgjelinek <TSTATE>max-lwps	{ return MAXLWPS; }
2790209230bSgjelinek <CSTATE>max-lwps	{ return MAXLWPS; }
2800209230bSgjelinek 
281ff19e029SMenno Lageman <TSTATE>max-processes	{ return MAXPROCS; }
282ff19e029SMenno Lageman <CSTATE>max-processes	{ return MAXPROCS; }
283ff19e029SMenno Lageman 
2840209230bSgjelinek <TSTATE>max-shm-memory	{ return MAXSHMMEM; }
2850209230bSgjelinek <CSTATE>max-shm-memory	{ return MAXSHMMEM; }
2860209230bSgjelinek 
2870209230bSgjelinek <TSTATE>max-shm-ids	{ return MAXSHMIDS; }
2880209230bSgjelinek <CSTATE>max-shm-ids	{ return MAXSHMIDS; }
2890209230bSgjelinek 
2900209230bSgjelinek <TSTATE>max-msg-ids	{ return MAXMSGIDS; }
2910209230bSgjelinek <CSTATE>max-msg-ids	{ return MAXMSGIDS; }
2920209230bSgjelinek 
2930209230bSgjelinek <TSTATE>max-sem-ids	{ return MAXSEMIDS; }
2940209230bSgjelinek <CSTATE>max-sem-ids	{ return MAXSEMIDS; }
2950209230bSgjelinek 
2960209230bSgjelinek <TSTATE>scheduling-class	{ return SCHED; }
2970209230bSgjelinek <CSTATE>scheduling-class	{ return SCHED; }
2980209230bSgjelinek 
2995679c89fSjv227347 <TSTATE>hostid		{ return HOSTID; }
3005679c89fSjv227347 <CSTATE>hostid		{ return HOSTID; }
3015679c89fSjv227347 
302cb8a054bSGlenn Faden <TSTATE>user	{ return USER; }
303cb8a054bSGlenn Faden <CSTATE>user	{ return USER; }
304cb8a054bSGlenn Faden 
305cb8a054bSGlenn Faden <TSTATE>auths	{ return AUTHS; }
306cb8a054bSGlenn Faden <CSTATE>auths	{ return AUTHS; }
307cb8a054bSGlenn Faden 
3080fbb751dSJohn Levon <TSTATE>fs-allowed	{ return FS_ALLOWED; }
3090fbb751dSJohn Levon <CSTATE>fs-allowed	{ return FS_ALLOWED; }
3100fbb751dSJohn Levon 
3117c478bd9Sstevel@tonic-gate <TSTATE>=	{ return EQUAL; }
3127c478bd9Sstevel@tonic-gate <LSTATE>=	{ return EQUAL; }
3137c478bd9Sstevel@tonic-gate <CSTATE>=	{ return EQUAL; }
3147c478bd9Sstevel@tonic-gate 
3157c478bd9Sstevel@tonic-gate <TSTATE>"["	{
3167c478bd9Sstevel@tonic-gate 			BEGIN LSTATE;
3177c478bd9Sstevel@tonic-gate 			state = LSTATE;
3187c478bd9Sstevel@tonic-gate 			return OPEN_SQ_BRACKET;
3197c478bd9Sstevel@tonic-gate 		}
3207c478bd9Sstevel@tonic-gate 
3217c478bd9Sstevel@tonic-gate <LSTATE>"]"	{
3227c478bd9Sstevel@tonic-gate 			BEGIN TSTATE;
3237c478bd9Sstevel@tonic-gate 			state = TSTATE;
3247c478bd9Sstevel@tonic-gate 			return CLOSE_SQ_BRACKET;
3257c478bd9Sstevel@tonic-gate 		}
3267c478bd9Sstevel@tonic-gate 
3277c478bd9Sstevel@tonic-gate <TSTATE>"("	{
3287c478bd9Sstevel@tonic-gate 			BEGIN CSTATE;
3297c478bd9Sstevel@tonic-gate 			return OPEN_PAREN;
3307c478bd9Sstevel@tonic-gate 		}
3317c478bd9Sstevel@tonic-gate 
3327c478bd9Sstevel@tonic-gate <LSTATE>"("	{
3337c478bd9Sstevel@tonic-gate 			BEGIN CSTATE;
3347c478bd9Sstevel@tonic-gate 			return OPEN_PAREN;
3357c478bd9Sstevel@tonic-gate 		}
3367c478bd9Sstevel@tonic-gate 
3377c478bd9Sstevel@tonic-gate <CSTATE>")"	{
3387c478bd9Sstevel@tonic-gate 			BEGIN state;
3397c478bd9Sstevel@tonic-gate 			return CLOSE_PAREN;
3407c478bd9Sstevel@tonic-gate 		}
3417c478bd9Sstevel@tonic-gate 
3427c478bd9Sstevel@tonic-gate <LSTATE>","	{ return COMMA; }
3437c478bd9Sstevel@tonic-gate <CSTATE>","	{ return COMMA; }
3447c478bd9Sstevel@tonic-gate 
3457c478bd9Sstevel@tonic-gate <TSTATE>[^ \t\n\";=\[\]\(\)]+	{
346*3869a938Sjv227347 			yylval.strval = create_token(yytext);
3477c478bd9Sstevel@tonic-gate 			return TOKEN;
3487c478bd9Sstevel@tonic-gate 		}
3497c478bd9Sstevel@tonic-gate 
3507c478bd9Sstevel@tonic-gate <LSTATE>[^ \t\n\",;=\[\]\(\)]+	{
351*3869a938Sjv227347 			yylval.strval = create_token(yytext);
3527c478bd9Sstevel@tonic-gate 			return TOKEN;
3537c478bd9Sstevel@tonic-gate 		}
3547c478bd9Sstevel@tonic-gate 
3557c478bd9Sstevel@tonic-gate <CSTATE>[^ \t\n\",;=\(\)]+	{
356*3869a938Sjv227347 			yylval.strval = create_token(yytext);
3577c478bd9Sstevel@tonic-gate 			return TOKEN;
3587c478bd9Sstevel@tonic-gate 		}
3597c478bd9Sstevel@tonic-gate 
3607c478bd9Sstevel@tonic-gate <TSTATE>\"[^\"\n]*[\"\n] {
361*3869a938Sjv227347 			yylval.strval = create_token(yytext + 1);
3627c478bd9Sstevel@tonic-gate 			if (yylval.strval[yyleng - 2] == '"')
3637c478bd9Sstevel@tonic-gate 				yylval.strval[yyleng - 2] = 0;
3647c478bd9Sstevel@tonic-gate 			return TOKEN;
3657c478bd9Sstevel@tonic-gate 		}
3667c478bd9Sstevel@tonic-gate 
3677c478bd9Sstevel@tonic-gate <LSTATE>\"[^\"\n]*[\"\n] {
368*3869a938Sjv227347 			yylval.strval = create_token(yytext + 1);
3697c478bd9Sstevel@tonic-gate 			if (yylval.strval[yyleng - 2] == '"')
3707c478bd9Sstevel@tonic-gate 				yylval.strval[yyleng - 2] = 0;
3717c478bd9Sstevel@tonic-gate 			return TOKEN;
3727c478bd9Sstevel@tonic-gate 		}
3737c478bd9Sstevel@tonic-gate 
3747c478bd9Sstevel@tonic-gate ";"		{
3757c478bd9Sstevel@tonic-gate 			BEGIN INITIAL;
3767c478bd9Sstevel@tonic-gate 			return (yytext[0]);
3777c478bd9Sstevel@tonic-gate 		}
3787c478bd9Sstevel@tonic-gate 
3797c478bd9Sstevel@tonic-gate \n		{
3807c478bd9Sstevel@tonic-gate 			lex_lineno++;
3817c478bd9Sstevel@tonic-gate 			BEGIN INITIAL;
3827c478bd9Sstevel@tonic-gate 			return (yytext[0]);
3837c478bd9Sstevel@tonic-gate 		}
3847c478bd9Sstevel@tonic-gate 
3857c478bd9Sstevel@tonic-gate [ \t]		;	/* Ignore whitespace */
3867c478bd9Sstevel@tonic-gate 
3877c478bd9Sstevel@tonic-gate .		{
3887c478bd9Sstevel@tonic-gate 			return (yytext[0]);
3897c478bd9Sstevel@tonic-gate 		}
3907c478bd9Sstevel@tonic-gate 
3917c478bd9Sstevel@tonic-gate %%
3927c478bd9Sstevel@tonic-gate 
393*3869a938Sjv227347 /*
394*3869a938Sjv227347  * Assert that there are no unclaimed tokens.  This function enforces the
395*3869a938Sjv227347  * invariants mentioned at the top of this file.
396*3869a938Sjv227347  */
397*3869a938Sjv227347 void
398*3869a938Sjv227347 assert_no_unclaimed_tokens(void)
399*3869a938Sjv227347 {
400*3869a938Sjv227347 	assert(num_unclaimed_tokens == 0);
401*3869a938Sjv227347 	assert(unclaimed_tokens == NULL);
402*3869a938Sjv227347 	assert(unclaimed_tokens_size == 0);
403*3869a938Sjv227347 }
404*3869a938Sjv227347 
405*3869a938Sjv227347 /*
406*3869a938Sjv227347  * Claim the specified unclaimed TOKEN.  YACC reduction rules that
407*3869a938Sjv227347  * use TOKENs should invoke this function immediately before freeing the TOKENs
408*3869a938Sjv227347  * or adding them to data structures that will be cleaned up when the YACC
409*3869a938Sjv227347  * parser finishes or encounters errors.  Reduction rules should only claim the
410*3869a938Sjv227347  * TOKENs that they use.
411*3869a938Sjv227347  *
412*3869a938Sjv227347  * This function returns its argument but does not free its memory.
413*3869a938Sjv227347  */
4147c478bd9Sstevel@tonic-gate char *
415*3869a938Sjv227347 claim_token(char *token)
416*3869a938Sjv227347 {
417*3869a938Sjv227347 	unsigned int index;
418*3869a938Sjv227347 
419*3869a938Sjv227347 	/*
420*3869a938Sjv227347 	 * Find the token in the list of unclaimed tokens.
421*3869a938Sjv227347 	 */
422*3869a938Sjv227347 	assert(num_unclaimed_tokens > 0);
423*3869a938Sjv227347 	for (index = 0; index < num_unclaimed_tokens; index++) {
424*3869a938Sjv227347 		if (unclaimed_tokens[index] == token)
425*3869a938Sjv227347 			break;
426*3869a938Sjv227347 	}
427*3869a938Sjv227347 
428*3869a938Sjv227347 	/*
429*3869a938Sjv227347 	 * Abort if we didn't find the token.
430*3869a938Sjv227347 	 */
431*3869a938Sjv227347 	assert(index != num_unclaimed_tokens);
432*3869a938Sjv227347 
433*3869a938Sjv227347 	/*
434*3869a938Sjv227347 	 * Replace the token with the last unclaimed token.
435*3869a938Sjv227347 	 */
436*3869a938Sjv227347 	num_unclaimed_tokens--;
437*3869a938Sjv227347 	unclaimed_tokens[index] = unclaimed_tokens[num_unclaimed_tokens];
438*3869a938Sjv227347 
439*3869a938Sjv227347 	/*
440*3869a938Sjv227347 	 * Delete the list of unclaimed tokens if it's empty.
441*3869a938Sjv227347 	 */
442*3869a938Sjv227347 	if (num_unclaimed_tokens == 0) {
443*3869a938Sjv227347 		free(unclaimed_tokens);
444*3869a938Sjv227347 		unclaimed_tokens = NULL;
445*3869a938Sjv227347 		unclaimed_tokens_size = 0;
446*3869a938Sjv227347 	}
447*3869a938Sjv227347 
448*3869a938Sjv227347 	return (token);
449*3869a938Sjv227347 }
450*3869a938Sjv227347 
451*3869a938Sjv227347 /*
452*3869a938Sjv227347  * Free all unclaimed TOKENs.  This should only be invoked when the YACC
453*3869a938Sjv227347  * parser encounters errors.
454*3869a938Sjv227347  */
455*3869a938Sjv227347 static void
456*3869a938Sjv227347 free_tokens(void)
457*3869a938Sjv227347 {
458*3869a938Sjv227347 	if (unclaimed_tokens != NULL) {
459*3869a938Sjv227347 		while (num_unclaimed_tokens > 0)
460*3869a938Sjv227347 			free(unclaimed_tokens[--num_unclaimed_tokens]);
461*3869a938Sjv227347 		free(unclaimed_tokens);
462*3869a938Sjv227347 		unclaimed_tokens = NULL;
463*3869a938Sjv227347 		unclaimed_tokens_size = 0;
464*3869a938Sjv227347 	}
465*3869a938Sjv227347 	assert_no_unclaimed_tokens();
466*3869a938Sjv227347 }
467*3869a938Sjv227347 
468*3869a938Sjv227347 /*
469*3869a938Sjv227347  * Create a TOKEN from the specified string.  The TOKEN is merely a duplicate
470*3869a938Sjv227347  * of the specified string.  TOKENs must be claimed by the YACC reduction rules
471*3869a938Sjv227347  * that use them; see claim_token() above.
472*3869a938Sjv227347  */
473*3869a938Sjv227347 char *
474*3869a938Sjv227347 create_token(char *s)
4757c478bd9Sstevel@tonic-gate {
4767c478bd9Sstevel@tonic-gate 	char *result;
4777c478bd9Sstevel@tonic-gate 
4787c478bd9Sstevel@tonic-gate 	if ((result = strdup(s)) == NULL) {
4797c478bd9Sstevel@tonic-gate 		yyerror("Out of memory");
4807c478bd9Sstevel@tonic-gate 		exit(Z_ERR);
4817c478bd9Sstevel@tonic-gate 	}
482*3869a938Sjv227347 
483*3869a938Sjv227347 	/*
484*3869a938Sjv227347 	 * Add the new TOKEN to the list of unclaimed TOKENs.  The list might
485*3869a938Sjv227347 	 * have to be resized.
486*3869a938Sjv227347 	 *
487*3869a938Sjv227347 	 * Reduction rules should claim TOKENs via claim_token() (see above).
488*3869a938Sjv227347 	 */
489*3869a938Sjv227347 	if (num_unclaimed_tokens == unclaimed_tokens_size) {
490*3869a938Sjv227347 		char **new_unclaimed_tokens;
491*3869a938Sjv227347 
492*3869a938Sjv227347 		unclaimed_tokens_size += UNCLAIMED_TOKENS_BUFFER_GROWTH;
493*3869a938Sjv227347 		new_unclaimed_tokens = (char **)realloc(unclaimed_tokens,
494*3869a938Sjv227347 		    unclaimed_tokens_size * sizeof (char *));
495*3869a938Sjv227347 		if (new_unclaimed_tokens == NULL) {
496*3869a938Sjv227347 			yyerror("Out of memory");
497*3869a938Sjv227347 			free(result);
498*3869a938Sjv227347 			exit(Z_ERR);
499*3869a938Sjv227347 		}
500*3869a938Sjv227347 		unclaimed_tokens = new_unclaimed_tokens;
501*3869a938Sjv227347 	}
502*3869a938Sjv227347 	unclaimed_tokens[num_unclaimed_tokens] = result;
503*3869a938Sjv227347 	num_unclaimed_tokens++;
5047c478bd9Sstevel@tonic-gate 	return (result);
5057c478bd9Sstevel@tonic-gate }
5067c478bd9Sstevel@tonic-gate 
5077c478bd9Sstevel@tonic-gate void
5087c478bd9Sstevel@tonic-gate yyerror(char *s)
5097c478bd9Sstevel@tonic-gate {
510*3869a938Sjv227347 	/*
511*3869a938Sjv227347 	 * Ensure that we won't leak unclaimed tokens.
512*3869a938Sjv227347 	 */
513*3869a938Sjv227347 	free_tokens();
514*3869a938Sjv227347 
5157c478bd9Sstevel@tonic-gate 	/* feof(yyin) is not an error; anything else is, so we set saw_error */
5167c478bd9Sstevel@tonic-gate 	if (yytext[0] == '\0') {
5177c478bd9Sstevel@tonic-gate 		if (!feof(yyin)) {
518bbec428eSgjelinek 			saw_error = B_TRUE;
5197c478bd9Sstevel@tonic-gate 			(void) fprintf(stderr, gettext("%s, token expected\n"),
5207c478bd9Sstevel@tonic-gate 			    s);
5217c478bd9Sstevel@tonic-gate 		}
5227c478bd9Sstevel@tonic-gate 		return;
5237c478bd9Sstevel@tonic-gate 	}
5247c478bd9Sstevel@tonic-gate 
525bbec428eSgjelinek 	saw_error = B_TRUE;
5267c478bd9Sstevel@tonic-gate 	if (cmd_file_mode)
5277c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr, gettext("%s on line %d at '%s'\n"), s,
5287c478bd9Sstevel@tonic-gate 		    lex_lineno, (yytext[0] == '\n') ? "\\n" : yytext);
5297c478bd9Sstevel@tonic-gate 	else
5307c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr, gettext("%s at '%s'\n"), s,
5317c478bd9Sstevel@tonic-gate 		    (yytext[0] == '\n') ? "\\n" : yytext);
532bbec428eSgjelinek 	usage(B_FALSE, HELP_SUBCMDS);
5337c478bd9Sstevel@tonic-gate }
534