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