1262266Sbapt%{
2262266Sbapt
3262266Sbapt#include <err.h>
4262266Sbapt#include <string.h>
5262266Sbapt#include <syslog.h>
6262266Sbapt#include "dma.h"
7262266Sbapt
8262266Sbaptextern int yylineno;
9262266Sbaptstatic void yyerror(const char *);
10262266Sbapt
11262266Sbaptstatic void
12262266Sbaptyyerror(const char *msg)
13262266Sbapt{
14262266Sbapt	/**
15262266Sbapt	 * Because we do error '\n' below, we need to report the error
16262266Sbapt	 * one line above of what yylineno points to.
17262266Sbapt	 */
18262266Sbapt	syslog(LOG_CRIT, "aliases line %d: %s", yylineno - 1, msg);
19262266Sbapt	fprintf(stderr, "aliases line %d: %s\n", yylineno - 1, msg);
20262266Sbapt}
21262266Sbapt
22262266Sbaptint
23262266Sbaptyywrap(void)
24262266Sbapt{
25262266Sbapt	return (1);
26262266Sbapt}
27262266Sbapt
28262266Sbapt%}
29262266Sbapt
30262266Sbapt%union {
31262266Sbapt	char *ident;
32262266Sbapt	struct stritem *strit;
33262266Sbapt	struct alias *alias;
34262266Sbapt}
35262266Sbapt
36262266Sbapt%token <ident> T_IDENT
37262266Sbapt%token T_ERROR
38262266Sbapt%token T_EOF 0
39262266Sbapt
40262266Sbapt%type <strit> dests
41262266Sbapt%type <alias> alias aliases
42262266Sbapt
43262266Sbapt%%
44262266Sbapt
45262266Sbaptstart	: aliases T_EOF
46262266Sbapt		{
47262266Sbapt			LIST_FIRST(&aliases) = $1;
48262266Sbapt		}
49262266Sbapt
50262266Sbaptaliases	: /* EMPTY */
51262266Sbapt		{
52262266Sbapt			$$ = NULL;
53262266Sbapt		}
54262266Sbapt	| alias aliases
55262266Sbapt		{
56262266Sbapt			if ($2 != NULL && $1 != NULL)
57262266Sbapt				LIST_INSERT_AFTER($2, $1, next);
58262266Sbapt			else if ($2 == NULL)
59262266Sbapt				$2 = $1;
60262266Sbapt			$$ = $2;
61262266Sbapt		}
62262266Sbapt       	;
63262266Sbapt
64262266Sbaptalias	: T_IDENT ':' dests '\n'
65262266Sbapt		{
66262266Sbapt			struct alias *al;
67262266Sbapt
68262266Sbapt			if ($1 == NULL)
69262266Sbapt				YYABORT;
70262266Sbapt			al = calloc(1, sizeof(*al));
71262266Sbapt			if (al == NULL)
72262266Sbapt				YYABORT;
73262266Sbapt			al->alias = $1;
74262266Sbapt			SLIST_FIRST(&al->dests) = $3;
75262266Sbapt			$$ = al;
76262266Sbapt		}
77262266Sbapt	| error '\n'
78262266Sbapt		{
79262266Sbapt			YYABORT;
80262266Sbapt		}
81262266Sbapt     	;
82262266Sbapt
83262266Sbaptdests	: T_IDENT
84262266Sbapt		{
85262266Sbapt			struct stritem *it;
86262266Sbapt
87262266Sbapt			if ($1 == NULL)
88262266Sbapt				YYABORT;
89262266Sbapt			it = calloc(1, sizeof(*it));
90262266Sbapt			if (it == NULL)
91262266Sbapt				YYABORT;
92262266Sbapt			it->str = $1;
93262266Sbapt			$$ = it;
94262266Sbapt		}
95262266Sbapt	| T_IDENT ',' dests
96262266Sbapt		{
97262266Sbapt			struct stritem *it;
98262266Sbapt
99262266Sbapt			if ($1 == NULL)
100262266Sbapt				YYABORT;
101262266Sbapt			it = calloc(1, sizeof(*it));
102262266Sbapt			if (it == NULL)
103262266Sbapt				YYABORT;
104262266Sbapt			it->str = $1;
105262266Sbapt			SLIST_NEXT(it, next) = $3;
106262266Sbapt			$$ = it;
107262266Sbapt		}
108262266Sbapt	;
109262266Sbapt
110262266Sbapt%%
111