summaryrefslogtreecommitdiffstats
path: root/buf.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-04-24 14:24:05 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-04-24 14:24:05 -0700
commit1525ee4cfd3b8f9256c0e3f7deaefd0c6697c1e1 (patch)
tree73b2a80a3c4a44a0a2d474f4f0270db7d1b6b48a /buf.c
parentb1726e0878b679508dda20166b04cac12213729b (diff)
downloadtxr-1525ee4cfd3b8f9256c0e3f7deaefd0c6697c1e1.tar.gz
txr-1525ee4cfd3b8f9256c0e3f7deaefd0c6697c1e1.tar.bz2
txr-1525ee4cfd3b8f9256c0e3f7deaefd0c6697c1e1.zip
Buffers: missing float and cptr.
* buf.c (buf_put_float, buf_put_cptr, buf_get_float, buf_get_cptr, align_float, align_cptr, size_float, size_cptr): New functions. (buf_init): Registered intrinsics buf-put-float, buf-put-cptr, buf-get-float, buf-get-cptr, align-float, align-cptr, size-float, size_cptr. * buf.h (buf_put_float, buf_put_cptr, buf_get_float, buf_get_cptr, align_float, align_cptr, size_float, size_cptr): Declared.
Diffstat (limited to 'buf.c')
-rw-r--r--buf.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/buf.c b/buf.c
index b57e7507..0c1ecf18 100644
--- a/buf.c
+++ b/buf.c
@@ -28,6 +28,7 @@
#include <stddef.h>
#include <wchar.h>
#include <limits.h>
+#include <float.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
@@ -346,6 +347,20 @@ val buf_put_ulong(val buf, val pos, val num)
return num;
}
+val buf_put_float(val buf, val pos, val num)
+{
+ val self = lit("buf-put-float");
+ double n;
+ double f = c_flo(num);
+ if (f > FLT_MAX || f < FLT_MIN)
+ uw_throwf(error_s, lit("~a: ~s is out of float range"), self, num, nao);
+
+ n = f;
+
+ buf_put_bytes(buf, pos, coerce(mem_t *, &n), sizeof n, self);
+ return num;
+}
+
val buf_put_double(val buf, val pos, val num)
{
val self = lit("buf-put-double");
@@ -354,6 +369,14 @@ val buf_put_double(val buf, val pos, val num)
return num;
}
+val buf_put_cptr(val buf, val pos, val cptr)
+{
+ val self = lit("buf-put-cptr");
+ mem_t *p = cptr_get(cptr);
+ buf_put_bytes(buf, pos, coerce(mem_t *, &p), sizeof p, self);
+ return cptr;
+}
+
static void buf_get_bytes(val buf, val pos, mem_t *ptr, cnum size, val self)
{
struct buf *b = buf_handle(buf, self);
@@ -527,6 +550,14 @@ val buf_get_ulong(val buf, val pos)
return unum(n);
}
+val buf_get_float(val buf, val pos)
+{
+ val self = lit("buf-get-float");
+ float n;
+ buf_get_bytes(buf, pos, coerce(mem_t *, &n), sizeof n, self);
+ return flo(n);
+}
+
val buf_get_double(val buf, val pos)
{
val self = lit("buf-get-double");
@@ -535,6 +566,14 @@ val buf_get_double(val buf, val pos)
return flo(n);
}
+val buf_get_cptr(val buf, val pos)
+{
+ val self = lit("buf-get-cptr");
+ mem_t *p;
+ buf_get_bytes(buf, pos, coerce(mem_t *, &p), sizeof p, self);
+ return cptr(p);
+}
+
val buf_print(val buf, val stream_in)
{
val stream = default_arg(stream_in, std_output);
@@ -609,7 +648,9 @@ void buf_init(void)
reg_fun(intern(lit("buf-put-uint"), user_package), func_n3(buf_put_uint));
reg_fun(intern(lit("buf-put-long"), user_package), func_n3(buf_put_long));
reg_fun(intern(lit("buf-put-ulong"), user_package), func_n3(buf_put_ulong));
+ reg_fun(intern(lit("buf-put-float"), user_package), func_n3(buf_put_float));
reg_fun(intern(lit("buf-put-double"), user_package), func_n3(buf_put_double));
+ reg_fun(intern(lit("buf-put-cptr"), user_package), func_n3(buf_put_cptr));
#if HAVE_I8
reg_fun(intern(lit("buf-get-i8"), user_package), func_n2(buf_get_i8));
@@ -639,6 +680,7 @@ void buf_init(void)
reg_fun(intern(lit("buf-get-uint"), user_package), func_n2(buf_get_uint));
reg_fun(intern(lit("buf-get-long"), user_package), func_n2(buf_get_long));
reg_fun(intern(lit("buf-get-ulong"), user_package), func_n2(buf_get_ulong));
+ reg_fun(intern(lit("buf-get-float"), user_package), func_n2(buf_get_float));
reg_fun(intern(lit("buf-get-double"), user_package), func_n2(buf_get_double));
reg_fun(intern(lit("buf-get-cptr"), user_package), func_n2(buf_get_cptr));
}