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