[Patch] Wrong usage of ctype functions
Werner Koch
wk at gnupg.org
Sat Jun 7 21:51:02 CEST 2003
On Fri, 6 Jun 2003 18:31:37 +0200, Christian Biere said:
> macro EOF". As "char" is a synonym for "signed char" changed on
> several architectures the implicit cast to "int" will gain negative
> values for many characters.
> - if( !*s || (*s & 0x80) || (!isgraph(*s) && !isspace(*s)) )
> + if( !*s || (*s & 0x80) ||
But not here. We already checked that that it is an ascii character;
i.e. one which won't yield a negative value. I am very well ware of
the problem but you compiler warnings are incorrect.
I agree that isascii () would be a cleaner solution than explicit bit
testing. isascii () is defined vor all integer values and actually
pretty simple. I am using that in newer code.
> for( s++; *s ; s++ ) {
> - if( iscntrl(*s) ) {
> + if( iscntrl((unsigned char) *s) ) {
> log_error(_("a notation value must not use "
Here you are right, however a better fix is to use:
if ((*s & 0x80))
highbit = 1;
else if (iscntrl(*s)) {
> - if(string[i]&0x80 || iscntrl(string[i]))
> + if(string[i]&0x80 || iscntrl((unsigned char) string[i]))
> break;
See above.
Many thanks for pointing out all the other buggy uses. I have fixed
them with my simple testing macros spacep, digitp and hexdigitp which
are not subject to localization - we are actually testing only for
ascii values.
Shalom-Salam,
Werner
--
Werner Koch <wk at gnupg.org>
The GnuPG Experts http://g10code.com
Free Software Foundation Europe http://fsfeurope.org
More information about the Gnupg-devel
mailing list