*BSD News Article 18437


Return to BSD News archive

Newsgroups: comp.os.386bsd.bugs
Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!elroy.jpl.nasa.gov!swrinde!gatech!europa.eng.gtefsd.com!darwin.sura.net!newsserver.jvnc.net!yale.edu!nigel.msen.com!math.fu-berlin.de!uniol!tapir.NOC.FH-Lippe.DE!bi-link.owl.de!martin
From: martin@bi-link.owl.de (Martin Husemann)
Subject: ctype.h Bug & Fix
Organization: IN - individual network, Ostwestfalen-Lippe, FRG
Date: Wed, 14 Jul 1993 20:40:35 GMT
Message-ID: <CA69Fo.Lwv@bi-link.owl.de>
Lines: 45


There is a small bug in /usr/include/ctype.h:

toupper() and tolower() are expected (by the ANSI standard at least) 
to work proper on all characters. They don't: toupper will try to
convert an uppercase letter as well.

The fix is easy:

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

Of course, there are some illegal uses of this macros. Remember:
arguments to macros should *never* have side effects like in

		*cp++ = toupper(*dev++);

An example is in /usr/src/usr.sbin/config/mkheaders.c, which should
be fixed like this:


/*
 * convert a dev name to a macro name
 */
char *tomacro(dev)
	register char *dev;
{
	static char mbuf[20];
	register char *cp;

	cp = mbuf;
	*cp++ = 'N';
	while (*dev) {
		*cp++ = toupper(*dev);
		dev++;
	}
	*cp++ = 0;
	return (mbuf);
}



Martin
-- 
"In computer languages, beauty is only scan deep"    -    Larry Wall