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