1%{
2/*
3 * Copyright (c) 2003
4 *	Bill Paul <wpaul@windriver.com>.  All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 *    must display the following acknowledgement:
16 *	This product includes software developed by Bill Paul.
17 * 4. Neither the name of the author nor the names of any co-contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34#include <sys/cdefs.h>
35__FBSDID("$FreeBSD$");
36
37#include <regex.h>
38#include <ctype.h>
39#include <err.h>
40#include <stdio.h>
41#include <stdlib.h>
42#include <string.h>
43#include "y.tab.h"
44
45int lineno = 1;
46
47int yylex(void);
48void yyerror(const char *);
49
50static void
51update_lineno(const char *cp)
52{
53	while (*cp)
54		if (*cp++ == '\n')
55			lineno++;
56}
57
58%}
59
60%option nounput
61%option noinput
62
63%%
64
65[ \t]+			;
66\n			{ lineno++; return EOL; }
67\r			;
68;.*$			;
69\/\/.*$			;
70=			{ return EQUALS; }
71,			{ return COMMA; }
72\"(\\\"|[^"]|\"\")*\"	{
73			int len = strlen(yytext) - 2;
74			int blen = len + 1;
75			char *walker;
76			int i;
77			update_lineno(yytext);
78			yylval.str = (char *)malloc(blen);
79			if (yylval.str == NULL)
80				goto out;
81			walker = yylval.str;
82			for (i = 1; i <= len; i++) {
83				if (yytext[i] == '\"') {
84					switch (yytext[i + 1]) {
85					case '\"':
86						i++;
87						break;
88					default:
89						break;
90					}
91				}
92				if (yytext[i] == '\\') {
93					switch (yytext[i + 1]) {
94					case '\n':
95						i += 2;
96						while(isspace(yytext[i]))
97							i++;
98						break;
99					case '\"':
100						i++;
101						break;
102					case '(':
103						i++;
104						break;
105					default:
106						break;
107					}
108				}
109				*walker++ = yytext[i];
110			}
111			*walker++ = '\0';
112			out:;
113			return STRING;
114			}
115\[[a-zA-Z0-9%&\{\}\-\.\/_\\\*\ ]+\]	{
116				int len = strlen(yytext);
117				yytext[len-1] = '\0';
118				yylval.str = strdup(yytext+1);
119				return SECTION;
120			}
121[a-zA-Z0-9%&\{\}\-\.\/_\\\*]+		{
122				yylval.str = strdup(yytext);
123				return WORD;
124			}
125%%
126
127void
128yyerror(const char *s)
129{
130	errx(1, "line %d: %s%s %s.", lineno, yytext, yytext?":":"", s);
131}
132