zonecfg_lex.l revision ff19e029e81c950f4e0f40f1f1ee1f7d8f8d8041
%{
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
*/
#include <string.h>
#include <libintl.h>
#include "zonecfg.h"
#include "zonecfg_grammar.tab.h"
extern boolean_t cmd_file_mode;
extern void yyerror(char *s);
char *safe_strdup(char *s);
%}
%a 7000
%p 5000
%e 2000
%n 1000
%{
/*
* The three states below are for tokens, lists and complex property values.
* Note that simple property values are a subset of tokens.
*/
%}
%s TSTATE
%s LSTATE
%s CSTATE
%%
<INITIAL>"#"[^\n]* { }
return ADD;
}
return CANCEL;
}
return COMMIT;
}
return CREATE;
}
return DELETE;
}
return END;
}
return EXIT;
}
return EXPORT;
}
return HELP;
}
return INFO;
}
return REMOVE;
}
return REVERT;
}
return SELECT;
}
return SET;
}
return CLEAR;
}
return VERIFY;
}
<TSTATE>"[" {
return OPEN_SQ_BRACKET;
}
<LSTATE>"]" {
return CLOSE_SQ_BRACKET;
}
<TSTATE>"(" {
return OPEN_PAREN;
}
<LSTATE>"(" {
return OPEN_PAREN;
}
<CSTATE>")" {
return CLOSE_PAREN;
}
<TSTATE>[^ \t\n\";=\[\]\(\)]+ {
yylval.strval = safe_strdup(yytext);
return TOKEN;
}
<LSTATE>[^ \t\n\",;=\[\]\(\)]+ {
yylval.strval = safe_strdup(yytext);
return TOKEN;
}
<CSTATE>[^ \t\n\",;=\(\)]+ {
yylval.strval = safe_strdup(yytext);
return TOKEN;
}
<TSTATE>\"[^\"\n]*[\"\n] {
yylval.strval = safe_strdup(yytext + 1);
if (yylval.strval[yyleng - 2] == '"')
yylval.strval[yyleng - 2] = 0;
return TOKEN;
}
<LSTATE>\"[^\"\n]*[\"\n] {
yylval.strval = safe_strdup(yytext + 1);
if (yylval.strval[yyleng - 2] == '"')
yylval.strval[yyleng - 2] = 0;
return TOKEN;
}
";" {
BEGIN INITIAL;
return (yytext[0]);
}
\n {
lex_lineno++;
BEGIN INITIAL;
return (yytext[0]);
}
[ \t] ; /* Ignore whitespace */
. {
return (yytext[0]);
}
%%
char *
safe_strdup(char *s)
{
char *result;
if ((result = strdup(s)) == NULL) {
exit(Z_ERR);
}
return (result);
}
void
yyerror(char *s)
{
/* feof(yyin) is not an error; anything else is, so we set saw_error */
if (yytext[0] == '\0') {
if (!feof(yyin)) {
saw_error = B_TRUE;
s);
}
return;
}
saw_error = B_TRUE;
if (cmd_file_mode)
lex_lineno, (yytext[0] == '\n') ? "\\n" : yytext);
else
(yytext[0] == '\n') ? "\\n" : yytext);
usage(B_FALSE, HELP_SUBCMDS);
}