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