1%{
2
3#include <err.h>
4#include <string.h>
5#include <syslog.h>
6#include "dma.h"
7
8extern int yylineno;
9static void yyerror(const char *);
10
11static void
12yyerror(const char *msg)
13{
14	/**
15	 * Because we do error '\n' below, we need to report the error
16	 * one line above of what yylineno points to.
17	 */
18	syslog(LOG_CRIT, "aliases line %d: %s", yylineno - 1, msg);
19	fprintf(stderr, "aliases line %d: %s\n", yylineno - 1, msg);
20}
21
22int
23yywrap(void)
24{
25	return (1);
26}
27
28%}
29
30%union {
31	char *ident;
32	struct stritem *strit;
33	struct alias *alias;
34}
35
36%token <ident> T_IDENT
37%token T_ERROR
38%token T_EOF 0
39
40%type <strit> dests
41%type <alias> alias aliases
42
43%%
44
45start	: aliases T_EOF
46		{
47			LIST_FIRST(&aliases) = $1;
48		}
49
50aliases	: /* EMPTY */
51		{
52			$$ = NULL;
53		}
54	| alias aliases
55		{
56			if ($2 != NULL && $1 != NULL)
57				LIST_INSERT_AFTER($2, $1, next);
58			else if ($2 == NULL)
59				$2 = $1;
60			$$ = $2;
61		}
62       	;
63
64alias	: T_IDENT ':' dests '\n'
65		{
66			struct alias *al;
67
68			if ($1 == NULL)
69				YYABORT;
70			al = calloc(1, sizeof(*al));
71			if (al == NULL)
72				YYABORT;
73			al->alias = $1;
74			SLIST_FIRST(&al->dests) = $3;
75			$$ = al;
76		}
77	| error '\n'
78		{
79			YYABORT;
80		}
81     	;
82
83dests	: T_IDENT
84		{
85			struct stritem *it;
86
87			if ($1 == NULL)
88				YYABORT;
89			it = calloc(1, sizeof(*it));
90			if (it == NULL)
91				YYABORT;
92			it->str = $1;
93			$$ = it;
94		}
95	| T_IDENT ',' dests
96		{
97			struct stritem *it;
98
99			if ($1 == NULL)
100				YYABORT;
101			it = calloc(1, sizeof(*it));
102			if (it == NULL)
103				YYABORT;
104			it->str = $1;
105			SLIST_NEXT(it, next) = $3;
106			$$ = it;
107		}
108	;
109
110%%
111