Path: wupost!zaphod.mps.ohio-state.edu!rpi!crdgw1!barnett
From: barnett@grymoire.crd.ge.com (Bruce Barnett)
Newsgroups: alt.sources
Subject: Official Ease 3.3 patch 3
Message-ID: <BARNETT.91Sep9131214@grymoire.crd.ge.com>
Date: 9 Sep 91 17:12:14 GMT
Sender: news@crdgw1.crd.ge.com
Reply-To: barnett@crdgw1.ge.com
Distribution: alt
Organization: GE Corp. R & D, Schenectady, NY
Lines: 1515

History:
	Ease is a high level language for sendmail .cf files
	You can ftp ease from gatekeeper.dec.com

	This is the official Patch 3 for Ease.
	It converts Ease 3.2 into Ease 3.3
	Apply with

	patch -p <Patch3

Fixes:
	bug with systems compiled without DATA_RW (systems that cannot
	write into data segments).

	Better cf->ease->cf conversion with $? $| $. constructs,
	especially Ying-Da Lee's sample sendmail.cf file
	




diff -r -c ./CONVERTING ../3.2/CONVERTING
*** ./CONVERTING	Mon Sep  9 12:19:42 1991
--- ../3.2/CONVERTING	Thu May 16 12:38:45 1991
***************
*** 40,49 ****
  	CGI IRIS
  		=> cfc -i -C FKSVN  
  
- 	smail
- 
- 		=> cfc -C DUET
- 
  Step 2.  Convert the ease file to cf: 
  
  	% et <sendmail.ease >sendmail.cf
--- 40,45 ----
diff -r -c ./Makefile ../3.2/Makefile
*** ./Makefile	Mon Sep  9 12:43:20 1991
--- ../3.2/Makefile	Thu May 16 12:43:04 1991
***************
*** 1,9 ****
! #	$Header: /tmp_mnt/home/kreskin/u0/barnett/Src/Ease/ease/RCS/Makefile,v 3.3 1991/09/09 16:41:11 barnett Exp $
  #
  #	$Log: Makefile,v $
- # Revision 3.3  1991/09/09  16:41:11  barnett
- # added '-' to /bin/rm in "make all"
- #
  # Revision 3.2  1991/05/16  10:51:13  barnett
  # Fixed a few typos and added the MAKE variable
  #
--- 1,6 ----
! #	$Header: /home/kreskin/u0/barnett/Src/ease/RCS/Makefile,v 3.2 1991/05/16 10:51:13 barnett Exp $
  #
  #	$Log: Makefile,v $
  # Revision 3.2  1991/05/16  10:51:13  barnett
  # Fixed a few typos and added the MAKE variable
  #
***************
*** 64,70 ****
  	cd src; ${MAKE} ${MFLAGS} $@
  	cd cfc; ${MAKE} ${MFLAGS} $@
  	cd utils; ${MAKE} ${MFLAGS} $@
! 	-/bin/rm all
  
  
  debug:	all sendmail.ease
--- 61,67 ----
  	cd src; ${MAKE} ${MFLAGS} $@
  	cd cfc; ${MAKE} ${MFLAGS} $@
  	cd utils; ${MAKE} ${MFLAGS} $@
! 	/bin/rm all
  
  
  debug:	all sendmail.ease
Only in .: Patch3
diff -r -c ./README ../3.2/README
*** ./README	Mon Sep  9 12:51:43 1991
--- ../3.2/README	Thu May 16 12:38:20 1991
***************
*** 1,5 ****
! This is release 3.3 of the CFC and Ease programs.
  
  Ease is a compiler for sendmail configuration files.  It reads a high-level
  mail configuration language and produces a sendmail.cf file.  If you've ever
  stared at a sendmail.cf, you know why this is valuable.
--- 1,7 ----
! README - Tue May  1 14:46:33 PDT 1990
  
+ This is release 3.2 of the CFC and Ease programs.
+ 
  Ease is a compiler for sendmail configuration files.  It reads a high-level
  mail configuration language and produces a sendmail.cf file.  If you've ever
  stared at a sendmail.cf, you know why this is valuable.
***************
*** 31,38 ****
  	Matt Heffron <heffron@falstaff.css.beckman.com>
  	William Roberts <liam@cs.qmw.ac.uk>
  	rainer@flyer.uni-duisburg.de (Rainer Bieniek)
- 	agq@dstos3.dsto.oz.au (Ashleigh Quick)
- 
  Cfc was written by Arnold D. Robbins, and has been enhanced by Bruce Barnett
  (see below).
  
--- 33,38 ----
***************
*** 42,58 ****
  
  	-----------------------------------------------------------
  
! 			Ease 3.3 Release Notes:
! 		Bruce Barnett <barnett@crdgw1.ge.com>
! 			July 1991
  
! I sent some patches to the authors of Ease several years ago, but they never 
! released them. I now have their permission to be the current maintainer of 
! Ease and cfc.  Most of the changes to Ease since 2.0 have been mine, with some generous patches sent in from the people described above.
  
! The main enhancement I added to Ease 3.0:
  
  
  	I subjected the Cfc/Ease programs to a test suite
  	that converted *.cf files to ease files, and back again.
  	I compared the input of cfc  (The original .cf file)
--- 42,64 ----
  
  	-----------------------------------------------------------
  
! 		Ease 3.2 and cfc Release Notes:
! 		Bruce Barnett barnett@crdgw1.ge.com
! 		May 1991
  
! This document describes Ease 3.2. This version was originally a
! modified version of the last official release of ease 2.1. I called it
! 2.1 Beta and sent it to several dozen people. I sent the patches to the authors
! of ease and cfc, but an updated version was never posted to the net.
! The authors have decided to let me post the changes, so I guess I have
! the baton now.
  
! Since this is a major release, I decided to call it Ease 3.0
! Two updates have been release since then.
  
+ The main feature of Ease/Cfc 3.2:
  
+ 
  	I subjected the Cfc/Ease programs to a test suite
  	that converted *.cf files to ease files, and back again.
  	I compared the input of cfc  (The original .cf file)
***************
*** 71,77 ****
  langauge and feel confident that you won't break anything.
  	
  
! Current status of Ease 3.3
  	It will handle 100% of the standard Ultrix, SunOS, HP, and Berkeley
  	versions of sendmail (I hope). It handles 99.5% of the IDA
  	enhancement package. It compiles of dozens of different machines.
--- 77,83 ----
  langauge and feel confident that you won't break anything.
  	
  
! Current status of Ease 3.2
  	It will handle 100% of the standard Ultrix, SunOS, HP, and Berkeley
  	versions of sendmail (I hope). It handles 99.5% of the IDA
  	enhancement package. It compiles of dozens of different machines.
***************
*** 205,219 ****
  
  Release Notes:
  
