static pic_value pic_blob_bytevector_append(pic_state *pic) { int argc, i, l, len; unsigned char *buf, *dst; pic_value *argv, blob; pic_get_args(pic, "*", &argc, &argv); len = 0; for (i = 0; i < argc; ++i) { TYPE_CHECK(pic, argv[i], blob); pic_blob(pic, argv[i], &l); len += l; } blob = pic_blob_value(pic, NULL, len); dst = pic_blob(pic, blob, NULL); len = 0; for (i = 0; i < argc; ++i) { buf = pic_blob(pic, argv[i], &l); memcpy(dst + len, buf, l); len += l; } return blob; }
static pic_value pic_blob_bytevector(pic_state *pic) { pic_value *argv, blob; int argc, i; unsigned char *data; pic_get_args(pic, "*", &argc, &argv); blob = pic_blob_value(pic, 0, argc); data = pic_blob(pic, blob, NULL); for (i = 0; i < argc; ++i) { TYPE_CHECK(pic, argv[i], int); if (pic_int(pic, argv[i]) < 0 || pic_int(pic, argv[i]) > 255) { pic_error(pic, "byte out of range", 0); } *data++ = (unsigned char)pic_int(pic, argv[i]); } return blob; }
static void write_blob(pic_state *pic, pic_value blob, pic_value port) { const unsigned char *buf; int len, i; buf = pic_blob(pic, blob, &len); pic_fprintf(pic, port, "#u8("); for (i = 0; i < len; ++i) { pic_fprintf(pic, port, "%d", buf[i]); if (i + 1 < len) { pic_fprintf(pic, port, " "); } } pic_fprintf(pic, port, ")"); }
static pic_value pic_blob_make_bytevector(pic_state *pic) { pic_value blob; int k, b = 0; pic_get_args(pic, "i|i", &k, &b); if (b < 0 || b > 255) pic_error(pic, "byte out of range", 0); if (k < 0) { pic_error(pic, "make-bytevector: negative length given", 1, pic_int_value(pic, k)); } blob = pic_blob_value(pic, 0, k); memset(pic_blob(pic, blob, NULL), (unsigned char)b, k); return blob; }
static pic_value pic_blob_list_to_bytevector(pic_state *pic) { pic_value blob; unsigned char *data; pic_value list, e, it; pic_get_args(pic, "o", &list); blob = pic_blob_value(pic, 0, pic_length(pic, list)); data = pic_blob(pic, blob, NULL); pic_for_each (e, list, it) { TYPE_CHECK(pic, e, int); if (pic_int(pic, e) < 0 || pic_int(pic, e) > 255) pic_error(pic, "byte out of range", 0); *data++ = (unsigned char)pic_int(pic, e); }