You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
2.4 KiB
Lua

-- Copyright (C) Dejiang Zhu(doujiang24)
local io_open = io.open
local tonumber = tonumber
local re_match = ngx.re.match
local substr = string.sub
local str_byte = string.byte
local _M = { _VERSION = "0.01" }
local section_pattern = [[ \A \[ ([^ \[ \] ]+) \] \z ]]
local keyvalue_pattern =
[[ \A \s* ( [\w_]+ ) \s* = \s* ( ' [^']* ' | " [^"]* " | \S+ ) (?:\s*)? \z ]]
function _M.getString(filename,sec,k)
local fp, err = io_open(filename)
if not fp then
return nil, "failed to open file: " .. (err or "")
end
local data = {}
local section = "default"
for line in fp:lines() do
local m = re_match(line, section_pattern, "jox")
if m then
section = m[1]
else
local m = re_match(line, keyvalue_pattern, "jox")
if m then
if not data[section] then
data[section] = {}
end
local key, value = m[1], m[2]
if section==sec then
if k==key then
return value
end
end
end
end
end
fp:close()
return nil
end
function _M.parse_file(filename)
local fp, err = io_open(filename)
if not fp then
return nil, "failed to open file: " .. (err or "")
end
local data = {}
local section = "default"
for line in fp:lines() do
local m = re_match(line, section_pattern, "jox")
if m then
section = m[1]
else
local m = re_match(line, keyvalue_pattern, "jox")
if m then
if not data[section] then
data[section] = {}
end
local key, value = m[1], m[2]
local val = tonumber(value)
if val then
value = val
elseif value == "true" then
value = true
elseif value == "false" then
value = false
else
local fst = str_byte(value, 1)
if fst == 34 or fst == 39 then -- ' or "
value = substr(value, 2, -2)
end
end
data[section][key] = value
end
end
end
fp:close()
return data
end
return _M