impl pic_fopen and pic_close. add FILE*-pic_file* adapter functions.
This commit is contained in:
parent
392549b315
commit
f043fbb0a7
51
src/port.c
51
src/port.c
|
@ -59,6 +59,55 @@ pic_funopen(void *cookie,
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
file_read(void *cookie, char *ptr, int size)
|
||||||
|
{
|
||||||
|
return fread(ptr, size, 1, (FILE *)cookie);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
file_write(void *cookie, const char *ptr, int size)
|
||||||
|
{
|
||||||
|
return fwrite(ptr, size, 1, (FILE *)cookie);
|
||||||
|
}
|
||||||
|
|
||||||
|
static fpos_t
|
||||||
|
file_seek(void *cookie, fpos_t pos, int whence)
|
||||||
|
{
|
||||||
|
return fseek((FILE *)cookie, pos, whence);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
file_close(void *cookie)
|
||||||
|
{
|
||||||
|
return fclose((FILE *)cookie);
|
||||||
|
}
|
||||||
|
|
||||||
|
pic_file *
|
||||||
|
pic_fopen(const char *filename, const char *mode)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
fp = fopen(filename, mode);
|
||||||
|
if (! fp) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return pic_funopen(fp, file_read, file_write, file_seek, file_close);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
pic_fclose(pic_file *file)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
|
||||||
|
r = file->vtable.close(file->vtable.cookie);
|
||||||
|
if (! r) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
free(file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void write_pair(pic_state *pic, struct pic_pair *pair);
|
static void write_pair(pic_state *pic, struct pic_pair *pair);
|
||||||
static void write_str(pic_state *pic, struct pic_string *str);
|
static void write_str(pic_state *pic, struct pic_string *str);
|
||||||
|
|
||||||
|
@ -213,7 +262,7 @@ port_new_from_fp(pic_state *pic, FILE *fp, short flags)
|
||||||
struct pic_port *port;
|
struct pic_port *port;
|
||||||
|
|
||||||
port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port), PIC_TT_PORT);
|
port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port), PIC_TT_PORT);
|
||||||
port->file = fp;
|
port->file = pic_funopen(fp, file_read, file_write, file_seek, file_close);
|
||||||
port->flags = flags;
|
port->flags = flags;
|
||||||
port->status = PIC_PORT_OPEN;
|
port->status = PIC_PORT_OPEN;
|
||||||
return pic_obj_value(port);
|
return pic_obj_value(port);
|
||||||
|
|
Loading…
Reference in New Issue