summaryrefslogtreecommitdiffstats
path: root/buf.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-05-08 05:57:40 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-05-08 05:57:40 -0700
commit33acb79f64de9a05122f0e3cc103cbcf58864b9c (patch)
tree43fba442f8a641ff4d32f56c167491c2f02efbe2 /buf.c
parentb00727089e36a75ed86160cba51695689d9a38d5 (diff)
downloadtxr-33acb79f64de9a05122f0e3cc103cbcf58864b9c.tar.gz
txr-33acb79f64de9a05122f0e3cc103cbcf58864b9c.tar.bz2
txr-33acb79f64de9a05122f0e3cc103cbcf58864b9c.zip
buffers: don't let a buffer shrink to zero.
* buf.c (buf_shrink): If a buffer has zero length, don't shrink the allocation size all the way down to zero, because that value indicates a non-resizeable buffer.
Diffstat (limited to 'buf.c')
-rw-r--r--buf.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/buf.c b/buf.c
index 5f8f17f8..c9cb4332 100644
--- a/buf.c
+++ b/buf.c
@@ -150,11 +150,13 @@ static void buf_grow(struct buf *b, val init_val, val self)
static void buf_shrink(struct buf *b)
{
- cnum oldsize = c_num(b->size);
- cnum len = c_num(b->len);
+ val len = b->len;
+
+ if (len == zero)
+ len = succ(len);
- if (len != oldsize) {
- b->data = chk_realloc(b->data, len);
+ if (len != b->size) {
+ b->data = chk_realloc(b->data, c_num(len));
b->size = b->len;
}
}