From 80d7c54dd58bcc0f71aea45c93c38e6216a84c04 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 16 May 2025 07:20:15 -0700 Subject: buf: move pattern preparation to function. * buf.c (prepare_pattern): New static function. (buf_xor_pattern): Use prepare_pattern to classify the pat parameter and prepare the pattern. --- buf.c | 104 +++++++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 59 insertions(+), 45 deletions(-) diff --git a/buf.c b/buf.c index 94cccaa7..17bdde4b 100644 --- a/buf.c +++ b/buf.c @@ -50,6 +50,8 @@ #include "txr.h" #include "buf.h" +static struct buf *buf_handle(val buf, val ctx); + static cnum buf_check_len(val len, val self) { cnum l = c_num(len, self); @@ -84,6 +86,62 @@ static void err_oflow(val self) uw_throwf(error_s, lit("~a: array size overflow"), self, nao); } +static void prepare_pattern(mem_t **ppat, mem_t **pfree, mem_t pbuf[SIZEOF_PTR], + ucnum *plen, int *left_p, val pat, val self) +{ + *left_p = 0; + *pfree = 0; + + switch (type(pat)) { + case CHR: + case NUM: + { + cnum pn = c_num(pat, self); + unsigned char *fill = pbuf + SIZEOF_PTR; + + if (pn < 0) { + *left_p = 1; + pn = -pn; + } + + do { + *--fill = pn & 0xff; + pn >>= 8; + } while (fill > pbuf && pn); + + *plen = pbuf + SIZEOF_PTR - fill; + *ppat = fill; + } + break; + case BGNUM: + { + if (minusp(pat)) { + *left_p = 1; + pat = neg(pat); + } + + { + mp_int *m = mp(pat); + ucnum pl = mp_unsigned_bin_size(m); + mem_t *p = chk_malloc(pl); + mp_to_unsigned_bin(m, p); + *ppat = *pfree = p; + *plen = pl; + } + } + break; + case BUF: + { + struct buf *pb = buf_handle(pat, self); + *ppat = pb->data; + *plen = c_unum(pb->len, self); + } + break; + default: + unsup_obj(self, pat); + } +} + val make_buf(val len, val init_val, val alloc_size) { val self = lit("make-buf"); @@ -1985,51 +2043,7 @@ val buf_xor_pattern(val buf, val pat) unsigned char pbuf[SIZEOF_PTR] = { 0 }; int left = 0; - switch (type(pat)) { - case NUM: - { - cnum pn = c_num(pat, self); - unsigned char *fill = pbuf + sizeof (pbuf); - - if (pn < 0) { - left = 1; - pn = -pn; - } - - do { - *--fill = pn & 0xff; - pn >>= 8; - } while (fill > pbuf && pn); - - pl = pbuf + sizeof(pbuf) - fill; - p = fill;; - } - break; - case BGNUM: - { - if (minusp(pat)) { - left = 1; - pat = neg(pat); - } - - { - mp_int *m = mp(pat); - pl = mp_unsigned_bin_size(m); - p = fr = chk_malloc(pl); - mp_to_unsigned_bin(m, p); - } - } - break; - case BUF: - { - struct buf *pb = buf_handle(pat, self); - p = pb->data; - pl = c_unum(pb->len, self); - } - break; - default: - unsup_obj(self, pat); - } + prepare_pattern(&p, &fr, pbuf, &pl, &left, pat, self); { val nbuf = make_ubuf(l); -- cgit v1.2.3