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