summaryrefslogtreecommitdiffstats
path: root/buf.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-11-04 22:10:15 -0800
committerKaz Kylheku <kaz@kylheku.com>2018-11-04 22:10:15 -0800
commitce6ada3b340607177bec7cbfa2b5eaa47ebb07a4 (patch)
tree11808552fdee0ba62ba5555f2a1a6df280872aba /buf.c
parent44c8e70f810ad52b0f26f06147d5613ed1271900 (diff)
downloadtxr-ce6ada3b340607177bec7cbfa2b5eaa47ebb07a4.tar.gz
txr-ce6ada3b340607177bec7cbfa2b5eaa47ebb07a4.tar.bz2
txr-ce6ada3b340607177bec7cbfa2b5eaa47ebb07a4.zip
buffers: implement copy-buf.
* buf.c (copy_buf): New function. (buf_init): Register copy-buf intrinsic. * buf.h (copy_buf): Declared. * lib.c (copy): Handle BUF via copy_buf. * txr.1: Documented.
Diffstat (limited to 'buf.c')
-rw-r--r--buf.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/buf.c b/buf.c
index 40e81607..959b7880 100644
--- a/buf.c
+++ b/buf.c
@@ -137,6 +137,14 @@ static struct buf *buf_handle(val buf, val ctx)
ctx, buf, nao);
}
+val copy_buf(val buf)
+{
+ struct buf *b = buf_handle(buf, lit("copy-buf"));
+ return if3(b->size,
+ make_duplicate_buf(b->len, b->data),
+ make_borrowed_buf(b->len, b->data));
+}
+
static void buf_grow(struct buf *b, val init_val, val self)
{
cnum len = c_num(b->len);
@@ -935,6 +943,7 @@ void buf_init(void)
reg_fun(intern(lit("buf-trim"), user_package), func_n1(buf_trim));
reg_fun(intern(lit("buf-set-length"), user_package), func_n3o(buf_set_length, 2));
reg_fun(intern(lit("length-buf"), user_package), func_n1(length_buf));
+ reg_fun(intern(lit("copy-buf"), user_package), func_n1(copy_buf));
#if HAVE_I8
reg_fun(intern(lit("buf-put-i8"), user_package), func_n3(buf_put_i8));