Files
aceVM/disks/1h/lib/config/ini
2025-09-29 00:03:57 -04:00

111 lines
2.7 KiB
Plaintext

-- Copyright (C) 2025 ASTRONAND
local ini = {}
local fs=require("filesystem")
local function trim(s)
local i, j = 1, #s
while i <= j and (s:sub(i,i) == " " or s:sub(i,i) == "\t") do
i = i + 1
end
while j >= i and (s:sub(j,j) == " " or s:sub(j,j) == "\t") do
j = j - 1
end
return s:sub(i, j)
end
local function parse(list)
local lines=function ()
local i=0
return function()
i=i+1
return list[i]
end
end
local data = {}
local section = data
for line in lines() do
line = trim(line)
if line ~= "" and line:sub(1,1) ~= ";" and line:sub(1,1) ~= "#" then
if line:sub(1,1) == "[" and line:sub(-1) == "]" then
local secName = trim(line:sub(2, -2))
if secName ~= "" then
data[secName] = data[secName] or {}
section = data[secName]
end
else
local eq
for i = 1, #line do
if line:sub(i,i) == "=" then
eq = i
break
end
end
if eq then
local key = trim(line:sub(1, eq-1))
local value = trim(line:sub(eq+1))
local lower = value:lower()
if tonumber(value) then
value = tonumber(value)
elseif lower == "true" then
value = true
elseif lower == "false" then
value = false
end
section[key] = value
end
end
end
end
return data
end
function ini.read(path)
local file, err = fs.open(path, "r")
if not file then return nil, err end
local list={}
for i in file.lines() do
list[#list+1] = i
end
file.close()
return parse(list)
end
function ini.get(text)
return parse(string.split(text, "\n"))
end
local function write(data)
local text=""
for k,v in pairs(data) do
if type(v) ~= "table" then
text=text..k .. " = " .. tostring(v) .. "\n"
end
end
for sec, tbl in pairs(data) do
if type(tbl) == "table" then
text=text.."\n[" .. sec .. "]\n"
for k,v in pairs(tbl) do
text=text..k .. " = " .. tostring(v) .. "\n"
end
end
end
return text
end
function ini.write(path, data)
local file=fs.open(path, "w")
file.write(write(data))
file.close()
return true
end
function ini.make(data)
return write(data)
end
return ini