tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: using the interfaces in ctype.h



(BTW, Terry, your address, tmm%mcci.com@localhost, isn't usable from mailers which refuse to honour broken MX CNAMEs. MX target hosts _must_ be canonical hostnames, i.e. host domain names with valid A records. Your domain is liable to end up in the bogusmx.rfc-ignorant.org blacklist.)

On 18-Apr-08, at 1:19 PM, Terry Moore wrote:

Hmm. Back in the bad old days before C-89, casts didn't portably guarantee that the result of casting was any different than what you started with. So for example isspace((uchar) x) could be wrong if x was > 0xFF.

I remember that the recommended practice (when using Whitesmiths C) was instead:

      isspace(x & 255)

Indeed! Some implementations were so lame they didn't include the mask in the implementation of the macro!

Oh oh, oops, the NetBSD implementations don't seem to include the mask either! I didn't realized that! So sad. (Which may even mean they violate the standards implication that they be able to safely accept the value of EOF. FreeBSD, OpenBSD, and Darwin all seem to have much better implementations, though they are all using proper (inline) functions which makes it easier in some ways to do it right.)

I think a smart compiler should be able to do the modulo 256 reduction without actually masking, on most platforms. In any event, when using modern compilers, the '&' will make everything an int, and shouldn't cause any warnings. (Of course, the usual #defines and so forth would normally be used instead of writing '255'....)

Of course that's not going to work very well at all on machines where a char is > 8 bits and a char is expected to have values > 0xFF. I suppose one could hope for CHAR_BIT being defined correctly and create the mask by shifting: ~(UINT_MAX << CHAR_BIT)

However for all it's failings, c89 is now pervasive on all unix and unix-like systems that are still in any way interesting or useful for ongoing work or play.

Hmmmm.... maybe though I should propose a patch to ctype.h that'll make these macros safe even in face of inappropriate uses.

--
                                        Greg A. Woods; Planix, Inc.
                                        <woods%planix.ca@localhost>





Home | Main Index | Thread Index | Old Index