From 410116deffa838061b8380f4d794a1b0ed12dbee Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 16 May 2025 07:45:10 -0700 Subject: buf: bug: empty fill pattern. * buf.c (prepare_pattern): Do not return a zero length pattern for an empty buffer. Callers don't deal with this properly. Return a one byte pattern that is zero. * test/012/buf.tl: Test case added. * txr.1: Documented. --- buf.c | 11 +++++++++-- tests/012/buf.tl | 2 ++ txr.1 | 4 ++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/buf.c b/buf.c index 4a35bc8b..3f7b7738 100644 --- a/buf.c +++ b/buf.c @@ -133,8 +133,15 @@ static void prepare_pattern(mem_t **ppat, mem_t **pfree, mem_t pbuf[SIZEOF_PTR], case BUF: { struct buf *pb = buf_handle(pat, self); - *ppat = pb->data; - *plen = c_unum(pb->len, self); + ucnum l = c_unum(pb->len, self); + + if (l > 0) { + *ppat = pb->data; + *plen = l; + } else { + *ppat = pbuf; + *plen = 1; + } } break; default: diff --git a/tests/012/buf.tl b/tests/012/buf.tl index 082e0d9f..22640eac 100644 --- a/tests/012/buf.tl +++ b/tests/012/buf.tl @@ -611,3 +611,5 @@ (buf-set-length b 3 #xdeadbeef) 2 b #b'ffefef' (buf-set-length b 4 #x-deadbeef) 3 b #b'ffefefef' (buf-set-length b 7 #x-deadbeef) 4 b #b'ffefefefdeadbe')) + +(test (make-buf 16 #b'') #b'00000000000000000000000000000000') diff --git a/txr.1 b/txr.1 index 10d77642..daa390c2 100644 --- a/txr.1 +++ b/txr.1 @@ -29015,6 +29015,10 @@ which doesn't fit into the buffer length is truncated on the opposite side of the alignment mode: truncated on the left under right alignment and vice versa. +An empty buffer +.meta pat +specifies one byte pattern of zero. + .coNP Function @ make-buf .synb .mets (make-buf < len >> [ init-pat <> [ alloc-size ]]) -- cgit v1.2.3