jp@Apple.COM (John Peterson) (09/07/89)
In playing with Think C 4.0, I've found a couple of bugs in their
scanf routines for floating point. First, it drops leading zeros
occuring after "0.", e.g., "0.001234" gets read as "0.1234". Second,
if you input a string of more than 20 digits, it starts dividing the
result by ten for every extra digit.
The following patch appears to correct these problems. Note I haven't
tested these fixes extensivly (although I've apparently tested them more
than Think did...)
In routine _vfscanf (in C Libraries:sources:scanf.c) change the code
fragment:
-----------
/* (floating) process each digit */
case -2:
if (c >= '0' && c <= '9') {
F.valid = TRUE;
if (c != '0' || D.sig[0]) {
if (D.sig[0] < sizeof D.sig - 1)
D.sig[++D.sig[0]] = c;
if (F.dot)
--D.exp;
}
}
to look like this:
-----------
/* (floating) process each digit */
case -2:
if (c >= '0' && c <= '9') {
F.valid = TRUE;
if (c != '0' || D.sig[0]) {
if (D.sig[0] < sizeof D.sig - 1) {
D.sig[++D.sig[0]] = c;
/* Bugfix JWP - Don't bump exp for ignored digits */
if (F.dot)
--D.exp;
}
}
/* Bugfix JWP - Don't ignore zeros after "0." */
if (c == '0' && (! D.sig[0]))
if (F.dot)
--D.exp;
}
Then rebuild the various "ANSI" projects (note the configuration files
contained in the "config" directory.) Thank heaven for sources.
Cheers,
John "so That's why my code broke" Peterson
[Disclaimer: This posting is not endorsed or supported by Apple Computer Inc.]