xref: /netbsd-src/external/bsd/am-utils/dist/amd/conf_tok.l (revision 19ef5b5b0bcb90f63509df6e78769de1b57c2758)
1 /*	$NetBSD: conf_tok.l,v 1.4 2011/06/22 03:58:51 mrg Exp $	*/
2 
3 %{
4 /*
5  * Copyright (c) 1997-2009 Erez Zadok
6  * Copyright (c) 1989 Jan-Simon Pendry
7  * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
8  * Copyright (c) 1989 The Regents of the University of California.
9  * All rights reserved.
10  *
11  * This code is derived from software contributed to Berkeley by
12  * Jan-Simon Pendry at Imperial College, London.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions
16  * are met:
17  * 1. Redistributions of source code must retain the above copyright
18  *    notice, this list of conditions and the following disclaimer.
19  * 2. Redistributions in binary form must reproduce the above copyright
20  *    notice, this list of conditions and the following disclaimer in the
21  *    documentation and/or other materials provided with the distribution.
22  * 3. All advertising materials mentioning features or use of this software
23  *    must display the following acknowledgment:
24  *      This product includes software developed by the University of
25  *      California, Berkeley and its contributors.
26  * 4. Neither the name of the University nor the names of its contributors
27  *    may be used to endorse or promote products derived from this software
28  *    without specific prior written permission.
29  *
30  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
31  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
32  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
33  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
34  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
35  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
36  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
37  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
38  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
39  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40  * SUCH DAMAGE.
41  *
42  *
43  * File: am-utils/amd/conf_tok.l
44  *
45  */
46 
47 /*
48  * Lexical analyzer for AMD configuration parser.
49  */
50 
51 #ifdef HAVE_CONFIG_H
52 # include <config.h>
53 #endif /* HAVE_CONFIG_H */
54 /*
55  * Some systems include a definition for the macro ECHO in <sys/ioctl.h>,
56  * and their (bad) version of lex defines it too at the very beginning of
57  * the generated lex.yy.c file (before it can be easily undefined),
58  * resulting in a conflict.  So undefine it here before needed.
59  * Luckily, it does not appear that this macro is actually used in the rest
60  * of the generated lex.yy.c file.
61  */
62 #ifdef ECHO
63 # undef ECHO
64 #endif /* ECHO */
65 #include <am_defs.h>
66 #include <amd.h>
67 #include <conf_parse.h>
68 /* and once again undefine this, just in case */
69 #ifdef ECHO
70 # undef ECHO
71 #endif /* ECHO */
72 
73 /*
74  * There are some things that need to be defined only if using GNU flex.
75  * These must not be defined if using standard lex
76  */
77 #ifdef FLEX_SCANNER
78 # ifndef ECHO
79 #  define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
80 # endif /* not ECHO */
81 #endif /* FLEX_SCANNER */
82 
83 int ayylineno = 0;
84 
85 int yylex(void);
86 /*
87  * some systems such as DU-4.x have a different GNU flex in /usr/bin
88  * which automatically generates yywrap macros and symbols.  So I must
89  * distinguish between them and when yywrap is actually needed.
90  */
91 #if !defined(yywrap) || defined(yylex)
92 int yywrap(void);
93 #endif /* not yywrap or yylex */
94 
95 #define TOK_DEBUG 0
96 
97 #if TOK_DEBUG
98 # define dprintf(f,s) fprintf(stderr, (f), ayylineno, (s))
99 # define amu_return(v)
100 #else /* not TOK_DEBUG */
101 # define dprintf(f,s)
102 # define amu_return(v) return((v))
103 #endif /* not TOK_DEBUG */
104 
105 /* no need to use yywrap() */
106 #define YY_SKIP_YYWRAP
107 
108 %}
109 
110 /* This option causes Solaris lex to fail.  Use flex.  See BUGS file */
111 /* no need to use yyunput() */
112 %option nounput
113 %option noinput
114 
115 /* allocate more output slots so lex scanners don't run out of mem */
116 %o 1024
117 
118 DIGIT		[0-9]
119 ALPHA		[A-Za-z]
120 ALPHANUM	[A-Za-z0-9]
121 SYMBOL		[A-Za-z0-9_-]
122 PATH		[A-Za-z0-9_-/]
123 NONWSCHAR	[^ \t\n\[\]=]
124 NONWSEQCHAR	[^ \t\n\[\]]
125 NONNL		[^\n]
126 NONQUOTE	[^\"]
127 
128 %%
129 
130 \n			{
131 			ayylineno++;
132 			amu_return(NEWLINE);
133 			}
134 
135 \[			{
136 			dprintf("%8d: Left bracket \"%s\"\n", yytext);
137 			yylval.strtype = strdup((char *)yytext);
138 			amu_return(LEFT_BRACKET);
139 			}
140 
141 \]			{
142 			dprintf("%8d: Right bracket \"%s\"\n", yytext);
143 			yylval.strtype = strdup((char *)yytext);
144 			amu_return(RIGHT_BRACKET);
145 			}
146 
147 =			{
148 			dprintf("%8d: Equal \"%s\"\n", yytext);
149 			yylval.strtype = strdup((char *)yytext);
150 			amu_return(EQUAL);
151 			}
152 
153 [ \t]*			{
154 			dprintf("%8d: Whitespace \"%s\"\n", yytext);
155 			}
156 "#"[^\n]*\n		{
157 			/* a comment line includes the terminating \n */
158 			ayylineno++;
159 			yytext[strlen((char *)yytext)-1] = '\0';
160 			dprintf("%8d: Comment \"%s\"\n", yytext);
161 			}
162 
163 {NONWSCHAR}{NONWSCHAR}*	{
164 			dprintf("%8d: Non-WS string \"%s\"\n", yytext);
165 			yylval.strtype = strdup((char *)yytext);
166 			amu_return(NONWS_STRING);
167 			}
168 
169 \"{NONQUOTE}{NONQUOTE}*\"	{
170 			dprintf("%8d: QUOTED-Non-WS-EQ string \"%s\"\n", yytext);
171 			/* must strip quotes */
172 			yytext[strlen((char *)yytext)-1] = '\0';
173 			yylval.strtype = strdup((char *)&yytext[1]);
174 			amu_return(QUOTED_NONWSEQ_STRING);
175 			}
176 
177 {NONWSEQCHAR}{NONWSEQCHAR}*	{
178 			dprintf("%8d: Non-WS-EQ string \"%s\"\n", yytext);
179 			yylval.strtype = strdup((char *)yytext);
180 			amu_return(NONWSEQ_STRING);
181 			}
182 
183 %%
184 
185 /*
186  * some systems such as DU-4.x have a different GNU flex in /usr/bin
187  * which automatically generates yywrap macros and symbols.  So I must
188  * distinguish between them and when yywrap is actually needed.
189  */
190 #if !defined(yywrap) || defined(yylex)
191 int yywrap(void)
192 {
193   return 1;
194 }
195 #endif /* not yywrap or yylex */
196