diff options
Diffstat (limited to 'include/ruby/io.h')
| -rw-r--r-- | include/ruby/io.h | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/include/ruby/io.h b/include/ruby/io.h new file mode 100644 index 0000000000..a3de95f281 --- /dev/null +++ b/include/ruby/io.h @@ -0,0 +1,180 @@ +#ifndef RUBY_IO_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_IO_H 1 +/** + * @file + * @author $Author$ + * @date Fri Nov 12 16:47:09 JST 1993 + * @copyright Copyright (C) 1993-2007 Yukihiro Matsumoto + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + */ +#include "ruby/internal/config.h" + +#include <stdio.h> +#include "ruby/encoding.h" + +#if defined(HAVE_STDIO_EXT_H) +#include <stdio_ext.h> +#endif + +#include <errno.h> +#if defined(HAVE_POLL) +# ifdef _AIX +# define reqevents events +# define rtnevents revents +# endif +# include <poll.h> +# ifdef _AIX +# undef reqevents +# undef rtnevents +# undef events +# undef revents +# endif +# define RB_WAITFD_IN POLLIN +# define RB_WAITFD_PRI POLLPRI +# define RB_WAITFD_OUT POLLOUT +#else +# define RB_WAITFD_IN 0x001 +# define RB_WAITFD_PRI 0x002 +# define RB_WAITFD_OUT 0x004 +#endif + +typedef enum { + RUBY_IO_READABLE = RB_WAITFD_IN, + RUBY_IO_WRITABLE = RB_WAITFD_OUT, + RUBY_IO_PRIORITY = RB_WAITFD_PRI, +} rb_io_event_t; + +#include "ruby/internal/dllexport.h" +RBIMPL_SYMBOL_EXPORT_BEGIN() + +PACKED_STRUCT_UNALIGNED(struct rb_io_buffer_t { + char *ptr; /* off + len <= capa */ + int off; + int len; + int capa; +}); +typedef struct rb_io_buffer_t rb_io_buffer_t; + +typedef struct rb_io_t { + VALUE self; + + FILE *stdio_file; /* stdio ptr for read/write if available */ + int fd; /* file descriptor */ + int mode; /* mode flags: FMODE_XXXs */ + rb_pid_t pid; /* child's pid (for pipes) */ + int lineno; /* number of lines read */ + VALUE pathv; /* pathname for file */ + void (*finalize)(struct rb_io_t*,int); /* finalize proc */ + + rb_io_buffer_t wbuf, rbuf; + + VALUE tied_io_for_writing; + + /* + * enc enc2 read action write action + * NULL NULL force_encoding(default_external) write the byte sequence of str + * e1 NULL force_encoding(e1) convert str.encoding to e1 + * e1 e2 convert from e2 to e1 convert str.encoding to e2 + */ + struct rb_io_enc_t { + rb_encoding *enc; + rb_encoding *enc2; + int ecflags; + VALUE ecopts; + } encs; + + rb_econv_t *readconv; + rb_io_buffer_t cbuf; + + rb_econv_t *writeconv; + VALUE writeconv_asciicompat; + int writeconv_initialized; + int writeconv_pre_ecflags; + VALUE writeconv_pre_ecopts; + + VALUE write_lock; +} rb_io_t; + +typedef struct rb_io_enc_t rb_io_enc_t; + +#define HAVE_RB_IO_T 1 + +#define FMODE_READABLE 0x00000001 +#define FMODE_WRITABLE 0x00000002 +#define FMODE_READWRITE (FMODE_READABLE|FMODE_WRITABLE) +#define FMODE_BINMODE 0x00000004 +#define FMODE_SYNC 0x00000008 +#define FMODE_TTY 0x00000010 +#define FMODE_DUPLEX 0x00000020 +#define FMODE_APPEND 0x00000040 +#define FMODE_CREATE 0x00000080 +/* #define FMODE_NOREVLOOKUP 0x00000100 */ +#define FMODE_EXCL 0x00000400 +#define FMODE_TRUNC 0x00000800 +#define FMODE_TEXTMODE 0x00001000 +/* #define FMODE_PREP 0x00010000 */ +#define FMODE_SETENC_BY_BOM 0x00100000 +/* #define FMODE_UNIX 0x00200000 */ +/* #define FMODE_INET 0x00400000 */ +/* #define FMODE_INET6 0x00800000 */ + +#define RB_IO_POINTER(obj,fp) rb_io_check_closed((fp) = RFILE(rb_io_taint_check(obj))->fptr) +#define GetOpenFile RB_IO_POINTER + +#define RB_IO_OPEN(obj, fp) do {\ + (fp) = rb_io_make_open_file(obj);\ +} while (0) +#define MakeOpenFile RB_IO_OPEN + +rb_io_t *rb_io_make_open_file(VALUE obj); + +FILE *rb_io_stdio_file(rb_io_t *fptr); + +FILE *rb_fdopen(int, const char*); +int rb_io_modestr_fmode(const char *modestr); +int rb_io_modestr_oflags(const char *modestr); +CONSTFUNC(int rb_io_oflags_fmode(int oflags)); +void rb_io_check_writable(rb_io_t*); +void rb_io_check_readable(rb_io_t*); +void rb_io_check_char_readable(rb_io_t *fptr); +void rb_io_check_byte_readable(rb_io_t *fptr); +int rb_io_fptr_finalize(rb_io_t*); +void rb_io_synchronized(rb_io_t*); +void rb_io_check_initialized(rb_io_t*); +void rb_io_check_closed(rb_io_t*); +VALUE rb_io_get_io(VALUE io); +VALUE rb_io_check_io(VALUE io); +VALUE rb_io_get_write_io(VALUE io); +VALUE rb_io_set_write_io(VALUE io, VALUE w); +void rb_io_set_nonblock(rb_io_t *fptr); +int rb_io_extract_encoding_option(VALUE opt, rb_encoding **enc_p, rb_encoding **enc2_p, int *fmode_p); +void rb_io_extract_modeenc(VALUE *vmode_p, VALUE *vperm_p, VALUE opthash, int *oflags_p, int *fmode_p, rb_io_enc_t *convconfig_p); +ssize_t rb_io_bufwrite(VALUE io, const void *buf, size_t size); + +int rb_io_wait_readable(int fd); +int rb_io_wait_writable(int fd); +int rb_wait_for_single_fd(int fd, int events, struct timeval *tv); + +VALUE rb_io_wait(VALUE io, VALUE events, VALUE timeout); + +/* compatibility for ruby 1.8 and older */ +#define rb_io_mode_flags(modestr) [<"rb_io_mode_flags() is obsolete; use rb_io_modestr_fmode()">] +#define rb_io_modenum_flags(oflags) [<"rb_io_modenum_flags() is obsolete; use rb_io_oflags_fmode()">] + +VALUE rb_io_taint_check(VALUE); +NORETURN(void rb_eof_error(void)); + +void rb_io_read_check(rb_io_t*); +int rb_io_read_pending(rb_io_t*); + +struct stat; +VALUE rb_stat_new(const struct stat *); + +/* gc.c */ + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_IO_H */ |
