On 15 May 2008 at 20:39, Eric Blake wrote: > Heinrich Mislik <Heinrich.Mislik <at> univie.ac.at> writes: > > Hello Heinrich, and thanks for the report. > > > here is a problem with stdbool.h from gnulib: > > pbool(256); > > Inherently non-portable when attempted with a C89 compiler. And > Gnulib's > <stdbool.h> replacement documents it as one of the limitations of > using the > replacement <stdbool.h>: > > | Limitations of this substitute, when used in a C89 > environment: > | > | - <stdbool.h> must be #included before the '_Bool' type can > be used. > | > | - You cannot assume that _Bool is a typedef; it might be a > macro. > | > | - Bit-fields of type 'bool' are not supported. Portable > code > | should use 'unsigned int foo : 1;' rather than 'bool foo : > 1;'. > | > | - In C99, casts and automatic conversions to '_Bool' or > 'bool' are > | performed in such a way that every nonzero value gets > converted > | to 'true', and zero gets converted to 'false'. This > doesn't work > | with this substitute. With this substitute, only the > values 0 and 1 > | give the expected result when converted to _Bool' or > 'bool'. > > > I came across this, when the -iregex option of find didn't work > > (behaves like -regex). The above test-program reflects the > situation > > in line 778 of regcomp.c: > > > > err = re_string_construct (®exp, pattern, length, > preg-translate, > > syntax & RE_ICASE, dfa); > > Therefore the bug is in regcomp.c, for violating the limits of > <stdbool.h> > usage. The proper fix is not in the stdbool module (since there is > no way to > make C89 behave the way C99 requires bool to act), but in the regex > module, to > explicitly compare the result of & against 0 in order to create a > true 0/1 > value regardless of what underlying type we are really using.
After reading the comments in stdbool.h I came to the same conclusion and to the same fix. After that -iregex was completly broken. I found one second place, that needs the same change: Line 703 in regexec.c is now: err = re_string_allocate (&mctx.input, string, length, dfa->nodes_len + 1, preg->translate, (preg->syntax & RE_ICASE) != 0, dfa); Now -iregex seems to work OK. But as you mentioned, there may be more gotchas around. Regarding your other mail: Attached find the relevant parts from config.log. I don't now, wether the compiler is in error here. And reporting bugs for AIX costs a lot of time, which I don't have right now. Cheers Heinrich -- Heinrich Mislik Zentraler Informatikdienst der Universitaet Wien A-1010 Wien, Universitaetsstrasse 7 Tel.: (+43 1) 4277-14056, Fax: (+43 1) 4277-9140
The following section of this message contains a file attachment prepared for transmission using the Internet MIME message format. If you are using Pegasus Mail, or any other MIME-compliant system, you should be able to save it or view it from within your mailer. If you cannot, please ask your system administrator for assistance. ---- File information ----------- File: config.log.bool Date: 16 May 2008, 13:04 Size: 5577 bytes. Type: Unknown
config.log.bool
Description: Binary data