# 兼容性边界

参照 hyperrealm/libconfig 1.8.2；本库为独立 MoonBit 实现，**不是全兼容移植**。真实差分基线是 Windows x64/MSVC 上游构建，不能推断所有平台的上游行为相同。

支持 group、同类型标量 array、异构 list；Int32/Int64/Double/Bool/字节字符串；三类注释、相邻字符串拼接、尾逗号、可选分号/逗号设置分隔符、ASCII标识符及四种进制。规范化写出使用十进制，Int64 显式带 L。非十进制按数字位数/L后缀判定位宽，可用位模式表示负数。

字符串保留字节，非UTF-8字节通过 as_string 解码时明确失败。未知或不完整转义、NUL字节均拒绝。

## 实测差异（140个输入中的8个）

| 输入情形 | Windows上游实测 | 本库 |
| --- | --- | --- |
| 未闭合块注释到EOF | 接受 | 拒绝 |
| 未知Unicode样式转义 | 保留反斜线和字符 | 拒绝 |
| 十六进制转义中有非十六进制字符 | 保留原文 | 拒绝 |
| 十六进制转义不足两位 | 保留原文 | 拒绝 |
| 字符串中的NUL及后缀 | C字符串查询截断 | 拒绝 |
| a=0xFFFFFFFFL | Int64(-1) | Int64(4294967295) |
| a=0xffffffffffffffff | 语法错误 | Int64(-1)，64位位模式 |
| a=1e999 | 接受为无穷大 | 拒绝非有限浮点 |

六项是明确的严格拒绝策略；两项非十进制整数差异保留本库确定的位宽/位模式规则，不能声称与此次上游构建一致。交换大整数优先使用十进制及显式L后缀。本表不是所有可能差异的穷尽清单。

tools/expected-differences-windows.json 固定以上八项的完整输入、双方结果和差异类别。差分脚本在新增差异、预期改变或已知差异消失时失败，不按差异数量简单放行。

## 写出及限制

- 输出为规范化ASCII，非ASCII/控制字节用十六进制转义；不保留注释、排版、进制或include。
- 上游默认写出会损失部分小浮点数，也可能改变负二进制Int32位宽。测试适配器明确使用17位精度、科学记数法和默认十进制格式，比较类型和值而非原文。
- include始终报unsupported_include，不读取文件。无FFI、schema、热重载或自动数值转换。
- 默认输入/输出1 MiB、嵌套64层、100000个值节点（根group不计数）、单字符串256 KiB。嵌套可配置至256，路径最多256段，限制必须非负。
- 行/列从1开始，列按字节计，offset从0开始；LF换行，CR增加列。查询/写出错误没有源位置，使用offset=0、line=1、column=1。
- Value容器为可访问的MoonBit Array；replaced复制修改路径上的容器，不深复制未修改分支。writer检查手动构造的非法树，并用限制截断循环引用。
- get_path、parse_path和replaced均执行256段路径上限；parse_path还受默认输入字节上限约束。
- with_member/without_member用于合法group的新增、替换、删除，保留顺序且不修改源容器。新值的完整结构/资源校验仍由writer负责；这些接口不会自动修复调用方手工构造的非法树。
- 0.2.0提供validate独立检查手工配置树，错误路径用于显示；无效字段名的路径不保证能作为lookup输入。列表/数组编辑复制容器，但不对任意嵌套的新值做完整资源校验；使用validate检查最终树。
- Document记录原输入字段/值的起始字节位置，语法报错带上下文路径。严格类型查询定位原值，缺失节点定位最近已知父节点。Document位置是解析时快照，不随root返回的共享容器被修改而更新。
