karl@haddock.ima.isc.com (Karl Heuer) (01/05/89)
In article <2537@xyzzy.UUCP> throopw@xyzzy.UUCP (Wayne A. Throop) writes: > if( *p >= 0 ) *p = toupper( *p ); Wrong, because this would fail to translate a lowercase character whose value appears negative. (In a non-ASCII environment.) In article <2581@ficc.uu.net> peter@ficc.uu.net (Peter da Silva) writes: > if(islower(*p)) *p = toupper(*p); Wrong, because if *p appears negative, it's not valid as input to islower(). In article <189@becker.UUCP> bdb@becker.UUCP (Bruce Becker) writes: > *p = toupper( *p&0xff ); Wrong, because bytes need not be eight bits wide. But this one is closest; it can be made correct by changing it to *p = toupper((unsigned char)*p) or by declaring p to be of type `unsigned char *' in the first place (which may have other ramifications). >Not all _ctype arrays have the same range - some are only 128 bytes. In those >cases the '0xff' above becomes '0x7f'. No, in 128-element ctype implementations (which are necessarily pre-ANSI), it's generally more correct to use if (isascii(*p)) *p = toupper(*p); or (if toupper() has the more restricted domain) if (isascii(*p) && islower(*p)) *p = toupper(*p); Silently ignoring the high bit is only correct in special cases, in programs that use it for quoting and such. In article <9256@smoke.BRL.MIL> gwyn@brl.arpa (Doug Gwyn (VLD/VMB) <gwyn>) writes: >In article <189@becker.UUCP> bdb@becker.UUCP (Bruce Becker) writes: >>I'm confused about what the value of "toupper(EOF)" should be... > >I don't think EOF is supposed to be a valid argument for toupper(), >just for the is*() functions. I don't see any exception being made in the dpANS, so by my reading, EOF is in the domain of toupper().% If this is correct, the proper return value is EOF. (Just as toupper('#') must return '#'.) Karl W. Z. Heuer (ima!haddock!karl or karl@haddock.isc.com), The Walking Lint ________ % This is probably about as useful as having it in the domain of the is*() functions. In both cases, I can imagine a use for it, but in my own code, I generally check for EOF before doing *anything* else with a getc() result.