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