+/*
+ * Convert mail alias file to nameserver DB format.
+ */
+
+%{
+#include <stdio.h>
+#include <ctype.h>
+
+char yytext[BUFSIZ];
+int lineno = 1;
+%}
+
+%token NAME
+
+%start list
+
+%%
+
+list: /* empty */
+ | list alias ':' a_list
+ ;
+
+alias: NAME {
+ printf("%s IN MB UCB-VAX.ARPA\n", yytext);
+ }
+ ;
+
+a_list: aname
+ | a_list ',' aname
+ ;
+
+aname: NAME {
+ printf(" IN MG %s\n", yytext);
+ }
+ ;
+%%
+
+yylex()
+{
+ register char *cp;
+ register int c;
+ char op[32];
+
+ for (;;) {
+ c = getchar();
+ top:
+ switch (c) {
+ case '#':
+ while ((c = getchar()) != EOF && c != '\n')
+ ;
+ goto top;
+
+ case '\\':
+ if ((c = getchar()) == EOF) {
+ c = '\\';
+ break;
+ }
+ if (c != '\n') {
+ ungetc(c, stdin);
+ c = '\\';
+ break;
+ }
+ case '\n':
+ lineno++;
+ case ' ':
+ case '\t':
+ continue;
+
+ case EOF:
+ case ':':
+ case ',':
+ return (c);
+ }
+ cp = yytext;
+ do {
+ if (c == '"') {
+ do {
+ if (cp >= &yytext[BUFSIZ-1]) {
+ yyerror("buffer overflow");
+ break;
+ }
+ *cp++ = c;
+ } while ((c = getchar()) != EOF && c != '"');
+ }
+ if (cp >= &yytext[BUFSIZ-1]) {
+ yyerror("buffer overflow");
+ break;
+ }
+ if (islower(c))
+ c = toupper(c);
+ *cp++ = c;
+ } while ((c = getchar()) != EOF && !any(c, ",: \t\n"));
+ ungetc(c, stdin);
+ *cp = '\0';
+ return (NAME);
+ }
+}
+
+any(c, s)
+ int c;
+ register char *s;
+{
+ while (*s)
+ if (c == *s++)
+ return (1);
+ return (0);
+}
+
+main()
+{
+ yyparse();
+}
+
+yyerror(s)
+ char *s;
+{
+ fprintf(stderr, "line %d: %s\n", lineno, s);
+}