local this = {}
function this.lines(filename)
local fd, len = et.trap_FS_FOpenFile(filename, et.FS_READ)
if len == -1 then
return function() end
end
local buffer = ''
return function()
while buffer ~= nil do
local s, e = string.find(buffer, '[\r\n]+')
if s ~= nil then
local part = string.sub(buffer, 1, s - 1)
buffer = string.sub(buffer, e + 1)
if part ~= '' then
return part
end
else
if finish then
local part = buffer
buffer = nil
if part ~= '' then
return part
else
break
end
end
local read = 1024
if read > len then
read = len
end
len = len - read
if read == 0 then
et.trap_FS_FCloseFile(fd)
local remain = buffer
buffer = nil
if remain ~= '' then
return remain
end
break
end
buffer = buffer .. et.trap_FS_Read(fd, read)
end
end
end
end
function this.ini(filename, sections, comments)
local ini
local section
for line in this.lines(filename) do
if ini == nil then
ini = {}
end
if comments ~= false then
line = string.gsub(line, '[;#].+$', '')
end
line = string.gsub(line, '^%s+', '')
line = string.gsub(line, '%s+$', '')
if line ~= '' then
local key, value = string.gfind(line, "(.-)%s*=%s*(.-)$")()
if key ~= nil then
if section == nil then
ini[key] = value
else
section[key] = value
end
else
local s = string.gfind(line, "%[(.+)%]")()
if s ~= nil then
if sections then
section = {}
if ini[s] == nil then
ini[s] = {}
end
table.insert(ini[s], section)
else
if ini[s] == nil then
ini[s] = {}
end
section = ini[s]
end
else
return nil
end
end
end
end
return ini
end
return this