summaryrefslogtreecommitdiff
path: root/xmake/core/base
diff options
context:
space:
mode:
authorruki <[email protected]>2019-06-04 22:41:25 +0800
committerruki <[email protected]>2019-06-04 10:08:31 +0800
commit18663d52e5ff484eea423f88cbf52cc10c5721f3 (patch)
tree3e1e147713b4ca50276b676b9b346f52f893708b /xmake/core/base
parent255d51be7e7ed10a13a4cd55b5aae55079ab4bb9 (diff)
improve string.split
Diffstat (limited to 'xmake/core/base')
-rw-r--r--xmake/core/base/colors.lua4
-rw-r--r--xmake/core/base/interpreter.lua8
-rw-r--r--xmake/core/base/string.lua39
3 files changed, 37 insertions, 14 deletions
diff --git a/xmake/core/base/colors.lua b/xmake/core/base/colors.lua
index 8c5b2c287..2223c3f85 100644
--- a/xmake/core/base/colors.lua
+++ b/xmake/core/base/colors.lua
@@ -324,7 +324,7 @@ function colors.translate(str)
end
-- split words
- local blocks_raw = word:split("%s+")
+ local blocks_raw = word:split("%s")
-- translate theme color first, e.g ${color.error}
local blocks = {}
@@ -332,7 +332,7 @@ function colors.translate(str)
if theme then
local theme_block = theme:get(block)
if theme_block then
- for _, theme_block_sub in ipairs(theme_block:split("%s+")) do
+ for _, theme_block_sub in ipairs(theme_block:split("%s")) do
table.insert(blocks, theme_block_sub)
end
else
diff --git a/xmake/core/base/interpreter.lua b/xmake/core/base/interpreter.lua
index 029fe3e60..01d76973e 100644
--- a/xmake/core/base/interpreter.lua
+++ b/xmake/core/base/interpreter.lua
@@ -119,7 +119,7 @@ function interpreter._fetch_root_scope(root)
for scope_kind_and_name, _ in pairs(root or {}) do
-- is scope_kind@@scope_name?
- scope_kind_and_name = scope_kind_and_name:split("@@")
+ scope_kind_and_name = scope_kind_and_name:split("@@", {plain = true})
if #scope_kind_and_name == 2 then
local scope_kind = scope_kind_and_name[1]
local scope_name = scope_kind_and_name[2]
@@ -1413,7 +1413,7 @@ function interpreter:api_define(apis)
-- get api function
local apiscope = nil
local funcname = nil
- apifunc = apifunc:split('.')
+ apifunc = apifunc:split('.', {plain = true})
assert(apifunc)
if #apifunc == 2 then
apiscope = apifunc[1]
@@ -1470,7 +1470,7 @@ function interpreter:api_builtin_set_xmakever(minver)
end
-- parse minimum version
- local minvers = minver:split('.')
+ local minvers = minver:split('.', {plain = true})
if not minvers or #minvers ~= 3 then
os.raise("[nobacktrace]: set_xmakever(\"%s\"): invalid version format!", minver)
end
@@ -1479,7 +1479,7 @@ function interpreter:api_builtin_set_xmakever(minver)
local minvers_num = minvers[1] * 100 + minvers[2] * 10 + minvers[3]
-- parse current version
- local curvers = xmake._VERSION_SHORT:split('.')
+ local curvers = xmake._VERSION_SHORT:split('.', {plain = true})
-- make current numerical version
local curvers_num = curvers[1] * 100 + curvers[2] * 10 + curvers[3]
diff --git a/xmake/core/base/string.lua b/xmake/core/base/string.lua
index b27d076d5..878a2f683 100644
--- a/xmake/core/base/string.lua
+++ b/xmake/core/base/string.lua
@@ -143,19 +143,42 @@ function string:find_last(pattern, plain)
end
end
--- split string with the given characters
+-- split string with the given substring/characters
--
+-- pattern match and ignore empty string
-- ("1\n\n2\n3"):split('\n') => 1, 2, 3
--- ("1\n\n2\n3"):split('\n', true) => 1, , 2, 3
+-- ("abc123123xyz123abc"):split('123') => abc, xyz, abc
+-- ("abc123123xyz123abc"):split('[123]+') => abc, xyz, abc
--
-function string:split(delimiter, strict)
+-- plain match and ignore empty string
+-- ("1\n\n2\n3"):split('\n', {plain = true}) => 1, 2, 3
+-- ("abc123123xyz123abc"):split('123', {plain = true}) => abc, xyz, abc
+--
+-- pattern match and contains empty string
+-- ("1\n\n2\n3"):split('\n', {strict = true}) => 1, , 2, 3
+-- ("abc123123xyz123abc"):split('123', {strict = true}) => abc, , xyz, abc
+-- ("abc123123xyz123abc"):split('[123]+', {strict = true}) => abc, xyz, abc
+--
+-- plain match and contains empty string
+-- ("1\n\n2\n3"):split('\n', {plain = true, strict = true}) => 1, , 2, 3
+-- ("abc123123xyz123abc"):split('123', {plain = true, strict = true}) => abc, , xyz, abc
+--
+function string:split(delimiter, opt)
local result = {}
- if strict then
- for match in (self .. delimiter):gmatch("(.-)" .. delimiter) do
- table.insert(result, match)
+ local start = 1
+ local pos, epos = self:find(delimiter, start, opt and opt.plain)
+ while pos do
+ local substr = self:sub(start, pos - 1)
+ if #substr > 0 then
+ table.insert(result, substr)
+ elseif opt and opt.strict then
+ table.insert(result, substr)
end
- else
- self:gsub("[^" .. delimiter .."]+", function(v) table.insert(result, v) end)
+ start = epos + 1
+ pos, epos = self:find(delimiter, start, opt and opt.plain)
+ end
+ if start <= #self then
+ table.insert(result, self:sub(start))
end
return result
end