summaryrefslogtreecommitdiff
path: root/xmake/core
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
parent255d51be7e7ed10a13a4cd55b5aae55079ab4bb9 (diff)
improve string.split
Diffstat (limited to 'xmake/core')
-rw-r--r--xmake/core/base/colors.lua4
-rw-r--r--xmake/core/base/interpreter.lua8
-rw-r--r--xmake/core/base/string.lua39
-rw-r--r--xmake/core/language/language.lua2
-rw-r--r--xmake/core/project/project.lua2
-rw-r--r--xmake/core/sandbox/modules/import/core/package/repository.lua2
-rw-r--r--xmake/core/sandbox/modules/import/lib/detect/find_program.lua2
-rw-r--r--xmake/core/ui/label.lua4
8 files changed, 43 insertions, 20 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
diff --git a/xmake/core/language/language.lua b/xmake/core/language/language.lua
index 682532dcf..a7fdddcc0 100644
--- a/xmake/core/language/language.lua
+++ b/xmake/core/language/language.lua
@@ -162,7 +162,7 @@ function _instance:nameflags()
for _, namedflag in ipairs(nameflags) do
-- split it by '.'
- local splitinfo = namedflag:split('.')
+ local splitinfo = namedflag:split('.', {plain = true})
assert(#splitinfo == 2)
-- get flag scope
diff --git a/xmake/core/project/project.lua b/xmake/core/project/project.lua
index 03909c93f..07fb6792f 100644
--- a/xmake/core/project/project.lua
+++ b/xmake/core/project/project.lua
@@ -660,7 +660,7 @@ function project._load_requires()
for _, requirestr in ipairs(table.wrap(requires_str)) do
-- get the package name
- local packagename = requirestr:split('%s+')[1]
+ local packagename = requirestr:split('%s')[1]
-- get alias
local alias = nil
diff --git a/xmake/core/sandbox/modules/import/core/package/repository.lua b/xmake/core/sandbox/modules/import/core/package/repository.lua
index f6080d965..80f266d02 100644
--- a/xmake/core/sandbox/modules/import/core/package/repository.lua
+++ b/xmake/core/sandbox/modules/import/core/package/repository.lua
@@ -114,7 +114,7 @@ function sandbox_core_package_repository.repositories(is_global)
--
if not is_global then
for _, repo in ipairs(table.wrap(project.get("repositories"))) do
- local repoinfo = repo:split(' ')
+ local repoinfo = repo:split('%s')
if #repoinfo <= 3 then
local repo = repository.load(repoinfo[1], repoinfo[2], repoinfo[3], is_global)
if repo then
diff --git a/xmake/core/sandbox/modules/import/lib/detect/find_program.lua b/xmake/core/sandbox/modules/import/lib/detect/find_program.lua
index fda3e03df..d9cfbf484 100644
--- a/xmake/core/sandbox/modules/import/lib/detect/find_program.lua
+++ b/xmake/core/sandbox/modules/import/lib/detect/find_program.lua
@@ -103,7 +103,7 @@ function sandbox_lib_detect_find_program._find_from_pathes(name, pathes, opt)
end
-- the program path
- if program_path and (os.isexec(program_path) or os.isexec(program_path:split("%s+")[1])) then
+ if program_path and (os.isexec(program_path) or os.isexec(program_path:split("%s")[1])) then
-- check it
if sandbox_lib_detect_find_program._check(program_path, opt) then
return program_path
diff --git a/xmake/core/ui/label.lua b/xmake/core/ui/label.lua
index 894cae478..e8fc0bfc6 100644
--- a/xmake/core/ui/label.lua
+++ b/xmake/core/ui/label.lua
@@ -110,7 +110,7 @@ function label:textattr_val()
end
-- update the cache
- value = curses.calc_attr(textattr:split("%s+"))
+ value = curses.calc_attr(textattr:split("%s"))
self._TEXTATTR[textattr] = value
return value
end
@@ -123,7 +123,7 @@ function label:splitext(text, width)
-- split text first
local result = {}
- local lines = text:split('\n', true)
+ local lines = text:split('\n', {strict = true})
for idx = 1, #lines do
local line = lines[idx]
while #line > width do