diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2025-05-16 07:20:15 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2025-05-16 07:20:15 -0700 |
commit | 80d7c54dd58bcc0f71aea45c93c38e6216a84c04 (patch) | |
tree | 6b92048937474465cdcc6cbf138a2a1ad2f750ca | |
parent | c1c1b6ae1b89d4ebbc79c234af8a5d31770516ae (diff) | |
download | txr-80d7c54dd58bcc0f71aea45c93c38e6216a84c04.tar.gz txr-80d7c54dd58bcc0f71aea45c93c38e6216a84c04.tar.bz2 txr-80d7c54dd58bcc0f71aea45c93c38e6216a84c04.zip |
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.
-rw-r--r-- | buf.c | 104 |
1 files changed, 59 insertions, 45 deletions
@@ -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); |