should scanf be getting built supporting hexadecimal float

Corinna Vinschen corinna-cygwin@cygwin.com
Mon Apr 19 17:53:24 GMT 2021


On Apr 19 09:17, Brian Inglis wrote:
> On 2021-04-19 09:07, Brian Inglis wrote:
> > On 2021-04-18 22:09, Keith Thompson via Cygwin wrote:
> > > The *scanf() functions don't handle hexadecimal floating-point input
> > > (for example "0x1p+0" representing 1.0).
> > > On Cygwin, the output (compiled with gcc or clang) is:
> > > sscanf returned 1, x = 0 (expected 1), FAILED
> > > On Ubuntu, the output is:
> > > sscanf returned 1, x = 1, PASSED
> > > Looking through the newlib sources (git://sourceware.org/git/newlib-cygwin.git),
> > > this might be related to the _WANT_IO_C99_FORMATS macro, but I haven't
> > > looked into
> > > the details.
> > > The test case passes on Cygwin when compiled with i686-w64-mingw32-gcc
> > > or x86_64-w64-mingw32-gcc.
> 
> > This seems like an oversight as gdtoa-gethex.c was added about 2006 and
> > scanf and strtod support it.
> > See augmented STC with strtod added attached:
> > 
> > $ gcc -o hexfloat-scanf-test{,.c}
> > $ ./hexfloat-scanf-test
> > sscanf returned 2, unscanned 'x1p+0', x = 0 (expected 1), FAILED
> > strtod unscanned '', x = 1, PASSED
> 
> Should the Cygwin newlib build be enabling hex float support?

Unfortunately, newlib's scanf code does not support hex floats at all yet.
Scanf collects and validates the input stream snippet which is supposed to
be given to strtod/strtold, and neither x nor p are valid chars in that
piece of code yet.

I'll look into adding this code, which shouldn't be too complicated,
but I wouldn't be offended by patches either.


Thanks,
Corinna


More information about the Cygwin mailing list