diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-01-13 07:55:56 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-01-13 07:55:56 -0800 |
commit | 20c0166b6b8e4b4ec9c17e354c7b33004149d5ae (patch) | |
tree | 306a31540a9d0d79bc6c7f793f8c47c5ae1273bb /lib.c | |
parent | 387834636fe55bbda0ad7061f7a63077869dfd2a (diff) | |
download | txr-20c0166b6b8e4b4ec9c17e354c7b33004149d5ae.tar.gz txr-20c0166b6b8e4b4ec9c17e354c7b33004149d5ae.tar.bz2 txr-20c0166b6b8e4b4ec9c17e354c7b33004149d5ae.zip |
cptr-int: allow full unsigned range.
The cptr-int function requries an address to be expressed as a
signed integer, which is incovenient. E.g. -2147483648 to
2147483647 in a 32 bit address space. Let's fix it to accept
an extended range.
* lib.c (cptr_int): Convert the argument value to a ucnum if it
is positive according to plusp, otherwise to cnum. Then either
one to the mem_t * pointer. Thus we can accept either signed
or unsigned values.
* txr.1: Document the extended range of cptr-int.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 5 |
1 files changed, 4 insertions, 1 deletions
@@ -9817,7 +9817,10 @@ val cptr_int(val n, val type_sym_in) { val self = lit("cptr-int"); val type_sym = default_null_arg(type_sym_in); - return cptr_typed(coerce(mem_t *, c_num(n, self)), type_sym, 0); + return cptr_typed(if3(plusp(n), + coerce(mem_t *, c_unum(n, self)), + coerce(mem_t *, c_num(n, self))), + type_sym, 0); } val cptr_obj(val obj, val type_sym_in) |