diff options
Diffstat (limited to 'src/lib_io.c')
-rw-r--r-- | src/lib_io.c | 41 |
1 files changed, 17 insertions, 24 deletions
diff --git a/src/lib_io.c b/src/lib_io.c index f13cf048..5e9d0d66 100644 --- a/src/lib_io.c +++ b/src/lib_io.c | |||
@@ -19,8 +19,10 @@ | |||
19 | #include "lj_obj.h" | 19 | #include "lj_obj.h" |
20 | #include "lj_gc.h" | 20 | #include "lj_gc.h" |
21 | #include "lj_err.h" | 21 | #include "lj_err.h" |
22 | #include "lj_buf.h" | ||
22 | #include "lj_str.h" | 23 | #include "lj_str.h" |
23 | #include "lj_state.h" | 24 | #include "lj_state.h" |
25 | #include "lj_strfmt.h" | ||
24 | #include "lj_ff.h" | 26 | #include "lj_ff.h" |
25 | #include "lj_lib.h" | 27 | #include "lj_lib.h" |
26 | 28 | ||
@@ -84,7 +86,7 @@ static IOFileUD *io_file_open(lua_State *L, const char *mode) | |||
84 | IOFileUD *iof = io_file_new(L); | 86 | IOFileUD *iof = io_file_new(L); |
85 | iof->fp = fopen(fname, mode); | 87 | iof->fp = fopen(fname, mode); |
86 | if (iof->fp == NULL) | 88 | if (iof->fp == NULL) |
87 | luaL_argerror(L, 1, lj_str_pushf(L, "%s: %s", fname, strerror(errno))); | 89 | luaL_argerror(L, 1, lj_strfmt_pushf(L, "%s: %s", fname, strerror(errno))); |
88 | return iof; | 90 | return iof; |
89 | } | 91 | } |
90 | 92 | ||
@@ -97,7 +99,7 @@ static int io_file_close(lua_State *L, IOFileUD *iof) | |||
97 | int stat = -1; | 99 | int stat = -1; |
98 | #if LJ_TARGET_POSIX | 100 | #if LJ_TARGET_POSIX |
99 | stat = pclose(iof->fp); | 101 | stat = pclose(iof->fp); |
100 | #elif LJ_TARGET_WINDOWS | 102 | #elif LJ_TARGET_WINDOWS && !LJ_TARGET_XBOXONE && !LJ_TARGET_UWP |
101 | stat = _pclose(iof->fp); | 103 | stat = _pclose(iof->fp); |
102 | #else | 104 | #else |
103 | lua_assert(0); | 105 | lua_assert(0); |
@@ -145,7 +147,7 @@ static int io_file_readline(lua_State *L, FILE *fp, MSize chop) | |||
145 | MSize m = LUAL_BUFFERSIZE, n = 0, ok = 0; | 147 | MSize m = LUAL_BUFFERSIZE, n = 0, ok = 0; |
146 | char *buf; | 148 | char *buf; |
147 | for (;;) { | 149 | for (;;) { |
148 | buf = lj_str_needbuf(L, &G(L)->tmpbuf, m); | 150 | buf = lj_buf_tmp(L, m); |
149 | if (fgets(buf+n, m-n, fp) == NULL) break; | 151 | if (fgets(buf+n, m-n, fp) == NULL) break; |
150 | n += (MSize)strlen(buf+n); | 152 | n += (MSize)strlen(buf+n); |
151 | ok |= n; | 153 | ok |= n; |
@@ -161,7 +163,7 @@ static void io_file_readall(lua_State *L, FILE *fp) | |||
161 | { | 163 | { |
162 | MSize m, n; | 164 | MSize m, n; |
163 | for (m = LUAL_BUFFERSIZE, n = 0; ; m += m) { | 165 | for (m = LUAL_BUFFERSIZE, n = 0; ; m += m) { |
164 | char *buf = lj_str_needbuf(L, &G(L)->tmpbuf, m); | 166 | char *buf = lj_buf_tmp(L, m); |
165 | n += (MSize)fread(buf+n, 1, m-n, fp); | 167 | n += (MSize)fread(buf+n, 1, m-n, fp); |
166 | if (n != m) { | 168 | if (n != m) { |
167 | setstrV(L, L->top++, lj_str_new(L, buf, (size_t)n)); | 169 | setstrV(L, L->top++, lj_str_new(L, buf, (size_t)n)); |
@@ -174,7 +176,7 @@ static void io_file_readall(lua_State *L, FILE *fp) | |||
174 | static int io_file_readlen(lua_State *L, FILE *fp, MSize m) | 176 | static int io_file_readlen(lua_State *L, FILE *fp, MSize m) |
175 | { | 177 | { |
176 | if (m) { | 178 | if (m) { |
177 | char *buf = lj_str_needbuf(L, &G(L)->tmpbuf, m); | 179 | char *buf = lj_buf_tmp(L, m); |
178 | MSize n = (MSize)fread(buf, 1, m, fp); | 180 | MSize n = (MSize)fread(buf, 1, m, fp); |
179 | setstrV(L, L->top++, lj_str_new(L, buf, (size_t)n)); | 181 | setstrV(L, L->top++, lj_str_new(L, buf, (size_t)n)); |
180 | lj_gc_check(L); | 182 | lj_gc_check(L); |
@@ -201,13 +203,12 @@ static int io_file_read(lua_State *L, FILE *fp, int start) | |||
201 | for (n = start; nargs-- && ok; n++) { | 203 | for (n = start; nargs-- && ok; n++) { |
202 | if (tvisstr(L->base+n)) { | 204 | if (tvisstr(L->base+n)) { |
203 | const char *p = strVdata(L->base+n); | 205 | const char *p = strVdata(L->base+n); |
204 | if (p[0] != '*') | 206 | if (p[0] == '*') p++; |
205 | lj_err_arg(L, n+1, LJ_ERR_INVOPT); | 207 | if (p[0] == 'n') |
206 | if (p[1] == 'n') | ||
207 | ok = io_file_readnum(L, fp); | 208 | ok = io_file_readnum(L, fp); |
208 | else if ((p[1] & ~0x20) == 'L') | 209 | else if ((p[0] & ~0x20) == 'L') |
209 | ok = io_file_readline(L, fp, (p[1] == 'l')); | 210 | ok = io_file_readline(L, fp, (p[0] == 'l')); |
210 | else if (p[1] == 'a') | 211 | else if (p[0] == 'a') |
211 | io_file_readall(L, fp); | 212 | io_file_readall(L, fp); |
212 | else | 213 | else |
213 | lj_err_arg(L, n+1, LJ_ERR_INVFMT); | 214 | lj_err_arg(L, n+1, LJ_ERR_INVFMT); |
@@ -230,19 +231,11 @@ static int io_file_write(lua_State *L, FILE *fp, int start) | |||
230 | cTValue *tv; | 231 | cTValue *tv; |
231 | int status = 1; | 232 | int status = 1; |
232 | for (tv = L->base+start; tv < L->top; tv++) { | 233 | for (tv = L->base+start; tv < L->top; tv++) { |
233 | if (tvisstr(tv)) { | 234 | MSize len; |
234 | MSize len = strV(tv)->len; | 235 | const char *p = lj_strfmt_wstrnum(L, tv, &len); |
235 | status = status && (fwrite(strVdata(tv), 1, len, fp) == len); | 236 | if (!p) |
236 | } else if (tvisint(tv)) { | ||
237 | char buf[LJ_STR_INTBUF]; | ||
238 | char *p = lj_str_bufint(buf, intV(tv)); | ||
239 | size_t len = (size_t)(buf+LJ_STR_INTBUF-p); | ||
240 | status = status && (fwrite(p, 1, len, fp) == len); | ||
241 | } else if (tvisnum(tv)) { | ||
242 | status = status && (fprintf(fp, LUA_NUMBER_FMT, numV(tv)) > 0); | ||
243 | } else { | ||
244 | lj_err_argt(L, (int)(tv - L->base) + 1, LUA_TSTRING); | 237 | lj_err_argt(L, (int)(tv - L->base) + 1, LUA_TSTRING); |
245 | } | 238 | status = status && (fwrite(p, 1, len, fp) == len); |
246 | } | 239 | } |
247 | if (LJ_52 && status) { | 240 | if (LJ_52 && status) { |
248 | L->top = L->base+1; | 241 | L->top = L->base+1; |
@@ -413,7 +406,7 @@ LJLIB_CF(io_open) | |||
413 | 406 | ||
414 | LJLIB_CF(io_popen) | 407 | LJLIB_CF(io_popen) |
415 | { | 408 | { |
416 | #if LJ_TARGET_POSIX || LJ_TARGET_WINDOWS | 409 | #if LJ_TARGET_POSIX || (LJ_TARGET_WINDOWS && !LJ_TARGET_XBOXONE && !LJ_TARGET_UWP) |
417 | const char *fname = strdata(lj_lib_checkstr(L, 1)); | 410 | const char *fname = strdata(lj_lib_checkstr(L, 1)); |
418 | GCstr *s = lj_lib_optstr(L, 2); | 411 | GCstr *s = lj_lib_optstr(L, 2); |
419 | const char *mode = s ? strdata(s) : "r"; | 412 | const char *mode = s ? strdata(s) : "r"; |