home *** CD-ROM | disk | FTP | other *** search
- Subject: v25i020: Ease 3.5 - high-level sendmail.cf language, Part04/06
- Newsgroups: comp.sources.unix
- Approved: vixie@pa.dec.com
-
- Submitted-by: Bruce G. Barnett <barnett@crdgw1.ge.com>
- Posting-number: Volume 25, Issue 20
- Archive-name: ease3.5/part04
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 4 (of 6)."
- # Contents: src/parser.y
- # Wrapped by vixie@cognition.pa.dec.com on Tue Dec 10 08:45:57 1991
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'src/parser.y' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'src/parser.y'\"
- else
- echo shar: Extracting \"'src/parser.y'\" \(26290 characters\)
- sed "s/^X//" >'src/parser.y' <<'END_OF_FILE'
- X%{
- X#ifdef FLUKE
- X# ifndef LINT
- X static char RCSid[] = "@(#)FLUKE $Header: /home/kreskin/u0/barnett/Src/Ease/ease/src/RCS/parser.y,v 3.4 1991/10/15 17:02:04 barnett Exp $";
- X# endif LINT
- X#endif FLUKE
- X
- X/*
- X * parser.y -- EASE parser.
- X *
- X * Contains code for yacc(1) which produces a parser (y.tab.c)
- X * for Ease, a specification format for sendmail configuration
- X * files.
- X *
- X * author -- James S. Schoner, Purdue University Computing Center,
- X * West Lafayette, Indiana 47907
- X *
- X * date -- July 2, 1985
- X *
- X * Copyright (c) 1985 by Purdue Research Foundation
- X *
- X * All rights reserved.
- X *
- X * $Log: parser.y,v $
- X * Revision 3.4 1991/10/15 17:02:04 barnett
- X * Detect if (one_or_more) next ($2) error
- X *
- X * Revision 3.3 1991/09/09 16:33:23 barnett
- X * Minor bug fix release
- X *
- X * Revision 3.2 1991/05/16 10:45:25 barnett
- X * Better support for System V machines
- X * Support for machines with read only text segments
- X *
- X * Revision 3.1 1991/02/25 22:09:52 barnett
- X * Fixed some portability problems
- X *
- X * Revision 3.0 1991/02/22 18:50:27 barnett
- X * Added support for HP/UX and IDA sendmail.
- X *
- X * Revision 2.1 1990/01/30 15:48:35 jeff
- X * Added SunOS/Ultrix/IDA extensions Jan 24, 1989 Bruce Barnett
- X *
- X * Version 2.0 90/01/30 15:44:34 jeff
- X * Baseline release for netwide posting.
- X *
- X */
- X
- X#include "fixstrings.h"
- X#include <stdio.h>
- X#include "symtab.h"
- X#include <ctype.h>
- extern void BindID ();
- extern void EmitDef ();
- extern char *ListAppend ();
- extern char *MakeCond ();
- extern char *MakeRStr ();
- extern char *ConvOpt ();
- extern char *ConvFlg ();
- extern char *MacScan ();
- extern char *ConvMat ();
- extern void StartRuleset ();
- extern char *MakePosTok ();
- extern char *GetField ();
- extern char *Bracket ();
- extern char *DbmParen ();
- extern char *MakeRSCall ();
- extern char *CheckMailer ();
- extern char *CheckRS ();
- extern char *MakeField ();
- extern char MakeMac ();
- extern void AssignType ();
- extern void RemoveSymbol ();
- extern void yyerror ();
- extern void FatalError ();
- extern short RMatch; /* ruleset match flag */
- extern short number_of_fields; /* number of fields on the line */
- X#ifdef DATA_RW
- char *Cbuf = " "; /* character buffer */
- char *Mbuf = "$ "; /* macro buffer */
- X#else
- char *Cbuf = NULL;
- char *Mbuf = NULL;
- extern char *Strdup();
- X#endif
- char *Tsb; /* pointer to temporary string buffer */
- char *Tsb1; /* pointer to another temporary string buffer */
- char *Flaglist; /* pointer to header flag list */
- X
- X#define DIM(x) (sizeof x/sizeof x[0])
- extern int yychar;
- extern int yydebug;
- X
- X#ifndef DATA_RW
- void InitParser()
- X{
- X if(!(Cbuf = Strdup(" ")) || !(Mbuf = Strdup("$ ")))
- X FatalError("Out of memory in InitParser()", (char *)NULL);
- X}
- X#endif
- X
- static void
- XFree( ptr )
- char *ptr;
- X {
- X if (ptr == (char *)0) {
- X/* fprintf(stderr,"Freeing a null pointer\n"); */
- X } else {
- X if (free(ptr) < 0 ) {
- X fprintf(stderr,"Free() returned an error\n");
- X }
- X }
- X fflush(stderr);
- X };
- static char *
- yydisplay(ch)
- X register int ch;
- X{
- X static char buf[15];
- X static char * token[] = {
- X#include "y.tok.h"
- X 0 };
- X
- X switch (ch) {
- X case 0:
- X return "[end of file]";
- X/* YYERRCODE is 256. See below */
- X/* case YYERRCODE:
- X return "[error]"; */
- X case '\b':
- X return "'\\b'";
- X case '\f':
- X return "'\\f'";
- X case '\n':
- X return "'\\n'";
- X case '\r':
- X return "'\\r'";
- X case '\t':
- X return "'\\t'";
- X }
- X /* I should use YYERRCODE - but it hasn't been defined yet */
- X /* when /usr/lib/yaccpar is added to this file, it will be defined */
- X if (ch == 256 ) return ("[error]");
- X if (ch > 256 && ch < 256 + DIM(token))
- X return token[ch - 257];
- X if (isascii(ch) && isprint(ch))
- X sprintf(buf, "'%c'",ch);
- X else if (ch < 256)
- X sprintf(buf, "Char %o4.3o", ch);
- X else
- X sprintf(buf, "token %d", ch);
- X return buf;
- X}
- static yyyylex()
- X{
- X if (yychar < 0) {
- X /* don't make this match =yylex - because sed changes
- X =yylex to =yyyylex in the Makefile.
- X the pieces it changes is in /usr/lib/yaccparr and I don't
- X want to modify THAT! - bgb */
- X
- X if ((yychar = yylex ()) < 0) /* call yylex, not yyyylex */
- X yychar = 0;
- X#ifdef YYDEBUG
- X if (yydebug)
- X printf("[yydebug] reading %s\n",
- X yydisplay(yychar));
- X fflush(stdout);
- X#endif
- X return yychar;
- X }
- X}
- X
- X
- X%}
- X
- X%union { /* value stack element type */
- X int ival; /* integer token */
- X char *psb; /* string token */
- X struct he *phe; /* pointer to hash entry */
- X enum opts optval; /* sendmail options */
- X enum flgs flgval; /* mailer flags */
- X enum mats mpval; /* mailer attribute parameters */
- X}
- X
- X%start config
- X
- X%token <phe> IDENT
- X%token <psb> SCONST
- X%token <ival> ICONST SEPCHAR
- X%token BIND CANON CLASS CONCAT FOR HEADER HOST HOSTNUM IF IFSET IN
- X%token MACRO MAILER MAP MARGV MATCH MEOL MFLAGS MMAXSIZE MPATH
- X%token MRECIPIENT MSENDER NEXT OPTIONS PRECEDENCE READCLASS RESOLVE
- X%token RETRY RETURN RULESET TRUSTED USER
- X%token YPALIAS YPMAP YPPASSWD EVAL RESOLVED QUOTE ASM PROGRAM DEFAULT ALIAS
- X%token DBM
- X
- X%token ASGN COLON COMMA DEFINE DOLLAR FIELD LBRACE LPAREN RBRACE
- X%token RPAREN SEMI STAR SLASH
- X
- X%token AAOPT AOPT BBOPT CCOPT COPT DDOPT DOPT DOPTB DOPTI DOPTQ EOPT
- X%token EOPTE EOPTM EOPTP EOPTW EOPTZ FFOPT FOPT GOPT HHOPT IOPT LLOPT
- X%token MOPT NNOPT NOPT OOPT PPOPT QOPT QQOPT ROPT SOPT SSOPT TOPT TTOPT
- X%token UOPT VOPT WWOPT XOPT XXOPT YOPT YYOPT ZOPT ZZOPT
- X%token RROPT BOPT SLOPT HOPT IIOPT
- X
- X%token AAFLAG CCFLAG DDFLAG EEFLAG EFLAG FFFLAG FFLAG HFLAG IIFLAG LFLAG
- X%token LLFLAG MFLAG MMFLAG NFLAG PFLAG PPFLAG RFLAG RRFLAG SFLAG SSFLAG
- X%token UFLAG UUFLAG XFLAG XXFLAG
- X%token HHFLAG VVFLAG BBFLAG
- X
- X%type <psb> mval strval ifcon conval ifres elseres nameset namelist
- X%type <psb> doptid eoptid idlist fcond dlist mflags route mdefs
- X%type <psb> matchaddr matchtok action actionstmt mailerspec mtdef
- X%type <psb> rwaddr rwtok ftype reftok rword cantok resolution
- X%type <psb> dbmtok dbmval dbmvaltok dbmstuff
- X%type <psb> userspec hword hostid dheader mdefine
- X%type <psb> catstring catstringlist canval canvaltok
- X%type <ival> anychar
- X%type <phe> cdef
- X%type <optval> optid
- X%type <flgval> flagid
- X%type <mpval> mvar
- X%type <psb> ifresmatch elseresmatch ifresroute elseresroute
- X/* needed special class with no comma's allowed */
- X%type <ival> anycharbutcomma
- X%type <psb> matchaddrnocomma matchtoknocomma
- X
- X%left COMMA
- X%left LPAREN RPAREN
- X%nonassoc SCONST
- X
- X%%
- config : /* empty */
- X | config blockdef
- X | error blockdef
- X ;
- X
- blockdef : BIND bindings
- X | MACRO macdefs
- X | CLASS classdefs
- X | OPTIONS optdefs
- X | PRECEDENCE precdefs
- X | TRUSTED tlist
- X | HEADER hdefs
- X | MAILER mlist
- X | RULESET rdef
- X | FIELD fdefs
- X ;
- X
- bindings : /* empty */
- X | bindings IDENT ASGN RULESET ICONST SEMI {
- X BindID ($2, $5, ID_RULESET);
- X }
- X | error SEMI {
- X yyerrok;
- X }
- X ;
- X
- macdefs : /* empty */
- X | macdefs IDENT ASGN mdefine SEMI {
- X EmitDef (def_macro, $2, $4, (char *) NULL);
- X }
- X | error SEMI {
- X yyerrok;
- X }
- X ;
- X
- X/* macro value
- X * can be string
- X * or ifset()
- X * or concat
- X */
- mdefine : mval {
- X $$ = $1;
- X }
- X | IFSET LPAREN IDENT COMMA ifres RPAREN {
- X $$ = MakeCond ($3, MacScan($5));
- X }
- X ;
- mval : strval %prec COMMA {
- X $$ = $1;
- X }
- X | CONCAT LPAREN conval RPAREN {
- X $$ = $3;
- X }
- X ;
- X
- strval : SCONST {
- X $$ = $1;
- X }
- X | strval SCONST {
- X $$ = ListAppend ($1, $2, (char *) NULL);
- X Free ($1);
- X }
- X ;
- X
- X/* conval specifies what can be in a concat() function */
- conval : strval COMMA ifcon {
- X $$ = ListAppend ($1, $3, (char *) NULL);
- X Free ($1);
- X Free ($3);
- X }
- X | ifcon COMMA strval {
- X $$ = ListAppend ($1, $3, (char *) NULL);
- X Free ($1);
- X Free ($3);
- X }
- X | ifcon {
- X $$ = $1;
- X }
- X | error {
- X $$ = NULL;
- X }
- X ;
- X
- ifcon : IFSET LPAREN IDENT COMMA ifres RPAREN {
- X $$ = MakeCond ($3, MacScan($5));
- X }
- X ;
- X
- ifres : mval elseres {
- X if ($2 != NULL) {
- X $$ = ListAppend ($1, $2, "$|");
- X Free ($1);
- X Free ($2);
- X } else
- X $$ = $1;
- X }
- X | error {
- X $$ = NULL;
- X }
- X ;
- X
- elseres : /* empty */ {
- X $$ = NULL;
- X }
- X | COMMA mval {
- X $$ = $2;
- X }
- X ;
- X
- classdefs : /* empty */
- X | classdefs IDENT ASGN nameset {
- X EmitDef (def_class, $2, $4, (char *) NULL);
- X }
- X | classdefs ASM LPAREN SCONST RPAREN SEMI {
- X printf("%s\n",$4);
- X }
- X | error
- X ;
- X
- nameset : LBRACE namelist RBRACE SEMI {
- X $$ = $2;
- X }
- X | LBRACE RBRACE SEMI {
- X $$ = NULL;
- X }
- X | LBRACE error RBRACE SEMI {
- X $$ = NULL;
- X }
- X | READCLASS LPAREN strval RPAREN SEMI {
- X $$ = MakeRStr ($3, (char *) NULL);
- X }
- X | READCLASS LPAREN strval COMMA strval RPAREN SEMI {
- X $$ = MakeRStr ($3, $5);
- X }
- X | READCLASS LPAREN error RPAREN SEMI {
- X $$ = NULL;
- X }
- X | error SEMI {
- X $$ = NULL;
- X yyerrok;
- X }
- X ;
- X
- namelist : IDENT {
- X $$ = ListAppend ($1->psb, (char *) NULL, (char *) NULL);
- X RemoveSymbol ($1);
- X }
- X | strval {
- X $$ = $1;
- X }
- X | namelist COMMA IDENT {
- X $$ = ListAppend ($1, $3->psb, " ");
- X Free ($1);
- X RemoveSymbol ($3);
- X }
- X | namelist COMMA strval {
- X $$ = ListAppend ($1, $3, " ");
- X Free ($1);
- X Free ($3);
- X }
- X ;
- X
- optdefs : /* empty */
- X | optdefs optid ASGN strval SEMI {
- X EmitDef (def_option, (struct he *) NULL, ConvOpt ($2), $4);
- X }
- X | optdefs DOPT ASGN doptid SEMI {
- X EmitDef (def_option, (struct he *) NULL, ConvOpt (opt_d), $4);
- X }
- X | optdefs EOPT ASGN eoptid SEMI {
- X EmitDef (def_option, (struct he *) NULL, ConvOpt (opt_e), $4);
- X }
- X | optdefs ASM LPAREN SCONST RPAREN SEMI {
- X printf("%s\n",$4);
- X }
- X | error SEMI {
- X yyerrok;
- X }
- X ;
- X
- optid : AAOPT {
- X $$ = opt_A;
- X }
- X | AOPT {
- X $$ = opt_a;
- X }
- X | BBOPT {
- X $$ = opt_B;
- X }
- X | BOPT {
- X $$ = opt_b;
- X }
- X | CCOPT {
- X $$ = opt_C;
- X }
- X | COPT {
- X $$ = opt_c;
- X }
- X | DDOPT {
- X $$ = opt_D;
- X }
- X | FFOPT {
- X $$ = opt_F;
- X }
- X | FOPT {
- X $$ = opt_f;
- X }
- X | GOPT {
- X $$ = opt_g;
- X }
- X | HOPT {
- X $$ = opt_h;
- X }
- X | HHOPT {
- X $$ = opt_H;
- X }
- X | IOPT {
- X $$ = opt_i;
- X }
- X | IIOPT {
- X $$ = opt_I;
- X }
- X | LLOPT {
- X $$ = opt_L;
- X }
- X | MOPT {
- X $$ = opt_m;
- X }
- X | NNOPT {
- X $$ = opt_N;
- X }
- X | NOPT {
- X $$ = opt_n;
- X }
- X | PPOPT {
- X $$ = opt_P;
- X }
- X | OOPT {
- X $$ = opt_o;
- X }
- X | QQOPT {
- X $$ = opt_Q;
- X }
- X | QOPT {
- X $$ = opt_q;
- X }
- X | ROPT {
- X $$ = opt_r;
- X }
- X | RROPT {
- X $$ = opt_R;
- X }
- X | SSOPT {
- X $$ = opt_S;
- X }
- X | SOPT {
- X $$ = opt_s;
- X }
- X | TTOPT {
- X $$ = opt_T;
- X }
- X | TOPT {
- X $$ = opt_t;
- X }
- X | UOPT {
- X $$ = opt_u;
- X }
- X | VOPT {
- X $$ = opt_v;
- X }
- X | WWOPT {
- X $$ = opt_W;
- X }
- X | XOPT {
- X $$ = opt_x;
- X }
- X | XXOPT {
- X $$ = opt_X;
- X }
- X | YOPT {
- X $$ = opt_y;
- X }
- X | YYOPT {
- X $$ = opt_Y;
- X }
- X | ZOPT {
- X $$ = opt_z;
- X }
- X | ZZOPT {
- X $$ = opt_Z;
- X }
- X | SLOPT {
- X $$ = opt_SL; /* SLASH .e.g. O/ in IDA */
- X }
- X ;
- X
- doptid : DOPTI {
- X $$ = ConvOpt (d_opt_i);
- X }
- X | DOPTB {
- X $$ = ConvOpt (d_opt_b);
- X }
- X | DOPTQ {
- X $$ = ConvOpt (d_opt_q);
- X }
- X ;
- X
- eoptid : EOPTP {
- X $$ = ConvOpt (e_opt_p);
- X }
- X | EOPTE {
- X $$ = ConvOpt (e_opt_e);
- X }
- X | EOPTM {
- X $$ = ConvOpt (e_opt_m);
- X }
- X | EOPTW {
- X $$ = ConvOpt (e_opt_w);
- X }
- X | EOPTZ {
- X $$ = ConvOpt (e_opt_z);
- X }
- X ;
- X
- precdefs : /* empty */
- X | precdefs IDENT ASGN ICONST SEMI {
- X BindID ($2, $4, ID_PREC);
- X EmitDef (def_prec, $2, (char *) NULL, (char *) NULL);
- X }
- X ;
- X
- tlist : /* empty */
- X | tlist LBRACE IDENT idlist RBRACE SEMI {
- X EmitDef (def_trusted, (struct he *) NULL,
- X ListAppend ($3->psb, $4, " "), (char *) NULL);
- X Free ($4); /* Gets a Null pointer */
- X RemoveSymbol ($3);
- X }
- X | tlist LBRACE RBRACE SEMI
- X | error SEMI {
- X yyerrok;
- X }
- X ;
- X
- hdefs : /* empty */
- X | hdefs FOR fcond dheader SEMI {
- X EmitDef (def_header, (struct he *) NULL, $3, $4);
- X }
- X | hdefs FOR fcond LBRACE { Flaglist = $3; }
- X dheaders RBRACE SEMI
- X | hdefs DEFINE dlist SEMI {
- X EmitDef (def_header, (struct he *) NULL, (char *) NULL, $3);
- X }
- X | error SEMI {
- X yyerrok;
- X }
- X ;
- X
- fcond : LPAREN RPAREN {
- X $$ = NULL;
- X }
- X | LPAREN mflags RPAREN {
- X $$ = $2;
- X }
- X | LPAREN error RPAREN {
- X $$ = NULL;
- X }
- X ;
- X
- mflags : flagid {
- X $$ = ListAppend (ConvFlg ($1), (char *) NULL, (char *) NULL);
- X }
- X | mflags COMMA flagid {
- X $$ = ListAppend ($1, ConvFlg($3), (char *) NULL);
- X Free ($1);
- X }
- X ;
- X
- flagid : FFLAG {
- X $$ = flg_f;
- X }
- X | RFLAG {
- X $$ = flg_r;
- X }
- X | SSFLAG {
- X $$ = flg_S;
- X }
- X | NFLAG {
- X $$ = flg_n;
- X }
- X | LFLAG {
- X $$ = flg_l;
- X }
- X | SFLAG {
- X $$ = flg_s;
- X }
- X | MFLAG {
- X $$ = flg_m;
- X }
- X | FFFLAG {
- X $$ = flg_F;
- X }
- X | DDFLAG {
- X $$ = flg_D;
- X }
- X | MMFLAG {
- X $$ = flg_M;
- X }
- X | XFLAG {
- X $$ = flg_x;
- X }
- X | PPFLAG {
- X $$ = flg_P;
- X }
- X | UFLAG {
- X $$ = flg_u;
- X }
- X | HFLAG {
- X $$ = flg_h;
- X }
- X | AAFLAG {
- X $$ = flg_A;
- X }
- X | BBFLAG {
- X $$ = flg_B;
- X }
- X | UUFLAG {
- X $$ = flg_U;
- X }
- X | EFLAG {
- X $$ = flg_e;
- X }
- X | XXFLAG {
- X $$ = flg_X;
- X }
- X | LLFLAG {
- X $$ = flg_L;
- X }
- X | PFLAG {
- X $$ = flg_p;
- X }
- X | IIFLAG {
- X $$ = flg_I;
- X }
- X | CCFLAG {
- X $$ = flg_C;
- X }
- X | EEFLAG {
- X $$ = flg_E;
- X }
- X | RRFLAG {
- X $$ = flg_R;
- X }
- X | HHFLAG {
- X $$ = flg_H;
- X }
- X | VVFLAG {
- X $$ = flg_V;
- X }
- X ;
- X
- dheader : /* empty */ {
- X $$ = NULL;
- X }
- X | DEFINE dlist {
- X $$ = $2;
- X }
- X | error {
- X $$ = NULL;
- X }
- X ;
- X
- dheaders : /* empty */
- X | dheaders DEFINE dlist SEMI {
- X EmitDef (def_header, (struct he *) NULL, Flaglist, $3);
- X }
- X | dheaders ASM LPAREN SCONST RPAREN SEMI {
- X printf("%s\n",$4);
- X }
- X | error
- X ;
- X
- dlist : LPAREN strval COMMA catstringlist RPAREN {
- X $$ = ListAppend ($2, MacScan ($4), " ");
- X Free ($2);
- X Free ($4);
- X }
- X | LPAREN error RPAREN {
- X $$ = NULL;
- X }
- X ;
- X
- catstringlist : catstring {
- X $$ = $1;
- X }
- X | catstring COMMA catstringlist {
- X $$ = ListAppend( $1, $3, (char *) NULL);
- X Free($1);
- X }
- catstring : SCONST {
- X $$ = $1;
- X }
- X | CONCAT LPAREN conval RPAREN {
- X $$ = $3;
- X }
- X | ifcon {
- X $$ = $1;
- X }
- X ;
- X
- mlist : /* empty */
- X | mlist IDENT LBRACE mdefs RBRACE SEMI {
- X EmitDef (def_mailer, $2, $4, (char *) NULL);
- X }
- X | mlist IDENT LBRACE RBRACE SEMI {
- X EmitDef (def_mailer, $2, (char *) NULL, (char *) NULL);
- X }
- X | error SEMI {
- X yyerrok;
- X }
- X ;
- X
- mdefs : mtdef {
- X $$ = $1;
- X }
- X | mdefs COMMA mtdef {
- X $$ = ListAppend ($1, $3, ", ");
- X Free ($1);
- X Free ($3);
- X }
- X ;
- X
- mtdef : mvar ASGN mval {
- X $$ = ListAppend (ConvMat ($1), MacScan ($3), "=");
- X Free ($3);
- X }
- X | MFLAGS ASGN LBRACE mflags RBRACE {
- X $$ = ListAppend (ConvMat (mat_flags), $4, "=");
- X }
- X | MSENDER ASGN IDENT {
- X $$ = ListAppend (ConvMat (mat_sender), CheckRS ($3), "=");
- X }
- X | MSENDER ASGN IDENT SLASH IDENT {
- X $$ = ListAppend(
- X Tsb = ListAppend (ConvMat(mat_sender), CheckRS ($3), "="),
- X Tsb1 = ListAppend ("/", CheckRS ($5), (char *) NULL),
- X (char *) NULL);
- X Free (Tsb);
- X Free (Tsb1);
- X }
- X | MRECIPIENT ASGN IDENT {
- X $$ = ListAppend (ConvMat (mat_recipient), CheckRS ($3), "=");
- X }
- X | MRECIPIENT ASGN IDENT SLASH IDENT {
- X $$ = ListAppend(
- X Tsb = ListAppend (ConvMat(mat_recipient), CheckRS ($3), "="),
- X Tsb1 = ListAppend ("/", CheckRS ($5), (char *) NULL),
- X (char *) NULL);
- X Free (Tsb);
- X Free (Tsb1);
- X }
- X | error {
- X $$ = NULL;
- X }
- X ;
- X
- mvar : MPATH {
- X $$ = mat_path;
- X }
- X | MARGV {
- X $$ = mat_argv;
- X }
- X | MEOL {
- X $$ = mat_eol;
- X }
- X | MMAXSIZE {
- X $$ = mat_maxsize;
- X }
- X ;
- X
- rdef : /* empty */
- X | rdef IDENT { StartRuleset ($2); } rulelist
- X ;
- X
- rulelist : LBRACE ruledefs RBRACE {
- X RMatch = FALSE;
- X }
- X | error {
- X RMatch = FALSE;
- X }
- X ;
- X
- ruledefs : /* empty */ {
- X RMatch = TRUE;
- X }
- X | ruledefs IF LPAREN matchaddr RPAREN actionstmt {
- X number_of_fields =0;
- X EmitDef (def_ruleset, (struct he *) NULL,
- X ListAppend ($4, $6, "\t"), (char *) NULL);
- X Free ($4);
- X Free ($6);
- X }
- X | ruledefs ASM LPAREN SCONST RPAREN SEMI {
- X printf("%s\n",$4);
- X }
- X | error SEMI {
- X yyerrok;
- X }
- X ;
- X
- matchaddr : /* empty */ {
- X $$ = NULL;
- X }
- X | matchaddr matchtok {
- X $$ = ListAppend ($1, $2, (char *) NULL);
- X Free ($1); /* NULL */
- X }
- X | error {
- X $$ = NULL;
- X }
- X ;
- X
- X/* just like matchaddr - but comma's aren't allowed */
- matchaddrnocomma : /* empty */ {
- X $$ = NULL;
- X }
- X | matchaddrnocomma matchtoknocomma {
- X $$ = ListAppend ($1, $2, (char *) NULL);
- X Free ($1); /* NULL */
- X }
- X | error {
- X $$ = NULL;
- X }
- X ;
- X
- matchtok : IDENT {
- X $$ = GetField ($1);
- X }
- X | anychar {
- X *Cbuf = $1;
- X $$ = ListAppend (Cbuf, (char *) NULL, (char *) NULL);
- X }
- X | mval {
- X $$ = MacScan ($1);
- X }
- X | DOLLAR IDENT {
- X Mbuf[1] = MakeMac ($2, ID_MACRO);
- X $$ = ListAppend (Mbuf, (char *) NULL, (char *) NULL);
- X }
- X | YPALIAS LPAREN matchtok RPAREN {
- X $$ = ListAppend("${",$3,(char *) NULL);
- X/* Free ($3); */
- X }
- X | YPPASSWD LPAREN matchtok RPAREN {
- X $$ = ListAppend("$\"",$3,(char *) NULL);
- X }
- X | RESOLVED LPAREN matchtok RPAREN {
- X $$ = ListAppend("$#",$3,(char *) NULL);
- X }
- X | IFSET LPAREN IDENT COMMA ifresmatch RPAREN {
- X $$ = MakeCond ($3, MacScan($5));
- X }
- X ;
- X
- X/* the next one is just like matchtok - but you can't have a comma in it */
- matchtoknocomma : IDENT {
- X $$ = GetField ($1);
- X }
- X | anycharbutcomma {
- X *Cbuf = $1;
- X $$ = ListAppend (Cbuf, (char *) NULL, (char *) NULL);
- X }
- X | mval {
- X $$ = MacScan ($1);
- X }
- X | DOLLAR IDENT {
- X Mbuf[1] = MakeMac ($2, ID_MACRO);
- X $$ = ListAppend (Mbuf, (char *) NULL, (char *) NULL);
- X }
- X | YPALIAS LPAREN matchtok RPAREN {
- X $$ = ListAppend("${",$3,(char *) NULL);
- X/* Free ($3); */
- X }
- X | YPPASSWD LPAREN matchtok RPAREN {
- X $$ = ListAppend("$\"",$3,(char *) NULL);
- X }
- X | RESOLVED LPAREN matchtok RPAREN {
- X $$ = ListAppend("$#",$3,(char *) NULL);
- X }
- X | IFSET LPAREN IDENT COMMA ifresmatch RPAREN {
- X $$ = MakeCond ($3, MacScan($5));
- X }
- X ;
- X
- ifresmatch : matchaddrnocomma elseresmatch {
- X if ($2 != NULL) {
- X $$ = ListAppend ($1, $2, "$|");
- X Free ($1);
- X Free ($2);
- X } else
- X $$ = $1;
- X }
- X | error {
- X $$ = NULL;
- X }
- X ;
- X
- elseresmatch :
- X COMMA matchaddrnocomma {
- X $$ = $2;
- X }
- X ;
- X
- actionstmt : action LPAREN rwaddr RPAREN SEMI {
- X $$ = ListAppend ($1, $3, (char *) NULL);
- X Free ($3);
- X }
- X | RESOLVE LPAREN resolution RPAREN SEMI {
- X $$ = $3;
- X }
- X | error SEMI {
- X $$ = NULL;
- X yyerrok;
- X }
- X ;
- X
- action : RETRY {
- X $$ = NULL;
- X }
- X | NEXT {
- X $$ = "$:";
- X }
- X | RETURN {
- X $$ = "$@";
- X }
- X ;
- X
- rwaddr : /* empty */ {
- X $$ = NULL;
- X }
- X | rwaddr rwtok {
- X $$ = ListAppend ($1, $2, (char *) NULL);
- X Free ($1); /* NULL */
- X }
- X | rwaddr IDENT LPAREN rwaddr RPAREN {
- X $$ = ListAppend ($1, (Tsb = MakeRSCall ($2, $4)), (char *) NULL);
- X Free ($1); /* NULL */
- X Free ($4);
- X Free (Tsb);
- X }
- X | error {
- X $$ = NULL;
- X }
- X ;
- X
- rwtok : anychar {
- X *Cbuf = $1;
- X $$ = ListAppend (Cbuf, (char *) NULL, (char *) NULL);
- X }
- X | mval {
- X $$ = MacScan ($1);
- X }
- X | cantok {
- X $$ = $1;
- X }
- X | dbmtok {
- X $$ = $1;
- X }
- X | ALIAS LPAREN reftok RPAREN {
- X $$ = ListAppend("$(@", $3, "$:$)");
- X }
- X | ALIAS LPAREN reftok DEFAULT LPAREN rwaddr RPAREN RPAREN {
- X $$ = ListAppend(Tsb =
- X ListAppend ( "$(@",
- X $3,
- X (char *)NULL),
- X Tsb1 = ListAppend("$:", $6, "$)" ),
- X (char *) NULL);
- X Free (Tsb);
- X Free (Tsb1);
- X Free ($3);
- X Free ($6);
- X }
- X | reftok {
- X $$ = $1;
- X }
- X | ifcon {
- X $$ = $1;
- X }
- X | YPMAP LPAREN IDENT COMMA rwaddr RPAREN {
- X *Cbuf = MakeMac ($3, ID_MACRO);
- X $$ = ListAppend(Tsb = ListAppend ("${", (char *)Cbuf, (char *)NULL),
- X Tsb1 = ListAppend ($5, "$}", (char *) NULL),
- X (char *) NULL);
- X Free (Tsb);
- X Free (Tsb1);
- X Free ($5);
- X }
- X
- X | PROGRAM LPAREN IDENT COMMA rwaddr RPAREN {
- X *Cbuf = MakeMac ($3, ID_MACRO);
- X $$ = ListAppend(Tsb = ListAppend ("$<", (char *)Cbuf, (char *)NULL),
- X Tsb1 = ListAppend ($5, "", (char *) NULL),
- X (char *) NULL);
- X Free (Tsb);
- X Free (Tsb1);
- X Free ($5);
- X }
- X
- X | action LPAREN rwaddr RPAREN {
- X $$ = ListAppend ($1, $3, (char *) NULL);
- X Free ($3);
- X }
- X ;
- X
- X
- cantok : CANON LPAREN canval RPAREN {
- X $$ = Bracket ($3, TRUE);
- X Free ($3);
- X }
- X
- X ;
- canval : canvaltok {
- X $$ = $1;
- X }
- X | canval canvaltok {
- X $$ = ListAppend ($1, $2, (char *) NULL);
- X Free ($1);
- X/* Free ($2); */
- X }
- X ;
- X
- canvaltok : IDENT {
- X $$ = ListAppend ($1->psb, (char *) NULL, (char *) NULL);
- X RemoveSymbol ($1);
- X }
- X | SCONST {
- X $$ = ListAppend (MacScan ($1), (char *) NULL, (char *) NULL);
- X Free ($1);
- X }
- X | NEXT LPAREN RPAREN { /* I Used next earlier, but now use default - because it is clearer syntax */
- X $$ = "$:";
- X }
- X | NEXT LPAREN canval RPAREN {
- X $$ = ListAppend("$:", $3, (char *)NULL);
- X }
- X | DEFAULT LPAREN RPAREN {
- X $$ = "$:";
- X }
- X | DEFAULT LPAREN canval RPAREN {
- X $$ = ListAppend("$:", $3, (char *)NULL);
- X }
- X | reftok {
- X $$ = $1;
- X }
- X | SEPCHAR {
- X *Cbuf = $1;
- X $$ = ListAppend (Cbuf, (char *) NULL, (char *) NULL);
- X }
- X | HOSTNUM LPAREN reftok RPAREN {
- X $$ = Bracket ($3, FALSE);
- X Free ($3);
- X }
- X ;
- X
- dbmtok : DBM LPAREN DOLLAR IDENT COMMA dbmstuff RPAREN {
- X $$ = DbmParen ($4->psb, $6);
- X RemoveSymbol($4);
- X Free ($6);
- X }
- X ;
- dbmstuff : dbmval COMMA dbmval {
- X $$ = ListAppend ($1, Tsb = ListAppend ("$@", $3, (char *) NULL),
- X (char *) NULL);
- X Free (Tsb);
- X }
- X | dbmval {
- X $$ = $1;
- X }
- X ;
- X
- dbmval : dbmvaltok {
- X $$ = $1;
- X }
- X | dbmval dbmvaltok {
- X $$ = ListAppend ($1, $2, (char *) NULL);
- X Free ($1);
- X/* Free ($2); */
- X }
- X ;
- X
- dbmvaltok : IDENT {
- X $$ = ListAppend ($1->psb, (char *) NULL, (char *) NULL);
- X RemoveSymbol ($1);
- X }
- X | SCONST {
- X $$ = ListAppend (MacScan ($1), (char *) NULL, (char *) NULL);
- X Free ($1);
- X }
- X | NEXT LPAREN RPAREN { /* I Used next earlier, but now use default - because it is clearer syntax */
- X $$ = "$:";
- X }
- X | NEXT LPAREN dbmval RPAREN {
- X $$ = ListAppend("$:", $3, (char *)NULL);
- X }
- X | DEFAULT LPAREN RPAREN {
- X $$ = "$:";
- X }
- X | DEFAULT LPAREN dbmval RPAREN {
- X $$ = ListAppend("$:", $3, (char *)NULL);
- X }
- X | reftok {
- X $$ = $1;
- X }
- X | SEPCHAR {
- X *Cbuf = $1;
- X $$ = ListAppend (Cbuf, (char *) NULL, (char *) NULL);
- X }
- X ;
- X
- reftok : DOLLAR IDENT {
- X Mbuf[1] = MakeMac ($2, ID_MACRO);
- X $$ = ListAppend (Mbuf, (char *) NULL, (char *) NULL);
- X }
- X | DOLLAR ICONST {
- X $$ = ListAppend (MakePosTok ($2), (char *) NULL, (char *) NULL);
- X }
- X | EVAL LPAREN IDENT RPAREN {
- X *Cbuf = MakeMac ($3, ID_MACRO);
- X $$ = ListAppend("$&", (char *)Cbuf, (char *)NULL);
- X }
- X ;
- X
- X
- X/* because of ifset, we have to treat comma's special
- X otherwise ifset(a,b,c) might be ambiguous if
- X c is an address with a comma in it.
- X*/
- anychar : anycharbutcomma {
- X $$ = $1;
- X }
- X | COMMA {
- X $$ = ',';
- X }
- X
- X ;
- X
- anycharbutcomma : SEPCHAR {
- X $$ = $1;
- X }
- X | COLON {
- X $$ = ':';
- X }
- X | STAR {
- X $$ = '*';
- X }
- X | SEMI {
- X $$ = ';';
- X }
- X | LBRACE {
- X $$ = '{';
- X }
- X | RBRACE {
- X $$ = '}';
- X }
- X | SLASH {
- X $$ = '/';
- X }
- X | ASGN {
- X $$ = '=';
- X }
- X ;
- X
- resolution : mailerspec COMMA route {
- X $$ = ListAppend ($1, $3, (char *) NULL);
- X Free ($1);
- X Free ($3);
- X }
- X | mailerspec {
- X $$ = $1;
- X }
- X | error {
- X $$ = NULL;
- X }
- X ;
- X
- mailerspec : MAILER LPAREN rword RPAREN {
- X $$ = ListAppend ("$#", $3, (char *) NULL);
- X }
- X ;
- X
- route : HOST LPAREN hword RPAREN COMMA userspec {
- X $$ = ListAppend (Tsb = ListAppend ("$@", $3, (char *) NULL),
- X $6, (char *) NULL);
- X Free (Tsb);
- X
- X
- X Free ($6);
- X }
- X | userspec {
- X $$ = $1;
- X }
- X | IFSET LPAREN IDENT COMMA ifresroute RPAREN {
- X $$ = MakeCond ($3, MacScan($5));
- X }
- X ;
- X
- ifresroute : LPAREN route RPAREN elseresroute {
- X if ($4 != NULL) {
- X $$ = ListAppend ($2, $4, "$|");
- X Free ($2);
- X Free ($4);
- X } else
- X $$ = $2;
- X }
- X | error {
- X $$ = NULL;
- X }
- X ;
- X
- elseresroute :
- X COMMA LPAREN route RPAREN {
- X $$ = $3;
- X }
- X ;
- X
- hword : hostid {
- X $$ = $1;
- X }
- X | HOSTNUM LPAREN reftok RPAREN {
- X $$ = Bracket ($3, FALSE);
- X Free ($3);
- X }
- X ;
- X
- hostid : /* empty */ {
- X $$ = NULL;
- X }
- X | hostid IDENT {
- X $$ = ListAppend ($1, $2->psb, (char *) NULL);
- X RemoveSymbol ($2);
- X Free ($1);
- X }
- X | hostid rwtok {
- X $$ = ListAppend ($1, $2, (char *) NULL);
- X Free ($1); /* NULL */
- X }
- X ;
- X
- userspec : USER LPAREN rwaddr RPAREN {
- X $$ = ListAppend ("$:", $3, (char *) NULL);
- X Free ($3);
- X }
- X ;
- X
- rword : IDENT {
- X $$ = CheckMailer ($1);
- X }
- X | reftok {
- X $$ = $1;
- X }
- X ;
- X
- fdefs : /* empty */
- X | fdefs IDENT idlist COLON ftype SEMI {
- X AssignType (ListAppend ($2->psb, $3, " "), $5);
- X Free ($3); /* NULL */
- X }
- X | error SEMI {
- X yyerrok;
- X }
- X ;
- X
- idlist : /* empty */ {
- X $$ = NULL;
- X }
- X | idlist COMMA IDENT {
- X $$ = ListAppend ($1, $3->psb, " ");
- X Free ($1);
- X }
- X ;
- X
- ftype : MATCH LPAREN ICONST RPAREN cdef {
- X $$ = ListAppend (MakeField ($3, $5, FALSE, FALSE),
- X (char *) NULL, (char *) NULL);
- X }
- X | MATCH LPAREN ICONST RPAREN MAP IDENT {
- X $$ = ListAppend (MakeField ($3, $6, FALSE, TRUE),
- X (char *) NULL, (char *) NULL);
- X }
- X | MATCH HOST {
- X $$ = ListAppend ("$%y",
- X (char *) NULL, (char *) NULL);
- X }
- X | MATCH LPAREN ICONST STAR RPAREN {
- X $$ = ListAppend (MakeField ($3, (struct he *) NULL, TRUE, FALSE),
- X (char *) NULL, (char *) NULL);
- X }
- X | error {
- X $$ = NULL;
- X }
- X ;
- X
- cdef : /* empty */ {
- X $$ = NULL;
- X }
- X | IN IDENT {
- X $$ = $2;
- X }
- X ;
- END_OF_FILE
- if test 26290 -ne `wc -c <'src/parser.y'`; then
- echo shar: \"'src/parser.y'\" unpacked with wrong size!
- fi
- # end of 'src/parser.y'
- fi
- echo shar: End of archive 4 \(of 6\).
- cp /dev/null ark4isdone
- MISSING=""
- for I in 1 2 3 4 5 6 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have unpacked all 6 archives.
- rm -f ark[1-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
-