struct pic_port * -> pic_value
This commit is contained in:
parent
215e159598
commit
d851273f60
|
@ -12,7 +12,7 @@ file_error(pic_state *pic, const char *msg)
|
||||||
pic_error(pic, "file", msg, pic_nil_value(pic));
|
pic_error(pic, "file", msg, pic_nil_value(pic));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pic_port *
|
static pic_value
|
||||||
open_file(pic_state *pic, const char *fname, const char *mode)
|
open_file(pic_state *pic, const char *fname, const char *mode)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
@ -30,7 +30,7 @@ pic_file_open_input_file(pic_state *pic)
|
||||||
|
|
||||||
pic_get_args(pic, "z", &fname);
|
pic_get_args(pic, "z", &fname);
|
||||||
|
|
||||||
return pic_obj_value(open_file(pic, fname, "r"));
|
return open_file(pic, fname, "r");
|
||||||
}
|
}
|
||||||
|
|
||||||
pic_value
|
pic_value
|
||||||
|
@ -40,7 +40,7 @@ pic_file_open_output_file(pic_state *pic)
|
||||||
|
|
||||||
pic_get_args(pic, "z", &fname);
|
pic_get_args(pic, "z", &fname);
|
||||||
|
|
||||||
return pic_obj_value(open_file(pic, fname, "w"));
|
return open_file(pic, fname, "w");
|
||||||
}
|
}
|
||||||
|
|
||||||
pic_value
|
pic_value
|
||||||
|
|
|
@ -9,9 +9,8 @@
|
||||||
static pic_value
|
static pic_value
|
||||||
pic_load_load(pic_state *pic)
|
pic_load_load(pic_state *pic)
|
||||||
{
|
{
|
||||||
pic_value envid;
|
pic_value envid, port;
|
||||||
char *fn;
|
char *fn;
|
||||||
struct pic_port *port;
|
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
pic_get_args(pic, "z|o", &fn, &envid);
|
pic_get_args(pic, "z|o", &fn, &envid);
|
||||||
|
|
|
@ -320,7 +320,7 @@ xf_socket_close(pic_state PIC_UNUSED(*pic), void PIC_UNUSED(*cookie))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pic_port *
|
static pic_value
|
||||||
make_socket_port(pic_state *pic, struct pic_socket_t *sock, const char *mode)
|
make_socket_port(pic_state *pic, struct pic_socket_t *sock, const char *mode)
|
||||||
{
|
{
|
||||||
xFILE *fp;
|
xFILE *fp;
|
||||||
|
@ -346,7 +346,7 @@ pic_socket_socket_input_port(pic_state *pic)
|
||||||
sock = pic_socket_data(pic, obj);
|
sock = pic_socket_data(pic, obj);
|
||||||
ensure_socket_is_open(pic, sock);
|
ensure_socket_is_open(pic, sock);
|
||||||
|
|
||||||
return pic_obj_value(make_socket_port(pic, sock, "r"));
|
return make_socket_port(pic, sock, "r");
|
||||||
}
|
}
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
|
@ -361,7 +361,7 @@ pic_socket_socket_output_port(pic_state *pic)
|
||||||
sock = pic_socket_data(pic, obj);
|
sock = pic_socket_data(pic, obj);
|
||||||
ensure_socket_is_open(pic, sock);
|
ensure_socket_is_open(pic, sock);
|
||||||
|
|
||||||
return pic_obj_value(make_socket_port(pic, sock, "w"));
|
return make_socket_port(pic, sock, "w");
|
||||||
}
|
}
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
|
|
|
@ -28,7 +28,7 @@ pic_warnf(pic_state *pic, const char *fmt, ...)
|
||||||
err = pic_vstrf_value(pic, fmt, ap);
|
err = pic_vstrf_value(pic, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
xfprintf(pic, pic_stderr(pic)->file, "warn: %s\n", pic_str(pic, err));
|
pic_fprintf(pic, pic_stderr(pic), "warn: %s\n", pic_str(pic, err));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -51,7 +51,6 @@ typedef struct {
|
||||||
} pic_value;
|
} pic_value;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct pic_port;
|
|
||||||
struct pic_error;
|
struct pic_error;
|
||||||
|
|
||||||
typedef void *(*pic_allocf)(void *userdata, void *ptr, size_t n);
|
typedef void *(*pic_allocf)(void *userdata, void *ptr, size_t n);
|
||||||
|
@ -275,8 +274,8 @@ void *pic_default_allocf(void *, void *, size_t);
|
||||||
pic_errorf(pic, "expected " #type ", but got ~s", v); \
|
pic_errorf(pic, "expected " #type ", but got ~s", v); \
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pic_port *pic_make_port(pic_state *, xFILE *file);
|
pic_value pic_make_port(pic_state *, xFILE *file);
|
||||||
void pic_close_port(pic_state *, struct pic_port *port);
|
void pic_close_port(pic_state *, pic_value port);
|
||||||
|
|
||||||
#define pic_void(exec) \
|
#define pic_void(exec) \
|
||||||
pic_void_(PIC_GENSYM(ai), exec)
|
pic_void_(PIC_GENSYM(ai), exec)
|
||||||
|
@ -286,14 +285,14 @@ void pic_close_port(pic_state *, struct pic_port *port);
|
||||||
pic_leave(pic, ai); \
|
pic_leave(pic, ai); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
pic_value pic_read(pic_state *, struct pic_port *);
|
pic_value pic_read(pic_state *, pic_value port);
|
||||||
pic_value pic_read_cstr(pic_state *, const char *);
|
pic_value pic_read_cstr(pic_state *, const char *);
|
||||||
|
|
||||||
pic_value pic_expand(pic_state *, pic_value program, pic_value env);
|
pic_value pic_expand(pic_state *, pic_value program, pic_value env);
|
||||||
|
|
||||||
pic_value pic_eval(pic_state *, pic_value program, const char *lib);
|
pic_value pic_eval(pic_state *, pic_value program, const char *lib);
|
||||||
|
|
||||||
void pic_load(pic_state *, struct pic_port *);
|
void pic_load(pic_state *, pic_value port);
|
||||||
void pic_load_cstr(pic_state *, const char *);
|
void pic_load_cstr(pic_state *, const char *);
|
||||||
|
|
||||||
pic_value pic_make_var(pic_state *, pic_value init, pic_value conv);
|
pic_value pic_make_var(pic_state *, pic_value init, pic_value conv);
|
||||||
|
@ -347,14 +346,16 @@ void pic_warnf(pic_state *, const char *, ...);
|
||||||
pic_value pic_get_backtrace(pic_state *);
|
pic_value pic_get_backtrace(pic_state *);
|
||||||
void pic_print_backtrace(pic_state *, xFILE *);
|
void pic_print_backtrace(pic_state *, xFILE *);
|
||||||
|
|
||||||
#define pic_stdin(pic) pic_port_ptr(pic_funcall(pic, "picrin.base", "current-input-port", 0))
|
#define pic_stdin(pic) pic_funcall(pic, "picrin.base", "current-input-port", 0)
|
||||||
#define pic_stdout(pic) pic_port_ptr(pic_funcall(pic, "picrin.base", "current-output-port", 0))
|
#define pic_stdout(pic) pic_funcall(pic, "picrin.base", "current-output-port", 0)
|
||||||
#define pic_stderr(pic) pic_port_ptr(pic_funcall(pic, "picrin.base", "current-error-port", 0))
|
#define pic_stderr(pic) pic_funcall(pic, "picrin.base", "current-error-port", 0)
|
||||||
|
|
||||||
|
xFILE *pic_fileno(pic_state *, pic_value port);
|
||||||
|
|
||||||
pic_value pic_write(pic_state *, pic_value); /* returns given obj */
|
pic_value pic_write(pic_state *, pic_value); /* returns given obj */
|
||||||
pic_value pic_fwrite(pic_state *, pic_value, xFILE *);
|
pic_value pic_fwrite(pic_state *, pic_value, xFILE *);
|
||||||
void pic_printf(pic_state *, const char *, ...);
|
void pic_printf(pic_state *, const char *, ...);
|
||||||
void pic_fprintf(pic_state *, struct pic_port *, const char *, ...);
|
void pic_fprintf(pic_state *, pic_value port, const char *, ...);
|
||||||
pic_value pic_display(pic_state *, pic_value);
|
pic_value pic_display(pic_state *, pic_value);
|
||||||
pic_value pic_fdisplay(pic_state *, pic_value, xFILE *);
|
pic_value pic_fdisplay(pic_state *, pic_value, xFILE *);
|
||||||
|
|
||||||
|
|
|
@ -144,10 +144,10 @@ struct pic_checkpoint {
|
||||||
#define pic_data_ptr(pic, o) ((struct pic_data *)pic_obj_ptr(o))
|
#define pic_data_ptr(pic, o) ((struct pic_data *)pic_obj_ptr(o))
|
||||||
#define pic_proc_ptr(pic, o) ((struct pic_proc *)pic_obj_ptr(o))
|
#define pic_proc_ptr(pic, o) ((struct pic_proc *)pic_obj_ptr(o))
|
||||||
#define pic_env_ptr(pic, o) ((struct pic_env *)pic_obj_ptr(o))
|
#define pic_env_ptr(pic, o) ((struct pic_env *)pic_obj_ptr(o))
|
||||||
|
#define pic_port_ptr(pic, o) ((struct pic_port *)pic_obj_ptr(o))
|
||||||
#define pic_context_ptr(o) ((struct pic_context *)pic_obj_ptr(o))
|
#define pic_context_ptr(o) ((struct pic_context *)pic_obj_ptr(o))
|
||||||
#define pic_rec_ptr(v) ((struct pic_record *)pic_obj_ptr(v))
|
#define pic_rec_ptr(v) ((struct pic_record *)pic_obj_ptr(v))
|
||||||
#define pic_error_ptr(v) ((struct pic_error *)pic_obj_ptr(v))
|
#define pic_error_ptr(v) ((struct pic_error *)pic_obj_ptr(v))
|
||||||
#define pic_port_ptr(v) ((struct pic_port *)pic_obj_ptr(v))
|
|
||||||
|
|
||||||
#define pic_obj_p(pic,v) (pic_vtype(pic,v) == PIC_IVAL_END)
|
#define pic_obj_p(pic,v) (pic_vtype(pic,v) == PIC_IVAL_END)
|
||||||
#define pic_env_p(pic, v) (pic_type(pic, v) == PIC_TYPE_ENV)
|
#define pic_env_p(pic, v) (pic_type(pic, v) == PIC_TYPE_ENV)
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
pic_load(pic_state *pic, struct pic_port *port)
|
pic_load(pic_state *pic, pic_value port)
|
||||||
{
|
{
|
||||||
pic_value form;
|
pic_value form;
|
||||||
size_t ai = pic_enter(pic);
|
size_t ai = pic_enter(pic);
|
||||||
|
@ -20,7 +20,7 @@ pic_load(pic_state *pic, struct pic_port *port)
|
||||||
void
|
void
|
||||||
pic_load_cstr(pic_state *pic, const char *str)
|
pic_load_cstr(pic_state *pic, const char *str)
|
||||||
{
|
{
|
||||||
struct pic_port *port = pic_make_port(pic, xfopen_buf(pic, str, strlen(str), "r"));
|
pic_value port = pic_make_port(pic, xfopen_buf(pic, str, strlen(str), "r"));
|
||||||
|
|
||||||
pic_try {
|
pic_try {
|
||||||
pic_load(pic, port);
|
pic_load(pic, port);
|
||||||
|
|
|
@ -8,23 +8,32 @@
|
||||||
#undef EOF
|
#undef EOF
|
||||||
#define EOF (-1)
|
#define EOF (-1)
|
||||||
|
|
||||||
struct pic_port *
|
pic_value
|
||||||
pic_make_port(pic_state *pic, xFILE *file)
|
pic_make_port(pic_state *pic, xFILE *file)
|
||||||
{
|
{
|
||||||
struct pic_port *port;
|
struct pic_port *port;
|
||||||
|
|
||||||
port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port), PIC_TYPE_PORT);
|
port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port), PIC_TYPE_PORT);
|
||||||
port->file = file;
|
port->file = file;
|
||||||
return port;
|
|
||||||
|
return pic_obj_value(port);
|
||||||
|
}
|
||||||
|
|
||||||
|
xFILE *
|
||||||
|
pic_fileno(pic_state PIC_UNUSED(*pic), pic_value port)
|
||||||
|
{
|
||||||
|
return pic_port_ptr(pic, port)->file;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
pic_close_port(pic_state *pic, struct pic_port *port)
|
pic_close_port(pic_state *pic, pic_value port)
|
||||||
{
|
{
|
||||||
if (port->file->flag == 0) {
|
xFILE *file = pic_fileno(pic, port);
|
||||||
|
|
||||||
|
if (file->flag == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (xfclose(pic, port->file) == EOF) {
|
if (xfclose(pic, file) == EOF) {
|
||||||
pic_errorf(pic, "close-port: failure");
|
pic_errorf(pic, "close-port: failure");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,7 +45,7 @@ pic_port_input_port_p(pic_state *pic)
|
||||||
|
|
||||||
pic_get_args(pic, "o", &v);
|
pic_get_args(pic, "o", &v);
|
||||||
|
|
||||||
if (pic_port_p(pic, v) && (pic_port_ptr(v)->file->flag & X_READ) != 0) {
|
if (pic_port_p(pic, v) && (pic_fileno(pic, v)->flag & X_READ) != 0) {
|
||||||
return pic_true_value(pic);
|
return pic_true_value(pic);
|
||||||
} else {
|
} else {
|
||||||
return pic_false_value(pic);
|
return pic_false_value(pic);
|
||||||
|
@ -50,7 +59,7 @@ pic_port_output_port_p(pic_state *pic)
|
||||||
|
|
||||||
pic_get_args(pic, "o", &v);
|
pic_get_args(pic, "o", &v);
|
||||||
|
|
||||||
if (pic_port_p(pic, v) && (pic_port_ptr(v)->file->flag & X_WRITE) != 0) {
|
if (pic_port_p(pic, v) && (pic_fileno(pic, v)->flag & X_WRITE) != 0) {
|
||||||
return pic_true_value(pic);
|
return pic_true_value(pic);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -89,17 +98,17 @@ pic_port_eof_object(pic_state *pic)
|
||||||
static pic_value
|
static pic_value
|
||||||
pic_port_port_open_p(pic_state *pic)
|
pic_port_port_open_p(pic_state *pic)
|
||||||
{
|
{
|
||||||
struct pic_port *port;
|
pic_value port;
|
||||||
|
|
||||||
pic_get_args(pic, "p", &port);
|
pic_get_args(pic, "p", &port);
|
||||||
|
|
||||||
return pic_bool_value(pic, port->file->flag != 0);
|
return pic_bool_value(pic, pic_fileno(pic, port)->flag != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
pic_port_close_port(pic_state *pic)
|
pic_port_close_port(pic_state *pic)
|
||||||
{
|
{
|
||||||
struct pic_port *port;
|
pic_value port;
|
||||||
|
|
||||||
pic_get_args(pic, "p", &port);
|
pic_get_args(pic, "p", &port);
|
||||||
|
|
||||||
|
@ -109,7 +118,7 @@ pic_port_close_port(pic_state *pic)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define assert_port_profile(port, flags, caller) do { \
|
#define assert_port_profile(port, flags, caller) do { \
|
||||||
if ((port->file->flag & (flags)) != (flags)) { \
|
if ((pic_fileno(pic, port)->flag & (flags)) != (flags)) { \
|
||||||
switch (flags) { \
|
switch (flags) { \
|
||||||
case X_WRITE: \
|
case X_WRITE: \
|
||||||
pic_errorf(pic, caller ": expected output port"); \
|
pic_errorf(pic, caller ": expected output port"); \
|
||||||
|
@ -117,7 +126,7 @@ pic_port_close_port(pic_state *pic)
|
||||||
pic_errorf(pic, caller ": expected input port"); \
|
pic_errorf(pic, caller ": expected input port"); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
if (port->file->flag == 0) { \
|
if (pic_fileno(pic, port)->flag == 0) { \
|
||||||
pic_errorf(pic, caller ": expected open port"); \
|
pic_errorf(pic, caller ": expected open port"); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
@ -133,7 +142,7 @@ pic_port_open_input_bytevector(pic_state *pic)
|
||||||
|
|
||||||
buf = pic_blob(pic, blob, &len);
|
buf = pic_blob(pic, blob, &len);
|
||||||
|
|
||||||
return pic_obj_value(pic_make_port(pic, xfopen_buf(pic, (char *)buf, len, "r")));
|
return pic_make_port(pic, xfopen_buf(pic, (char *)buf, len, "r"));
|
||||||
}
|
}
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
|
@ -141,13 +150,13 @@ pic_port_open_output_bytevector(pic_state *pic)
|
||||||
{
|
{
|
||||||
pic_get_args(pic, "");
|
pic_get_args(pic, "");
|
||||||
|
|
||||||
return pic_obj_value(pic_make_port(pic, xfopen_buf(pic, NULL, 0, "w")));
|
return pic_make_port(pic, xfopen_buf(pic, NULL, 0, "w"));
|
||||||
}
|
}
|
||||||
|
|
||||||
static pic_value
|
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);
|
pic_value port = pic_stdout(pic);
|
||||||
const char *buf;
|
const char *buf;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
|
@ -155,7 +164,7 @@ pic_port_get_output_bytevector(pic_state *pic)
|
||||||
|
|
||||||
assert_port_profile(port, X_WRITE, "get-output-bytevector");
|
assert_port_profile(port, X_WRITE, "get-output-bytevector");
|
||||||
|
|
||||||
if (xfget_buf(pic, port->file, &buf, &len) < 0) {
|
if (xfget_buf(pic, pic_fileno(pic, port), &buf, &len) < 0) {
|
||||||
pic_errorf(pic, "port was not created by open-output-bytevector");
|
pic_errorf(pic, "port was not created by open-output-bytevector");
|
||||||
}
|
}
|
||||||
return pic_blob_value(pic, (unsigned char *)buf, len);
|
return pic_blob_value(pic, (unsigned char *)buf, len);
|
||||||
|
@ -163,12 +172,12 @@ pic_port_get_output_bytevector(pic_state *pic)
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
pic_port_read_u8(pic_state *pic){
|
pic_port_read_u8(pic_state *pic){
|
||||||
struct pic_port *port = pic_stdin(pic);
|
pic_value port = pic_stdin(pic);
|
||||||
int c;
|
int c;
|
||||||
pic_get_args(pic, "|p", &port);
|
pic_get_args(pic, "|p", &port);
|
||||||
|
|
||||||
assert_port_profile(port, X_READ, "read-u8");
|
assert_port_profile(port, X_READ, "read-u8");
|
||||||
if ((c = xfgetc(pic, port->file)) == EOF) {
|
if ((c = xfgetc(pic, pic_fileno(pic, port))) == EOF) {
|
||||||
return pic_eof_object(pic);
|
return pic_eof_object(pic);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -179,18 +188,18 @@ static pic_value
|
||||||
pic_port_peek_u8(pic_state *pic)
|
pic_port_peek_u8(pic_state *pic)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
struct pic_port *port = pic_stdin(pic);
|
pic_value port = pic_stdin(pic);
|
||||||
|
|
||||||
pic_get_args(pic, "|p", &port);
|
pic_get_args(pic, "|p", &port);
|
||||||
|
|
||||||
assert_port_profile(port, X_READ, "peek-u8");
|
assert_port_profile(port, X_READ, "peek-u8");
|
||||||
|
|
||||||
c = xfgetc(pic, port->file);
|
c = xfgetc(pic, pic_fileno(pic, port));
|
||||||
if (c == EOF) {
|
if (c == EOF) {
|
||||||
return pic_eof_object(pic);
|
return pic_eof_object(pic);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
xungetc(c, port->file);
|
xungetc(c, pic_fileno(pic, port));
|
||||||
return pic_int_value(pic, c);
|
return pic_int_value(pic, c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -198,7 +207,7 @@ pic_port_peek_u8(pic_state *pic)
|
||||||
static pic_value
|
static pic_value
|
||||||
pic_port_u8_ready_p(pic_state *pic)
|
pic_port_u8_ready_p(pic_state *pic)
|
||||||
{
|
{
|
||||||
struct pic_port *port = pic_stdin(pic);
|
pic_value port = pic_stdin(pic);
|
||||||
|
|
||||||
pic_get_args(pic, "|p", &port);
|
pic_get_args(pic, "|p", &port);
|
||||||
|
|
||||||
|
@ -211,7 +220,7 @@ pic_port_u8_ready_p(pic_state *pic)
|
||||||
static pic_value
|
static pic_value
|
||||||
pic_port_read_bytevector(pic_state *pic)
|
pic_port_read_bytevector(pic_state *pic)
|
||||||
{
|
{
|
||||||
struct pic_port *port = pic_stdin(pic);
|
pic_value port = pic_stdin(pic);
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
int k, i;
|
int k, i;
|
||||||
|
|
||||||
|
@ -221,7 +230,7 @@ pic_port_read_bytevector(pic_state *pic)
|
||||||
|
|
||||||
buf = pic_blob(pic, pic_blob_value(pic, NULL, k), NULL);
|
buf = pic_blob(pic, pic_blob_value(pic, NULL, k), NULL);
|
||||||
|
|
||||||
i = xfread(pic, buf, sizeof(char), k, port->file);
|
i = xfread(pic, buf, sizeof(char), k, pic_fileno(pic, port));
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
return pic_eof_object(pic);
|
return pic_eof_object(pic);
|
||||||
}
|
}
|
||||||
|
@ -231,8 +240,7 @@ pic_port_read_bytevector(pic_state *pic)
|
||||||
static pic_value
|
static pic_value
|
||||||
pic_port_read_bytevector_ip(pic_state *pic)
|
pic_port_read_bytevector_ip(pic_state *pic)
|
||||||
{
|
{
|
||||||
struct pic_port *port;
|
pic_value bv, port;
|
||||||
pic_value bv;
|
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
int n, start, end, i, len;
|
int n, start, end, i, len;
|
||||||
|
|
||||||
|
@ -252,7 +260,7 @@ pic_port_read_bytevector_ip(pic_state *pic)
|
||||||
VALID_RANGE(pic, len, start, end);
|
VALID_RANGE(pic, len, start, end);
|
||||||
assert_port_profile(port, X_READ, "read-bytevector!");
|
assert_port_profile(port, X_READ, "read-bytevector!");
|
||||||
|
|
||||||
i = xfread(pic, buf + start, 1, end - start, port->file);
|
i = xfread(pic, buf + start, 1, end - start, pic_fileno(pic, port));
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
return pic_eof_object(pic);
|
return pic_eof_object(pic);
|
||||||
}
|
}
|
||||||
|
@ -263,13 +271,13 @@ static pic_value
|
||||||
pic_port_write_u8(pic_state *pic)
|
pic_port_write_u8(pic_state *pic)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct pic_port *port = pic_stdout(pic);
|
pic_value port = pic_stdout(pic);
|
||||||
|
|
||||||
pic_get_args(pic, "i|p", &i, &port);
|
pic_get_args(pic, "i|p", &i, &port);
|
||||||
|
|
||||||
assert_port_profile(port, X_WRITE, "write-u8");
|
assert_port_profile(port, X_WRITE, "write-u8");
|
||||||
|
|
||||||
xfputc(pic, i, port->file);
|
xfputc(pic, i, pic_fileno(pic, port));
|
||||||
return pic_undef_value(pic);
|
return pic_undef_value(pic);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -277,7 +285,7 @@ static pic_value
|
||||||
pic_port_write_bytevector(pic_state *pic)
|
pic_port_write_bytevector(pic_state *pic)
|
||||||
{
|
{
|
||||||
pic_value blob;
|
pic_value blob;
|
||||||
struct pic_port *port;
|
pic_value port;
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
int n, start, end, len, done;
|
int n, start, end, len, done;
|
||||||
|
|
||||||
|
@ -299,7 +307,7 @@ pic_port_write_bytevector(pic_state *pic)
|
||||||
|
|
||||||
done = 0;
|
done = 0;
|
||||||
while (done < end - start) {
|
while (done < end - start) {
|
||||||
done += xfwrite(pic, buf + start + done, 1, end - start - done, port->file);
|
done += xfwrite(pic, buf + start + done, 1, end - start - done, pic_fileno(pic, port));
|
||||||
/* FIXME: error check... */
|
/* FIXME: error check... */
|
||||||
}
|
}
|
||||||
return pic_undef_value(pic);
|
return pic_undef_value(pic);
|
||||||
|
@ -308,28 +316,28 @@ pic_port_write_bytevector(pic_state *pic)
|
||||||
static pic_value
|
static pic_value
|
||||||
pic_port_flush(pic_state *pic)
|
pic_port_flush(pic_state *pic)
|
||||||
{
|
{
|
||||||
struct pic_port *port = pic_stdout(pic);
|
pic_value port = pic_stdout(pic);
|
||||||
|
|
||||||
pic_get_args(pic, "|p", &port);
|
pic_get_args(pic, "|p", &port);
|
||||||
|
|
||||||
assert_port_profile(port, X_WRITE, "flush-output-port");
|
assert_port_profile(port, X_WRITE, "flush-output-port");
|
||||||
|
|
||||||
xfflush(pic, port->file);
|
xfflush(pic, pic_fileno(pic, port));
|
||||||
return pic_undef_value(pic);
|
return pic_undef_value(pic);
|
||||||
}
|
}
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
coerce_port(pic_state *pic)
|
coerce_port(pic_state *pic)
|
||||||
{
|
{
|
||||||
struct pic_port *port;
|
pic_value port;
|
||||||
|
|
||||||
pic_get_args(pic, "p", &port);
|
pic_get_args(pic, "p", &port);
|
||||||
|
|
||||||
return pic_obj_value(port);
|
return port;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEFINE_PORT(pic, name, file) \
|
#define DEFINE_PORT(pic, name, file) \
|
||||||
pic_defvar(pic, name, pic_obj_value(pic_make_port(pic, file)), coerce)
|
pic_defvar(pic, name, pic_make_port(pic, file), coerce)
|
||||||
|
|
||||||
void
|
void
|
||||||
pic_init_port(pic_state *pic)
|
pic_init_port(pic_state *pic)
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
* s pic_value * string object
|
* s pic_value * string object
|
||||||
* b pic_value * bytevector object
|
* b pic_value * bytevector object
|
||||||
* l pic_value * lambda object
|
* l pic_value * lambda object
|
||||||
* p struct pic_port ** port object
|
* p pic_value * port object
|
||||||
* d pic_value * dictionary object
|
* d pic_value * dictionary object
|
||||||
* e struct pic_error ** error object
|
* e struct pic_error ** error object
|
||||||
* r struct pic_record ** record object
|
* r struct pic_record ** record object
|
||||||
|
@ -147,7 +147,6 @@ pic_get_args(pic_state *pic, const char *format, ...)
|
||||||
#define PTR_CASE(c, type, ctype) \
|
#define PTR_CASE(c, type, ctype) \
|
||||||
VAL_CASE(c, type, ctype, pic_## type ##_ptr(v))
|
VAL_CASE(c, type, ctype, pic_## type ##_ptr(v))
|
||||||
|
|
||||||
PTR_CASE('p', port, struct pic_port *)
|
|
||||||
PTR_CASE('e', error, struct pic_error *)
|
PTR_CASE('e', error, struct pic_error *)
|
||||||
PTR_CASE('r', rec, struct pic_record *)
|
PTR_CASE('r', rec, struct pic_record *)
|
||||||
|
|
||||||
|
@ -159,6 +158,7 @@ pic_get_args(pic_state *pic, const char *format, ...)
|
||||||
OBJ_CASE('b', blob)
|
OBJ_CASE('b', blob)
|
||||||
OBJ_CASE('v', vec)
|
OBJ_CASE('v', vec)
|
||||||
OBJ_CASE('d', dict)
|
OBJ_CASE('d', dict)
|
||||||
|
OBJ_CASE('p', port)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
pic_errorf(pic, "pic_get_args: invalid argument specifier '%c' given", c);
|
pic_errorf(pic, "pic_get_args: invalid argument specifier '%c' given", c);
|
||||||
|
|
|
@ -818,11 +818,11 @@ pic_reader_destroy(pic_state *pic)
|
||||||
}
|
}
|
||||||
|
|
||||||
pic_value
|
pic_value
|
||||||
pic_read(pic_state *pic, struct pic_port *port)
|
pic_read(pic_state *pic, pic_value port)
|
||||||
{
|
{
|
||||||
size_t ai = pic_enter(pic);
|
size_t ai = pic_enter(pic);
|
||||||
pic_value val;
|
pic_value val;
|
||||||
xFILE *file = port->file;
|
xFILE *file = pic_fileno(pic, port);
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
while ((c = skip(pic, file, next(pic, file))) != EOF) {
|
while ((c = skip(pic, file, next(pic, file))) != EOF) {
|
||||||
|
@ -844,7 +844,7 @@ pic_read(pic_state *pic, struct pic_port *port)
|
||||||
pic_value
|
pic_value
|
||||||
pic_read_cstr(pic_state *pic, const char *str)
|
pic_read_cstr(pic_state *pic, const char *str)
|
||||||
{
|
{
|
||||||
struct pic_port *port = pic_make_port(pic, xfopen_buf(pic, str, strlen(str), "r"));
|
pic_value port = pic_make_port(pic, xfopen_buf(pic, str, strlen(str), "r"));
|
||||||
pic_value form;
|
pic_value form;
|
||||||
|
|
||||||
pic_try {
|
pic_try {
|
||||||
|
@ -863,7 +863,7 @@ pic_read_cstr(pic_state *pic, const char *str)
|
||||||
static pic_value
|
static pic_value
|
||||||
pic_read_read(pic_state *pic)
|
pic_read_read(pic_state *pic)
|
||||||
{
|
{
|
||||||
struct pic_port *port = pic_stdin(pic);
|
pic_value port = pic_stdin(pic);
|
||||||
|
|
||||||
pic_get_args(pic, "|p", &port);
|
pic_get_args(pic, "|p", &port);
|
||||||
|
|
||||||
|
|
|
@ -411,7 +411,7 @@ write(pic_state *pic, pic_value obj, xFILE *file, int mode, int op)
|
||||||
pic_value
|
pic_value
|
||||||
pic_write(pic_state *pic, pic_value obj)
|
pic_write(pic_state *pic, pic_value obj)
|
||||||
{
|
{
|
||||||
return pic_fwrite(pic, obj, pic_stdout(pic)->file);
|
return pic_fwrite(pic, obj, pic_fileno(pic, pic_stdout(pic)));
|
||||||
}
|
}
|
||||||
|
|
||||||
pic_value
|
pic_value
|
||||||
|
@ -425,7 +425,7 @@ pic_fwrite(pic_state *pic, pic_value obj, xFILE *file)
|
||||||
pic_value
|
pic_value
|
||||||
pic_display(pic_state *pic, pic_value obj)
|
pic_display(pic_state *pic, pic_value obj)
|
||||||
{
|
{
|
||||||
return pic_fdisplay(pic, obj, pic_stdout(pic)->file);
|
return pic_fdisplay(pic, obj, pic_fileno(pic, pic_stdout(pic)));
|
||||||
}
|
}
|
||||||
|
|
||||||
pic_value
|
pic_value
|
||||||
|
@ -437,63 +437,74 @@ pic_fdisplay(pic_state *pic, pic_value obj, xFILE *file)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
pic_printf(pic_state *pic, const char *fmt, ...)
|
pic_vfprintf(pic_state *pic, pic_value port, const char *fmt, va_list ap)
|
||||||
{
|
{
|
||||||
xFILE *file = pic_stdout(pic)->file;
|
xFILE *file = pic_fileno(pic, port);
|
||||||
va_list ap;
|
|
||||||
pic_value str;
|
pic_value str;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
|
||||||
|
|
||||||
str = pic_vstrf_value(pic, fmt, ap);
|
str = pic_vstrf_value(pic, fmt, ap);
|
||||||
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
xfprintf(pic, file, "%s", pic_str(pic, str));
|
xfprintf(pic, file, "%s", pic_str(pic, str));
|
||||||
xfflush(pic, file);
|
xfflush(pic, file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pic_fprintf(pic_state *pic, pic_value port, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
pic_vfprintf(pic, port, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pic_printf(pic_state *pic, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
pic_vfprintf(pic, pic_stdout(pic), fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
pic_write_write(pic_state *pic)
|
pic_write_write(pic_state *pic)
|
||||||
{
|
{
|
||||||
pic_value v;
|
pic_value v, port = pic_stdout(pic);
|
||||||
struct pic_port *port = pic_stdout(pic);
|
|
||||||
|
|
||||||
pic_get_args(pic, "o|p", &v, &port);
|
pic_get_args(pic, "o|p", &v, &port);
|
||||||
write(pic, v, port->file, WRITE_MODE, OP_WRITE);
|
write(pic, v, pic_fileno(pic, port), WRITE_MODE, OP_WRITE);
|
||||||
return pic_undef_value(pic);
|
return pic_undef_value(pic);
|
||||||
}
|
}
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
pic_write_write_simple(pic_state *pic)
|
pic_write_write_simple(pic_state *pic)
|
||||||
{
|
{
|
||||||
pic_value v;
|
pic_value v, port = pic_stdout(pic);
|
||||||
struct pic_port *port = pic_stdout(pic);
|
|
||||||
|
|
||||||
pic_get_args(pic, "o|p", &v, &port);
|
pic_get_args(pic, "o|p", &v, &port);
|
||||||
write(pic, v, port->file, WRITE_MODE, OP_WRITE_SIMPLE);
|
write(pic, v, pic_fileno(pic, port), WRITE_MODE, OP_WRITE_SIMPLE);
|
||||||
return pic_undef_value(pic);
|
return pic_undef_value(pic);
|
||||||
}
|
}
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
pic_write_write_shared(pic_state *pic)
|
pic_write_write_shared(pic_state *pic)
|
||||||
{
|
{
|
||||||
pic_value v;
|
pic_value v, port = pic_stdout(pic);
|
||||||
struct pic_port *port = pic_stdout(pic);
|
|
||||||
|
|
||||||
pic_get_args(pic, "o|p", &v, &port);
|
pic_get_args(pic, "o|p", &v, &port);
|
||||||
write(pic, v, port->file, WRITE_MODE, OP_WRITE_SHARED);
|
write(pic, v, pic_fileno(pic, port), WRITE_MODE, OP_WRITE_SHARED);
|
||||||
return pic_undef_value(pic);
|
return pic_undef_value(pic);
|
||||||
}
|
}
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
pic_write_display(pic_state *pic)
|
pic_write_display(pic_state *pic)
|
||||||
{
|
{
|
||||||
pic_value v;
|
pic_value v, port = pic_stdout(pic);
|
||||||
struct pic_port *port = pic_stdout(pic);
|
|
||||||
|
|
||||||
pic_get_args(pic, "o|p", &v, &port);
|
pic_get_args(pic, "o|p", &v, &port);
|
||||||
write(pic, v, port->file, DISPLAY_MODE, OP_WRITE);
|
write(pic, v, pic_fileno(pic, port), DISPLAY_MODE, OP_WRITE);
|
||||||
return pic_undef_value(pic);
|
return pic_undef_value(pic);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue