changed some functions to set no error upon failure in bigint.c
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
hyung-hwan 2024-08-10 18:00:33 +09:00
parent 17cde13cbb
commit 151653aaf4
5 changed files with 143 additions and 29 deletions

View File

@ -100,7 +100,6 @@ libhcl_la_LIBADD = $(LIBADD_LIB_COMMON)
if ENABLE_STATIC_MODULE if ENABLE_STATIC_MODULE
libhcl_la_LIBADD += ../mod/libhcl-core.la libhcl_la_LIBADD += ../mod/libhcl-core.la
libhcl_la_LIBADD += ../mod/libhcl-dic.la libhcl_la_LIBADD += ../mod/libhcl-dic.la
libhcl_la_LIBADD += ../mod/libhcl-str.la
libhcl_la_LIBADD += ../mod/libhcl-sys.la libhcl_la_LIBADD += ../mod/libhcl-sys.la
endif endif

View File

@ -94,7 +94,6 @@ host_triplet = @host@
@MACOSX_FALSE@@WIN32_FALSE@am__append_5 = -DHCL_DEFAULT_PFMODPOSTFIX=\".so\" @MACOSX_FALSE@@WIN32_FALSE@am__append_5 = -DHCL_DEFAULT_PFMODPOSTFIX=\".so\"
@ENABLE_STATIC_MODULE_TRUE@am__append_6 = ../mod/libhcl-core.la \ @ENABLE_STATIC_MODULE_TRUE@am__append_6 = ../mod/libhcl-core.la \
@ENABLE_STATIC_MODULE_TRUE@ ../mod/libhcl-dic.la \ @ENABLE_STATIC_MODULE_TRUE@ ../mod/libhcl-dic.la \
@ENABLE_STATIC_MODULE_TRUE@ ../mod/libhcl-str.la \
@ENABLE_STATIC_MODULE_TRUE@ ../mod/libhcl-sys.la @ENABLE_STATIC_MODULE_TRUE@ ../mod/libhcl-sys.la
@ENABLE_HCLX_TRUE@am__append_7 = libhclx.la @ENABLE_HCLX_TRUE@am__append_7 = libhclx.la
@ENABLE_HCLX_TRUE@am__append_8 = hcl-x.h hcl-tmr.h hcl-json.h @ENABLE_HCLX_TRUE@am__append_8 = hcl-x.h hcl-tmr.h hcl-json.h

View File

