disallowed fixed point decimal literal with no digit after the point.
fixed a bug in hcl_divnums
This commit is contained in:
		| @ -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)) | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user