summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2025-05-16 07:20:15 -0700
committerKaz Kylheku <kaz@kylheku.com>2025-05-16 07:20:15 -0700
commit80d7c54dd58bcc0f71aea45c93c38e6216a84c04 (patch)
tree6b92048937474465cdcc6cbf138a2a1ad2f750ca
parentc1c1b6ae1b89d4ebbc79c234af8a5d31770516ae (diff)
downloadtxr-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.c104
1 files 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);