use pic_blob_value

This commit is contained in:
Yuichi Nishiwaki 2016-02-18 23:59:33 +09:00
parent 126989e4ec
commit 0a715e4916
5 changed files with 14 additions and 18 deletions

View File

@ -263,8 +263,7 @@ pic_socket_socket_recv(pic_state *pic)
pic_errorf(pic, "%s", strerror(errno)); pic_errorf(pic, "%s", strerror(errno));
} }
bv = pic_make_blob(pic, len); bv = pic_blob_value(pic, buf, len);
memcpy(bv->data, buf, len);
free(buf); free(buf);
return pic_obj_value(bv); return pic_obj_value(bv);

View File

@ -5,13 +5,16 @@
#include "picrin.h" #include "picrin.h"
struct pic_blob * struct pic_blob *
pic_make_blob(pic_state *pic, int len) pic_blob_value(pic_state *pic, const unsigned char *buf, int len)
{ {
struct pic_blob *bv; struct pic_blob *bv;
bv = (struct pic_blob *)pic_obj_alloc(pic, sizeof(struct pic_blob), PIC_TYPE_BLOB); bv = (struct pic_blob *)pic_obj_alloc(pic, sizeof(struct pic_blob), PIC_TYPE_BLOB);
bv->data = pic_malloc(pic, len); bv->data = pic_malloc(pic, len);
bv->len = len; bv->len = len;
if (buf) {
memcpy(bv->data, buf, len);
}
return bv; return bv;
} }
@ -35,7 +38,7 @@ pic_blob_bytevector(pic_state *pic)
pic_get_args(pic, "*", &argc, &argv); pic_get_args(pic, "*", &argc, &argv);
blob = pic_make_blob(pic, argc); blob = pic_blob_value(pic, 0, argc);
data = blob->data; data = blob->data;
@ -63,7 +66,7 @@ pic_blob_make_bytevector(pic_state *pic)
if (b < 0 || b > 255) if (b < 0 || b > 255)
pic_errorf(pic, "byte out of range"); pic_errorf(pic, "byte out of range");
blob = pic_make_blob(pic, k); blob = pic_blob_value(pic, 0, k);
for (i = 0; i < k; ++i) { for (i = 0; i < k; ++i) {
blob->data[i] = (unsigned char)b; blob->data[i] = (unsigned char)b;
} }
@ -157,7 +160,7 @@ pic_blob_bytevector_copy(pic_state *pic)
pic_errorf(pic, "make-bytevector: end index must not be less than start index"); pic_errorf(pic, "make-bytevector: end index must not be less than start index");
} }
to = pic_make_blob(pic, end - start); to = pic_blob_value(pic, 0, end - start);
while (start < end) { while (start < end) {
to->data[i++] = from->data[start++]; to->data[i++] = from->data[start++];
} }
@ -180,7 +183,7 @@ pic_blob_bytevector_append(pic_state *pic)
len += pic_blob_ptr(argv[i])->len; len += pic_blob_ptr(argv[i])->len;
} }
blob = pic_make_blob(pic, len); blob = pic_blob_value(pic, 0, len);
len = 0; len = 0;
for (i = 0; i < argc; ++i) { for (i = 0; i < argc; ++i) {
@ -202,7 +205,7 @@ pic_blob_list_to_bytevector(pic_state *pic)
pic_get_args(pic, "o", &list); pic_get_args(pic, "o", &list);
blob = pic_make_blob(pic, pic_length(pic, list)); blob = pic_blob_value(pic, 0, pic_length(pic, list));
data = blob->data; data = blob->data;

View File

@ -17,8 +17,6 @@ struct pic_blob {
#define pic_blob_ptr(v) ((struct pic_blob *)pic_obj_ptr(v)) #define pic_blob_ptr(v) ((struct pic_blob *)pic_obj_ptr(v))
struct pic_blob *pic_make_blob(pic_state *, int);
#if defined(__cplusplus) #if defined(__cplusplus)
} }
#endif #endif

View File

@ -546,8 +546,7 @@ pic_port_get_output_bytevector(pic_state *pic)
s = port->file->vtable.cookie; s = port->file->vtable.cookie;
blob = pic_make_blob(pic, s->end); blob = pic_blob_value(pic, (unsigned char *)s->buf, s->end);
memcpy(blob->data, s->buf, s->end);
return pic_obj_value(blob); return pic_obj_value(blob);
} }
@ -717,7 +716,7 @@ pic_port_read_blob(pic_state *pic)
assert_port_profile(port, PIC_PORT_IN | PIC_PORT_BINARY, "read-bytevector"); assert_port_profile(port, PIC_PORT_IN | PIC_PORT_BINARY, "read-bytevector");
blob = pic_make_blob(pic, k); blob = pic_blob_value(pic, 0, k);
i = xfread(pic, blob->data, sizeof(char), k, port->file); i = xfread(pic, blob->data, sizeof(char), k, port->file);
if (i == 0) { if (i == 0) {

View File

@ -497,7 +497,7 @@ static pic_value
read_blob(pic_state *pic, struct pic_port *port, int c) read_blob(pic_state *pic, struct pic_port *port, int c)
{ {
int nbits, n; int nbits, n;
int len, i; int len;
unsigned char *dat; unsigned char *dat;
struct pic_blob *blob; struct pic_blob *blob;
@ -529,10 +529,7 @@ read_blob(pic_state *pic, struct pic_port *port, int c)
c = next(pic, port); c = next(pic, port);
} }
blob = pic_make_blob(pic, len); blob = pic_blob_value(pic, dat, len);
for (i = 0; i < len; ++i) {
blob->data[i] = dat[i];
}
pic_free(pic, dat); pic_free(pic, dat);
return pic_obj_value(blob); return pic_obj_value(blob);