disallowed fixed point decimal literal with no digit after the point.
fixed a bug in hcl_divnums
This commit is contained in:
parent
2253d09a18
commit
e466c6b68a
@ -100,7 +100,7 @@ enum hcl_synerrnum_t
|
|||||||
HCL_SYNERR_STRCHRNC, /* string/character not closed */
|
HCL_SYNERR_STRCHRNC, /* string/character not closed */
|
||||||
HCL_SYNERR_HASHLIT, /* wrong hashed literal */
|
HCL_SYNERR_HASHLIT, /* wrong hashed literal */
|
||||||
HCL_SYNERR_CHARLIT, /* wrong character literal */
|
HCL_SYNERR_CHARLIT, /* wrong character literal */
|
||||||
HCL_SYNERR_RADNUMLIT , /* invalid numeric literal with radix */
|
HCL_SYNERR_NUMLIT , /* invalid numeric literal */
|
||||||
HCL_SYNERR_NUMRANGE, /* number range error */
|
HCL_SYNERR_NUMRANGE, /* number range error */
|
||||||
HCL_SYNERR_ERRORLIT, /* wrong error literal */
|
HCL_SYNERR_ERRORLIT, /* wrong error literal */
|
||||||
HCL_SYNERR_SMPTRLIT, /* wrong smptr literal */
|
HCL_SYNERR_SMPTRLIT, /* wrong smptr literal */
|
||||||
|
@ -233,7 +233,7 @@ hcl_oop_t hcl_divnums (hcl_t* hcl, hcl_oop_t x, hcl_oop_t y)
|
|||||||
|
|
||||||
nv = xv;
|
nv = xv;
|
||||||
|
|
||||||
hcl_pushtmp (hcl, &y);
|
hcl_pushtmp (hcl, &yv);
|
||||||
for (i = 0; i < ys; i++)
|
for (i = 0; i < ys; i++)
|
||||||
{
|
{
|
||||||
nv = hcl_mulints(hcl, nv, HCL_SMOOI_TO_OOP(10));
|
nv = hcl_mulints(hcl, nv, HCL_SMOOI_TO_OOP(10));
|
||||||
@ -244,7 +244,7 @@ hcl_oop_t hcl_divnums (hcl_t* hcl, hcl_oop_t x, hcl_oop_t y)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nv = hcl_divints(hcl, nv, y, 0, HCL_NULL);
|
nv = hcl_divints(hcl, nv, yv, 0, HCL_NULL);
|
||||||
hcl_poptmp (hcl);
|
hcl_poptmp (hcl);
|
||||||
if (!nv) return HCL_NULL;
|
if (!nv) return HCL_NULL;
|
||||||
|
|
||||||
|
@ -273,7 +273,11 @@ hcl_oop_t hcl_makefpdec (hcl_t* hcl, hcl_oop_t value, hcl_ooi_t scale)
|
|||||||
{
|
{
|
||||||
hcl_oop_fpdec_t f;
|
hcl_oop_fpdec_t f;
|
||||||
|
|
||||||
if (!HCL_IN_SMOOI_RANGE(scale))
|
HCL_ASSERT (hcl, hcl_isint(hcl, value));
|
||||||
|
|
||||||
|
if (scale <= 0) return value; /* if scale is 0 or less, return the value as it it */
|
||||||
|
|
||||||
|
if (scale > HCL_SMOOI_MAX)
|
||||||
{
|
{
|
||||||
hcl_seterrbfmt (hcl, HCL_EINVAL, "fpdec scale too large - %zd", scale);
|
hcl_seterrbfmt (hcl, HCL_EINVAL, "fpdec scale too large - %zd", scale);
|
||||||
return HCL_NULL;
|
return HCL_NULL;
|
||||||
|
@ -719,7 +719,7 @@ static int get_radix_number (hcl_t* hcl, hcl_ooci_t rc, int radix)
|
|||||||
|
|
||||||
if (CHAR_TO_NUM(c, radix) >= radix)
|
if (CHAR_TO_NUM(c, radix) >= radix)
|
||||||
{
|
{
|
||||||
hcl_setsynerrbfmt (hcl, HCL_SYNERR_RADNUMLIT, TOKEN_LOC(hcl), TOKEN_NAME(hcl),
|
hcl_setsynerrbfmt (hcl, HCL_SYNERR_NUMLIT, TOKEN_LOC(hcl), TOKEN_NAME(hcl),
|
||||||
"no digit after radix specifier in %.*js", hcl->c->tok.name.len, hcl->c->tok.name.ptr);
|
"no digit after radix specifier in %.*js", hcl->c->tok.name.len, hcl->c->tok.name.ptr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -740,7 +740,7 @@ static int get_radix_number (hcl_t* hcl, hcl_ooci_t rc, int radix)
|
|||||||
}
|
}
|
||||||
while (!is_delimiter(c));
|
while (!is_delimiter(c));
|
||||||
|
|
||||||
hcl_setsynerrbfmt (hcl, HCL_SYNERR_RADNUMLIT, TOKEN_LOC(hcl), TOKEN_NAME(hcl),
|
hcl_setsynerrbfmt (hcl, HCL_SYNERR_NUMLIT, TOKEN_LOC(hcl), TOKEN_NAME(hcl),
|
||||||
"invalid digit in radixed number in %.*js", hcl->c->tok.name.len, hcl->c->tok.name.ptr);
|
"invalid digit in radixed number in %.*js", hcl->c->tok.name.len, hcl->c->tok.name.ptr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1154,6 +1154,11 @@ retry:
|
|||||||
SET_TOKEN_TYPE (hcl, HCL_IOTOK_FPDECLIT);
|
SET_TOKEN_TYPE (hcl, HCL_IOTOK_FPDECLIT);
|
||||||
ADD_TOKEN_CHAR (hcl, c);
|
ADD_TOKEN_CHAR (hcl, c);
|
||||||
GET_CHAR_TO (hcl, c);
|
GET_CHAR_TO (hcl, c);
|
||||||
|
if (!is_digitchar(c))
|
||||||
|
{
|
||||||
|
hcl_setsynerrbfmt (hcl, HCL_SYNERR_NUMLIT, TOKEN_LOC(hcl), TOKEN_NAME(hcl), "invalid numeric literal with no digit after fixed-point");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_digitchar(c))
|
if (!is_digitchar(c))
|
||||||
|
Loading…
Reference in New Issue
Block a user