change blob API

This commit is contained in:
Yuichi Nishiwaki 2014-07-22 13:55:21 +09:00
parent 3f6ec5f878
commit 18b07fc853
4 changed files with 29 additions and 21 deletions

View File

@ -18,7 +18,7 @@ struct pic_blob {
#define pic_blob_p(v) (pic_type(v) == PIC_TT_BLOB) #define pic_blob_p(v) (pic_type(v) == PIC_TT_BLOB)
#define pic_blob_ptr(v) ((struct pic_blob *)pic_ptr(v)) #define pic_blob_ptr(v) ((struct pic_blob *)pic_ptr(v))
struct pic_blob *pic_blob_new(pic_state *, char *, size_t len); struct pic_blob *pic_blob_new(pic_state *, size_t);
#if defined(__cplusplus) #if defined(__cplusplus)
} }

View File

@ -25,12 +25,12 @@ pic_strdup(pic_state *pic, const char *s)
} }
struct pic_blob * struct pic_blob *
pic_blob_new(pic_state *pic, char *dat, size_t len) pic_blob_new(pic_state *pic, size_t len)
{ {
struct pic_blob *bv; struct pic_blob *bv;
bv = (struct pic_blob *)pic_obj_alloc(pic, sizeof(struct pic_blob), PIC_TT_BLOB); bv = (struct pic_blob *)pic_obj_alloc(pic, sizeof(struct pic_blob), PIC_TT_BLOB);
bv->data = pic_strndup(pic, dat, len); bv->data = pic_alloc(pic, len);
bv->len = len; bv->len = len;
return bv; return bv;
} }
@ -48,20 +48,20 @@ pic_blob_bytevector_p(pic_state *pic)
static pic_value static pic_value
pic_blob_make_bytevector(pic_state *pic) pic_blob_make_bytevector(pic_state *pic)
{ {
pic_blob *blob;
int k, b = 0, i; int k, b = 0, i;
char *dat;
pic_get_args(pic, "i|i", &k, &b); pic_get_args(pic, "i|i", &k, &b);
if (b < 0 || b > 255) if (b < 0 || b > 255)
pic_error(pic, "byte out of range"); pic_error(pic, "byte out of range");
dat = pic_alloc(pic, k); blob = pic_blob_new(pic, k);
for (i = 0; i < k; ++i) { for (i = 0; i < k; ++i) {
dat[i] = b; blob->data[i] = b;
} }
return pic_obj_value(pic_blob_new(pic, dat, k)); return pic_obj_value(blob);
} }
static pic_value static pic_value

View File

@ -354,8 +354,8 @@ static pic_value
pic_port_get_output_bytevector(pic_state *pic) pic_port_get_output_bytevector(pic_state *pic)
{ {
struct pic_port *port = pic_stdout(pic); struct pic_port *port = pic_stdout(pic);
pic_blob *blob;
long endpos; long endpos;
char *buf;
pic_get_args(pic, "|p", &port); pic_get_args(pic, "|p", &port);
@ -367,10 +367,10 @@ pic_port_get_output_bytevector(pic_state *pic)
xrewind(port->file); xrewind(port->file);
/* copy to buf */ /* copy to buf */
buf = (char *)pic_alloc(pic, endpos); blob = pic_blob_new(pic, endpos);
xfread(buf, 1, endpos, port->file); xfread(blob->data, 1, endpos, port->file);
return pic_obj_value(pic_blob_new(pic, buf, endpos)); return pic_obj_value(blob);
} }
static pic_value static pic_value
@ -524,28 +524,32 @@ pic_port_byte_ready_p(pic_state *pic)
static pic_value static pic_value
pic_port_read_blob(pic_state *pic){ pic_port_read_blob(pic_state *pic)
{
struct pic_port *port = pic_stdin(pic); struct pic_port *port = pic_stdin(pic);
pic_blob *blob;
int k, i; int k, i;
char *buf;
pic_get_args(pic, "i|p", &k, &port); pic_get_args(pic, "i|p", &k, &port);
assert_port_profile(port, PIC_PORT_IN | PIC_PORT_BINARY, PIC_PORT_OPEN, "read-bytevector"); assert_port_profile(port, PIC_PORT_IN | PIC_PORT_BINARY, PIC_PORT_OPEN, "read-bytevector");
buf = pic_calloc(pic, k, sizeof(char)); blob = pic_blob_new(pic, k);
i = xfread(buf, sizeof(char), k, port->file);
i = xfread(blob->data, sizeof(char), k, port->file);
if ( i == 0 ) { if ( i == 0 ) {
return pic_eof_object(); return pic_eof_object();
} }
else { else {
pic_realloc(pic, buf, i); pic_realloc(pic, blob->data, i);
return pic_obj_value(pic_blob_new(pic, buf, i)); blob->len = i;
return pic_obj_value(blob);
} }
} }
static pic_value static pic_value
pic_port_read_blob_ip(pic_state *pic){ pic_port_read_blob_ip(pic_state *pic)
{
struct pic_port *port; struct pic_port *port;
struct pic_blob *bv; struct pic_blob *bv;
int i, n, start, end, len; int i, n, start, end, len;
@ -568,7 +572,7 @@ pic_port_read_blob_ip(pic_state *pic){
i = xfread(buf, sizeof(char), len, port->file); i = xfread(buf, sizeof(char), len, port->file);
memcpy(bv->data + start, buf, i); memcpy(bv->data + start, buf, i);
pic_free(pic, buf); pic_free(pic, buf);
if ( i == 0) { if ( i == 0) {
return pic_eof_object(); return pic_eof_object();
} }

View File

@ -438,7 +438,7 @@ static pic_value
read_unsigned_blob(pic_state *pic, struct pic_port *port, char c) read_unsigned_blob(pic_state *pic, struct pic_port *port, char c)
{ {
int nbits, n; int nbits, n;
size_t len; size_t len, i;
char *dat, buf[256]; char *dat, buf[256];
pic_blob *blob; pic_blob *blob;
@ -471,7 +471,11 @@ read_unsigned_blob(pic_state *pic, struct pic_port *port, char c)
c = next(port); c = next(port);
} }
blob = pic_blob_new(pic, dat, len); blob = pic_blob_new(pic, 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);
} }