diff options
Diffstat (limited to 'src/lib_io.c')
-rw-r--r-- | src/lib_io.c | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/src/lib_io.c b/src/lib_io.c index e0c6908f..ca87ec4d 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 | ||
@@ -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); |
@@ -230,19 +232,12 @@ static int io_file_write(lua_State *L, FILE *fp, int start) | |||
230 | cTValue *tv; | 232 | cTValue *tv; |
231 | int status = 1; | 233 | int status = 1; |
232 | for (tv = L->base+start; tv < L->top; tv++) { | 234 | for (tv = L->base+start; tv < L->top; tv++) { |
233 | if (tvisstr(tv)) { | 235 | char buf[STRFMT_MAXBUF_NUM]; |
234 | MSize len = strV(tv)->len; | 236 | MSize len; |
235 | status = status && (fwrite(strVdata(tv), 1, len, fp) == len); | 237 | const char *p = lj_strfmt_wstrnum(buf, tv, &len); |
236 | } else if (tvisint(tv)) { | 238 | if (!p) |
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); | 239 | lj_err_argt(L, (int)(tv - L->base) + 1, LUA_TSTRING); |
245 | } | 240 | status = status && (fwrite(p, 1, len, fp) == len); |
246 | } | 241 | } |
247 | if (LJ_52 && status) { | 242 | if (LJ_52 && status) { |
248 | L->top = L->base+1; | 243 | L->top = L->base+1; |