- 	3.3:
- 		Support for $? $| $. on LHS
- 			added warning if $. is missing
- 		Support for $? after $#
- 		Fix DATA_RW compile option
- 		Eliminate warnings about "LOCAL" and "ERROR" 
- 			mailers being undefined. Case doesn't matter.
- 			but I don't want to convert to lower because the cfdiff
- 			might complain
  	3.2:
  	Added better support for IDA sendmail
  	Added better support for unusual values in mailer flags, and options
--- 211,216 ----
***************
*** 231,249 ****
  Release 3.0:
  	First release of Bruce's changes to the net in alt.sources
  
- 
- 
- NOTE:
- 
- on some systems, you will get the warning:
-     make: Warning: Infinite loop: Target `lexdefs.h' depends on itself
- This is okay. If the line was removed, Make wouldn't work on other machines.
- 
  ============================================================================
  
  If you find these programs useful, or if you have suggestions or changes,
  please drop me a line. I would really appreciate any patches to this
! package. I will merge any patches and release new versions, as they
  are sent to me. 
  
  	Bruce Barnett
--- 228,239 ----
  Release 3.0:
  	First release of Bruce's changes to the net in alt.sources
  
  ============================================================================
  
  If you find these programs useful, or if you have suggestions or changes,
  please drop me a line. I would really appreciate any patches to this
! package, as I don't plan any major upgrade to support all of the IDA
! extensions. I will merge any patches and release new versions, as they
  are sent to me. 
  
  	Bruce Barnett
diff -r -c ./TODO ../3.2/TODO
*** ./TODO	Fri Sep  6 15:02:32 1991
--- ../3.2/TODO	Thu May 16 12:38:28 1991
***************
*** 3,51 ****
  
  Keyed databases definitions (OKP/usr/lib/aliases) should not need an asm()
  
! Fix the following constructs so that cfc/et handles the conversion properly:
  
  HReceived: from $?s$s$|localhost$. by $w$?r with $r$.
  	id $i; $b; sendmail $v/$V
  	(from $f for $u)
  
! DMroot
! T$M
  
- Eliminate the concat() construct, if possible.
- 
  check for if (exactly_one) next($2); type error.
  check for matching < and > in rulesets
  Check for mailers "local" and "prog" 
- 
- Add the new IDA/sendmail macro $m
- 
- 	A new macro, $m, has been defined.  For single recipients in
- 	a local mail delivery, it's value is the original address before
- 	aliasing.  If all recipients for the current transaction derive
- 	from a single original recipient, use that for $m.  Else make
- 	$m undefined (to preserve Bcc: privacy).
- 
- 	The Received header now has 'for $m' in place of 'for $u'.  The
- 	new code release supports $m as the recipient prior to aliasing.
- 	This will not cause any problems with earlier code releases, except
- 	that the 'for user' will no appear on the header unless you change
- 	this back to $u.
- 
- 
- Add the IDA Os option:
- 
- 	If Os (SuperSafe) is set in the sendmail.cf file, files in the spool
- 	area will either be open()ed with O_SYNC set or fsync()ed prior
- 	to close.
- 
- IDA:
- 	Simon J Gerraty (sjg@melb.bull.oz.au) contributed patch for SUN's
- 	$%x and $!x features ($!x added as $^x).
- 
-     * delayed macro evaluation using $&x syntax
-     * RFC822 quoted macro expansion using $!x syntax
- 
  
  CFC improvements
  	Make it a real two-pass parser. This way, it can
--- 3,22 ----
  
  Keyed databases definitions (OKP/usr/lib/aliases) should not need an asm()
  
! Ignore case when checking for mailer names existance
! 		(local vs. LOCAL)
  
+ Fix the following construct so that cfc/et handles the conversion properly:
+ 
  HReceived: from $?s$s$|localhost$. by $w$?r with $r$.
  	id $i; $b; sendmail $v/$V
  	(from $f for $u)
  
! Eliminate the concat() construct.
  
  check for if (exactly_one) next($2); type error.
  check for matching < and > in rulesets
  Check for mailers "local" and "prog" 
  
  CFC improvements
  	Make it a real two-pass parser. This way, it can
Common subdirectories: ./cfc and ../3.2/cfc
Common subdirectories: ./debug and ../3.2/debug
Common subdirectories: ./doc and ../3.2/doc
Common subdirectories: ./src and ../3.2/src
Common subdirectories: ./test and ../3.2/test
Common subdirectories: ./utils and ../3.2/utils
diff -r -c ./cfc/cfc.c ../3.2/cfc/cfc.c
*** ./cfc/cfc.c	Mon Sep  9 12:44:10 1991
--- ../3.2/cfc/cfc.c	Thu May 16 12:43:01 1991
***************
*** 1,12 ****
  #ifndef lint
! static char RCSid[] = "$Header: /tmp_mnt/home/kreskin/u0/barnett/Src/Ease/ease/cfc/RCS/cfc.c,v 3.3 1991/09/09 16:34:44 barnett Exp $";
  #endif
  
  /*
   * $Log: cfc.c,v $
-  * Revision 3.3  1991/09/09  16:34:44  barnett
-  * Bug fixes. Better handling of those $? conditionals.
-  *
   * Revision 3.2  1991/05/16  10:49:33  barnett
   * Support for IDA databases
   * More tolerant handling of unusual conditions
--- 1,9 ----
  #ifndef lint
! static char RCSid[] = "$Header: /home/kreskin/u0/barnett/Src/ease/cfc/RCS/cfc.c,v 3.2 1991/05/16 10:49:33 barnett Exp $";
  #endif
  
  /*
   * $Log: cfc.c,v $
   * Revision 3.2  1991/05/16  10:49:33  barnett
   * Support for IDA databases
   * More tolerant handling of unusual conditions
***************
*** 141,147 ****
  			"warning: ignoring non-flag command line arguments\n");
  
  	printf ("/***********************************************************/\n");
! 	printf ("/* This ease file generated by cfc version $Revision: 3.3 $*/\n");
  	printf ("/* automatically from a sendmail.cf file                   */\n");
  	printf ("/* It may need to be edited before feeding to ease.        */\n");
  	printf ("/***********************************************************/\n");
--- 138,144 ----
  			"warning: ignoring non-flag command line arguments\n");
  
  	printf ("/***********************************************************/\n");
! 	printf ("/* This ease file generated by cfc version $Revision: 3.2 $*/\n");
  	printf ("/* automatically from a sendmail.cf file                   */\n");
  	printf ("/* It may need to be edited before feeding to ease.        */\n");
  	printf ("/***********************************************************/\n");
***************
*** 429,444 ****
  				conditional++;ifset++;
  				break;
  			case '|':
! 				if ( ! conditional) complain("in left hand side of rule, found a '$|' without a previous '$?'");
  				if ( ifset) {
! 				    /* I don't think I have to output a ", " */
! 				    /* but let's test */
! 				    if ( quoting ) 
! 				      printf("\", \""); 
! 				    else
! 				      printf(", ");
  				} else {
! 				    complain("in left hand side of rule, found a '$|' without a previous '$?'");
  				    putchar (',');
  				}
  				break;
--- 426,436 ----
  				conditional++;ifset++;
  				break;
  			case '|':
! 				if ( ! conditional) die("lhs - $| without $?");
  				if ( ifset) {
! 				    printf("\", \"");
  				} else {
! 					fprintf(stderr,"Got $| when not in ifset\n");
  				    putchar (',');
  				}
  				break;
***************
*** 508,519 ****
  		putchar ('"');
  	while (open--)
  		putchar (')');
! 	if (conditional) { 
! 	    /* the lhs was missing a $. - let's add one automatically */
! 	    complain ("Expected '$.' on left hand side of rule - adding one anyway");
! 	    putchar (')');
! 	    conditional--;ifset--;
! 	}
  	printf (")");
  }
  
--- 500,507 ----
  		putchar ('"');
  	while (open--)
  		putchar (')');
! 	if (conditional)
! 		die ("lhs");
  	printf (")");
  }
  
***************
*** 610,620 ****
  		      quoting++;
  		      break;
  		    case '|':
! 		      if ( ! conditional) complain("right side of rule - found '$|' without '$?'");
  		      if ( ifset) {
  			  printf("\", \"");
  		      } else {
! 			  complain("right side of rule - found '$|' without '$?'");
  			  putchar (',');
  		      }
  		      break;
--- 598,608 ----
  		      quoting++;
  		      break;
  		    case '|':
! 		      if ( ! conditional) die("rhs - $| without $?");
  		      if ( ifset) {
  			  printf("\", \"");
  		      } else {
! 			  fprintf(stderr,"Got $| when not in ifset\n");
  			  putchar (',');
  		      }
  		      break;
***************
*** 622,628 ****
  		      if (ifset && quoting ) {
  			  putchar('"'); quoting--;
  		      }
! 		      if (! ifset ) complain("right side of rule - found '$.' without '$?'");
  		      putchar (')');
  		      if (open) {
  			  putchar(')');
--- 610,616 ----
  		      if (ifset && quoting ) {
  			  putchar('"'); quoting--;
  		      }
! 		      if (! ifset ) fprintf(stderr,"Got $. while not in ifset\n");
  		      putchar (')');
  		      if (open) {
  			  putchar(')');
***************
*** 704,710 ****
  			    printf ("${%s}", macro (*cp));
  			  else
  			    printf ("$%s", macro (*cp));
! 		      } else { /* not in ifset() */
  			  if (quoting)
  			    printf ("${%s}", macro (*cp));
  			  else 
--- 692,698 ----
  			    printf ("${%s}", macro (*cp));
  			  else
  			    printf ("$%s", macro (*cp));
! 		      } else { /* not not in ifset() */
  			  if (quoting)
  			    printf ("${%s}", macro (*cp));
  			  else 
***************
*** 760,770 ****
  {
      int quoting = 0;
      int open = 0;
-     int ifset = 0;
      char *addrops;
      addrops = ".:;%@!=/[]?#^,<>$"; /* should be defined from input file */
      printf ("resolve (mailer (");
!     /* this is a simple (idiotic) parser (hack) that scans the right
         hand side of a $# rule
         The format is usually
         "$# mailer $@ host $: user" or
--- 748,764 ----
  {
      int quoting = 0;
      int open = 0;
      char *addrops;
      addrops = ".:;%@!=/[]?#^,<>$"; /* should be defined from input file */
      printf ("resolve (mailer (");
! /*  if (strncmp (cp+1, "local", 5) == 0
!     || strncmp (cp+1, "error", 5) == 0
!     || strncmp (cp+1, "LOCAL", 5) == 0
!     || strncmp (cp+1, "ERROR", 5) == 0)
!     goto skiphost;
! loop1:
! */
!     /* this is a simple parser that scans the right
         hand side of a $# rule
         The format is usually
         "$# mailer $@ host $: user" or
***************
*** 783,789 ****
         */
      /* pointing to '#' */
      cp++;
-     while( *cp == ' ') cp++; /* skip blanks */
      /* output any character not a '$' */
      while (cp && *cp && *cp != '$' ) {
  	/* skip spaces in the mailer field */
--- 777,782 ----
***************
*** 790,797 ****
  	if ( *cp != ' ' ) putchar(*cp); 
  	cp++;
      }
-   parsehost:
-     while (cp && *cp && *cp == ' ') cp++;	/* advance to non-blank */
      if (!cp || !*cp ) goto out;
      /* currently pointing to a "$" */
      /* we may now be pointing to:
--- 783,788 ----
***************
*** 800,832 ****
         or a macro
         or nothing?! (*cp == 0);
         /* don't look at the '$' */
!     if (*cp == '$') {
! 	cp++;	/* skip past $, expect a '@' */
!     } else {
! 	  fprintf(stderr,
! 		  "Error: found %c when expecting a '$' on line %d\n",
! 		  *cp,line);
!     }
      if (!cp || !*cp ) goto out;
      if (*cp  == ':') goto parseuser;
-     if (*cp == '?' ) {	/* handle $#$?G$@....$:...$|$@...$:...$. */
- 	cp++;
- 	printf ("),  ifset (%s,\n\t\t\t\t(", macro (*cp++));
- 	ifset++;
- 	while (cp && *cp && *cp == ' ') cp++;	/* advance to non-blank */
- 	if ( *cp == '$') {
- 	    cp++;
- 	} else {
- 	  fprintf(stderr,
- 		  "Error: found %c when expecting a '$' on line %d\n",
- 		  *cp,line);
- 	}
-     }
      if (*cp != '@' ) {
  	/* must be a macro name */
  	printf ("$%s",macro(*cp++));
  	/* now skip to the $@ */
! /*	if (!cp || !*cp ) goto out; */
  	while (cp && *cp && *cp == ' ') cp++;
  	if (!cp || !*cp ) goto out;
  	if (*cp == '$') cp++; 
--- 791,804 ----
         or a macro
         or nothing?! (*cp == 0);
         /* don't look at the '$' */
!     cp++;
      if (!cp || !*cp ) goto out;
      if (*cp  == ':') goto parseuser;
      if (*cp != '@' ) {
  	/* must be a macro name */
  	printf ("$%s",macro(*cp++));
  	/* now skip to the $@ */
! 	if (!cp || !*cp ) goto out;
  	while (cp && *cp && *cp == ' ') cp++;
  	if (!cp || !*cp ) goto out;
  	if (*cp == '$') cp++; 
***************
*** 845,854 ****
  	cp++;
      }
      /* print host name ($@host ) */
!     if (ifset)
!       printf (" host (");
!     else
!       printf ("),\n\t\t\t\thost (");
      for (;cp && *cp;cp++) {
  	if (*cp != '$') { 
  	    putchar (*cp);
--- 817,823 ----
  	cp++;
      }
      /* print host name ($@host ) */
!     printf ("),\n\t\t\t\thost (");
      for (;cp && *cp;cp++) {
  	if (*cp != '$') { 
  	    putchar (*cp);
***************
*** 905,911 ****
  	} else {	/* not quoting */
  	    if ( *cp == '$' ) {
  		cp++;
- 		/* Could be $|, or $>, or $macro */
  		if (*cp == '>' ) { /* IDA sendmail */
  		    cp++;
  		    printf("retry (RULESET_");
--- 874,879 ----
***************
*** 912,941 ****
  		    while (cp && *cp && *cp >= '0' && *cp <= '9') putchar(*cp++);
  		    printf("("); open++;
  		    open++;
- 		} else if ( *cp == '|') {
- 		    /* This is the middle of an ifset */
- 		    if ( ! ifset ) {
- 			fprintf(stderr,
- 				"Found a '$|' in the user address without a '$?' on line %d\n",
- 				*cp,line);
- 			cp++; /* ignore */
- 		    } else { /* I expected this */
- 			printf(")),\n\t\t\t\t(");
- 			cp++;
- 			goto parsehost;
- 		    }
- 		} else if ( *cp == '.') {
- 		    /* This is the END of an ifset */
- 		    if ( ! ifset ) {
- 			fprintf(stderr,
- 				"Found a '$.' in the user address without a '$?' on line %d\n",
- 				*cp,line);
- 			cp++; /* ignore */
- 		    } else { /* I expected this */
- 			/* cp++; */ /* Don't do this, the for loop increments cp */
- 			printf("))");
- 			ifset = 0;
- 		    }
  		} else {
  		    putchar ('$'); /* print $ */
  		    printf("%s",macro(*cp)); /* and macro */
--- 880,885 ----
***************
*** 952,963 ****
      }
      if (quoting) printf("\"");
    out:
-     if (ifset) {
- 	fprintf(stderr,
- 		"EOL while expecting '$.' on line  %d\n",
- 				line);
- 	ifset = 0;
-     }
      while (open--) printf(")");
      printf ("))");
  } /* end parseresolve () */
--- 896,901 ----
***************
*** 1037,1043 ****
  				if ( ifset) {
  				    printf("\", \"");
  				} else {
! 					complain("Got $| when not in ifset\n");
  				    putchar (',');
  				}
  				break;
--- 975,981 ----
  				if ( ifset) {
  				    printf("\", \"");
  				} else {
! 					fprintf(stderr,"Got $| when not in ifset\n");
  				    putchar (',');
  				}
  				break;
***************
*** 1313,1323 ****
  	register char *cp = buffer + 1;
  	register int flags = 0;
  	register int conditional = 0;
! 	register int concat = 0;	/* true if in a concat( */
! 	register int needcomma = 0;	/* true if a concat is needed */
  	register int quote = 0;
! 	register int ifset = 0;		/* true if in a ifset 
! 					   (may be inside a concat) */
  
  	printf ("header\n\t");
  	if (*cp == '?')		/* header for mailers  with these flags */
--- 1251,1259 ----
  	register char *cp = buffer + 1;
  	register int flags = 0;
  	register int conditional = 0;
! 	register int concat = 0;
  	register int quote = 0;
! 	register int ifset = 0;
  
  	printf ("header\n\t");
  	if (*cp == '?')		/* header for mailers  with these flags */
***************
*** 1345,1354 ****
  	else if (cp && ! *cp ) printf("\", \"\"");
  	else if (!cp) {
  	    printf("\"");
! 	    complain("I didn't expect this!\n");
  	}
  
! 	quote = concat = conditional = ifset = needcomma = 0;
  body:
  	while (cp && *cp)
  	{
--- 1281,1290 ----
  	else if (cp && ! *cp ) printf("\", \"\"");
  	else if (!cp) {
  	    printf("\"");
! 	    fprintf(stderr,"I didn't expect this!\n");
  	}
  
! 	quote = concat = conditional = ifset = 0;
  body:
  	while (cp && *cp)
  	{
***************
*** 1356,1425 ****
  		case '$':
  			switch (*++cp) {
  			case '?':
- 			    /* if we are in the middle of a quote, end it */
- 			    if (quote) {
- 				printf("\"");quote--;needcomma=1;
- 			    }
  			    /* if we are not in a concat, then start one */
  			    if ( ! concat ) {
- 				if (needcomma) printf(", ");
  				printf("concat (");
! 				concat++;needcomma=0;
! 			    }  else { /* we are in a concat  */
! 				if ( ifset ) { /* if in ifset(..) terminate */
! 				    printf("), concat ("); 
! 				    ifset--;needcomma=0;
! 				} else {
! 				    /* otherwise - don't terminate the concat */
! 				    /* but add a comma to seperate the fields */
! 				    /* what do do if concat(X, */
! 				    /* if so, then don't put the comma */
! 				    /* instead - check needcomma */
! /*				    printf(", "); */
  				}
  			    }
! 			    if ( ifset ) {
! 				complain("found '$?' before terminating previous '$?' with a '$.'");
  			    }
- 			    if (needcomma) {
- 				printf(", ");
- 				needcomma=0;
- 			    }
  			    printf ("ifset (%s, \"", macro (*++cp));
  			    conditional++; quote++;ifset++;
  			    break;
  			case '|':
! 			    if (quote) {
! 				putchar('"');quote--;
! 			    }
! 			    if ( ! conditional) complain("header - $| without $?");
! 			    if ( ifset) {
! 				printf(", "); needcomma=0;
! 			    } else {
! 				complain("Got '$|' without matching '$?'");
! 				putchar (','); needcomma=0;
! 			    }
  			    break;
  			case '.':
  			    if (quote) {
  				putchar('"');quote--;
  			    }
- 			    if (!ifset ) {
- 				complain("found '$.' without matching '$?'");
- 			    }
  			    putchar (')');
  			    conditional--;ifset--;
  			    if (concat) {
  				/* this is messy - There may be more than one $? on a line */
- 				/* and the line may continue on to the next line. */
  
! 				if (*(cp+1)) { /* if there is more on the line */
! 				    putchar(')');concat--;
! 				    printf(", ");needcomma=0;
! 				} else { 
! 				    /* may need to print a comma - delay decision */
! 				    /* see continuation line handler */
! 				    putchar(')');concat--;needcomma=1;
  				}
  			    }
  			    break;
--- 1292,1333 ----
  		case '$':
  			switch (*++cp) {
  			case '?':
  			    /* if we are not in a concat, then start one */
  			    if ( ! concat ) {
  				printf("concat (");
! 				concat++;
! 			    }  else { /* we are in one */
! 				if (quote) {
! 				    printf("\"");quote--;
  				}
+ 				printf("), concat (");
  			    }
! 			    if (quote) {
! 				printf("\",");quote--;
  			    }
  			    printf ("ifset (%s, \"", macro (*++cp));
  			    conditional++; quote++;ifset++;
  			    break;
  			case '|':
! 				if ( ! conditional) die("header - $| without $?");
! 				if ( ifset) {
! 				    printf("\", \"");
! 				} else {
! 					fprintf(stderr,"Got $| when not in ifset\n");
! 				    putchar (',');
! 				}
  			    break;
  			case '.':
  			    if (quote) {
  				putchar('"');quote--;
  			    }
  			    putchar (')');
  			    conditional--;ifset--;
  			    if (concat) {
  				/* this is messy - There may be more than one $? on a line */
  
! 				if (cp+1) { /* if there is more on the line */
! 				    printf(", ");
  				}
  			    }
  			    break;
***************
*** 1428,1439 ****
  			    if (!concat && (strlen(cp)>2) 
  				&& (*(cp+1) == '$')
  				&& (*(cp+2) == '?')) {
- 				if ( quote) {
- 				    printf("\", ");
- 				    quote--;needcomma=0;
- 				}
  				printf ("concat (\"${%s}\", ", macro (*cp));
! 				/* I'm in a concat */
  				concat++;
  			    } else {
  				if (!quote) {
--- 1336,1343 ----
  			    if (!concat && (strlen(cp)>2) 
  				&& (*(cp+1) == '$')
  				&& (*(cp+2) == '?')) {
  				printf ("concat (\"${%s}\", ", macro (*cp));
! 				/* I'm gonna need a concat */
  				concat++;
  			    } else {
  				if (!quote) {
***************
*** 1466,1479 ****
  		line++;
  		if (buffer[0] == '\t')
  		{
- 			if ( concat ) {
- 			    printf("), ");needcomma=0;
- 			    concat--;
- 			}
- 			if (needcomma) {
- 			    printf(", ");
- 			    needcomma=0;
- 			}
  			if ( ! quote ) {
  			    putchar('"');
  			    quote++;
--- 1370,1375 ----
***************
*** 1584,1597 ****
  			routine, line);
  	exit (1);
  }
- complain (problem)
- char *problem;
- {
- 	fprintf (stderr, "Warning: malformed input line %d: %s\n",
- 			line, problem);
- 	fflush(stderr);
- 	fflush(stdout);
-     }
  
  /* macro --- return name for sendmail predefined macro */
  
--- 1480,1485 ----
***************
*** 1684,1697 ****
  	case 'z':	/* The home directory of the recipient */
  		return ("m_rhdir");
  
!         case '"':	/* you can get a quote character in some macro definitions */
  		return ("\\\"");
  	default:
- 		if (!(isalpha(c) || isdigit(c))) /* if not a digit or letter */
- 		  fprintf (stderr,
- 			   "warning: expected letter as macro definition, found '%c' on line %d\n",
- 			   c, line);
- 
  		buf[0] = c;
  		return (buf);
  	}
--- 1572,1580 ----
  	case 'z':	/* The home directory of the recipient */
  		return ("m_rhdir");
  
!         case '"':	/* you can get a quote charater in some macro definitions */
  		return ("\\\"");
  	default:
  		buf[0] = c;
  		return (buf);
  	}
diff -r -c ./doc/Makefile ../3.2/doc/Makefile
*** ./doc/Makefile	Thu Jun 27 10:48:17 1991
--- ../3.2/doc/Makefile	Thu May 16 12:38:22 1991
***************
*** 45,51 ****
  install:
  	install -c ease.man $(MANDEST)/ease.${EXT}
  	install -c et.man $(MANDEST)/et.${EXT}
! 	install -c cfc.man $(MANDEST)/cfc.${EXT}
  
  printman: ease.man et.man cfc.man
  	${ROFF} -man ease.man
--- 45,51 ----
  install:
  	install -c ease.man $(MANDEST)/ease.${EXT}
  	install -c et.man $(MANDEST)/et.${EXT}
! 	install -c cfc.man $(MANDEST)/cdc.${EXT}
  
  printman: ease.man et.man cfc.man
  	${ROFF} -man ease.man
diff -r -c ./doc/ap2 ../3.2/doc/ap2
*** ./doc/ap2	Mon Sep  9 12:44:53 1991
--- ../3.2/doc/ap2	Thu May 16 12:38:24 1991
***************
*** 1,10 ****
  ...
! ... $Header: /tmp_mnt/home/kreskin/u0/barnett/Src/Ease/ease/doc/RCS/ap2,v 3.3 1991/09/09 16:36:05 barnett Exp $
  ... 
  ... $Log: ap2,v $
- ... Revision 3.3  1991/09/09  16:36:05  barnett
- ... minor bug fixes
- ...
  ... Revision 2.1  1990/01/30  12:57:42  jeff
  ... Made changes corresponding to Ease release 2.1Alpha.
  ... se.
--- 1,7 ----
  ...
! ... $Header: /home/kreskin/u0/barnett/Src/ease/doc/RCS/ap2,v 2.1 1990/01/30 12:57:42 jeff Exp barnett $
  ... 
  ... $Log: ap2,v $
  ... Revision 2.1  1990/01/30  12:57:42  jeff
  ... Made changes corresponding to Ease release 2.1Alpha.
  ... se.
diff -r -c ./doc/cfc.man ../3.2/doc/cfc.man
*** ./doc/cfc.man	Mon Sep  9 12:44:51 1991
--- ../3.2/doc/cfc.man	Thu May 16 12:38:23 1991
***************
*** 1,10 ****
  ...
! ... $Header: /tmp_mnt/home/kreskin/u0/barnett/Src/Ease/ease/doc/RCS/cfc.man,v 3.3 1991/09/09 16:36:05 barnett Exp $
  ... 
  ... $Log: cfc.man,v $
- ... Revision 3.3  1991/09/09  16:36:05  barnett
- ... minor bug fixes
- ...
  ... Revision 1.2  1990/04/04  15:42:51  jeff
  ... Reformatted somewhat for readability.  Added some bugs
  ... described by Bruce Barnett.
--- 1,7 ----
  ...
! ... $Header: /home/kreskin/u0/barnett/Src/Ease/ease/doc/RCS/cfc.man,v 1.2 1990/04/04 15:42:51 jeff Exp barnett $
  ... 
  ... $Log: cfc.man,v $
  ... Revision 1.2  1990/04/04  15:42:51  jeff
  ... Reformatted somewhat for readability.  Added some bugs
  ... described by Bruce Barnett.
diff -r -c ./doc/cover ../3.2/doc/cover
*** ./doc/cover	Mon Sep  9 12:44:51 1991
--- ../3.2/doc/cover	Thu May 16 12:38:25 1991
***************
*** 1,10 ****
  ...
! ... $Header: /tmp_mnt/home/kreskin/u0/barnett/Src/Ease/ease/doc/RCS/cover,v 3.3 1991/09/09 16:36:05 barnett Exp $
  ...
  ... $Log: cover,v $
- ... Revision 3.3  1991/09/09  16:36:05  barnett
- ... minor bug fixes
- ...
  ... Revision 2.0  1990/01/30  12:50:41  jeff
  ... Baseline version, corresponding to netwide release 2.0.
  ...
--- 1,7 ----
  ...
! ... $Header: /home/kreskin/u0/barnett/Src/Ease/ease/doc/RCS/cover,v 2.0 1990/01/30 12:50:41 jeff Exp barnett $
  ...
  ... $Log: cover,v $
  ... Revision 2.0  1990/01/30  12:50:41  jeff
  ... Baseline version, corresponding to netwide release 2.0.
  ...
diff -r -c ./doc/ease.paper ../3.2/doc/ease.paper
*** ./doc/ease.paper	Mon Sep  9 12:44:52 1991
--- ../3.2/doc/ease.paper	Thu May 16 12:38:27 1991
***************
*** 1,10 ****
  ...
! ... $Header: /tmp_mnt/home/kreskin/u0/barnett/Src/Ease/ease/doc/RCS/ease.paper,v 3.3 1991/09/09 16:36:05 barnett Exp $
  ... 
  ... $Log: ease.paper,v $
- ... Revision 3.3  1991/09/09  16:36:05  barnett
- ... minor bug fixes
- ...
  ... Revision 2.0  1990/01/30  12:50:44  jeff
  ... Baseline version, corresponding to netwide release 2.0.
  ...
--- 1,7 ----
  ...
! ... $Header: /home/kreskin/u0/barnett/Src/Ease/ease/doc/RCS/ease.paper,v 2.0 1990/01/30 12:50:44 jeff Exp barnett $
  ... 
  ... $Log: ease.paper,v $
  ... Revision 2.0  1990/01/30  12:50:44  jeff
  ... Baseline version, corresponding to netwide release 2.0.
  ...
diff -r -c ./src/Makefile ../3.2/src/Makefile
*** ./src/Makefile	Mon Sep  9 12:44:34 1991
--- ../3.2/src/Makefile	Thu May 16 12:43:14 1991
***************
*** 1,11 ****
  # Makefile for Ease Translator (et).
  #
! #	$Header: /tmp_mnt/home/kreskin/u0/barnett/Src/Ease/ease/src/RCS/Makefile,v 3.3 1991/09/09 16:33:23 barnett Exp $
  #
  #	$Log: Makefile,v $
- # Revision 3.3  1991/09/09  16:33:23  barnett
- # Minor bug fix release
- #
  # Revision 3.2  1991/05/16  10:45:25  barnett
  # Better support for System V machines
  # Support for machines with read only text segments
--- 1,8 ----
  # Makefile for Ease Translator (et).
  #
! #	$Header: /home/kreskin/u0/barnett/Src/ease/src/RCS/Makefile,v 3.2 1991/05/16 10:45:25 barnett Exp $
  #
  #	$Log: Makefile,v $
  # Revision 3.2  1991/05/16  10:45:25  barnett
  # Better support for System V machines
  # Support for machines with read only text segments
***************
*** 43,49 ****
  #	         - A sun 3/60 using gcc
  #		 - A esix SysV PC  with gcc
  #                - A HP9000/845 with cc
- #		 - Apollo/Domain with BSD4.3 environment
  #           The default is to define it, because this is what earlier versions 
  #           of Ease did.
  #
--- 40,45 ----
***************
*** 56,62 ****
   
  DEFS = ${OFLAGS}
  LIBS = -ll
- # some people must remove the -O
  CFLAGS = -O ${DEFS} ${INCLUDE}
  CC = cc
  #CC = gcc
--- 52,57 ----
***************
*** 74,83 ****
  # Special Debug flags
  # select this one to debug the grammar
  #DEFS =-DYYDEBUG
! # The following two lines are used with the SunOS malloc() debug package.
  #DEFS = -DMALLOC_DEBUG	#  Part of the SunOS malloc package
  #LIBS = /usr/lib/debug/malloc.o -ll
! CFLAGS = -g  ${DEFS} ${INCLUDE}
  
  
  HDR = symtab.h
--- 69,78 ----
  # Special Debug flags
  # select this one to debug the grammar
  #DEFS =-DYYDEBUG
! # The following are used with the SunOS malloc() debug package.
  #DEFS = -DMALLOC_DEBUG	#  Part of the SunOS malloc package
  #LIBS = /usr/lib/debug/malloc.o -ll
! #CFLAGS = -g  ${DEFS} ${INCLUDE}
  
  
  HDR = symtab.h
diff -r -c ./src/errors.c ../3.2/src/errors.c
*** ./src/errors.c	Mon Sep  9 12:44:35 1991
--- ../3.2/src/errors.c	Thu May 16 12:43:16 1991
***************
*** 1,6 ****
  #ifdef FLUKE
  # ifndef LINT
!     static char RCSid[] = "@(#)FLUKE  $Header: /tmp_mnt/home/kreskin/u0/barnett/Src/Ease/ease/src/RCS/errors.c,v 2.3 1991/09/09 16:33:23 barnett Exp $";
  # endif LINT
  #endif FLUKE
  
--- 1,6 ----
  #ifdef FLUKE
  # ifndef LINT
!     static char RCSid[] = "@(#)FLUKE  $Header: /home/kreskin/u0/barnett/Src/ease/src/RCS/errors.c,v 2.2 1991/05/16 10:45:25 barnett Exp $";
  # endif LINT
  #endif FLUKE
  
***************
*** 17,25 ****
   *	All rights reserved.
   *
   * $Log: errors.c,v $
-  * Revision 2.3  1991/09/09  16:33:23  barnett
-  * Minor bug fix release
-  *
   * Revision 2.2  1991/05/16  10:45:25  barnett
   * Better support for System V machines
   * Support for machines with read only text segments
--- 17,22 ----
***************
*** 91,98 ****
      if (colon)
        fputs(": ",DIAGf);
      fflush(DIAGf);
-     fflush(stdout);
-     fflush(stderr); /* just to make sure */
  }
  
  
--- 88,93 ----
diff -r -c ./src/idman.c ../3.2/src/idman.c
*** ./src/idman.c	Fri Sep  6 14:20:15 1991
--- ../3.2/src/idman.c	Thu May 16 12:38:31 1991
***************
*** 1,6 ****
  #ifdef FLUKE
  # ifndef LINT
!     static char RCSid[] = "@(#)FLUKE  $Header: /home/kreskin/u0/barnett/Src/Ease/ease/src/RCS/idman.c,v 3.1 1991/02/25 22:09:52 barnett Exp barnett $";
  # endif LINT
  #endif FLUKE
  
--- 1,6 ----
  #ifdef FLUKE
  # ifndef LINT
!     static char RCSid[] = "@(#)FLUKE  $Header: /home/kreskin/u0/barnett/Src/Ease/ease/src/RCS/idman.c,v 3.1 1991/02/25 22:09:52 barnett Exp $";
  # endif LINT
  #endif FLUKE
  
diff -r -c ./src/parser.y ../3.2/src/parser.y
*** ./src/parser.y	Mon Sep  9 12:44:40 1991
--- ../3.2/src/parser.y	Thu May 16 12:43:15 1991
***************
*** 1,7 ****
  %{
  #ifdef FLUKE
  # ifndef LINT
!     static char RCSid[] = "@(#)FLUKE  $Header: /tmp_mnt/home/kreskin/u0/barnett/Src/Ease/ease/src/RCS/parser.y,v 3.3 1991/09/09 16:33:23 barnett Exp $";
  # endif LINT
  #endif FLUKE
  
--- 1,7 ----
  %{
  #ifdef FLUKE
  # ifndef LINT
!     static char RCSid[] = "@(#)FLUKE  $Header: /home/kreskin/u0/barnett/Src/ease/src/RCS/parser.y,v 3.2 1991/05/16 10:45:25 barnett Exp $";
  # endif LINT
  #endif FLUKE
  
***************
*** 22,30 ****
   *	All rights reserved.
   *
   * $Log: parser.y,v $
-  * Revision 3.3  1991/09/09  16:33:23  barnett
-  * Minor bug fix release
-  *
   * Revision 3.2  1991/05/16  10:45:25  barnett
   * Better support for System V machines
   * Support for machines with read only text segments
--- 22,27 ----
***************
*** 72,77 ****
--- 69,75 ----
  extern void	   FatalError ();
  extern short RMatch;		/* ruleset match flag 		      */
  
+ extern char *strdup(); 
  #ifdef DATA_RW
  char *Cbuf = " ";		/* character buffer   		      */
  char *Mbuf = "$ ";		/* macro buffer	      		      */
***************
*** 78,84 ****
  #else
  char *Cbuf = NULL;
  char *Mbuf = NULL;
- extern char *Strdup(); 
  #endif
  char *Tsb;			/* pointer to temporary string buffer */
  char *Tsb1;			/* pointer to another temporary string buffer */
--- 76,81 ----
***************
*** 91,97 ****
  #ifndef	DATA_RW
  void InitParser()
  {
! 	if(!(Cbuf = Strdup(" ")) || !(Mbuf = Strdup("$ ")))
  		FatalError("Out of memory in InitParser()", (char *)NULL);
  }
  #endif
--- 88,94 ----
  #ifndef	DATA_RW
  void InitParser()
  {
! 	if(!(Cbuf = strdup(" ")) || !(Mbuf = strdup("$ ")))
  		FatalError("Out of memory in InitParser()", (char *)NULL);
  }
  #endif
***************
*** 107,113 ****
  	      fprintf(stderr,"Free() returned an error\n");
  	  }
        }
-       fflush(stderr);
    };
  static char *
  yydisplay(ch)
--- 104,109 ----
***************
*** 162,168 ****
  	if (yydebug)
  		printf("[yydebug] reading %s\n",
  			yydisplay(yychar));
- 		fflush(stdout);
  #endif
  		return yychar;
  	}
--- 158,163 ----
***************
*** 218,227 ****
  %type	<optval>	optid
  %type	<flgval>	flagid
  %type	<mpval>		mvar
- %type	<psb>		ifresmatch elseresmatch ifresroute elseresroute 
- /* needed special class with no comma's allowed */
- %type	<ival>		anycharbutcomma
- %type	<psb>		matchaddrnocomma matchtoknocomma
  
  %left COMMA
  %left LPAREN RPAREN
--- 213,218 ----
***************
*** 849,867 ****
  			}
  		;
  
- /* just like matchaddr - but comma's aren't allowed */
- matchaddrnocomma	:	/* empty */ {
- 				$$ = NULL;
- 			}
- 		|	matchaddrnocomma matchtoknocomma {
- 				$$ = ListAppend ($1, $2, (char *) NULL);
- 				Free ($1); /* NULL */
- 			}
- 		|	error {
- 				$$ = NULL;
- 			}
- 		;
- 
  matchtok	:	IDENT {
  				$$ = GetField ($1);
  			}
--- 840,845 ----
***************
*** 886,945 ****
                  |       RESOLVED LPAREN matchtok RPAREN {
  		         $$ = ListAppend("$#",$3,(char *) NULL);
  		}
- 		|	IFSET LPAREN IDENT COMMA ifresmatch RPAREN {
- 				$$ = MakeCond ($3, MacScan($5));
- 			}
  	;
  
- /* the next one is just like matchtok - but you can't have a comma in it */
- matchtoknocomma	:	IDENT {
- 				$$ = GetField ($1);
- 			}
- 		|	anycharbutcomma {
- 				*Cbuf = $1;
- 				$$ = ListAppend (Cbuf, (char *) NULL, (char *) NULL);
- 			}
- 		|	mval {
- 				$$ = MacScan ($1);
- 			}
- 		|	DOLLAR IDENT {
- 				Mbuf[1] = MakeMac ($2, ID_MACRO);
- 				$$ = ListAppend (Mbuf, (char *) NULL, (char *) NULL);
- 			}
-                 |       YPALIAS LPAREN matchtok RPAREN {
- 		         $$ = ListAppend("${",$3,(char *) NULL);
- /*			 Free ($3); */
- 		}
-                 |       YPPASSWD LPAREN matchtok RPAREN {
- 		         $$ = ListAppend("$\"",$3,(char *) NULL);
- 		}
-                 |       RESOLVED LPAREN matchtok RPAREN {
- 		         $$ = ListAppend("$#",$3,(char *) NULL);
- 		}
- 		|	IFSET LPAREN IDENT COMMA ifresmatch RPAREN {
- 				$$ = MakeCond ($3, MacScan($5));
- 			}
- 	;
- 
- ifresmatch	:	matchaddrnocomma elseresmatch {
- 				if ($2 != NULL) {
- 					$$ = ListAppend ($1, $2, "$|");
- 					Free ($1);
- 					Free ($2);
- 				} else
- 					$$ = $1;
- 			}
- 		|	error {
- 				$$ = NULL;
- 			}
- 		;
- 
- elseresmatch	:
- 			COMMA matchaddrnocomma {
- 				$$ = $2;
- 			}
- 		;
- 
  actionstmt	:	action LPAREN rwaddr RPAREN SEMI {
  				$$ = ListAppend ($1, $3, (char *) NULL);
  				Free ($3);
--- 864,871 ----
***************
*** 1160,1180 ****
  			}
  		;
  
! 
! /* because of ifset, we have to treat comma's special
!  otherwise ifset(a,b,c) might be ambiguous if
!  c is an address with a comma in it.
! */
! anychar		:	anycharbutcomma {
!   				$$ = $1;
! 		}
!   		|	COMMA {
! 				$$ = ',';
! 			}
! 
! 		;
! 
! anycharbutcomma		:	SEPCHAR {
  				$$ = $1;
  			}
  		|	COLON {
--- 1086,1092 ----
  			}
  		;
  
! anychar		:	SEPCHAR {
  				$$ = $1;
  			}
  		|	COLON {
***************
*** 1192,1197 ****
--- 1104,1112 ----
  		|	RBRACE {
  				$$ = '}';
  			}
+ 		|	COMMA {
+ 				$$ = ',';
+ 			}
  		|	SLASH {
  				$$ = '/';
  			}
***************
*** 1228,1255 ****
  			}
  		|	userspec {
  				$$ = $1;
- 			}
- 		|	IFSET LPAREN IDENT COMMA ifresroute RPAREN {
- 				$$ = MakeCond ($3, MacScan($5));
- 			}
- 		;
- 
- ifresroute		:	LPAREN route RPAREN  elseresroute {
- 				if ($4 != NULL) {
- 					$$ = ListAppend ($2, $4, "$|");
- 					Free ($2);
- 					Free ($4);
- 				} else
- 					$$ = $2;
- 			}
- 		|	error {
- 				$$ = NULL;
- 			}
- 		;
- 
- elseresroute	:
- 			COMMA LPAREN route RPAREN {
- 				$$ = $3;
  			}
  		;
  
--- 1143,1148 ----
diff -r -c ./src/strops.c ../3.2/src/strops.c
*** ./src/strops.c	Mon Sep  9 12:44:40 1991
--- ../3.2/src/strops.c	Thu May 16 12:43:21 1991
***************
*** 1,6 ****
  #ifdef FLUKE
  # ifndef LINT
!     static char RCSid[] = "@(#)FLUKE  $Header: /tmp_mnt/home/kreskin/u0/barnett/Src/Ease/ease/src/RCS/strops.c,v 3.3 1991/09/09 16:33:23 barnett Exp $";
  # endif LINT
  #endif FLUKE
  
--- 1,6 ----
  #ifdef FLUKE
  # ifndef LINT
!     static char RCSid[] = "@(#)FLUKE  $Header: /home/kreskin/u0/barnett/Src/ease/src/RCS/strops.c,v 3.2 1991/05/16 10:45:25 barnett Exp $";
  # endif LINT
  #endif FLUKE
  
***************
*** 18,26 ****
   *	All rights reserved.
   *
   * $Log: strops.c,v $
-  * Revision 3.3  1991/09/09  16:33:23  barnett
-  * Minor bug fix release
-  *
   * Revision 3.2  1991/05/16  10:45:25  barnett
   * Better support for System V machines
   * Support for machines with read only text segments
--- 18,23 ----
***************
*** 93,99 ****
  char	*string;
  {
      char *s;
!     s=malloc(strlen(string));
      if (!s) return (nil);
      (void) sprintf(s,"%s",string);
      return (s);
--- 90,96 ----
  char	*string;
  {
      char *s;
!     s=malloc(length(string));
      if (!s) return (nil);
      (void) sprintf(s,"%s",string);
      return (s);
diff -r -c ./src/symtab.c ../3.2/src/symtab.c
*** ./src/symtab.c	Mon Sep  9 12:44:41 1991
--- ../3.2/src/symtab.c	Thu May 16 12:38:33 1991
***************
*** 1,6 ****
  #ifdef FLUKE
  # ifndef LINT
!     static char RCSid[] = "@(#)FLUKE  $Header: /tmp_mnt/home/kreskin/u0/barnett/Src/Ease/ease/src/RCS/symtab.c,v 3.1 1991/09/09 16:33:23 barnett Exp $";
  # endif LINT
  #endif FLUKE
  
--- 1,6 ----
  #ifdef FLUKE
  # ifndef LINT
!     static char RCSid[] = "@(#)FLUKE  $Header: /tmp_mnt/home/kreskin/u0/barnett/Src/Ease/ease/src/RCS/symtab.c,v 3.0 1991/02/22 18:50:27 barnett Exp $";
  # endif LINT
  #endif FLUKE
  
***************
*** 17,25 ****
   *	All rights reserved.
   *
   * $Log: symtab.c,v $
-  * Revision 3.1  1991/09/09  16:33:23  barnett
-  * Minor bug fix release
-  *
   * Revision 3.0  1991/02/22  18:50:27  barnett
   * Added support for HP/UX and IDA sendmail.
   *
--- 17,22 ----
***************
*** 36,42 ****
  #include "symtab.h"
  
  #define ERRORMAILER "error"		/* predefined error mailer name */
- #define ERRORMAILERUC "ERROR"		/* predefined ERROR mailer name */
  
  extern void FatalError (),
  	    PrintWarning ();
--- 33,38 ----
***************
*** 117,123 ****
  				    !ISCLASS(hcsearch->idd))
  #endif
  					PrintWarning ("Class not defined: %s\n", hcsearch->psb);
! 				if (ISMAILER(hcsearch->idtype) && !ISMAILER(hcsearch->idd) && (strcmp(hcsearch->psb,"LOCAL")))
  					PrintWarning ("Mailer not defined: %s\n", hcsearch->psb);
  				if (ISRULESET(hcsearch->idtype) && !ISRULESET(hcsearch->idd))
  					PrintWarning ("Ruleset not defined: %s\n", hcsearch->psb);
--- 113,119 ----
  				    !ISCLASS(hcsearch->idd))
  #endif
  					PrintWarning ("Class not defined: %s\n", hcsearch->psb);
! 				if (ISMAILER(hcsearch->idtype) && !ISMAILER(hcsearch->idd))
  					PrintWarning ("Mailer not defined: %s\n", hcsearch->psb);
  				if (ISRULESET(hcsearch->idtype) && !ISRULESET(hcsearch->idd))
  					PrintWarning ("Ruleset not defined: %s\n", hcsearch->psb);
***************
*** 168,178 ****
  
  	/* preload error mailer declaration */
  	symptr = LookupSymbol (ERRORMAILER);
- 	symptr->idtype |= ID_MAILER;
- 	symptr->idd |= ID_MAILER;
- 
- 	/* preload ERROR mailer declaration */
- 	symptr = LookupSymbol (ERRORMAILERUC);
  	symptr->idtype |= ID_MAILER;
  	symptr->idd |= ID_MAILER;
  }
--- 164,169 ----
--
Bruce G. Barnett	barnett@crdgw1.ge.com	uunet!crdgw1!barnett
