summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-05-09 06:57:46 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-05-09 06:57:46 -0700
commitf3cd8ecb633e0c76338017bd9e4f1ea9ffdfcbb5 (patch)
tree9dc7fd91b7078aad4022d567125ffce88f72dc92
parent179218caf4521209cbbe4d6b1267ed0aa3d70245 (diff)
downloadtxr-f3cd8ecb633e0c76338017bd9e4f1ea9ffdfcbb5.tar.gz
txr-f3cd8ecb633e0c76338017bd9e4f1ea9ffdfcbb5.tar.bz2
txr-f3cd8ecb633e0c76338017bd9e4f1ea9ffdfcbb5.zip
cptr: new functions.
* eval.c (eval_init): Register cptr-int, ctpr-obj, cptr-zap and cptr-free functions and cptr-null variable. * lib.c (cptr_int, cptr_obj, cptr_zap, cptr_free): New functions. * lib.c (cptr_int, cptr_obj, cptr_zap, cptr_free): Declared.
-rw-r--r--eval.c6
-rw-r--r--lib.c25
-rw-r--r--lib.h4
3 files changed, 35 insertions, 0 deletions
diff --git a/eval.c b/eval.c
index 60766b4b..97004bd5 100644
--- a/eval.c
+++ b/eval.c
@@ -6157,6 +6157,12 @@ void eval_init(void)
reg_fun(intern(lit("rlcp"), user_package), func_n2(rlcp));
reg_fun(intern(lit("rlcp-tree"), user_package), func_n2(rlcp_tree));
+ reg_fun(intern(lit("cptr-int"), user_package), func_n1(cptr_int));
+ reg_fun(intern(lit("cptr-obj"), user_package), func_n1(cptr_obj));
+ reg_fun(intern(lit("cptr-zap"), user_package), func_n1(cptr_zap));
+ reg_fun(intern(lit("cptr-free"), user_package), func_n1(cptr_free));
+ reg_varl(intern(lit("cptr-null"), user_package), cptr(0));
+
eval_error_s = intern(lit("eval-error"), user_package);
uw_register_subtype(eval_error_s, error_s);
diff --git a/lib.c b/lib.c
index 4de39f4e..829a9b99 100644
--- a/lib.c
+++ b/lib.c
@@ -7402,6 +7402,31 @@ val cptr(mem_t *ptr)
return cobj(ptr, cptr_s, &cptr_ops);
}
+val cptr_int(val n)
+{
+ return if3(missingp(n), cptr(0), cptr(coerce(mem_t *, c_num(n))));
+}
+
+val cptr_obj(val obj)
+{
+ return cptr(coerce(mem_t *, obj));
+}
+
+val cptr_zap(val cptr)
+{
+ (void) cobj_handle(cptr, cptr_s);
+ cptr->co.handle = 0;
+ return cptr;
+}
+
+val cptr_free(val cptr)
+{
+ (void) cobj_handle(cptr, cptr_s);
+ free(cptr->co.handle);
+ cptr->co.handle = 0;
+ return cptr;
+}
+
mem_t *cptr_get(val cptr)
{
return cobj_handle(cptr, cptr_s);
diff --git a/lib.h b/lib.h
index 814b0621..b5593475 100644
--- a/lib.h
+++ b/lib.h
@@ -938,6 +938,10 @@ val cobjp(val obj);
mem_t *cobj_handle(val cobj, val cls_sym);
struct cobj_ops *cobj_ops(val cobj, val cls_sym);
val cptr(mem_t *ptr);
+val cptr_int(val n);
+val cptr_obj(val obj);
+val cptr_zap(val cptr);
+val cptr_free(val cptr);
mem_t *cptr_get(val cptr);
mem_t **cptr_addr_of(val cptr);
val assoc(val key, val list);