From 56278989eb70e0226162afee8325cfc9c2b09145 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Wed, 23 Mar 2016 22:58:56 -0400 Subject: [PATCH] Integrating bytevector-append --- runtime.c | 69 ++++++++++++++++++++--------------------- scheme/cyclone/cgen.sld | 7 +++-- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/runtime.c b/runtime.c index 6eeed13a..f865a82a 100644 --- a/runtime.c +++ b/runtime.c @@ -1426,45 +1426,42 @@ object Cyc_bytevector(void *data, object cont, int _argc, object bval, ...) { } #define Cyc_bytevector_append_va_list(argc) { \ + int i = 0, buf_idx = 0, val, total_length = 0; \ + va_list ap; \ + object tmp; \ + char *buffer; \ + char **buffers = NULL; \ + 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); \ } void dispatch_bytevector_91append(void *data, int _argc, object clo, object cont, object bv, ...) { - //Cyc_bytevector_append_va_list((_argc - 1)); - int argc = _argc - 1; // TODO: temporary - - - int i = 0, buf_idx = 0, val, total_length = 0; - va_list ap; - object tmp; - char *buffer; - char **buffers = NULL; - 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); + Cyc_bytevector_append_va_list((_argc - 1)); } object Cyc_bytevector_append(void *data, object cont, int _argc, object bval, ...) { diff --git a/scheme/cyclone/cgen.sld b/scheme/cyclone/cgen.sld index 9240ae1f..0782cd3e 100644 --- a/scheme/cyclone/cgen.sld +++ b/scheme/cyclone/cgen.sld @@ -526,7 +526,8 @@ ((eq? p 'list->string) "Cyc_list2string") ((eq? p 'make-bytevector) "Cyc_make_bytevector") ((eq? p 'bytevector-length) "Cyc_bytevector_length") - ((eq? p 'bytevector) "Cyc_bytevector") + ((eq? p 'bytevector) "Cyc_bytevector") + ((eq? p 'bytevector-append) "Cyc_bytevector_append") ((eq? p 'bytevector-u8-ref) "Cyc_bytevector_u8_ref") ((eq? p 'bytevector-u8-set!) "Cyc_bytevector_u8_set") ((eq? p 'make-vector) "Cyc_make_vector") @@ -614,6 +615,7 @@ list->string make-bytevector bytevector-length + bytevector-append bytevector bytevector-u8-ref bytevector-u8-set! @@ -669,7 +671,6 @@ ((eq? p 'symbol->string) "object") ((eq? p 'substring) "object") ((eq? p 'make-bytevector) "object") - ;((eq? p 'bytevector) "object") ((eq? p 'make-vector) "object") ((eq? p 'list->string) "object") ((eq? p 'list->vector) "object") @@ -706,6 +707,7 @@ read-char peek-char symbol->string list->string substring string-append string->number make-bytevector + bytevector-append bytevector bytevector-u8-ref bytevector-u8-set! @@ -723,6 +725,7 @@ string->number string-append make-bytevector bytevector + bytevector-append make-vector + - * /))))