1 %{
2 /* $NetBSD: cgdlex.l,v 1.7 2022/08/12 10:49:17 riastradh 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.7 2022/08/12 10:49:17 riastradh 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 memory                                            { RETTOKEN(MEMORY); }
102 parallelism                                       { RETTOKEN(PARALLELISM); }
103 version                                           { RETTOKEN(VERSION); }
104 key                                               { RETTOKEN(KEY); }
105 cmd                                               { RETTOKEN(CMD); }
106 keygen_method                                     { RETTOKEN(KEYGEN_METHOD); }
107 keygen_salt                                       { RETTOKEN(KEYGEN_SALT); }
108 keygen_iterations                       { RETTOKEN(KEYGEN_ITERATIONS); }
109 xor_key                                           { RETTOKEN(XOR_KEY); }
110 shared                                            { RETTOKEN(SHARED); }
111 subkey                                            { RETTOKEN(SUBKEY); }
112 [;\n]                                             { return EOL; }
113 \\\n                                              /* ignore a quoted nl */
114 [ \t]                                             /* ignore spaces and tabs */
115 #[^;\n]*                                /* ignore comments */
116 [^ }{\t\n;"]+                                     { RETSTRING(STRINGLIT); }
117 
118 \"                                                { QUOTEDBEGIN(); }
119 <quoted>[^\"]+                                    { QUOTEDADD(); }
120 <quoted>\"                                        { RETQUOTED(STRINGLIT); }
121 
122 .                                                 { return yytext[0]; }
123 
124 %%
125 
126 void
127 yyerror(const char *msg)
128 {
129 
130          warnx("%s line %d: %s at '%s'", "foo", yylineno, msg, yytext);
131 }
132