ported the portability fix in bigint.c
This commit is contained in:
44
lib/bigint.c
44
lib/bigint.c
@ -304,6 +304,11 @@ static MOO_INLINE int bigint_to_oow_noseterr (moo_t* moo, moo_oop_t num, moo_oow
|
|||||||
*w = MAKE_WORD(MOO_OBJ_GET_HALFWORD_VAL(num, 0), MOO_OBJ_GET_HALFWORD_VAL(num, 1));
|
*w = MAKE_WORD(MOO_OBJ_GET_HALFWORD_VAL(num, 0), MOO_OBJ_GET_HALFWORD_VAL(num, 1));
|
||||||
return (MOO_POINTER_IS_NBIGINT(moo, num))? -1: 1;
|
return (MOO_POINTER_IS_NBIGINT(moo, num))? -1: 1;
|
||||||
}
|
}
|
||||||
|
if (MOO_OBJ_GET_SIZE(num) == 1)
|
||||||
|
{
|
||||||
|
*w = MOO_OBJ_GET_HALFWORD_VAL(num, 0);
|
||||||
|
return (MOO_POINTER_IS_NBIGINT(moo, num))? -1: 1;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
# error UNSUPPORTED LIW BIT SIZE
|
# error UNSUPPORTED LIW BIT SIZE
|
||||||
#endif
|
#endif
|
||||||
@ -413,7 +418,7 @@ int moo_inttoooi_noseterr (moo_t* moo, moo_oop_t x, moo_ooi_t* i)
|
|||||||
{
|
{
|
||||||
MOO_STATIC_ASSERT (MOO_TYPE_MAX(moo_ooi_t) + MOO_TYPE_MIN(moo_ooi_t) == -1); /* assume 2's complement */
|
MOO_STATIC_ASSERT (MOO_TYPE_MAX(moo_ooi_t) + MOO_TYPE_MIN(moo_ooi_t) == -1); /* assume 2's complement */
|
||||||
if (w > (moo_oow_t)MOO_TYPE_MAX(moo_ooi_t) + 1) return 0; /* too small */
|
if (w > (moo_oow_t)MOO_TYPE_MAX(moo_ooi_t) + 1) return 0; /* too small */
|
||||||
*i = -w; /* negate back */
|
*i = (w <= (moo_oow_t)MOO_TYPE_MAX(moo_ooi_t))? -(moo_ooi_t)w: MOO_TYPE_MIN(moo_ooi_t); /* negate back */
|
||||||
}
|
}
|
||||||
else if (n > 0)
|
else if (n > 0)
|
||||||
{
|
{
|
||||||
@ -449,7 +454,7 @@ int moo_inttoooi (moo_t* moo, moo_oop_t x, moo_ooi_t* i)
|
|||||||
moo_seterrnum (moo, MOO_ERANGE);
|
moo_seterrnum (moo, MOO_ERANGE);
|
||||||
return 0; /* too small */
|
return 0; /* too small */
|
||||||
}
|
}
|
||||||
*i = -w; /* negate back */
|
*i = (w <= (moo_oow_t)MOO_TYPE_MAX(moo_ooi_t))? -(moo_ooi_t)w: MOO_TYPE_MIN(moo_ooi_t); /* negate back */
|
||||||
}
|
}
|
||||||
else if (n > 0)
|
else if (n > 0)
|
||||||
{
|
{
|
||||||
@ -525,30 +530,30 @@ static MOO_INLINE int bigint_to_uintmax_noseterr (moo_t* moo, moo_oop_t num, moo
|
|||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
*w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << MOO_LIW_BITS * 3) |
|
*w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << (MOO_LIW_BITS * 3)) |
|
||||||
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1) << MOO_LIW_BITS * 2) |
|
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1) << (MOO_LIW_BITS * 2)) |
|
||||||
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 2) << MOO_LIW_BITS * 1) |
|
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 2) << (MOO_LIW_BITS * 1)) |
|
||||||
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 3));
|
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 3));
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
#if (MOO_SIZEOF_UINTMAX_T >= MOO_SIZEOF_OOW_T * 4)
|
#if (MOO_SIZEOF_UINTMAX_T >= MOO_SIZEOF_OOW_T * 4)
|
||||||
case 6:
|
case 6:
|
||||||
*w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << MOO_LIW_BITS * 5) |
|
*w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << (MOO_LIW_BITS * 5)) |
|
||||||
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1) << MOO_LIW_BITS * 4) |
|
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1) << (MOO_LIW_BITS * 4)) |
|
||||||
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 2) << MOO_LIW_BITS * 3) |
|
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 2) << (MOO_LIW_BITS * 3)) |
|
||||||
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 3) << MOO_LIW_BITS * 2) |
|
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 3) << (MOO_LIW_BITS * 2)) |
|
||||||
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 4) << MOO_LIW_BITS * 1) |
|
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 4) << (MOO_LIW_BITS * 1)) |
|
||||||
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 5));
|
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 5));
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
case 8:
|
case 8:
|
||||||
*w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << MOO_LIW_BITS * 7) |
|
*w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << (MOO_LIW_BITS * 7)) |
|
||||||
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1) << MOO_LIW_BITS * 6) |
|
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1) << (MOO_LIW_BITS * 6)) |
|
||||||
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 2) << MOO_LIW_BITS * 5) |
|
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 2) << (MOO_LIW_BITS * 5)) |
|
||||||
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 3) << MOO_LIW_BITS * 4) |
|
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 3) << (MOO_LIW_BITS * 4)) |
|
||||||
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 4) << MOO_LIW_BITS * 3) |
|
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 4) << (MOO_LIW_BITS * 3)) |
|
||||||
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 5) << MOO_LIW_BITS * 2) |
|
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 5) << (MOO_LIW_BITS * 2)) |
|
||||||
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 6) << MOO_LIW_BITS * 1) |
|
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 6) << (MOO_LIW_BITS * 1)) |
|
||||||
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 7));
|
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 7));
|
||||||
goto done;
|
goto done;
|
||||||
#endif
|
#endif
|
||||||
@ -637,7 +642,7 @@ int moo_inttointmax_noseterr (moo_t* moo, moo_oop_t x, moo_intmax_t* i)
|
|||||||
/* negative number negated to a positve number */
|
/* negative number negated to a positve number */
|
||||||
MOO_STATIC_ASSERT (MOO_TYPE_MAX(moo_intmax_t) + MOO_TYPE_MIN(moo_intmax_t) == -1); /* assume 2's complement */
|
MOO_STATIC_ASSERT (MOO_TYPE_MAX(moo_intmax_t) + MOO_TYPE_MIN(moo_intmax_t) == -1); /* assume 2's complement */
|
||||||
if (w > (moo_uintmax_t)MOO_TYPE_MAX(moo_intmax_t) + 1) return 0; /* not convertable - too small */
|
if (w > (moo_uintmax_t)MOO_TYPE_MAX(moo_intmax_t) + 1) return 0; /* not convertable - too small */
|
||||||
*i = -w; /* negate it back */
|
*i = (w <= (moo_uintmax_t)MOO_TYPE_MAX(moo_intmax_t))? -(moo_intmax_t)w: MOO_TYPE_MIN(moo_intmax_t); /* negate back */
|
||||||
}
|
}
|
||||||
else if (n > 0)
|
else if (n > 0)
|
||||||
{
|
{
|
||||||
@ -648,7 +653,6 @@ int moo_inttointmax_noseterr (moo_t* moo, moo_oop_t x, moo_intmax_t* i)
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
moo_seterrbfmt (moo, MOO_EINVAL, "not an integer - %O", x);
|
|
||||||
return 0; /* not convertable - not an integer */
|
return 0; /* not convertable - not an integer */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -675,7 +679,7 @@ int moo_inttointmax (moo_t* moo, moo_oop_t x, moo_intmax_t* i)
|
|||||||
moo_seterrnum (moo, MOO_ERANGE);
|
moo_seterrnum (moo, MOO_ERANGE);
|
||||||
return 0; /* not convertable. too small */
|
return 0; /* not convertable. too small */
|
||||||
}
|
}
|
||||||
*i = -w; /* negate it back */
|
*i = (w <= (moo_uintmax_t)MOO_TYPE_MAX(moo_intmax_t))? -(moo_intmax_t)w: MOO_TYPE_MIN(moo_intmax_t); /* negate back */
|
||||||
}
|
}
|
||||||
else if (n > 0)
|
else if (n > 0)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user