I ran into a mingw bug on strtol() today, and don't see it documented or
worked around in gnulib:
$ cat foo.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(void)
{
unsigned long u;
const char *str = "0x";
char *end;
errno = 0;
u = strtoul(str, &end, 10);
printf("%lu %s %d\n", u, end, errno);
errno = 0;
u = strtoul(str, &end, 16);
printf("%lu %s %d\n", u, end, errno);
errno = 0;
u = strtoul(str, &end, 0);
printf("%lu %s %d\n", u, end, errno);
str = "0xq";
errno = 0;
u = strtoul(str, &end, 10);
printf("%lu %s %d\n", u, end, errno);
errno = 0;
u = strtoul(str, &end, 16);
printf("%lu %s %d\n", u, end, errno);
errno = 0;
u = strtoul(str, &end, 0);
printf("%lu %s %d\n", u, end, errno);
return 0;
}
$ gcc -o foo-linux -Wall foo.c
$ x86_64-w64-mingw32-gcc -o foo-mingw -Wall foo.c
$ ./foo-linux
0 x 0
0 x 0
0 x 0
0 xq 0
0 xq 0
0 xq 0
$ wine ./foo-mingw.exe 2>/dev/null
0 x 0
0 0x 0
0 0x 0
0 xq 0
0 0xq 0
0 0xq 0
In short, mingw (at least when run under wine, I did not actually test
on a Windows machine) fails to properly consume '0' when parsing in base
16 or 0 when there are no hex digits after a trailing garbage of 'x' or 'X'.
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org