summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
authorruki <[email protected]>2019-07-05 23:50:56 +0800
committerruki <[email protected]>2019-07-05 22:11:19 +0800
commitd5f175c340f5b9f876965177830e42a94936d3b6 (patch)
tree3a34747f7470db2678f98e9ee949a151cabf53e9 /core/src
parenta35ae4e4e2733f8b4a2056abf782056e624314fe (diff)
optimize to read all
Diffstat (limited to 'core/src')
-rw-r--r--core/src/xmake/io/file_read.c99
-rw-r--r--core/src/xmake/xmake.lua3
2 files changed, 74 insertions, 28 deletions
diff --git a/core/src/xmake/io/file_read.c b/core/src/xmake/io/file_read.c
index ec6a7515e..6581bff9d 100644
--- a/core/src/xmake/io/file_read.c
+++ b/core/src/xmake/io/file_read.c
@@ -80,15 +80,8 @@ static tb_long_t xm_io_file_buffer_readline(tb_stream_ref_t stream, tb_buffer_re
static tb_int_t xm_io_file_buffer_pushline(luaL_Buffer* buf, xm_io_file* file, tb_char_t const* continuation, tb_bool_t keep_crlf)
{
// check
- tb_assert(lua && file && continuation && xm_io_file_is_file(file) && !xm_io_file_is_closed(file));
-
- // is binary? keep crlf
- tb_bool_t is_binary = file->encoding == XM_IO_FILE_ENCODING_BINARY;
- if (is_binary)
- {
- continuation = "";
- keep_crlf = tb_true;
- }
+ tb_assert(file && continuation && xm_io_file_is_file(file) && !xm_io_file_is_closed(file));
+ tb_assert(file->encoding != XM_IO_FILE_ENCODING_BINARY);
// init line buffer
tb_buffer_t line;
@@ -123,7 +116,7 @@ static tb_int_t xm_io_file_buffer_pushline(luaL_Buffer* buf, xm_io_file* file, t
else if (size > 1)
{
// crlf? => lf
- if (!is_binary && data[size - 2] == '\r')
+ if (data[size - 2] == '\r')
{
data[size - 2] = '\n';
size--;
@@ -160,12 +153,47 @@ static tb_int_t xm_io_file_buffer_pushline(luaL_Buffer* buf, xm_io_file* file, t
// return result
return result;
}
+static tb_int_t xm_io_file_read_all_directly(lua_State* lua, xm_io_file* file)
+{
+ // check
+ tb_assert(lua && file && xm_io_file_is_file(file) && !xm_io_file_is_closed(file));
+ // read all
+ luaL_Buffer sbuf, *buf = &sbuf;
+ luaL_buffinit(lua, buf);
+ tb_long_t read = 0;
+ tb_byte_t data[TB_STREAM_BLOCK_MAXN];
+ tb_stream_ref_t stream = file->file_ref;
+ while (!tb_stream_beof(stream))
+ {
+ tb_long_t real = tb_stream_read(stream, data, sizeof(data));
+ if (real > 0)
+ {
+ luaL_addlstring(buf, (tb_char_t const*)data, real);
+ read += real;
+ }
+ else if (!real)
+ {
+ real = tb_stream_wait(stream, TB_STREAM_WAIT_READ, -1);
+ tb_check_break(real > 0);
+ }
+ else break;
+ }
+
+ if (read > 0) luaL_pushresult(buf);
+ else lua_pushliteral(lua, "");
+ return 1;
+}
static tb_int_t xm_io_file_read_all(lua_State* lua, xm_io_file* file, tb_char_t const* continuation)
{
// check
tb_assert(lua && file && continuation && xm_io_file_is_file(file) && !xm_io_file_is_closed(file));
+ // is binary or no continuation? read all directly
+ tb_bool_t is_binary = file->encoding == XM_IO_FILE_ENCODING_BINARY;
+ if (is_binary || *continuation == '\0')
+ return xm_io_file_read_all_directly(lua, file);
+
// read all
luaL_Buffer sbuf, *buf = &sbuf;
luaL_buffinit(lua, buf);
@@ -175,8 +203,8 @@ static tb_int_t xm_io_file_read_all(lua_State* lua, xm_io_file* file, tb_char_t
switch (xm_io_file_buffer_pushline(buf, file, continuation, tb_true))
{
case PL_EOF:
- luaL_pushresult(buf);
if (!has_content) lua_pushliteral(lua, "");
+ else luaL_pushresult(buf);
return 1;
case PL_FIN:
case PL_CONL:
@@ -184,8 +212,7 @@ static tb_int_t xm_io_file_read_all(lua_State* lua, xm_io_file* file, tb_char_t
continue;
case PL_FAIL:
default:
- luaL_pushresult(buf);
- xm_io_file_return_error(lua, file, "failed to readline");
+ xm_io_file_return_error(lua, file, "failed to read all");
break;
}
}
@@ -205,14 +232,17 @@ static tb_int_t xm_io_file_read_line(lua_State* lua, xm_io_file* file, tb_char_t
switch (xm_io_file_buffer_pushline(buf, file, continuation, keep_crlf))
{
case PL_EOF:
- luaL_pushresult(buf);
if (!has_content) lua_pushnil(lua);
+ else luaL_pushresult(buf);
+ return 1;
+ case PL_FIN:
+ luaL_pushresult(buf);
return 1;
- case PL_FIN: luaL_pushresult(buf); return 1;
- case PL_CONL: has_content = tb_true; continue;
+ case PL_CONL:
+ has_content = tb_true;
+ continue;
case PL_FAIL:
default:
- luaL_pushresult(buf);
xm_io_file_return_error(lua, file, "failed to readline");
break;
}
@@ -266,7 +296,7 @@ static tb_int_t xm_io_file_read_n(lua_State* lua, xm_io_file* file, tb_char_t co
static tb_size_t xm_io_file_std_buffer_pushline(luaL_Buffer* buf, xm_io_file* file, tb_char_t const* continuation, tb_bool_t keep_crlf)
{
// check
- tb_assert(lua && file && continuation && xm_io_file_is_std(file) && !xm_io_file_is_closed(file));
+ tb_assert(file && continuation && xm_io_file_is_std(file) && !xm_io_file_is_closed(file));
// get input buffer
tb_char_t strbuf[8192];
@@ -282,12 +312,26 @@ static tb_size_t xm_io_file_std_buffer_pushline(luaL_Buffer* buf, xm_io_file* fi
// end of file, no lf found
result = PL_FIN;
}
- else if (buflen > conlen)
+ else if (buflen > 1)
{
- tb_bool_t con_line = conlen && buflen >= conlen + 1 && tb_strncmp(continuation, (strbuf + buflen - conlen - 1), conlen) == 0;
- if (!keep_crlf && !con_line) buflen--;
- if (con_line) buflen -= conlen + 1;
- result = con_line ? PL_CONL : PL_FIN;
+ // crlf? => lf
+ if (strbuf[buflen - 2] == '\r')
+ {
+ strbuf[buflen - 2] = '\n';
+ buflen--;
+ }
+
+ // has continuation?
+ tb_bool_t has_conline = conlen && buflen >= conlen + 1 && tb_strncmp(continuation, (strbuf + buflen - conlen - 1), conlen) == 0;
+
+ // do not keep crlf, strip the last lf
+ if (!keep_crlf && !has_conline) buflen--;
+
+ // strip it if has continuation?
+ if (has_conline) buflen -= conlen + 1;
+ strbuf[buflen] = '\0';
+
+ result = has_conline? PL_CONL : PL_FIN;
}
else
{
@@ -296,7 +340,8 @@ static tb_size_t xm_io_file_std_buffer_pushline(luaL_Buffer* buf, xm_io_file* fi
result = PL_FIN;
}
- if (result == PL_FIN || result == PL_CONL) luaL_addlstring(buf, strbuf, buflen);
+ if (result == PL_FIN || result == PL_CONL)
+ luaL_addlstring(buf, strbuf, buflen);
return result;
}
@@ -314,8 +359,8 @@ static tb_int_t xm_io_file_std_read_line(lua_State* lua, xm_io_file* file, tb_ch
switch (xm_io_file_std_buffer_pushline(buf, file, continuation, keep_crlf))
{
case PL_EOF:
- luaL_pushresult(buf);
if (!has_content) lua_pushnil(lua);
+ else luaL_pushresult(buf);
return 1;
case PL_FIN:
luaL_pushresult(buf);
@@ -325,7 +370,6 @@ static tb_int_t xm_io_file_std_read_line(lua_State* lua, xm_io_file* file, tb_ch
continue;
case PL_FAIL:
default:
- luaL_pushresult(buf);
xm_io_file_return_error(lua, file, "failed to readline");
break;
}
@@ -346,8 +390,8 @@ static tb_int_t xm_io_file_std_read_all(lua_State* lua, xm_io_file* file, tb_cha
switch (xm_io_file_std_buffer_pushline(buf, file, continuation, tb_true))
{
case PL_EOF:
- luaL_pushresult(buf);
if (!has_content) lua_pushliteral(lua, "");
+ else luaL_pushresult(buf);
return 1;
case PL_FIN:
case PL_CONL:
@@ -355,7 +399,6 @@ static tb_int_t xm_io_file_std_read_all(lua_State* lua, xm_io_file* file, tb_cha
continue;
case PL_FAIL:
default:
- luaL_pushresult(buf);
xm_io_file_return_error(lua, file, "failed to readline");
break;
}
diff --git a/core/src/xmake/xmake.lua b/core/src/xmake/xmake.lua
index 8806d1ca5..c3df93473 100644
--- a/core/src/xmake/xmake.lua
+++ b/core/src/xmake/xmake.lua
@@ -9,6 +9,9 @@ target("xmake")
-- add defines
add_defines("__tb_prefix__=\"xmake\"")
+ if is_mode("debug") then
+ add_defines("__tb_debug__", {public = true})
+ end
-- set the auto-generated config.h
set_configdir("$(buildir)/$(plat)/$(arch)/$(mode)")