summaryrefslogtreecommitdiffstats
path: root/buf.c
diff options
context:
space:
mode:
Diffstat (limited to 'buf.c')
-rw-r--r--buf.c85
1 files changed, 45 insertions, 40 deletions
diff --git a/buf.c b/buf.c
index 3cd050ef..9a9d8ff6 100644
--- a/buf.c
+++ b/buf.c
@@ -47,7 +47,7 @@
static cnum buf_check_len(val len, val self)
{
- cnum l = c_num(len);
+ cnum l = c_num(len, self);
if (l < 0)
uw_throwf(error_s, lit("~a: negative length ~s specified"),
self, len, nao);
@@ -56,7 +56,7 @@ static cnum buf_check_len(val len, val self)
static cnum buf_check_alloc_size(val alloc_size, cnum len, val self)
{
- cnum ah = c_num(alloc_size);
+ cnum ah = c_num(alloc_size, self);
if (ah < len)
uw_throwf(error_s, lit("~a: alloc size size ~s lower than length"),
self, alloc_size, nao);
@@ -65,9 +65,9 @@ static cnum buf_check_alloc_size(val alloc_size, cnum len, val self)
static cnum buf_check_index(struct buf *b, val index, val self)
{
- cnum ix = c_num(index);
+ cnum ix = c_num(index, self);
if (ix < 0)
- ix = c_num(plus(b->len, index));
+ ix = c_num(plus(b->len, index), self);
if (ix < 0)
uw_throwf(error_s, lit("~a: negative byte index ~s specified"),
self, index, nao);
@@ -119,10 +119,11 @@ val make_borrowed_buf(val len, mem_t *data)
val make_duplicate_buf(val len, mem_t *data)
{
+ val self = lit("make-duplicate-buf");
val obj = make_obj();
obj->b.type = BUF;
- obj->b.data = chk_copy_obj(data, c_num(len));
+ obj->b.data = chk_copy_obj(data, c_num(len, self));
obj->b.len = len;
obj->b.size = len;
@@ -154,13 +155,14 @@ val copy_buf(val buf)
static void buf_shrink(struct buf *b)
{
+ val self = lit("buf-trim");
val len = b->len;
if (len == zero)
len = succ(len); /* avoid reallocing to zero length; i.e. freeing */
if (len != b->size) {
- b->data = chk_realloc(b->data, c_unum(len));
+ b->data = chk_realloc(b->data, c_unum(len, self));
b->size = b->len;
}
}
@@ -181,8 +183,8 @@ static val buf_do_set_len(val buf, struct buf *b, val newlen,
val init_val, val self)
{
val oldlen = b->len;
- cnum olen = c_num(oldlen), len = c_num(newlen);
- cnum oldsize = c_num(b->size), size = oldsize;
+ cnum olen = c_num(oldlen, self), len = c_num(newlen, self);
+ cnum oldsize = c_num(b->size, self), size = oldsize;
cnum iv = c_u8(default_arg(init_val, zero), self);
if (!b->size)
@@ -242,6 +244,7 @@ mem_t *buf_get(val buf, val self)
val sub_buf(val buf, val from, val to)
{
+ val self = lit("sub-buf");
struct buf *b = buf_handle(buf, lit("sub"));
val len = b->len;
@@ -268,7 +271,7 @@ val sub_buf(val buf, val from, val to)
} else if (from == 0 && to == len) {
return buf;
} else {
- return make_duplicate_buf(minus(to, from), b->data + c_num(from));
+ return make_duplicate_buf(minus(to, from), b->data + c_num(from, self));
}
}
@@ -319,10 +322,10 @@ val replace_buf(val buf, val items, val from, val to)
if (gt(len_rep, len_it)) {
val len_diff = minus(len_rep, len_it);
- cnum t = c_num(to);
- cnum l = c_num(len);
+ cnum t = c_num(to, self);
+ cnum l = c_num(len, self);
- memmove(buf->b.data + t - c_num(len_diff),
+ memmove(buf->b.data + t - c_num(len_diff, self),
buf->b.data + t,
l - t);
@@ -330,12 +333,12 @@ val replace_buf(val buf, val items, val from, val to)
to = plus(from, len_it);
} else if (lt(len_rep, len_it)) {
val len_diff = minus(len_it, len_rep);
- cnum t = c_num(to);
- cnum l = c_num(len);
+ cnum t = c_num(to, self);
+ cnum l = c_num(len, self);
buf_set_length(buf, plus(len, len_diff), zero);
- memmove(buf->b.data + t + c_num(len_diff),
+ memmove(buf->b.data + t + c_num(len_diff, self),
buf->b.data + t,
l - t);
to = plus(from, len_it);
@@ -344,12 +347,12 @@ val replace_buf(val buf, val items, val from, val to)
if (zerop(len_it))
return buf;
if (bufp(items)) {
- memmove(buf->b.data + c_num(from), items->b.data, c_num(len_it));
+ memmove(buf->b.data + c_num(from, self), items->b.data, c_num(len_it, self));
} else {
seq_iter_t item_iter;
seq_iter_init(self, &item_iter, items);
- cnum f = c_num(from);
- cnum t = c_num(to);
+ cnum f = c_num(from, self);
+ cnum t = c_num(to, self);
for (; f != t; f++) {
val item = seq_geti(&item_iter);
@@ -392,7 +395,7 @@ val buf_put_buf(val dbuf, val sbuf, val pos)
{
val self = lit("buf-put-buf");
struct buf *sb = buf_handle(sbuf, self);
- buf_move_bytes(dbuf, pos, sb->data, c_num(sb->len), self);
+ buf_move_bytes(dbuf, pos, sb->data, c_num(sb->len, self), self);
return sbuf;
}
@@ -413,7 +416,7 @@ val buf_put_i8(val buf, val pos, val num)
struct buf *b = buf_handle(buf, self);
cnum p = buf_check_index(b, pos, self);
i8_t v = c_i8(num, self);
- if (p >= c_num(b->len))
+ if (p >= c_num(b->len, self))
buf_do_set_len(buf, b, succ(pos), nil, self);
b->data[p] = v;
return num;
@@ -425,7 +428,7 @@ val buf_put_u8(val buf, val pos, val num)
struct buf *b = buf_handle(buf, self);
cnum p = buf_check_index(b, pos, self);
cnum v = c_u8(num, self);
- if (p >= c_num(b->len))
+ if (p >= c_num(b->len, self))
buf_do_set_len(buf, b, succ(pos), nil, self);
b->data[p] = v;
return num;
@@ -492,7 +495,7 @@ val buf_put_char(val buf, val pos, val num)
struct buf *b = buf_handle(buf, self);
cnum p = buf_check_index(b, pos, self);
char v = c_char(num, self);
- if (p >= c_num(b->len))
+ if (p >= c_num(b->len, self))
buf_do_set_len(buf, b, succ(pos), nil, self);
b->data[p] = v;
return num;
@@ -504,7 +507,7 @@ val buf_put_uchar(val buf, val pos, val num)
struct buf *b = buf_handle(buf, self);
cnum p = buf_check_index(b, pos, self);
unsigned char v = c_uchar(num, self);
- if (p >= c_num(b->len))
+ if (p >= c_num(b->len, self))
buf_do_set_len(buf, b, succ(pos), nil, self);
b->data[p] = v;
return num;
@@ -593,7 +596,7 @@ void buf_get_bytes(val buf, val pos, mem_t *ptr, cnum size, val self)
struct buf *b = buf_handle(buf, self);
cnum p = buf_check_index(b, pos, self);
cnum e = p + size;
- cnum l = c_num(b->len);
+ cnum l = c_num(b->len, self);
if (e > l || e < 0)
uw_throwf(error_s, lit("~a: attempted read past buffer end"), self, nao);
@@ -607,7 +610,7 @@ val buf_get_i8(val buf, val pos)
val self = lit("buf-get-i8");
struct buf *b = buf_handle(buf, self);
cnum p = buf_check_index(b, pos, self);
- if (p >= c_num(b->len))
+ if (p >= c_num(b->len, self))
uw_throwf(error_s, lit("~a: attempted read past buffer end"), self, nao);
return num_fast(convert(i8_t, b->data[p]));
}
@@ -617,7 +620,7 @@ val buf_get_u8(val buf, val pos)
val self = lit("buf-get-u8");
struct buf *b = buf_handle(buf, self);
cnum p = buf_check_index(b, pos, self);
- if (p >= c_num(b->len))
+ if (p >= c_num(b->len, self))
uw_throwf(error_s, lit("~a: attempted read past buffer end"), self, nao);
return num_fast(convert(u8_t, b->data[p]));
}
@@ -787,9 +790,10 @@ val buf_get_cptr(val buf, val pos)
val buf_print(val buf, val stream_in)
{
+ val self = lit("buf-print");
val stream = default_arg(stream_in, std_output);
- struct buf *b = buf_handle(buf, lit("buf-print"));
- cnum len = c_num(b->len), count = 0;
+ struct buf *b = buf_handle(buf, self);
+ cnum len = c_num(b->len, self), count = 0;
mem_t *data = b->data;
val save_mode = test_neq_set_indent_mode(stream, num_fast(indent_foff),
num_fast(indent_data));
@@ -818,9 +822,10 @@ val buf_print(val buf, val stream_in)
val buf_pprint(val buf, val stream_in)
{
+ val self = lit("buf-pprint");
val stream = default_arg(stream_in, std_output);
- struct buf *b = buf_handle(buf, lit("buf-print"));
- cnum len = c_num(b->len);
+ struct buf *b = buf_handle(buf, self);
+ cnum len = c_num(b->len, self);
mem_t *data = b->data;
while (len-- > 0)
@@ -889,7 +894,7 @@ static int buf_strm_get_byte_callback(mem_t *ctx)
struct buf *b = buf_handle(s->buf, self);
cnum p = buf_check_index(b, s->pos, self);
s->pos = num(p + 1);
- return (p >= c_num(b->len)) ? EOF : b->data[p];
+ return (p >= c_num(b->len, self)) ? EOF : b->data[p];
}
static val buf_strm_get_char(val stream)
@@ -933,7 +938,7 @@ static val buf_strm_unget_byte(val stream, int byte)
val self = lit("unget-byte");
struct buf_strm *s = coerce(struct buf_strm *, stream->co.handle);
struct buf *b = buf_handle(s->buf, self);
- cnum p = c_num(s->pos);
+ cnum p = c_num(s->pos, self);
if (p <= 0) {
uw_throwf(file_error_s,
@@ -1090,7 +1095,7 @@ void buf_swap32(val buf)
{
val self = lit("buf-swap32");
struct buf *b = buf_handle(buf, self);
- mem_t *data = b->data, *end = data + c_num(b->len);
+ mem_t *data = b->data, *end = data + c_num(b->len, self);
for (; data + 3 < end; data += 4) {
u32_t sw32 = *coerce(u32_t *, data);
@@ -1113,7 +1118,7 @@ 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 blen = c_unum(b->len, self);
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);
@@ -1125,7 +1130,7 @@ static val buf_int(val num)
switch (type(num)) {
case NUM: case CHR:
- num = bignum(c_num(num));
+ num = bignum(c_num(num, self));
/* fallthrough */
case BGNUM:
{
@@ -1134,10 +1139,10 @@ static val buf_int(val num)
val bytes = ash(plus(bits, num_fast(7)), num_fast(-3));
val bitsround = ash(bytes, num_fast(3));
val un = logtrunc(num, bitsround);
- val ube = if3(bignump(un), un, bignum(c_num(un)));
+ val ube = if3(bignump(un), un, bignum(c_num(un, self)));
mp_int *m = mp(ube);
size_t numsize = mp_unsigned_bin_size(m);
- size_t bufsize = c_unum(bytes);
+ size_t bufsize = c_unum(bytes, self);
mem_t *data = chk_malloc(bufsize);
data[0] = 0;
mp_to_unsigned_bin(m, data + (bufsize - numsize));
@@ -1155,7 +1160,7 @@ static val buf_uint(val num)
switch (type(num)) {
case NUM: case CHR:
- num = bignum(c_num(num));
+ num = bignum(c_num(num, self));
/* fallthrough */
case BGNUM:
{
@@ -1179,7 +1184,7 @@ static val int_buf(val buf)
{
val self = lit("int-buf");
struct buf *b = buf_handle(buf, self);
- ucnum size = c_unum(b->size);
+ ucnum size = c_unum(b->size, self);
ucnum bits = size * 8;
val ubn = make_bignum();
mp_err mpe = mp_read_unsigned_bin(mp(ubn), b->data, size);
@@ -1192,7 +1197,7 @@ static val uint_buf(val buf)
{
val self = lit("int-buf");
struct buf *b = buf_handle(buf, self);
- ucnum size = c_unum(b->size);
+ ucnum size = c_unum(b->size, self);
val ubn = make_bignum();
mp_err mpe = mp_read_unsigned_bin(mp(ubn), b->data, size);
if (mpe != MP_OKAY)