[comp.mail.elm] Patch: filter suffers from tolower macro probs too

taylor@hpldat.UUCP (Dave Taylor) (05/23/87)

From: harvard!adelie.Adelie.COM!barry@seismo.CSS.GOV (Barry A. Burke)

"filter" prints bogus status messages, and will even occaisionally core dump
on a BSD system (including Ultrix). Trace back to half-successful attempt at
disabling the (bad) "tolower" macro definition in hdrs/filter.h.

Here's a diff to Elm/hdrs/filter.h to correct things. I'd advise not running
filter on a BSD unless this patch is applied- you probably won't realize
you're not getting all your mail. While I was at it, I re-instated the bell,
and also eliminated the redefinition of _IOFBF.

--
*** filter.h.orig	Wed May 20 22:02:47 1987
--- filter.h	Wed May 20 22:03:19 1987
***************
*** 7,13
  
  #ifdef   BSD
  # undef  tolower
- # define tolower(c)	(isupper(c)?  c = c - 'A' + 'a' : c)
  #endif
  
  /** define a few handy macros for later use... **/

--- 7,12 -----
  
  #ifdef   BSD
  # undef  tolower
  #endif
  
  /** define a few handy macros for later use... **/
***************
*** 12,18
  
  /** define a few handy macros for later use... **/
  
! #define  BEEP		(audible? "" : "")
  
  #define  the_same(a,b)	(strncmp(a,b,strlen(b)) == 0)
  

--- 11,17 -----
  
  /** define a few handy macros for later use... **/
  
! #define  BEEP		(audible? "\007" : "")
  
  #define  the_same(a,b)	(strncmp(a,b,strlen(b)) == 0)
  
***************
*** 146,152
  
    extern char  _vbuf[5*BUFSIZ];		/* space for file buffering */
  
! # define _IOFBF		0		/* doesn't matter - ignored */
  
  # define setvbuf(fd,a,b,c)	setbuffer(fd, _vbuf, 5*BUFSIZ)
  

--- 145,153 -----
  
    extern char  _vbuf[5*BUFSIZ];		/* space for file buffering */
  
! # ifndef _IOFBF	     	      	        /* fix for Ultrix-is already defined */
! #  define _IOFBF		0	/* doesn't matter - ignored */
! # endif
  
  # define setvbuf(fd,a,b,c)	setbuffer(fd, _vbuf, 5*BUFSIZ)
  
-- 
LIVE:	Barry A. Burke, (617) 499-6370
USPS:	Adelie Corporation, 125 CambridgePark Drive Cambridge, MA  02140
UUCP:	barry@adelie.Adelie.COM / ..!{harvard,ll-xn,necntc,mirror}!adelie!barry
ARPA:	barry@adelie.Adelie.COM (via MX) / barry%adelie@harvard.Harvard.EDU


--
I think that I shall never see
A billboard lovely as a tree.
Perhaps, unless the billboards fall
I'll never see a tree at all.

daemon@hplabsc.UUCP (05/30/87)

Uhhh. This portion of your patch works on Ultrix 2.0, (tolower() is in
libc.a), but under BSD4.[23] tolower has to be defined (it's a macro).

)
)From: harvard!adelie.Adelie.COM!barry@seismo.CSS.GOV (Barry A. Burke)
)
)"filter" prints bogus status messages, and will even occaisionally core dump
)on a BSD system (including Ultrix). Trace back to half-successful attempt at
)disabling the (bad) "tolower" macro definition in hdrs/filter.h.
)
)*** filter.h.orig	Wed May 20 22:02:47 1987
)--- filter.h	Wed May 20 22:03:19 1987
)***************
)*** 7,13
)  
)  #ifdef   BSD
)  # undef  tolower
)- # define tolower(c)	(isupper(c)?  c = c - 'A' + 'a' : c)
)  #endif
)  
)  /** define a few handy macros for later use... **/
)
)--- 7,12 -----
)  
)  #ifdef   BSD
)  # undef  tolower
)  #endif
)  
)  /** define a few handy macros for later use... **/

# define tolower(c) (isupper(c)? (c - 'A' + 'a') : c)

seems to work.


-- 
I hate mud. I like blue clean flowing water. LA sucks water.
That doesn't mean I like LA. (Actually, I like a lot of things in LA)
+      Jim Budler      Advanced Micro Devices, Inc.      (408) 749-5806      +
+  Compuserve: 72415,1200; Delphi: JIMBUDLER;  Usenet: jimb@amdcad.AMD.COM   +

daemon@hplabsc.UUCP (06/02/87)

In article <1917@hplabsc.HP.COM>, jimb@dopey.AMD.COM (Jim Budler) writes:
> 
> # define tolower(c) (isupper(c)? (c - 'A' + 'a') : c)
> 
> seems to work.

There has been much discussion concerning the usage of the toupper() &
tolower() macros on various systems.  This has got to be one of the items
within "C" which varies most widely from machine to machine.  I have seen
at least six different styles of macro invocations and function calls for
these operations on various machines.  System-V.2 currently implements
toupper() & tolower() as functions with _toupper() and _tolower() as 
[somewhat defective] macros.

Jim's example above addresses the problem (on some systems) of passing an
out-of-range character to the macro which then gets translated to a garbage
value.  The trouble with this example is that it breaks whenever the argument
is anything other than a single character - since the argument "c" will be
processed at least twice.  For example:

	tolower('a');    or    tolower('X');
	
both work fine, but ...

	tolower( getchar() );

gets translated to:

	isupper( getchar() ) ? (getchar() - 'A' + 'a') : getchar() );

which causes two calls to getchar to be made - yielding unexpected results.
There are many other examples of complex argument constructs which cause
the typical macro to fail (but will work OK on function calls!)

To address this problem, I have developed the following two macros which
can take the place of toupper() and tolower().  They will accept any argument
and will return a sane (ie. expected) result.  "_dumVAR_" is used to store an
intermediate result which is what allows the macro to work without resorting
to a function call.  Note that these invocations simply include the test which
isupper() & islower() would perform if included, as in Jim's example above.

char _dumVAR_;
#define  UC(c) (((_dumVAR_ = (c)) >= 'a' && _dumVAR_ <= 'z') ? \
				  (_dumVAR_ - 'a' + 'A') : _dumVAR_)
#define  LC(c) (((_dumVAR_ = (c)) >= 'A' && _dumVAR_ <= 'Z') ? \
				  (_dumVAR_ - 'A' + 'a') : _dumVAR_)

To use these macros in the elm system, place them in the sysdefs.h file
and then edit the Makefile(s) to include the following defines on the
compile lines:
		-Dtolower=LC -Dtoupper=UC

--
Jeffery Small          (203) 776-2000     UUCP:   ihnp4!---\
C. Jeffery Small and Associates	                            hsi!cjsa!jeff
123 York Street, New Haven, CT  06511          hao!noao!---/