diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2025-05-16 07:45:10 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2025-05-16 07:45:10 -0700 |
commit | 410116deffa838061b8380f4d794a1b0ed12dbee (patch) | |
tree | d76752f9acd931415f5762798ae23883976c66ec | |
parent | 840383dbaac4f8ad9e9ea4b0b7156e65569821d3 (diff) | |
download | txr-410116deffa838061b8380f4d794a1b0ed12dbee.tar.gz txr-410116deffa838061b8380f4d794a1b0ed12dbee.tar.bz2 txr-410116deffa838061b8380f4d794a1b0ed12dbee.zip |
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.
-rw-r--r-- | buf.c | 11 | ||||
-rw-r--r-- | tests/012/buf.tl | 2 | ||||
-rw-r--r-- | txr.1 | 4 |
3 files changed, 15 insertions, 2 deletions
@@ -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') @@ -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 ]]) |