lua-basic/tokenize_args.lua

75 lines
2.2 KiB
Lua
Raw Normal View History

2024-02-15 14:21:10 +01:00
function tokenize_args(raw)
-- NOTE: string.gmatch is does not use regex, but a smaller pattern matcher!
-- A complete regex parser would be larger than lua itself. See
-- [Programming in Lua 20.2](https://www.lua.org/pil/20.2.html).
--
-- Notable differences:
-- '-' is ungreedy wildcard
-- '*?' does not work
-- '|' is not or
--
2024-02-15 14:26:01 +01:00
-- This means we're better of implementing the lexer with an algorithm.
2024-02-15 14:21:10 +01:00
local t = {}
local current = ""
local in_str = false
local str_seek
for c in string.gmatch(raw, ".") do -- iterate through all chars
if c == ' ' and not in_str then
if string.len(current) > 0 then
table.insert(t, current)
current = ""
end
elseif c == '"' and not in_str then
in_str = true
str_seek = '"'
elseif c == "'" and not in_str then
in_str = true
str_seek = "'"
elseif c == str_seek and in_str then
in_str = false
table.insert(t, current)
current = ""
else
current = current .. c
end
end
2024-02-15 14:26:01 +01:00
if string.len(current) > 0 then
table.insert(t, current)
end
2024-02-15 14:21:10 +01:00
return t
end
--- dumps a variable into a string, so it can be printed. This is meant for
--- debug prints
--- @param any t any variable
--- @return string t_dumped t dumped to string
function dump(t)
if type(t) == 'table' then
local s = '{ '
for k, v in pairs(t) do
if type(k) ~= 'number' then k = '"' .. k .. '"' end
if k ~= 1 then
s = s .. ', '
end
s = s .. '[' .. k .. '] = \'' .. dump(v) .. '\''
end
return s .. ' }'
else
return tostring(t)
end
end
function main()
2024-02-15 14:26:01 +01:00
local mockargs =
[[--name "tls_service_rs" --base-dir ${PWD%/*/*} --log-level "TRACE" -j '{ "MODE": "server", "CERT": "data/server.crt", "KEY": "data/server.key", "CHAIN": "data/root.crt", "ADDR": "127.0.0.1:9999", "HOSTNAME": "localhost" }']]
2024-02-15 14:21:10 +01:00
print(mockargs)
local split = tokenize_args(mockargs)
print(dump(split))
end
if pcall(getfenv, 4) then
print("Library")
else
main()
end