Return to BSD News archive
Path: sserve!newshost.anu.edu.au!munnari.oz.au!constellation!osuunx.ucc.okstate.edu!moe.ksu.ksu.edu!vixen.cso.uiuc.edu!howland.reston.ans.net!agate!doc.ic.ac.uk!uknet!mcsun!news.eunet.fi!KremlSun!kiae!relcom!newsserv From: "Andrew A. Chernov, Black Mage" <ache@astral.msk.su> Newsgroups: comp.os.386bsd.bugs Subject: Right fix to ctype.h, expr calculated only one time now Date: Sun, 22 Aug 93 03:47:41 +0400 Distribution: world Organization: Ha-olahm Yetzirah Message-ID: <HQTGhTiKG1@astral.msk.su> Sender: news-service@kiae.su Reply-To: ache@astral.msk.su X-Return-Path: kiae.UUCP!newcom.kiae.su!astral!astral.msk.su!ache Lines: 54 It is well-know bug in toupper/tolower macros: it doesn't check for valid char, moreover it is ANSI standard violation. All fixes I seen have another well-know bug, expr calculated more than one time, produce error in *p++ = tolower(*s++) construction. Here is right fix, expr calculated only one time: *** ctype.h.old Mon Apr 8 18:52:59 1991 --- ctype.h Fri Aug 6 23:30:37 1993 *************** extern char _ctype_[]; *** 59,66 **** #define isgraph(c) ((_ctype_ + 1)[c] & (_P|_U|_L|_N)) #define iscntrl(c) ((_ctype_ + 1)[c] & _C) #define isascii(c) ((unsigned)(c) <= 0177) ! #define toupper(c) ((c) - 'a' + 'A') ! #define tolower(c) ((c) - 'A' + 'a') #define toascii(c) ((c) & 0177) #endif /* !_CTYPE_H_ */ --- 59,83 ---- #define isgraph(c) ((_ctype_ + 1)[c] & (_P|_U|_L|_N)) #define iscntrl(c) ((_ctype_ + 1)[c] & _C) #define isascii(c) ((unsigned)(c) <= 0177) ! #define _toupper(c) ((c) - 'a' + 'A') ! #define _tolower(c) ((c) - 'A' + 'a') #define toascii(c) ((c) & 0177) + + #ifdef __GNUC__ + #define tolower(c) \ + ({ \ + int ___c = (c); \ + isupper(___c) ? _tolower(___c) : ___c; \ + }) + + #define toupper(c) \ + ({ \ + int ___c = (c); \ + islower(___c) ? _toupper(___c) : ___c; \ + }) + #else + extern int tolower(); + extern int toupper(); + #endif #endif /* !_CTYPE_H_ */ -- In-This-Life: Andrew A. Chernov | "Hay mas dicha, mas contento Internet: ache@astral.msk.su | "Que adorar una hermosura FIDOnet: 2:5020/134.32 | "Brujuleada entre los lejos RELCOM Development Team, Moscow, Russia | "De lo imposible?!" (Calderon)