Convert bytevector-append

This commit is contained in:
Justin Ethier 2021-02-24 23:01:42 -05:00
parent 5e9def9dbf
commit 1d18d70951

104
runtime.c
View file

@ -3036,7 +3036,7 @@ void dispatch_bytevector(void *data, object clo, int _argc, object *args)
make_empty_bytevector(bv); make_empty_bytevector(bv);
if (argc > 0) { if (argc > 0) {
buffer = alloca(sizeof(char) * argc); buffer = alloca(sizeof(char) * argc);
for(i = 0; i < argc; i++) { for(i = 1; i < argc; i++) {
tmp = args[i]; tmp = args[i];
Cyc_check_num(data, tmp); Cyc_check_num(data, tmp);
val = unbox_number(tmp); val = unbox_number(tmp);
@ -3074,50 +3074,70 @@ object Cyc_bytevector(void *data, object cont, int argc, object bval, ...)
_return_closcall1(data, cont, &bv); _return_closcall1(data, cont, &bv);
} }
#define Cyc_bytevector_append_va_list(argc) { \ void dispatch_bytevector_91append(void *data, object clo, int _argc, object *args)
int i = 0, buf_idx = 0, total_length = 0; \ {
va_list ap; \ int argc = _argc - 1;
object tmp; \ int i = 0, buf_idx = 0, total_length = 0;
char *buffer; \ object tmp;
char **buffers = NULL; \ char *buffer;
int *lengths = NULL; \ char **buffers = NULL;
make_empty_bytevector(result); \ int *lengths = NULL;
if (argc > 0) { \ make_empty_bytevector(result);
buffers = alloca(sizeof(char *) * argc); \ if (argc > 0) {
lengths = alloca(sizeof(int) * argc); \ buffers = alloca(sizeof(char *) * argc);
Cyc_check_bvec(data, bv); \ lengths = alloca(sizeof(int) * argc);
total_length = ((bytevector)bv)->len; \ for(i = 1; i < argc; i++) {
lengths[0] = ((bytevector)bv)->len; \ tmp = args[i];
buffers[0] = ((bytevector)bv)->data; \ Cyc_check_bvec(data, tmp);
va_start(ap, bv); \ total_length += ((bytevector)tmp)->len;
for(i = 1; i < argc; i++) { \ lengths[i] = ((bytevector)tmp)->len;
tmp = va_arg(ap, object); \ buffers[i] = ((bytevector)tmp)->data;
Cyc_check_bvec(data, tmp); \ }
total_length += ((bytevector)tmp)->len; \ buffer = alloca(sizeof(char) * total_length);
lengths[i] = ((bytevector)tmp)->len; \ for (i = 0; i < argc; i++) {
buffers[i] = ((bytevector)tmp)->data; \ memcpy(&buffer[buf_idx], buffers[i], lengths[i]);
} \ buf_idx += lengths[i];
va_end(ap); \ }
buffer = alloca(sizeof(char) * total_length); \ result.len = total_length;
for (i = 0; i < argc; i++) { \ result.data = buffer;
memcpy(&buffer[buf_idx], buffers[i], lengths[i]); \ }
buf_idx += lengths[i]; \ return_closcall1(data, clo, &result);
} \
result.len = total_length; \
result.data = buffer; \
} \
_return_closcall1(data, cont, &result); \
} }
object dispatch_bytevector_91append(void *data, int _argc, object clo, object Cyc_bytevector_append(void *data, object cont, int argc, object bv, ...)
object cont, object bv, ...)
{ {
Cyc_bytevector_append_va_list((_argc - 1)); int i = 0, buf_idx = 0, total_length = 0;
} va_list ap;
object tmp;
object Cyc_bytevector_append(void *data, object cont, int _argc, object bv, ...) char *buffer;
{ char **buffers = NULL;
Cyc_bytevector_append_va_list(_argc); int *lengths = NULL;
make_empty_bytevector(result);
if (argc > 0) {
buffers = alloca(sizeof(char *) * argc);
lengths = alloca(sizeof(int) * argc);
Cyc_check_bvec(data, bv);
total_length = ((bytevector)bv)->len;
lengths[0] = ((bytevector)bv)->len;
buffers[0] = ((bytevector)bv)->data;
va_start(ap, bv);
for(i = 1; i < argc; i++) {
tmp = va_arg(ap, object);
Cyc_check_bvec(data, tmp);
total_length += ((bytevector)tmp)->len;
lengths[i] = ((bytevector)tmp)->len;
buffers[i] = ((bytevector)tmp)->data;
}
va_end(ap);
buffer = alloca(sizeof(char) * total_length);
for (i = 0; i < argc; i++) {
memcpy(&buffer[buf_idx], buffers[i], lengths[i]);
buf_idx += lengths[i];
}
result.len = total_length;
result.data = buffer;
}
_return_closcall1(data, cont, &result);
} }
object Cyc_bytevector_copy(void *data, object cont, object bv, object start, object Cyc_bytevector_copy(void *data, object cont, object bv, object start,