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