扩展库 / ini
ini
读取、修改和写入 UTF-8 INI 配置,保留节与键的顺序、注释和多行值。
版本 1.0.0 · C / xlang · 无扩展库依赖
快速开始
import ini
auto config = ini.parse("[server]\nport = 8080\n")
config.set("server", "port", "9090")
assert config.getInt("server", "port") == 9090
println(config.stringify())
完整的 C/XLang 对照范例还演示 create、save、load:在独占临时目录中保存配置并读回核对,运行结束即清理。Windows 严格 GCC 与 TCC、Linux ASan/UBSan 的输出均和 XLang 对照。
包内 examples/profiles.xl / profiles_c.c 另成对演示部署配置覆盖、多行值和读取时插值。可直接 xl run,不需要服务或数据文件;写回后可重新按默认严格模式读取。
examples/bounded_updates.xl / bounded_updates_c.c 演示按 UTF-8 字节限制修改:六字节中文值成功、超限覆盖保留旧值,随后可继续修改并用相同限额重新解析。两个范例无需文件或外部服务,输出完全一致。
插值的 ${.scheme} 可读取全局键;首个点分隔节名与键名,其余点保留为键的一部分,如 ${s.a.b} 读取 s 节的 a.b。空键引用报 ConfigError,空值本身合法;缺键、循环与真正的内存失败保持各自错误分类。
接口
| 入口 | 用途 |
|---|---|
create / parse / load | 创建空配置、解析文本或加载 UTF-8 路径。 |
Config.get / getOr / getInt / getFloat / getBool | 读取值并按需转换类型;get 直接接管原生分配并返回普通 string,getOr 提供默认值;getInt 严格解析完整十进制值,getFloat 固定点号十进制、不受区域设置影响;失败抛出 ConfigError。 |
Config.set / remove / removeSection | 修改键或节。set 与解析共享 maxItem 节名、键名和值的 UTF-8 字节限额(含值内换行);等于上限允许,超限抛 ConfigError,保留原内容、顺序和计数,不留下空节。 |
Config.sectionNames / keys / has / hasSection | 枚举和查询节、键。 |
Config.stringify / save | 直接接管原生文本并返回普通 string,或原子保存到文件;无法无损表示的节名、键名或值会明确报错,不会静默改变数据;写入失败不截断旧文件。 |
Config.errorCode / errorLine / errorColumn / errorOffset | 读取最近一次原生操作的错误信息;非法 UTF-8 指向首个错误字节,偏移包含 BOM,首行列号不计 BOM。 |
可设置大小写敏感、重复键检查、插值和资源限额。${key}、${section.key} 在启用插值时生效。parse(string) 直接传入 UTF-8 数据及字节长度,不另建 XLang Buffer 副本;原生读取器在复制正文前检查输入限额并拒绝内嵌 NUL。set() 可以保留内存值;写出时若值有首尾空白、尾随换行或注释形态的续行等无法无损表示的内容,C 端报 FORMAT,XLang 抛 ConfigError。全局节先于具名节写出。C 端包含 extlibs/ini/include/xrt_ini.h,解析结果由 xrtIniDestroy 释放;xrtIniGet 的结果由调用方用 xrtFree 释放。C 选项须先初始化,顶层与内嵌资源限额的版本和结构长度均会校验,失配报 ARGUMENT。拥有型 Reader/Writer 在退出时关闭,对象与 XRT 错误槽同时保留已有首因;正文成功但关闭失败时区分 MEMORY/IO,借用型流由调用方关闭。
C 配置的顶层及资源限额保留字段必须为零;非零配置在 create/parse 入口报告 ARGUMENT。iMaxEntries 限制所有节的键总数,删除键后恢复额度;不适用的压缩倍率与 iFlags 必须为零,显式设置会报 ARGUMENT。
strictDuplicates=false 时后一次赋值替换旧值,保留键的原顺序和拼写,缩进续行跟随本次更新,不能污染表尾的其他键。默认严格模式仍拒绝重复。首个全局键自身含 U+FEFF 时,写回会按需加一个空行,避免把键的一部分当作文件 BOM;该字节计入输出预算。空键/空节名报 FORMAT,真正的长度超限报 LIMIT。
maxOutput 同时限制拥有型 get 的结果和序列化文本的 UTF-8 字节数,0 表示不限。插值前缀、引用正文与后缀共用累计预算,每次追加/扩容前检查,不先构造超限结果才拒绝。没有插值表达式的值直接按长度复制,不创建插值栈和缓冲。类型化读取复用此取值预算,借用视图 xrtIniGetRaw 不复制或截断存储值;结果限额不是进程总内存上限。
验证与边界
2026-10-30:修复 set 绕过单项字节限额的问题;在修改节/键之前检查节名、键名和值,避免覆盖旧内容或留下空节。C 新增108组限额组合、12个分配失败点与恢复、多行/空值和完整 uint64 预算,两平台同一回归旧模型183条断言失败→修复后0。新 C/XLang 限额范例使用同一四行黄金输出;Windows默认89项检查、Linux原生快照ASan/UBSan与默认整包门禁通过,两平台均含18份独立程序及Python互通。输入/工具指纹保持;历史GCC ICE仍未定位,保持R,不据此升级发布状态。没有改动主线或XRT。
2026-10-30:Windows 门禁子进程统一限时并保留原始状态、退出码、工作目录及 stdout/stderr,两个私有访问负例须实际退出 1。门禁自测直接从 AST 取得同一个 Run,在 PowerShell 5.1/7 核对十个子进程结果,覆盖缺程序、无输出失败、预期非零、意外成功、空参数、双输出流、独立 CR、相对目录和超时;旧实现能抛缺程序异常,但缺少进程记录,不将此夸大成已证明的假绿。默认完整 Windows 门禁的73项子进程检查通过,含14份独立程序;实际工具与输入指纹、结构化报告会保留。历史 GCC ICE 根因仍未知,保持 R,不靠换优化级别、自动重试或旧对象签收。此轮不重复宣称新的 Linux 完整回归。
2026-10-29:修复关闭回调覆盖 XRT 正文首因、Reader 关闭内存错误误报 IO 的问题。新增 test/test_stream_errors.c 的14个组合先有13项失败,修复后核对读取/写入/刷新/关闭复合失败、格式/限额/选项/构造失败、对象与线程错误的类型/域/码/消息、关闭次数及活动分配恢复。新 C 用例在两平台严格编译、TCC 直跑和独立 EXE 通过;Linux 另有 ASan/UBSan。默认完整门禁保留旧所有权、分配预算、Python互通及双语JIT/AOT并全部通过,未改主线或 XRT。历史 GCC ICE 仍未定位,保持 R。
2026-10-28:诊断、get 与 stringify 的三处返回复制已移除,缺失键的 ConfigError、合法空值和内存错误保持区别。C 18 组、XLang 20 组固定预算和名称列表 57 个逐点故障/成功预算通过;完整生成夹具仍保留必要的默认值快照,名称列表的后续装箱复制也未消除,不称整条链路零开销。双平台默认门禁含 Linux ASan/UBSan、Python configparser 互通和双语 JIT/AOT;主线/XRT 未改,旧 GCC ICE 的 R 风险仍保留。
2026-10-28 插值空键误报 MemoryError 已修复;新增 C 的 9 个合法/9 个错误引用对照、逐点 OOM 与分配恢复、语言消费正反例。Windows/Linux 默认门禁通过严格 C、Linux ASan/UBSan 及新旧双语 JIT/AOT,先前工具链 R 风险仍保留。
本轮最后的 Windows/Linux 默认门禁完整通过,新增拥有型取值与插值累计预算的 C/XLang JIT/AOT、Linux ASan/UBSan、精确字节边界和 OOM 恢复检查。但 Windows GCC 编译未修改的 XRT 测试翻译单元曾出现一次内部错误;同参数重试成功,原因尚未闭环,当前仍保留工具链 R 风险。另一次 WSL 非正常重启使快照失效,已重新建立输入验证,不把失效运行视为库测试失败。
2026-10-28 Windows 默认门禁与 Linux 原生文件系统同输入门禁均通过:新增 54 种重复覆盖组合、8 种 BOM 键布局、输出预算与逐点分配故障,保留严格 GCC、Linux ASan/UBSan、Python configparser 独立互通、私有访问负例和双语 JIT/AOT。失败现场及输入指纹会保留;这不是 32 位、TSan 或所有文件系统的压力验收。
powershell -NoProfile -ExecutionPolicy Bypass -File release/extlibs/ini/test/check.ps1
bash release/extlibs/ini/test/check.sh
C Reader 的输入限额从当前读取位置计算,不包含已跳过的前缀;只有 Size 而没有 Tell 的 Reader 由实际读取阶段执行限额。
2026-10-24 使用更新后的 Windows 发布版复验,默认门禁通过严格 GCC、C/XLang 边界、双语同输出、边界 AOT 及公开文件范例 AOT;Linux 包级门禁通过 C ASan/UBSan、内嵌 TCC C 用例、中央和包内 XLang 边界及双语输出对照。旧版共享缺符号已解除。XRT uint64 限额与 XLang uint64 对齐,C 32 位深度参数使用 c_uint。语言边界还验证中文路径、内嵌 NUL、资源限额和分配失败恢复;限额与分配故障分开验证,不依赖固定分配次数。这是 ini 包级证据,不等于整个 xlang 发布版签收。
2026-10-25 所有权复核:Windows 默认 C/XLang 与 AOT 门禁复验通过。普通字符串直接接管 XRT 分配;节名和键名装入 array<string> 时仍受共享容器装箱路径的一次文本复制影响。Linux C sanitizer 与 XLang JIT/双语门禁已通过,独立 AOT 待复验。
2026-10-26 Linux 发布版复核:包级门禁通过 C ASan/UBSan、独立 Python configparser 双向互通、XLang JIT,以及浮点核心、边界、公开文件范例三份独立 EXE。公开范例的 AOT 输出与 GCC C 范例逐字节一致;旧版 Linux AOT 待验记录已由本次门禁补齐。
2026-10-26 当前联合门禁继续覆盖中央语言用例和 C 范例的独立 EXE:Windows/Linux 中央 JIT/AOT、Linux 五份独立 EXE 及 GCC/TCC/XLang 输出对照通过。Windows 从项目根目录直接运行公开范例亦通过,旧 VFS 工作目录问题不再复现。get/stringify 直接接管 XRT 文本分配;节名和键名装入 array<string> 仍由共享容器路径创建值副本。