@ -221,7 +221,7 @@ static int is_normalized_integer (hcl_t* hcl, hcl_oop_t oop)
return 0; return 0;
} }
static HCL_INLINE int bigint_to_oow (hcl_t* hcl, hcl_oop_t num, hcl_oow_t* w) static HCL_INLINE int bigint_to_oow_noseterr (hcl_t* hcl, hcl_oop_t num, hcl_oow_t* w)
{ {
HCL_ASSERT (hcl, HCL_IS_BIGINT(hcl,num)); HCL_ASSERT (hcl, HCL_IS_BIGINT(hcl,num));
@ -242,7 +242,7 @@ static HCL_INLINE int bigint_to_oow (hcl_t* hcl, hcl_oop_t num, hcl_oow_t* w)
HCL_ASSERT (hcl, HCL_OBJ_GET_SIZE(num) >= 2); HCL_ASSERT (hcl, HCL_OBJ_GET_SIZE(num) >= 2);
if (HCL_OBJ_GET_SIZE(num) == 2) if (HCL_OBJ_GET_SIZE(num) == 2)
{ {
*w = MAKE_WORD (((hcl_oop_halfword_t)num)->slot[0], ((hcl_oop_halfword_t)num)->slot[1]); *w = MAKE_WORD(((hcl_oop_halfword_t)num)->slot[0], ((hcl_oop_halfword_t)num)->slot[1]);
return HCL_IS_NBIGINT(hcl,num)? -1: 1; return HCL_IS_NBIGINT(hcl,num)? -1: 1;
} }
#else #else
@ -253,7 +253,7 @@ static HCL_INLINE int bigint_to_oow (hcl_t* hcl, hcl_oop_t num, hcl_oow_t* w)
return 0; /* not convertable */ return 0; /* not convertable */
} }
static HCL_INLINE int integer_to_oow (hcl_t* hcl, hcl_oop_t x, hcl_oow_t* w) static HCL_INLINE int integer_to_oow_noseterr (hcl_t* hcl, hcl_oop_t x, hcl_oow_t* w)
{ {
/* return value /* return value
* 1 - a positive number including 0 that can fit into hcl_oow_t * 1 - a positive number including 0 that can fit into hcl_oow_t
@ -279,10 +279,10 @@ static HCL_INLINE int integer_to_oow (hcl_t* hcl, hcl_oop_t x, hcl_oow_t* w)
} }
HCL_ASSERT (hcl, hcl_isbigint(hcl, x)); HCL_ASSERT (hcl, hcl_isbigint(hcl, x));
return bigint_to_oow(hcl, x, w); return bigint_to_oow_noseterr(hcl, x, w);
} }
int hcl_inttooow (hcl_t* hcl, hcl_oop_t x, hcl_oow_t* w) int hcl_inttooow_noseterr (hcl_t* hcl, hcl_oop_t x, hcl_oow_t* w)
{ {
if (HCL_OOP_IS_SMOOI(x)) if (HCL_OOP_IS_SMOOI(x))
{ {
@ -301,14 +301,44 @@ int hcl_inttooow (hcl_t* hcl, hcl_oop_t x, hcl_oow_t* w)
} }
} }
if (hcl_isbigint(hcl, x)) return bigint_to_oow(hcl, x, w); /* 0 -> too big, too small, or not an integer */
return hcl_isbigint(hcl, x)? bigint_to_oow_noseterr(hcl, x, w): 0;
}
int hcl_inttooow (hcl_t* hcl, hcl_oop_t x, hcl_oow_t* w)
{
if (HCL_OOP_IS_SMOOI(x))
{
hcl_ooi_t v;
v = HCL_OOP_TO_SMOOI(x);
if (v < 0)
{
*w = -v;
hcl_seterrnum (hcl, HCL_ERANGE);
return -1; /* negative number negated - kind of an error */
}
else
{
*w = v;
return 1; /* zero or positive number */
}
}
if (hcl_isbigint(hcl, x))
{
int n;
if ((n = bigint_to_oow_noseterr(hcl, x, w)) <= 0) hcl_seterrnum (hcl, HCL_ERANGE);
return n;
}
hcl_seterrbfmt (hcl, HCL_EINVAL, "parameter not integer - %O", x); hcl_seterrbfmt (hcl, HCL_EINVAL, "parameter not integer - %O", x);
return 0; /* not convertable - too big, too small, or not integer */ return 0; /* not convertable - too big, too small, or not integer */
} }
int hcl_inttoooi (hcl_t* hcl, hcl_oop_t x, hcl_ooi_t* i) int hcl_inttoooi_noseterr (hcl_t* hcl, hcl_oop_t x, hcl_ooi_t* i)
{ {
#if 0
hcl_oow_t w; hcl_oow_t w;
int n; int n;
@ -334,9 +364,82 @@ int hcl_inttoooi (hcl_t* hcl, hcl_oop_t x, hcl_ooi_t* i)
} }
return n; return n;
#else
if (HCL_OOP_IS_SMOOI(x))
{
*i = HCL_OOP_TO_SMOOI(x);
return (*i < 0)? -1: 1;
}
if (hcl_isbigint(hcl, x))
{
hcl_oow_t w;
int n;
n = bigint_to_oow_noseterr(hcl, x, &w);
if (n < 0)
{
HCL_STATIC_ASSERT (HCL_TYPE_MAX(hcl_ooi_t) + HCL_TYPE_MIN(hcl_ooi_t) == -1); /* assume 2's complement */
if (w > (hcl_oow_t)HCL_TYPE_MAX(hcl_ooi_t) + 1) return 0; /* too small */
*i = -w; /* negate back */
}
else if (n > 0)
{
if (w > HCL_TYPE_MAX(hcl_ooi_t)) return 0; /* too big */
*i = w;
}
return n;
}
return 0; /* not integer */
#endif
} }
int hcl_inttoooi (hcl_t* hcl, hcl_oop_t x, hcl_ooi_t* i)
{
if (HCL_OOP_IS_SMOOI(x))
{
*i = HCL_OOP_TO_SMOOI(x);
return (*i < 0)? -1: 1;
}
if (hcl_isbigint(hcl, x))
{
hcl_oow_t w;
int n;
n = bigint_to_oow_noseterr(hcl, x, &w);
if (n < 0)
{
HCL_STATIC_ASSERT (HCL_TYPE_MAX(hcl_ooi_t) + HCL_TYPE_MIN(hcl_ooi_t) == -1); /* assume 2's complement */
if (w > (hcl_oow_t)HCL_TYPE_MAX(hcl_ooi_t) + 1)
{
hcl_seterrnum (hcl, HCL_ERANGE);
return 0; /* too small */
}
*i = -w; /* negate back */
}
else if (n > 0)
{
if (w > HCL_TYPE_MAX(hcl_ooi_t))
{
hcl_seterrnum (hcl, HCL_ERANGE);
return 0; /* too big */
}
*i = w;
}
else
{
hcl_seterrnum (hcl, HCL_ERANGE);
}
return n;
}
hcl_seterrbfmt (hcl, HCL_EINVAL, "not an integer - %O", x);
return 0; /* not integer */
}
#if (HCL_SIZEOF_UINTMAX_T == HCL_SIZEOF_OOW_T) #if (HCL_SIZEOF_UINTMAX_T == HCL_SIZEOF_OOW_T)
@ -2941,7 +3044,7 @@ hcl_oop_t hcl_bitatint (hcl_t* hcl, hcl_oop_t x, hcl_oop_t y)
if (HCL_IS_NBIGINT(hcl, y)) return HCL_SMOOI_TO_OOP(0); if (HCL_IS_NBIGINT(hcl, y)) return HCL_SMOOI_TO_OOP(0);
sign = bigint_to_oow (hcl, y, &w); sign = bigint_to_oow_noseterr(hcl, y, &w);
HCL_ASSERT (hcl, sign >= 0); HCL_ASSERT (hcl, sign >= 0);
if (sign >= 1) if (sign >= 1)
{ {
@ -2955,11 +3058,11 @@ hcl_oop_t hcl_bitatint (hcl_t* hcl, hcl_oop_t x, hcl_oop_t y)
HCL_ASSERT (hcl, sign == 0); HCL_ASSERT (hcl, sign == 0);
hcl_pushvolat (hcl, &x); hcl_pushvolat (hcl, &x);
quo = hcl_divints (hcl, y, HCL_SMOOI_TO_OOP(HCL_LIW_BITS), 0, &rem); quo = hcl_divints(hcl, y, HCL_SMOOI_TO_OOP(HCL_LIW_BITS), 0, &rem);
hcl_popvolat (hcl); hcl_popvolat (hcl);
if (!quo) return HCL_NULL; if (!quo) return HCL_NULL;
sign = integer_to_oow (hcl, quo, &wp); sign = integer_to_oow_noseterr(hcl, quo, &wp);
HCL_ASSERT (hcl, sign >= 0); HCL_ASSERT (hcl, sign >= 0);
if (sign == 0) if (sign == 0)
{ {
@ -3845,7 +3948,7 @@ static HCL_INLINE hcl_oop_t rshift_negative_bigint_and_normalize (hcl_t* hcl, hc
hcl_popvolat (hcl); hcl_popvolat (hcl);
if (!y) return HCL_NULL; if (!y) return HCL_NULL;
sign = integer_to_oow (hcl, y, &shift); sign = integer_to_oow_noseterr(hcl, y, &shift);
if (sign == 0) shift = HCL_SMOOI_MAX; if (sign == 0) shift = HCL_SMOOI_MAX;
else else
{ {
@ -3929,11 +4032,11 @@ static HCL_INLINE hcl_oop_t rshift_positive_bigint_and_normalize (hcl_t* hcl, hc
/* y is a negative number. use hcl_addints() until it becomes 0 */ /* y is a negative number. use hcl_addints() until it becomes 0 */
hcl_pushvolat (hcl, &z); hcl_pushvolat (hcl, &z);
y = hcl_addints (hcl, y, HCL_SMOOI_TO_OOP(shift)); y = hcl_addints(hcl, y, HCL_SMOOI_TO_OOP(shift));
hcl_popvolat (hcl); hcl_popvolat (hcl);
if (!y) return HCL_NULL; if (!y) return HCL_NULL;
sign = integer_to_oow (hcl, y, &shift); sign = integer_to_oow_noseterr(hcl, y, &shift);
if (sign == 0) shift = HCL_SMOOI_MAX; if (sign == 0) shift = HCL_SMOOI_MAX;
else else
{ {
@ -3977,22 +4080,22 @@ static HCL_INLINE hcl_oop_t lshift_bigint_and_normalize (hcl_t* hcl, hcl_oop_t x
lshift_unsigned_array (((hcl_oop_liword_t)z)->slot, HCL_OBJ_GET_SIZE(z), shift); lshift_unsigned_array (((hcl_oop_liword_t)z)->slot, HCL_OBJ_GET_SIZE(z), shift);
hcl_pushvolat (hcl, &y); hcl_pushvolat (hcl, &y);
x = normalize_bigint (hcl, z); x = normalize_bigint(hcl, z);
hcl_popvolat (hcl); hcl_popvolat (hcl);
if (!x) return HCL_NULL; if (!x) return HCL_NULL;
hcl_pushvolat (hcl, &x); hcl_pushvolat (hcl, &x);
y = hcl_subints (hcl, y, HCL_SMOOI_TO_OOP(shift)); y = hcl_subints(hcl, y, HCL_SMOOI_TO_OOP(shift));
hcl_popvolat (hcl); hcl_popvolat (hcl);
if (!y) return HCL_NULL; if (!y) return HCL_NULL;
sign = integer_to_oow (hcl, y, &shift); sign = integer_to_oow_noseterr(hcl, y, &shift);
if (sign == 0) shift = HCL_SMOOI_MAX; if (sign == 0) shift = HCL_SMOOI_MAX;
else else
{ {
if (shift == 0) if (shift == 0)
{ {
HCL_ASSERT (hcl, is_normalized_integer (hcl, x)); HCL_ASSERT (hcl, is_normalized_integer(hcl, x));
return x; return x;
} }
HCL_ASSERT (hcl, sign >= 1); HCL_ASSERT (hcl, sign >= 1);
@ -4147,7 +4250,7 @@ hcl_oop_t hcl_bitshiftint (hcl_t* hcl, hcl_oop_t x, hcl_oop_t y)
negx = HCL_IS_NBIGINT(hcl, x); negx = HCL_IS_NBIGINT(hcl, x);
negy = HCL_IS_NBIGINT(hcl, y); negy = HCL_IS_NBIGINT(hcl, y);
sign = bigint_to_oow (hcl, y, &shift); sign = bigint_to_oow_noseterr(hcl, y, &shift);
if (sign == 0) if (sign == 0)
{ {
/* y is too big or too small */ /* y is too big or too small */
@ -4776,7 +4879,7 @@ hcl_oop_t hcl_inttostr (hcl_t* hcl, hcl_oop_t num, int flagged_radix)
HCL_ASSERT (hcl, radix >= 2 && radix <= 36); HCL_ASSERT (hcl, radix >= 2 && radix <= 36);
if (!hcl_isint(hcl,num)) goto oops_einval; if (!hcl_isint(hcl,num)) goto oops_einval;
v = integer_to_oow(hcl, num, &w); v = integer_to_oow_noseterr(hcl, num, &w);
if (v) if (v)
{ {

View File

@ -2961,12 +2961,24 @@ HCL_EXPORT hcl_oop_t hcl_ooitoint (
hcl_ooi_t i hcl_ooi_t i
); );
HCL_EXPORT int hcl_inttooow_noseterr (
hcl_t* hcl,
hcl_oop_t x,
hcl_oow_t* w
);
HCL_EXPORT int hcl_inttooow ( HCL_EXPORT int hcl_inttooow (
hcl_t* hcl, hcl_t* hcl,
hcl_oop_t x, hcl_oop_t x,
hcl_oow_t* w hcl_oow_t* w
); );
HCL_EXPORT int hcl_inttoooi_noseterr (
hcl_t* hcl,
hcl_oop_t x,
hcl_ooi_t* i
);
HCL_EXPORT int hcl_inttoooi ( HCL_EXPORT int hcl_inttoooi (
hcl_t* hcl, hcl_t* hcl,
hcl_oop_t x, hcl_oop_t x,

View File

@ -73,17 +73,18 @@ static hcl_pfrc_t pf_core_basic_at (hcl_t* hcl, hcl_mod_t* mod, hcl_ooi_t nargs)
if (!HCL_OOP_IS_POINTER(obj) || !HCL_OBJ_GET_FLAGS_FLEXI(obj)) if (!HCL_OOP_IS_POINTER(obj) || !HCL_OBJ_GET_FLAGS_FLEXI(obj))
{ {
unindexable: unindexable:
/* the receiver is a special numeric object or a non-indexable object */
hcl_seterrbfmt (hcl, HCL_EINVAL, "receiver not indexable - %O", obj); hcl_seterrbfmt (hcl, HCL_EINVAL, "receiver not indexable - %O", obj);
return HCL_PF_FAILURE; return HCL_PF_FAILURE;
} }
if (!HCL_OOP_IS_SMOOI(pos)) if (hcl_inttooow_noseterr(hcl, pos, &index) <= 0)
{ {
hcl_seterrbfmt (hcl, HCL_EINVAL, "position not numeric - %O", pos); /* negative integer or not integer */
hcl_seterrbfmt (hcl, HCL_EINVAL, "position not valid- %O", pos);
return HCL_PF_FAILURE; return HCL_PF_FAILURE;
} }
index = HCL_OOP_TO_SMOOI(pos); if (index >= HCL_OBJ_GET_SIZE(obj))
if (index < 0 || index >= HCL_OBJ_GET_SIZE(obj))
{ {
hcl_seterrbfmt (hcl, HCL_EINVAL, "position(%zd) out of range - negative or greater than or equal to %zu", index, (hcl_ooi_t)HCL_OBJ_GET_SIZE(obj)); hcl_seterrbfmt (hcl, HCL_EINVAL, "position(%zd) out of range - negative or greater than or equal to %zu", index, (hcl_ooi_t)HCL_OBJ_GET_SIZE(obj));
return HCL_PF_FAILURE; return HCL_PF_FAILURE;
@ -147,13 +148,13 @@ static hcl_pfrc_t pf_core_basic_at_put (hcl_t* hcl, hcl_mod_t* mod, hcl_ooi_t na
return HCL_PF_FAILURE; return HCL_PF_FAILURE;
} }
if (!HCL_OOP_IS_SMOOI(pos)) if (hcl_inttooow_noseterr(hcl, pos, &index) <= 0)
{ {
hcl_seterrbfmt (hcl, HCL_EINVAL, "position not numeric - %O", pos); /* negative integer or not integer */
hcl_seterrbfmt (hcl, HCL_EINVAL, "position not valid- %O", pos);
return HCL_PF_FAILURE; return HCL_PF_FAILURE;
} }
index = HCL_OOP_TO_SMOOI(pos); if (index >= HCL_OBJ_GET_SIZE(obj))
if (index < 0 || index >= HCL_OBJ_GET_SIZE(obj))
{ {
hcl_seterrbfmt (hcl, HCL_EINVAL, "position(%zd) out of range - negative or greater than or equal to %zu", index, (hcl_ooi_t)HCL_OBJ_GET_SIZE(obj)); hcl_seterrbfmt (hcl, HCL_EINVAL, "position(%zd) out of range - negative or greater than or equal to %zu", index, (hcl_ooi_t)HCL_OBJ_GET_SIZE(obj));
return HCL_PF_FAILURE; return HCL_PF_FAILURE;