Commit d69149c7 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Make SF_Parse_(numeric) ignore leading and trailing ows.

parent b3799d22
...@@ -81,6 +81,8 @@ sf_parse_int(const char **ipp, const char **errtxt, int maxdig) ...@@ -81,6 +81,8 @@ sf_parse_int(const char **ipp, const char **errtxt, int maxdig)
retval *= 10; retval *= 10;
retval += *(*ipp)++ - 0x30; retval += *(*ipp)++ - 0x30;
} }
while (vct_isows(*(*ipp)))
(*ipp)++;
if (ndig == 0) if (ndig == 0)
BAIL(negative ? err_invalid_num : err_miss_num); BAIL(negative ? err_invalid_num : err_miss_num);
if (negative) if (negative)
...@@ -98,48 +100,56 @@ SF_Parse_Integer(const char **ipp, const char **errtxt) ...@@ -98,48 +100,56 @@ SF_Parse_Integer(const char **ipp, const char **errtxt)
double double
SF_Parse_Decimal(const char **ipp, const char **errtxt) SF_Parse_Decimal(const char **ipp, const char **errtxt)
{ {
double retval; double retval, scale = 1;
int ndig;
retval = (double)sf_parse_int(ipp, errtxt, 12); retval = (double)sf_parse_int(ipp, errtxt, 12);
if (*(*ipp) != '.') if (retval < 0)
return (retval); scale = -scale;
(*ipp)++; do {
if (!vct_isdigit(*(*ipp))) if (*(*ipp) != '.')
return (retval); break;
retval += .1 * (*(*ipp)++ - 0x30); (*ipp)++;
if (!vct_isdigit(*(*ipp))) for(ndig = 0; ndig < 3; ndig++) {
return (retval); scale *= .1;
retval += .01 * (*(*ipp)++ - 0x30); if (!vct_isdigit(*(*ipp)))
if (!vct_isdigit(*(*ipp))) break;
return (retval); retval += scale * (*(*ipp)++ - 0x30);
retval += .001 * (*(*ipp)++ - 0x30); }
if (vct_isdigit(*(*ipp))) if (vct_isdigit(*(*ipp)))
BAIL(err_fatnum); BAIL(err_fatnum);
} while (0);
while (vct_isows(*(*ipp)))
(*ipp)++;
return (retval); return (retval);
} }
double double
SF_Parse_Number(const char **ipp, const char **errtxt) SF_Parse_Number(const char **ipp, const char **errtxt)
{ {
double retval; double retval, scale = 1;
int ndig;
retval = (double)sf_parse_int(ipp, errtxt, 15); retval = (double)sf_parse_int(ipp, errtxt, 15);
if (*(*ipp) != '.') if (retval < 0)
return (retval); scale = -scale;
if (retval < -999999999999 || retval > 999999999999) do {
BAIL(err_fatnum); if (*(*ipp) != '.')
(*ipp)++; break;
if (!vct_isdigit(*(*ipp))) if (retval < -999999999999 || retval > 999999999999)
return (retval); BAIL(err_fatnum);
retval += .1 * (*(*ipp)++ - 0x30); (*ipp)++;
if (!vct_isdigit(*(*ipp))) for(ndig = 0; ndig < 3; ndig++) {
return (retval); scale *= .1;
retval += .01 * (*(*ipp)++ - 0x30); if (!vct_isdigit(*(*ipp)))
if (!vct_isdigit(*(*ipp))) break;
return (retval); retval += scale * (*(*ipp)++ - 0x30);
retval += .001 * (*(*ipp)++ - 0x30); }
if (vct_isdigit(*(*ipp))) if (vct_isdigit(*(*ipp)))
BAIL(err_fatnum); BAIL(err_fatnum);
} while (0);
while (vct_isows(*(*ipp)))
(*ipp)++;
return (retval); return (retval);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment