xref: /netbsd/sbin/cgdconfig/cgdlex.l (revision 6550d01e)
1 %{
2 /* $NetBSD: cgdlex.l,v 1.5 2009/10/29 14:49:03 christos Exp $ */
3 
4 /*-
5  * Copyright (c) 2003 The NetBSD Foundation, Inc.
6  * All rights reserved.
7  *
8  * This code is derived from software contributed to The NetBSD Foundation
9  * by Roland C. Dowdeswell.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #include <sys/cdefs.h>
34 #ifndef lint
35 __RCSID("$NetBSD: cgdlex.l,v 1.5 2009/10/29 14:49:03 christos Exp $");
36 #endif
37 
38 #include <err.h>
39 #include <stdio.h>
40 
41 #include "utils.h"
42 #include "cgdparse.h"
43 
44 /*
45  * We use macros here to separate the C from the tokeniser, to
46  * ease reading each.
47  */
48 
49 #define	RETSTRING(x)	do {					\
50 		yylval.string = string_new(yytext, yyleng);	\
51 		return (x);					\
52 	} while (0)
53 #define RETTOKEN(x)	do {					\
54 		yylval.token.text = yytext;			\
55 		yylval.token.length = yyleng;			\
56 		return (x);					\
57 	} while (0)
58 #define RETINTEGER(x)	do {					\
59 		yylval.integer = atoi(yytext);			\
60 		return (x);					\
61 	} while (0)
62 
63 #define QUOTEDBEGIN() do {						\
64 		BEGIN(quoted);						\
65 		quoted_string = string_zero();				\
66 	} while (0)
67 #define QUOTEDADD() do {						\
68 		string_t	*tmp;					\
69 									\
70 		tmp = string_new(yytext, yyleng);			\
71 		quoted_string = string_add_d(quoted_string, tmp);	\
72 	} while (0)
73 #define RETQUOTED(x) do {						\
74 		yylval.string = quoted_string;				\
75 		quoted_string = NULL;					\
76 		BEGIN(INITIAL);						\
77 		return(x);						\
78 	} while (0)
79 
80 int yylineno;
81 
82 string_t	*quoted_string;
83 
84 void	yyerror(const char *);
85 int	yylex(void);
86 %}
87 
88 %x quoted
89 %option nounput
90 
91 %%
92 
93 [0-9]+					{ RETINTEGER(INTEGER); }
94 algorithm				{ RETTOKEN(ALGORITHM); }
95 keylength				{ RETTOKEN(KEYLENGTH); }
96 iv-method				{ RETTOKEN(IVMETHOD); }
97 verify_method				{ RETTOKEN(VERIFY_METHOD); }
98 keygen					{ RETTOKEN(KEYGEN); }
99 salt					{ RETTOKEN(SALT); }
100 iterations				{ RETTOKEN(ITERATIONS); }
101 key					{ RETTOKEN(KEY); }
102 cmd					{ RETTOKEN(CMD); }
103 keygen_method				{ RETTOKEN(KEYGEN_METHOD); }
104 keygen_salt				{ RETTOKEN(KEYGEN_SALT); }
105 keygen_iterations			{ RETTOKEN(KEYGEN_ITERATIONS); }
106 xor_key					{ RETTOKEN(XOR_KEY); }
107 [;\n]					{ return EOL; }
108 \\\n					/* ignore a quoted nl */
109 [ \t]					/* ignore spaces and tabs */
110 #[^;\n]*				/* ignore comments */
111 [^ }{\t\n;"]+				{ RETSTRING(STRINGLIT); }
112 
113 \"					{ QUOTEDBEGIN(); }
114 <quoted>[^\"]+				{ QUOTEDADD(); }
115 <quoted>\"				{ RETQUOTED(STRINGLIT); }
116 
117 .					{ return yytext[0]; }
118 
119 %%
120 
121 void
122 yyerror(const char *msg)
123 {
124 
125          warnx("%s line %d: %s at '%s'", "foo", yylineno, msg, yytext);
126 }
127