mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-22 07:09:17 +02:00
Convert bytevector-append
This commit is contained in:
parent
5e9def9dbf
commit
1d18d70951
1 changed files with 62 additions and 42 deletions
104
runtime.c
104
runtime.c
|
@ -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,
|
||||||
|
|
Loading…
Add table
Reference in a new issue