diff options
| author | Tomoyuki Sahara <[email protected]> | 2014-03-14 10:41:56 +0900 |
|---|---|---|
| committer | Tomoyuki Sahara <[email protected]> | 2014-03-14 10:41:56 +0900 |
| commit | 14031bdf44c255ecce805bb998b2f0d1e4dfe5a8 (patch) | |
| tree | 7072f0f19ef8762ae3af6478dad3b35ba67bb858 /src/io.c | |
| parent | f7c054bd39f0809641ab474771f0f85a5282c72e (diff) | |
| parent | 39bd240116b2980f90f9d8f350e18311959db54b (diff) | |
| download | mruby-14031bdf44c255ecce805bb998b2f0d1e4dfe5a8.tar.gz mruby-14031bdf44c255ecce805bb998b2f0d1e4dfe5a8.zip | |
Merge pull request #11 from pbosetti/master
Can build on VisualStudio, revised.
Diffstat (limited to 'src/io.c')
| -rw-r--r-- | src/io.c | 54 |
1 files changed, 52 insertions, 2 deletions
@@ -17,6 +17,16 @@ #include "mruby/error.h" #endif +#if defined(_WIN32) || defined(_WIN64) + #include <io.h> + #define open _open + #define close _close + #define read _read + #define write _write + #define lseek _lseek +#else +#endif + static int mrb_io_modestr_to_flags(mrb_state *mrb, const char *modestr); static int mrb_io_flags_to_modenum(mrb_state *mrb, int flags); @@ -67,6 +77,41 @@ mrb_io_modestr_to_flags(mrb_state *mrb, const char *mode) } static int +mrb_io_modenum_to_flags(mrb_state *mrb, int modenum) +{ + int flags = 0; + + switch (modenum & (O_RDONLY|O_WRONLY|O_RDWR)) { + case O_RDONLY: + flags = FMODE_READABLE; + break; + case O_WRONLY: + flags = FMODE_WRITABLE; + break; + case O_RDWR: + flags = FMODE_READWRITE; + break; + } + + if (modenum & O_APPEND) { + flags |= FMODE_APPEND; + } + if (modenum & O_TRUNC) { + flags |= FMODE_TRUNC; + } + if (modenum & O_CREAT) { + flags |= FMODE_CREATE; + } +#ifdef O_BINARY + if (modenum & O_BINARY) { + flags |= FMODE_BINMODE; + } +#endif + + return flags; +} + +static int mrb_io_flags_to_modenum(mrb_state *mrb, int flags) { int modenum = 0; @@ -94,13 +139,14 @@ mrb_io_flags_to_modenum(mrb_state *mrb, int flags) } #ifdef O_BINARY if (flags & FMODE_BINMODE) { - modenum |= O_BINARY + modenum |= O_BINARY; } #endif return modenum; } +#ifndef _WIN32 static int mrb_proc_exec(const char *pname) { @@ -118,6 +164,7 @@ mrb_proc_exec(const char *pname) execl("/bin/sh", "sh", "-c", pname, (char *)NULL); return -1; } +#endif static void mrb_io_free(mrb_state *mrb, void *ptr) @@ -160,6 +207,7 @@ io_open(mrb_state *mrb, mrb_value path, int flags, int perm) #define NOFILE 64 #endif +#ifndef _WIN32 mrb_value mrb_io_s_popen(mrb_state *mrb, mrb_value klass) { @@ -270,6 +318,7 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass) } return result; } +#endif mrb_value mrb_io_initialize(mrb_state *mrb, mrb_value io) @@ -717,9 +766,10 @@ mrb_init_io(mrb_state *mrb) MRB_SET_INSTANCE_TT(io, MRB_TT_DATA); mrb_include_module(mrb, io, mrb_module_get(mrb, "Enumerable")); /* 15.2.20.3 */ - +#ifndef _WIN32 mrb_define_class_method(mrb, io, "_popen", mrb_io_s_popen, MRB_ARGS_ANY()); mrb_define_class_method(mrb, io, "_sysclose", mrb_io_s_sysclose, MRB_ARGS_REQ(1)); +#endif mrb_define_class_method(mrb, io, "for_fd", mrb_io_s_for_fd, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(2)); mrb_define_class_method(mrb, io, "select", mrb_io_s_select, MRB_ARGS_ANY()); mrb_define_class_method(mrb, io, "sysopen", mrb_io_s_sysopen, MRB_ARGS_ANY()); |
