ref: 12e6e4059651285cbc6df5c58e9ed43c81919b36
parent: c6aa991371c01426c0925b61776f957823425799
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Tue Jan 28 22:13:38 EST 2025
add ismpint and tompint
--- a/src/builtins.c
+++ b/src/builtins.c
@@ -264,9 +264,7 @@
BUILTIN("bignum?", bignump)
{
argcount(nargs, 1);
- value_t v = args[0];
- return (iscvalue(v) && cp_numtype(ptr(v)) == T_MPINT) ?
- FL_t : FL_f;
+ return ismpint(args[0]) ? FL_t : FL_f;
}
BUILTIN("fixnum", fixnum)
@@ -275,14 +273,15 @@
value_t v = args[0];
if(isfixnum(v))
return v;
- void *p = ptr(v);
- if(iscprim(v))
+ if(iscprim(v)){
+ void *p = ptr(v);
return fixnum(conv_to_int64(cp_data(p), cp_numtype(p)));
- if(iscvalue(v) && cp_numtype(p) == T_MPINT)
+ }
+ if(ismpint(v))
#ifdef BITS64
- return fixnum(mptov(*(mpint**)cv_data(p)));
+ return fixnum(mptov(tompint(v)));
#else
- return fixnum(mptoi(*(mpint**)cv_data(p)));
+ return fixnum(mptoi(tompint(v)));
#endif
type_error("number", v);
}
--- a/src/cvalues.c
+++ b/src/cvalues.c
@@ -223,9 +223,8 @@
cprim_t *cp = ptr(arg); \
void *p = cp_data(cp); \
n = (ctype)conv_to_##cnvt(p, cp_numtype(cp)); \
- }else if(iscvalue(arg) && cp_numtype(ptr(arg)) == T_MPINT){ \
- cvalue_t *cv = ptr(arg); \
- void *p = cv_data(cv); \
+ }else if(ismpint(arg)){ \
+ void *p = cv_data(ptr(arg)); \
n = (ctype)conv_to_##cnvt(p, T_MPINT); \
}else \
return 1; \
--- a/src/flisp.h
+++ b/src/flisp.h
@@ -111,7 +111,7 @@
#define bothfixnums(x, y) ((((x)|(y)) & 3) == TAG_NUM)
#define isvector(x) (tag(x) == TAG_VECTOR)
#define iscvalue(x) (tag(x) == TAG_CVALUE)
-#define iscprim(x) (tag(x) == TAG_CPRIM)
+#define iscprim(x) (tag(x) == TAG_CPRIM)
// doesn't lead to other values
#define leafp(a) (((a)&TAG_NONLEAF_MASK) != TAG_NONLEAF_MASK)
@@ -328,6 +328,9 @@
#define cp_data(cp) (&((cprim_t*)(cp))->_space[0])
// WARNING: multiple evaluation!
#define cptr(v) (iscprim(v) ? cp_data(ptr(v)) : cvalue_data(v))
+
+#define ismpint(v) (iscvalue(v) && cp_numtype(ptr(v)) == T_MPINT)
+#define tompint(v) (*(mpint**)cv_data(ptr(v)))
#define BUILTIN(lname, cname) \
value_t fn_builtin_##cname(value_t *args, uint32_t nargs)
--- a/src/string.c
+++ b/src/string.c
@@ -382,10 +382,10 @@
lerrorf(FL_ArgError, "invalid radix with floating point");
else
return fn_builtin_string(args, nargs);
- }else if(iscvalue(n) && cp_numtype(ptr(n)) == T_MPINT){
+ }else if(ismpint(n)){
if(radix != 16 && radix != 10 && radix != 8 && radix != 4 && radix != 2)
lerrorf(FL_ArgError, "invalid radix with bignum");
- mpint *i = *(mpint**)cv_data(ptr(n));
+ mpint *i = tompint(n);
char *s = mptoa(i, radix, nil, 0);
assert(s != nil);
if(radix == 16){ /* FFFF → ffff */