add some file open functions

This commit is contained in:
Yuichi Nishiwaki 2013-10-22 15:44:03 +09:00
parent 6245ec7e05
commit 176d167de8
3 changed files with 79 additions and 5 deletions

View File

@ -1,11 +1,13 @@
#ifndef PORT_H__ #ifndef PORT_H__
#define PORT_H__ #define PORT_H__
#include <stdio.h>
enum pic_port_flag { enum pic_port_flag {
PIC_PORT_IN, PIC_PORT_IN = 1,
PIC_PORT_OUT, PIC_PORT_OUT = 2,
PIC_PORT_TEXT, PIC_PORT_TEXT = 4,
PIC_PORT_BINARY PIC_PORT_BINARY = 8
}; };
enum pic_port_status { enum pic_port_status {

View File

@ -1,6 +1,74 @@
#include <stdio.h> #include <stdio.h>
#include "picrin.h" #include "picrin.h"
#include "picrin/port.h"
static pic_value
generic_open_file(pic_state *pic, const char *fname, char *mode, short flags)
{
struct pic_port *port;
FILE *fp;
fp = fopen(fname, mode);
if (! fp) {
pic_error(pic, "could not open file");
}
port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port), PIC_TT_PORT);
port->file = fp;
port->flags = flags;
port->status = PIC_PORT_OPEN;
return pic_obj_value(port);
}
pic_value
pic_file_open_input_file(pic_state *pic)
{
static const short flags = PIC_PORT_IN | PIC_PORT_TEXT;
char *fname;
size_t size;
pic_get_args(pic, "s", &fname, &size);
return generic_open_file(pic, fname, "r", flags);
}
pic_value
pic_file_open_input_binary_file(pic_state *pic)
{
static const short flags = PIC_PORT_IN | PIC_PORT_BINARY;
char *fname;
size_t size;
pic_get_args(pic, "s", &fname, &size);
return generic_open_file(pic, fname, "rb", flags);
}
pic_value
pic_file_open_output_file(pic_state *pic)
{
static const short flags = PIC_PORT_OUT | PIC_PORT_TEXT;
char *fname;
size_t size;
pic_get_args(pic, "s", &fname, &size);
return generic_open_file(pic, fname, "w", flags);
}
pic_value
pic_file_open_output_binary_file(pic_state *pic)
{
static const short flags = PIC_PORT_OUT | PIC_PORT_BINARY;
char *fname;
size_t size;
pic_get_args(pic, "s", &fname, &size);
return generic_open_file(pic, fname, "wb", flags);
}
pic_value pic_value
pic_file_exists_p(pic_state *pic) pic_file_exists_p(pic_state *pic)
@ -37,6 +105,10 @@ pic_file_delete(pic_state *pic)
void void
pic_init_file(pic_state *pic) pic_init_file(pic_state *pic)
{ {
pic_defun(pic, "open-input-file", pic_file_open_input_file);
pic_defun(pic, "open-input-binary-file", pic_file_open_input_binary_file);
pic_defun(pic, "open-output-file", pic_file_open_output_file);
pic_defun(pic, "open-output-binary-file", pic_file_open_output_binary_file);
pic_defun(pic, "file-exists?", pic_file_exists_p); pic_defun(pic, "file-exists?", pic_file_exists_p);
pic_defun(pic, "delete-file", pic_file_delete); pic_defun(pic, "delete-file", pic_file_delete);
} }

View File

@ -268,7 +268,7 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj)
} }
case PIC_TT_PORT: { case PIC_TT_PORT: {
struct pic_port *port = (struct pic_port *)obj; struct pic_port *port = (struct pic_port *)obj;
if (port->status == PIC_OPEN) { if (port->status == PIC_PORT_OPEN) {
fclose(port->file); fclose(port->file);
} }
break; break;