summaryrefslogtreecommitdiffstats
path: root/buf.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-10-17 06:45:43 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-10-17 06:45:43 -0700
commitddbd4325247083477e0f6270f36332cfb03e49e1 (patch)
tree5a8379e0c1e609a0ff9729adbb4c644741dbfb96 /buf.c
parente327bc964cc81e8da899b35cb4ab9f660066e918 (diff)
downloadtxr-ddbd4325247083477e0f6270f36332cfb03e49e1.tar.gz
txr-ddbd4325247083477e0f6270f36332cfb03e49e1.tar.bz2
txr-ddbd4325247083477e0f6270f36332cfb03e49e1.zip
buffers: new functions buf-str and str-buf.
* buf.c (make_owned_buf, buf_str, str_buf): New functions. (buf_init): buf-str and str-buf intrinsics registered. * txr.1: Documented.
Diffstat (limited to 'buf.c')
-rw-r--r--buf.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/buf.c b/buf.c
index 928eaece..be0c5ab6 100644
--- a/buf.c
+++ b/buf.c
@@ -130,6 +130,12 @@ val make_duplicate_buf(val len, mem_t *data)
return obj;
}
+static val make_owned_buf(val len, mem_t *data)
+{
+ val buf = make_borrowed_buf(len, data);
+ buf->b.size = len;
+ return buf;
+}
static struct buf *buf_handle(val buf, val ctx)
{
@@ -1078,6 +1084,27 @@ void buf_swap32(val buf)
}
}
+static val buf_str(val str, val null_term)
+{
+ size_t sz;
+ val nt = default_null_arg(null_term);
+ unsigned char *u8 = utf8_dup_to_buf(c_str(str), &sz, nt != nil);
+ return make_owned_buf(unum(sz), u8);
+}
+
+static val str_buf(val buf, val null_term)
+{
+ val self = lit("str-buf");
+ struct buf *b = buf_handle(buf, self);
+ val nt = default_null_arg(null_term);
+ size_t blen = c_unum(b->len);
+ size_t len = (nt && blen > 0 && !b->data[blen-1]) ? blen - 1 : blen;
+ wchar_t *str = utf8_dup_from_buf(coerce(const char *, b->data), len);
+ return string_own(str);
+}
+
+unsigned char *utf8_dup_to_buf(const wchar_t *, size_t *pnbytes,
+ int null_term);
void buf_init(void)
{
reg_fun(intern(lit("make-buf"), user_package), func_n3o(make_buf, 1));
@@ -1158,5 +1185,8 @@ void buf_init(void)
reg_fun(intern(lit("make-buf-stream"), user_package), func_n1o(make_buf_stream, 0));
reg_fun(intern(lit("get-buf-from-stream"), user_package), func_n1(get_buf_from_stream));
+ reg_fun(intern(lit("buf-str"), user_package), func_n2o(buf_str, 1));
+ reg_fun(intern(lit("str-buf"), user_package), func_n2o(str_buf, 1));
+
fill_stream_ops(&buf_strm_ops);
}