1%{
2/*-
3 * DEVD (Device action daemon)
4 *
5 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
6 *
7 * Copyright (c) 2002 M. Warner Losh <imp@freebsd.org>.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 * $FreeBSD: stable/11/sbin/devd/token.l 352280 2019-09-13 07:21:06Z bapt $
32 */
33
34#include <ctype.h>
35#include <stdlib.h>
36#include <string.h>
37#include <syslog.h>
38#include "devd.h"
39#include "y.tab.h"
40
41int lineno = 1;
42
43static void
44update_lineno(const char *cp)
45{
46	while (*cp)
47		if (*cp++ == '\n')
48			lineno++;
49}
50
51%}
52
53%option noyywrap
54%option nounput
55%option noinput
56
57%%
58
59[ \t]+			;
60\n			lineno++;
61;			{ return SEMICOLON; }
62#.*$			;
63\/\/.*$			;
64\/\*([^*]|(\*+([^*\/])))*\*+\/ { update_lineno(yytext); }
65\{			{ return BEGINBLOCK; }
66\}			{ return ENDBLOCK; }
67[0-9]+			{ yylval.i = atoi(yytext); return NUMBER; }
68\"[^"]+\"		{
69				int len = strlen(yytext) - 2;
70				char *walker;
71				int i;
72				update_lineno(yytext);
73				if ((yylval.str = (char *) malloc(len + 1)) == NULL)
74					goto out;
75				walker = yylval.str;
76				for (i = 1; i <= len; i++) {
77					if (yytext[i] == '\\' &&
78					    yytext[i + 1] == '\n') {
79						i += 2;
80						while(isspace(yytext[i]))
81							i++;
82					}
83					*walker++ = yytext[i];
84				}
85				*walker++ = '\0';
86			out:;
87				return STRING;
88			}
89
90
91options			{ return OPTIONS; }
92set			{ return SET; }
93directory		{ return DIRECTORY; }
94pid-file		{ return PID_FILE; }
95attach			{ return ATTACH; }
96detach			{ return DETACH; }
97device-name		{ return DEVICE_NAME; }
98media-type		{ return MEDIA_TYPE; }
99class			{ return CLASS; }
100subdevice		{ return SUBDEVICE; }
101action			{ return ACTION; }
102match			{ return MATCH; }
103nomatch			{ return NOMATCH; }
104notify			{ return NOTIFY; }
105[A-Za-z][A-Za-z0-9_-]*	{
106				yylval.str = strdup(yytext);
107				return ID;
108			}
109%%
110
111void
112yyerror(const char *s)
113{
114	syslog(LOG_ERR, "line %d: %s%s %s.\n", lineno, yytext, yytext?":":"", s);
115}
116