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
80int yylineno;
81
82string_t	*quoted_string;
83
84void	yyerror(const char *);
85int	yylex(void);
86%}
87
88%x quoted
89%option nounput
90
91%%
92
93[0-9]+					{ RETINTEGER(INTEGER); }
94algorithm				{ RETTOKEN(ALGORITHM); }
95keylength				{ RETTOKEN(KEYLENGTH); }
96iv-method				{ RETTOKEN(IVMETHOD); }
97verify_method				{ RETTOKEN(VERIFY_METHOD); }
98keygen					{ RETTOKEN(KEYGEN); }
99salt					{ RETTOKEN(SALT); }
100iterations				{ RETTOKEN(ITERATIONS); }
101memory					{ RETTOKEN(MEMORY); }
102parallelism				{ RETTOKEN(PARALLELISM); }
103version					{ RETTOKEN(VERSION); }
104key					{ RETTOKEN(KEY); }
105cmd					{ RETTOKEN(CMD); }
106keygen_method				{ RETTOKEN(KEYGEN_METHOD); }
107keygen_salt				{ RETTOKEN(KEYGEN_SALT); }
108keygen_iterations			{ RETTOKEN(KEYGEN_ITERATIONS); }
109xor_key					{ RETTOKEN(XOR_KEY); }
110shared					{ RETTOKEN(SHARED); }
111subkey					{ 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
126void
127yyerror(const char *msg)
128{
129
130         warnx("%s line %d: %s at '%s'", "foo", yylineno, msg, yytext);
131}
132