扩展库 / hcl
hcl
只读查询 HCL 的属性、块与标签;表达式保留原文。
受限语法查询,不执行 Terraform 表达式,也不解析变量和 provider schema。HCL 正文、属性名和块类型含嵌入 NUL 时会拒绝,不会截断;整份正文须为有效 UTF-8。查询命中后仍会校验后续内容和块体,块及表达式括号最多嵌套 64 层;()、[]、{} 必须按顺序闭合。双引号中的真实换行无效,需使用 \n 转义;非法转义会报错,\u/\U 可解码为 UTF-8,解码结果含 NUL 时拒绝 C 字符串查询。
2026-10-28 当前固定发布版复验:Windows/Linux 默认完整门禁通过。覆盖严格 C、两平台四线程查询、Linux ASan/UBSan、XLang JIT、核心/边界/分配/范例独立 EXE;公开 C 范例的 GCC、TCC、C AOT 与 XLang JIT/AOT 输出一致。Linux 更早的一次无诊断退出仍未查明根因,不将本轮通过当成该历史风险已修复;门禁现保留失败命令、原始退出码、两条输出流及输入指纹。
HCL 正文最多 8 MiB UTF-8 字节;超过上限时所有查询和 validate 都在解析前报告 RangeError,C 侧报告 XERR_RANGE。属性声明和块头支持 /* ... */ 行内注释,不会把注释两侧的标识符拼接;get 忽略值末尾注释,getRaw 保留原文。
get 仅解码完整的单个双引号字符串。v = "a" == "b" 仍返回 "a" == "b",不会去引号或解码表达式中的转义;"\u0000" == "x" 也按原文返回。真正解码单个字符串中的 NUL 才报错。2026-10-29 新增 C/XLang 17 组边界、逐分配点失败和恢复测试,双语范例展示同一规则;Windows/Linux 默认完整门禁通过,含 Linux ASan/UBSan、四线程及双语 JIT/AOT。不增加表达式求值能力,也不据此关闭历史偶发退出风险。
嵌套表达式内部的 #、// 行注释和块注释保持原文。注释中的引号、转义和括号只是文本,get 不会再次解释它们。包内 examples/query_comments.xl / query_comments_c.c 演示含运维注释的列表表达式、端口及块标签查询;二者各自断言并输出相同六行,不把列表表达式求值为容器。
2026-10-30:修复行注释的二次解释,原17组字符串边界扩为77组,新增60组行注释、括号和LF/CRLF组合及逐分配点恢复。两平台同一最终C回归旧60组取值错误→修复后全部通过;Windows默认完整门禁、Linux原生57阶段含ASan/UBSan、四线程与各9份独立程序通过,新增双语范例使用同一六行golden。实际生成的12个函数声明与公开C头一致,故意改错bool返回时两平台均拒绝。源与工具指纹保持,不增加分配或扫描轮次。历史Linux偶发退出根因仍未知,保持R,不扩大为完整HCL或Terraform能力。
API
| 函数 | 用途 |
|---|---|
get / getRaw | 读取属性文本或原始表达式 |
getInt / getFloat / getBool | 读取明确的标量;整数严格解析完整十进制值,浮点固定点号十进制且不受区域设置影响 |
has / countAttrs | 查询属性存在性和数量;has 的空属性名报参数错 |
countBlocks / blockLabel / blockLabelCount / blockLabelAt | 查询块及标签 |
validate | 检查受支持的语法;非法内容抛 ValueError |
get、getRaw、blockLabel、blockLabelAt 返回普通 string;原生 char* 通过 @owned 直接交给 XLang,不在接管处复制正文,但仍需扫描一次取得长度。Windows 默认门禁与 Linux C sanitizer/XLang JIT/AOT 门禁已通过。
xlang
import hcl
string config = "resource \"server\" \"main\" { port = 8080 }"
assert hcl.blockLabelAt(config, "resource", 0, 1) == "main"
assert hcl.getInt(config, "port") == 8080
C
包含 include/hcl_native.h。文本结果由调用方持有,必须使用 xrtFree;失败时返回 NULL 并保留 XRT 错误。C 范例可直接运行 xl run examples/extlibs/hcl_c.c。
2026-10-19:C 回归对固定文档逐字节截断和替换,核对 validate 与属性、原文、块标签和块计数查询的结果及错误状态一致;非法 UTF-8 必须拒绝。Windows 包级 C/XLang 与 Linux C ASan/UBSan、双语对照通过。该矩阵不证明完整 HCL 规范支持。Linux 入口为 bash release/extlibs/hcl/test/check.sh。
Linux 失败现场目录由 [hcl] FAIL ... artifacts=... 报告,成功后自动清理。输入指纹包括包文件、XRT 头、双语范例及 xl/libxlc.so;结束时确认输入未变。可单独运行 bash release/extlibs/hcl/test/check_gate_diagnostics.sh 验证无输出退出 37 和命令不存在退出 127 的留档;该自测不代替库功能验收。