模块契约XLON

错误与位置

XLON 模块使用 xrt.xlon 错误域:

语法、限制、数值、重复键和标签错误尽量携带位置:

Offset 是零基 UTF-8 字节偏移,行列从 1 开始。函数只读取机器数据,不修改 当前错误;错误域不匹配或错误没有位置时返回 false。

裁剪与依赖

能力公开选择宏实现宏主要依赖
公共错误与位置XRT_MODULE_XLON_COREXRT_FEATURE_XLON_COREcore
校验、事件访问、DOM 解析XRT_MODULE_XLON_READXRT_FEATURE_XLON_READxlon_core, buffer, base64, time_text, number, unicode, value_container
DOM 与增量写出XRT_MODULE_XLON_WRITEXRT_FEATURE_XLON_WRITExlon_core, buffer, base64, time_text, number, unicode, value_container
XLON 文件读写XRT_MODULE_XLON_FILEXRT_FEATURE_XLON_FILExlon_read, xlon_write, file_whole
完整 XLONXRT_MODULE_XLONXRT_FEATURE_XLONxlon_file

读、写和文件层可独立裁剪。只访问事件时不需要文件层,只生成内部快照时不需要 读取层。

语法

标准 JSON 类型保持原义:

扩展类型只有以下显式形式:

  • bytes 使用标准、带规范填充的 Base64。
  • time 使用严格 RFC 3339;写出时统一规范化为 UTC,并使用 Z。
  • 有限浮点继续使用 JSON 数字;只有 nan、inf、-inf 使用 float 标签。
  • intmap 键必须是 int64 整数字面量。
  • set 元素必须满足 xvalue 集合的可哈希标量约束。
  • 自定义标签名最长 128 字节,首字节是 ASCII 字母或下划线,后续还可使用数字、

. 和 -;载荷始终是完成 JSON 反转义的 UTF-8 字符串。

  • bytes、time、float、intmap 和 set 是保留名称。

格式不支持根据第一个元素猜测容器类型,也不支持旧版 class(Base64) 原始 ABI 内存快照。空数组、空对象、空集合和空整数映射分别固定写作 []、{}、 set[]、intmap{}。

稳定契约

  • 默认语法严格;注释、尾随逗号和自定义标签必须分别开启。
  • 输入和字符串都使用显式长度,解码后的字符串允许包含 U+0000。
  • 所有文本和标签载荷必须是合法 UTF-8,字符串转义遵守 JSON 规则。
  • xrtXlonParse("null") 返回 xrtValueNull();失败返回 C NULL。
  • 整数优先无损保存为 int64,非负且超过 INT64_MAX 时保存为 uint64;超出 uint64 或低于 int64 范围默认失败。
  • 读取和写出默认都有有限资源预算;配置必须先调用对应 Init。
  • 事件中的字符串、字节、键、原始 token 和标签视图只在回调期间有效。
  • sink 回调必须在返回前消费字节。回调设置的具体错误会保留为当前错误。
  • 增量 writer 不可重入;任一失败都会进入不可恢复的失败终态。
  • 文件写出先完成序列化,再原子替换目标。序列化失败不会改变已有文件。
  • 模块不带隐式锁。不同解析或写入对象可并行使用,同一 writer 由调用方串行访问。

默认预算

MaxDecodedBytes 约束单个 bytes 标签的解码结果。服务端和不可信文件读取应按 实际接口进一步收紧全部预算。

读取配置

对象和 intmap 默认拒绝重复键。KEEP 保留首值并继续完整校验后续值, REPLACE 保留末值。BIGINT_FLOAT 允许把超出 uint64 或低于 int64 范围的整数有损读为 double。

自定义标签需要同时开启 XXLON_READ_CUSTOM。事件访问会直接报告 XXLON_EVENT_CUSTOM;DOM 解析还要求 Decode 返回一个拥有引用,解析器成功挂入 后接管该引用。解码器失败返回 NULL,并应设置业务错误。Reserved 必须保持零。

DOM 读取

Parse 使用默认严格配置,Read 用于语法选项、重复键、自定义标签和资源预算。 返回值由 xrtValueRelease 释放。Valid 不构造 DOM,但为字符串反转义和 bytes 语义校验可能使用可复用临时缓冲,因此不承诺零分配。

映射关系如下:

XLONxvaluetype
null, bool, signed integer, unsigned integer, finite/nonfinite float, string对应 XVALUE_NULL、XVALUE_BOOL、XVALUE_INT、XVALUE_UINT、XVALUE_FLOAT、XVALUE_STRING
bytes(...)XVALUE_BYTES
time(...)XVALUE_TIME
[...]XVALUE_ARRAY
intmap{...}XVALUE_INT_MAP
set[...]XVALUE_SET
{...}XVALUE_OBJECT
custom tag由 Decode 决定

事件访问

xxloneventtype 明确区分标量事件和容器边界:

事件含义
XXLON_EVENT_NULL空值,Value 无效
XXLON_EVENT_BOOL布尔值,读取 Value.Boolean
XXLON_EVENT_INT64 位有符号整数,读取 Value.Integer
XXLON_EVENT_UINT64 位无符号整数,读取 Value.Unsigned
XXLON_EVENT_FLOAT浮点数,包括显式非有限值,读取 Value.Float
XXLON_EVENT_STRINGUTF-8 字符串,读取 Value.String
XXLON_EVENT_BYTES已解码字节串,读取 Value.Bytes
XXLON_EVENT_TIME已解析时间,读取 Value.Time
XXLON_EVENT_CUSTOM自定义标签,读取 Value.Tag
XXLON_EVENT_ARRAY_BEGIN / XXLON_EVENT_ARRAY_END数组开始与结束
XXLON_EVENT_INT_MAP_BEGIN / XXLON_EVENT_INT_MAP_END整数键映射开始与结束
XXLON_EVENT_SET_BEGIN / XXLON_EVENT_SET_END集合开始与结束
XXLON_EVENT_OBJECT_BEGIN / XXLON_EVENT_OBJECT_END字符串键对象开始与结束

事件结构为:

Key.Type 在对象、数组、int-map 和 set 中分别是 XVALUE_KEY_STRING、 XVALUE_KEY_INDEX、XVALUE_KEY_INT 和 XVALUE_KEY_NONE。数字事件的 Raw 保留原 token,便于上层接入 BigInt 或 Decimal。

STOP 是正常提前完成。FAIL 应先设置具体业务错误;没有新错误时 XLON 层建立 XXLON_ERROR_STATE。

写出配置

ESCAPE_HTML 转义 <、>、&,但不能代替完整 HTML 上下文转义。 ESCAPE_NON_ASCII 使用 \uXXXX,补充平面字符输出代理对。

内建 XLON 可以无损写出除 Pointer、Handle 外的可移植 xvalue 类型。Pointer 和 Handle 默认失败,Encode 可把它们映射为非保留自定义标签。编码器接收只在回调 期间有效的只读快照,可以使用 Value getter;不能保存该外壳。返回的 Tag/Payload 视图必须保持到当前 WriterValue 返回。

XXLON_UNSUPPORTED_SKIP 只跳过 DOM 容器中的 Pointer/Handle 成员;根值和直接 WriterValue 仍失败。选择 SKIP 时这些成员不会再进入编码器。Indent 范围为 0 到 16,Reserved 必须保持零。

DOM 与 sink 写出

Stringify 返回由 xrtFree 释放的零结尾文本;pSize 不包含末尾零,失败时保持 不变。Write 同步提交若干借用字节块,不保留完整结果。sink 已接受的块无法撤回, 因此 sink 路径不提供事务输出。

Bytes 使用固定小块流式 Base64 编码,不建立第二份等大的 Base64 临时字符串。

增量 writer

两种 writer 共享以下操作:

Object 必须按 Name -> Value 交替写入;IntMap 按 Key -> Value 交替;Array 和 Set 直接写值。End 结束最近容器。每个 writer 只接受一个根值,全部容器关闭后使用 Finish 封闭结果。Value 在当前位置写入已有 DOM 子树。

Take 只适用于已完成的内存 writer,只能成功一次,结果由 xrtFree 释放。 sink writer 不支持 Take。Free 可接收空指针。

文件

ReadFile 在读取阶段执行 MaxInputBytes,然后使用同一配置解析。文件打开、读取、 临时文件、刷新或替换失败建立 XXLON_ERROR_IO,底层文件错误保留在原因链。

完整可运行示例位于 examples/data/xlon/main.c。

xxlonerror类型

XLON 模块错误码在 xrt.xlon 域内保持稳定。

值语义
XXLON_ERROR_CONFIG配置非法
XXLON_ERROR_SYNTAX语法非法
XXLON_ERROR_LIMIT超限
XXLON_ERROR_DUPLICATE失败
XXLON_ERROR_NUMBER失败
XXLON_ERROR_TAG失败
XXLON_ERROR_STATE状态非法
XXLON_ERROR_UNSUPPORTED不支持
XXLON_ERROR_OUTPUT输出失败
XXLON_ERROR_IO写出失败
typedef enum xxlonerror { XXLON_ERROR_CONFIG = 1401, XXLON_ERROR_SYNTAX, XXLON_ERROR_LIMIT, XXLON_ERROR_DUPLICATE, XXLON_ERROR_NUMBER, XXLON_ERROR_TAG, XXLON_ERROR_STATE, XXLON_ERROR_UNSUPPORTED, XXLON_ERROR_OUTPUT, XXLON_ERROR_IO } xxlonerror;

xxlonlocation类型

文本位置使用零基字节偏移和一基行列。

字段类型语义
Offsetsize_t偏移量
Linesize_t行号
Columnsize_t列号
typedef struct xxlonlocation { size_t Offset; size_t Line; size_t Column; } xxlonlocation;

xxlonreadflag类型

非标准空白扩展和自定义标签默认全部关闭。

值语义
XXLON_READ_COMMENTS读方向
XXLON_READ_TRAILING_COMMA读方向
XXLON_READ_CUSTOM自定义标签解码
typedef enum xxlonreadflag { XXLON_READ_COMMENTS = UINT32_C(0x00000001), XXLON_READ_TRAILING_COMMA = UINT32_C(0x00000002), XXLON_READ_CUSTOM = UINT32_C(0x00000004)

xxlonduplicate类型

对象和整数映射使用同一套明确的重复键策略。

值语义
XXLON_DUPLICATE_REJECTREJECT
XXLON_DUPLICATE_KEEPKEEP
XXLON_DUPLICATE_REPLACE重名后者覆盖
typedef enum xxlonduplicate { XXLON_DUPLICATE_REJECT = 0, XXLON_DUPLICATE_KEEP, XXLON_DUPLICATE_REPLACE } xxlonduplicate;

xxlonbigint类型

超出 int64/uint64 的整数默认失败,可显式按 double 接收。

值语义
XXLON_BIGINT_REJECTXXLONBIGINTREJECT
XXLON_BIGINT_FLOAT浮点形态(超精度可选)
typedef enum xxlonbigint { XXLON_BIGINT_REJECT = 0, XXLON_BIGINT_FLOAT } xxlonbigint;

xxlonreadconfig类型

XLON 读取配置同时约束语法、资源预算和自定义类型入口。

字段类型语义
Flagsuint32标志位
DuplicatexxlonduplicateDuplicate
BigIntegerxxlonbigintBigInteger
MaxDepthuint32MaxDepth
MaxInputBytessize_tMaxInputBytes
MaxStringBytessize_tMaxStringBytes
MaxValuessize_tMaxValues
MaxContainerItemssize_tMaxContainerItems
MaxDecodedBytessize_tMaxDecodedBytes
DecodexxlondecodeprocDecode
DecodeDataptrDecodeData
typedef struct xxlonreadconfig { uint32 Flags; xxlonduplicate Duplicate; xxlonbigint BigInteger; uint32 MaxDepth; size_t MaxInputBytes; size_t MaxStringBytes; size_t MaxValues; size_t MaxContainerItems; size_t MaxDecodedBytes; xxlondecodeproc Decode; ptr DecodeData; uint32 Reserved[4]; } xxlonreadconfig;

xxloneventtype类型

访问事件直接表达全部可移植 XLON 类型。

值语义
XXLON_EVENT_NULL空值
XXLON_EVENT_BOOL布尔
XXLON_EVENT_INT有符号整数
XXLON_EVENT_FLOAT浮点
XXLON_EVENT_STRING字符串
XXLON_EVENT_BYTESBYTES
XXLON_EVENT_TIME时间
XXLON_EVENT_CUSTOMCUSTOM
XXLON_EVENT_ARRAY_BEGIN数组形态BEGIN
XXLON_EVENT_ARRAY_END数组形态END
XXLON_EVENT_INT_MAP_BEGIN有符号整数映射形态BEGIN
XXLON_EVENT_INT_MAP_END有符号整数映射形态END
XXLON_EVENT_SET_BEGIN集合形态BEGIN
XXLON_EVENT_SET_END集合形态END
XXLON_EVENT_OBJECT_BEGIN对象形态BEGIN
XXLON_EVENT_OBJECT_END对象形态END
XXLON_EVENT_UINT无符号整数事件
XXLON_EVENT_CHARUnicode 标量字符事件
typedef enum xxloneventtype { XXLON_EVENT_NULL = 0, XXLON_EVENT_BOOL, XXLON_EVENT_INT, XXLON_EVENT_FLOAT, XXLON_EVENT_STRING, XXLON_EVENT_BYTES, XXLON_EVENT_TIME, XXLON_EVENT_CUSTOM, XXLON_EVENT_ARRAY_BEGIN, XXLON_EVENT_ARRAY_END, XXLON_EVENT_INT_MAP_BEGIN, XXLON_EVENT_INT_MAP_END, XXLON_EVENT_SET_BEGIN, XXLON_EVENT_SET_END, XXLON_EVENT_OBJECT_BEGIN, XXLON_EVENT_OBJECT_END, XXLON_EVENT_UINT, XXLON_EVENT_CHAR } xxloneventtype;

xxlonvisitaction类型

回调可继续、正常提前停止或报告失败。

值语义
XXLON_VISIT_NEXTNEXT
XXLON_VISIT_STOPSTOP
XXLON_VISIT_FAIL回调失败
typedef enum xxlonvisitaction { XXLON_VISIT_NEXT = 0, XXLON_VISIT_STOP, XXLON_VISIT_FAIL } xxlonvisitaction;

xxlonvisitresult类型

访问结果明确区分完成、调用方停止和失败。

值语义
XXLON_VISIT_ERROR失败
XXLON_VISIT_DONE完成
XXLON_VISIT_STOPPED回调请求停止
typedef enum xxlonvisitresult { XXLON_VISIT_ERROR = -1, XXLON_VISIT_DONE = 0, XXLON_VISIT_STOPPED = 1 } xxlonvisitresult;

xxlontag类型

自定义标签保留名称和已经完成 JSON 反转义的字符串载荷。

字段类型语义
Namexstrview名称
Payloadxstrview载荷
typedef struct xxlontag { xstrview Name; xstrview Payload; } xxlontag;

xxlonwriteflag类型

输出标志只改变文本布局和字符串转义。

值语义
XXLON_WRITE_PRETTY写方向
XXLON_WRITE_ESCAPE_SLASH写方向
XXLON_WRITE_ESCAPE_HTML写方向
XXLON_WRITE_ESCAPE_NON_ASCII转义非 ASCII
typedef enum xxlonwriteflag { XXLON_WRITE_PRETTY = UINT32_C(0x00000001), XXLON_WRITE_ESCAPE_SLASH = UINT32_C(0x00000002), XXLON_WRITE_ESCAPE_HTML = UINT32_C(0x00000004), XXLON_WRITE_ESCAPE_NON_ASCII = UINT32_C(0x00000008)

xxlonunsupported类型

不可直接表示的值默认失败,也可显式跳过容器成员。

值语义
XXLON_UNSUPPORTED_REJECTXXLON不支持REJECT
XXLON_UNSUPPORTED_SKIP跳过
typedef enum xxlonunsupported { XXLON_UNSUPPORTED_REJECT = 0, XXLON_UNSUPPORTED_SKIP } xxlonunsupported;

xxloncoderesult类型

自定义编码回调明确区分不处理、成功和失败。

值语义
XXLON_CODE_ERROR失败
XXLON_CODE_UNSUPPORTED不支持
XXLON_CODE_OK成功
typedef enum xxloncoderesult { XXLON_CODE_ERROR = -1, XXLON_CODE_UNSUPPORTED = 0, XXLON_CODE_OK = 1 } xxloncoderesult;

xxlonwriteconfig类型

XLON 写出配置提供固定上限和唯一自定义类型入口。

字段类型语义
Flagsuint32标志位
UnsupportedxxlonunsupportedUnsupported
MaxDepthuint32MaxDepth
Indentuint32Indent
MaxOutputBytessize_tMaxOutputBytes
EncodexxlonencodeprocEncode
EncodeDataptrEncodeData
typedef struct xxlonwriteconfig { uint32 Flags; xxlonunsupported Unsupported; uint32 MaxDepth; uint32 Indent; size_t MaxOutputBytes; xxlonencodeproc Encode; ptr EncodeData; uint32 Reserved[4]; } xxlonwriteconfig;

xxlonwriter类型

增量写入器保持不透明,所有方法都拒绝回调重入。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xxlonwriter xxlonwriter;

xxlondecodeproc类型

自定义标签解码器返回一个拥有引用;失败时应设置具体错误。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef xvalue* (*xxlondecodeproc)( xstrview Tag, xstrview Payload, ptr pUserData );

xxlonvisitproc类型

XLON 访问器不得保存事件中的借用视图。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef xxlonvisitaction(*xxlonvisitproc)( const xxlonevent* pEvent, ptr pUserData)

xxlonencodeproc类型

编码器接收仅在回调期间有效的只读快照;返回视图保持到本次调用返回。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef xxloncoderesult(*xxlonencodeproc)( const xvalue* pValue, xstrview* pTag, xstrview* pPayload, ptr pUserData)

xxlonwriteproc类型

输出回调必须在返回前消费借用字节。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xxlonwriteproc)(xbytesview Data, ptr pUserData)

xrtXlonErrorLocation函数

从 xrt.xlon 错误的机器数据中读取文本位置。

bool xrtXlonErrorLocation(const xerror* pError, xxlonlocation* pLocation)

参数

参数方向约束说明
pError输入非空、xrt.xlon 域解析/写出错误
pLocation输出非空接收文本位置
返回值
返回含义失败时状态
true已写出位置—
false错误不含位置数据不设错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • 无位置数据返回 false 且不设置错误

范例已编译验证

xlon_tour · 错误定位

			!xrtXlonErrorLocation(pError, &Location) ||
读取配置

xrtXlonReadConfigInit函数

初始化严格语法、拒绝重复键和有限资源预算。

void xrtXlonReadConfigInit(xxlonreadconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收配置
返回值
返回含义失败时状态
无已初始化—
错误
  • 无 — 初始化不失败

范例已编译验证

xlon · 读取配置

	xrtXlonReadConfigInit(&ReadConfig);
DOM 读取

xrtXlonParse函数

使用默认严格配置解析一个完整 XLON 文本。

xvalue* xrtXlonParse(xstrview Text)

参数

参数方向约束说明
Text输入借用XLON 文本
返回值
返回含义失败时状态
非空Value DOM 根,用后 xrtValueFree 释放—
NULL解析失败xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 语法或结构非法,位置可由 xrtXlonErrorLocation 读取
  • xrt.xlon 域错误 — 超出嵌套深度或资源预算
  • XERR_MEMORY — DOM 或缓冲分配失败

范例已编译验证

xlon · 默认解析

	pRoot = xrtXlonParse((xstrview){ sInput, sizeof(sInput) - 1u });

xrtXlonRead函数

使用高级配置解析一个完整 XLON 文本。

xvalue* xrtXlonRead(xstrview Text, const xxlonreadconfig* pConfig)

参数

参数方向约束说明
Text输入借用XLON 文本
pConfig输入允许空读取配置,空 = 默认
返回值
返回含义失败时状态
非空Value DOM 根,用后 xrtValueFree 释放—
NULL解析失败xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 语法或结构非法,位置可由 xrtXlonErrorLocation 读取
  • xrt.xlon 域错误 — 超出嵌套深度或资源预算
  • XERR_MEMORY — DOM 或缓冲分配失败

范例已编译验证

xlon_tour · 高级配置解析

		((pDom = xrtXlonRead(XRT_STR_LITERAL(
			"{\"n\":7}"), &ReadConfig)) == NULL) ) {

xrtXlonValid函数

验证默认 XLON 语法和内建标签,不构造 Value DOM。

bool xrtXlonValid(xstrview Text)

参数

参数方向约束说明
Text输入借用XLON 文本
返回值
返回含义失败时状态
true语法合法—
false语法非法xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 语法或结构非法,位置可由 xrtXlonErrorLocation 读取
  • xrt.xlon 域错误 — 超出嵌套深度或资源预算

范例已编译验证

xlon_tour · 语法校验

	if ( xrtXlonValid((xstrview) { sBad, 6u }) ||
		!xrtXlonValid(XRT_STR_LITERAL("[1,2,3]")) ||
		((pDom = xrtXlonRead(XRT_STR_LITERAL(
			"{\"n\":7}"), &ReadConfig)) == NULL) ) {
事件访问

xrtXlonVisit函数

直接访问解析事件,不构造中间 DOM。

xxlonvisitresult xrtXlonVisit(xstrview Text, const xxlonreadconfig* pConfig, xxlonvisitproc pVisitor, ptr pUserData)

参数

参数方向约束说明
Text输入借用XLON 文本
pConfig输入允许空读取配置,空 = 默认
pVisitor输入非空事件回调
pUserData输入任意值回调数据
返回值
返回含义失败时状态
XXLON_VISIT_NEXT已完整遍历—
XXLON_VISIT_STOP回调请求停止不设错误
XXLON_VISIT_ERROR失败xrt.xlon 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.xlon 域错误 — 语法或结构非法,位置可由 xrtXlonErrorLocation 读取
  • xrt.xlon 域错误 — 超出嵌套深度或资源预算

范例已编译验证

xlon · 事件访问

		xrtXlonVisit(
			(xstrview){ sInput, sizeof(sInput) - 1u },
			&ReadConfig,
			printXlonEvent,
			NULL
		) != XXLON_VISIT_DONE
写出配置

xrtXlonWriteConfigInit函数

初始化紧凑输出、严格类型和有限输出预算。

void xrtXlonWriteConfigInit(xxlonwriteconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收配置
返回值
返回含义失败时状态
无已初始化—
错误
  • 无 — 初始化不失败

范例已编译验证

xlon · 写出配置

	xrtXlonWriteConfigInit(&WriteConfig);
DOM 与 sink 写出

xrtXlonStringify函数

紧凑或美化地序列化 Value,并返回由 xrtFree 释放的文本。

str xrtXlonStringify(const xvalue* pValue, bool bPretty, size_t* pSize)

参数

参数方向约束说明
pValue输入非空源 Value
bPretty输入—是否美化
pSize输出允许空接收长度
返回值
返回含义失败时状态
非空零结尾文本,xrtFree 释放—
NULL失败xrt.xlon 域错误等
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_MEMORY — 输出缓冲分配失败

范例已编译验证

xlon · 序列化

	sText = xrtXlonStringify(pRoot, true, &iSize);

xrtXlonWrite函数

使用高级配置把 Value 同步写入调用方输出回调。

bool xrtXlonWrite(const xvalue* pValue, const xxlonwriteconfig* pConfig, xxlonwriteproc pWrite, ptr pUserData)

参数

参数方向约束说明
pValue输入非空源 Value
pConfig输入允许空写出配置,空 = 默认
pWrite输入非空输出回调
pUserData输入任意值回调数据
返回值
返回含义失败时状态
true已完整写出—
false失败xrt.xlon 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY — 内部缓冲分配失败

范例已编译验证

xlon_tour · 回调写出

	if ( !xrtXlonWrite(pDom, &WriteConfig, exampleSink,
			(ptr)&Sink) ||
		(Sink.iBytes != 7u) ) { /* {"n":7} 恰七字节。 */

xrtXlonStringifyFile函数

紧凑或美化地序列化并原子替换 XLON 文件。

bool xrtXlonStringifyFile(cstr sPath, const xvalue* pValue, bool bPretty)

参数

参数方向约束说明
sPath输入非空、零结尾目标文件路径
pValue输入非空源 Value
bPretty输入—是否美化
返回值
返回含义失败时状态
true已原子写入—
false失败xrt.xlon / xrt.file 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.file 域错误 — 临时文件创建或替换失败
  • xrt.xlon 域错误 — 序列化失败

范例已编译验证

xlon_tour · 序列化到文件

		!xrtXlonStringifyFile(sFile, pDom, true) ||

xrtXlonWriteFile函数

使用高级配置序列化并原子替换 XLON 文件。

bool xrtXlonWriteFile(cstr sPath, const xvalue* pValue, const xxlonwriteconfig* pConfig)

参数

参数方向约束说明
sPath输入非空、零结尾目标文件路径
pValue输入非空源 Value
pConfig输入允许空写出配置,空 = 默认
返回值
返回含义失败时状态
true已原子写入—
false失败xrt.xlon / xrt.file 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.file 域错误 — 临时文件创建或替换失败
  • xrt.xlon 域错误 — 序列化失败

范例已编译验证

xlon_tour · 高级配置写文件

	if ( !xrtXlonWriteFile(sFile, pDom, &WriteConfig) ||
		!xrtXlonStringifyFile(sFile, pDom, true) ||
		(xrtXlonParseFile(sFile) == NULL) ) {
增量 writer

xrtXlonWriterCreate函数

创建把增量结果保存在内存中的 XLON 写入器。

xxlonwriter* xrtXlonWriterCreate(const xxlonwriteconfig* pConfig)

参数

参数方向约束说明
pConfig输入允许空写出配置,空 = 默认
返回值
返回含义失败时状态
非空写入器—
NULL创建失败XERR_ARGUMENT 等
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY — DOM 或缓冲分配失败

范例已编译验证

xlon · 内存写入器

	pWriter = xrtXlonWriterCreate(&WriteConfig);

xrtXlonWriterCreateSink函数

创建把增量结果同步提交给回调的 XLON 写入器。

xxlonwriter* xrtXlonWriterCreateSink(const xxlonwriteconfig* pConfig, xxlonwriteproc pWrite, ptr pUserData)

参数

参数方向约束说明
pConfig输入允许空写出配置,空 = 默认
pWrite输入非空输出回调
pUserData输入任意值回调数据
返回值
返回含义失败时状态
非空写入器—
NULL创建失败XERR_ARGUMENT 等
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY — DOM 或缓冲分配失败

范例已编译验证

xlon_tour · 回调写入器

	pWriter = xrtXlonWriterCreateSink(&WriteConfig, exampleSink,
		(ptr)&Sink);

xrtXlonWriterFree函数

销毁写入器和未移交的内存结果。

void xrtXlonWriterFree(xxlonwriter* pWriter)

参数

参数方向约束说明
pWriter输入允许空空 = 空操作
返回值
返回含义失败时状态
无已销毁—
错误
  • 无 — 释放不失败

范例已编译验证

xlon · 销毁写入器

		xrtXlonWriterFree(pWriter);

xrtXlonWriterObject函数

在当前位置开始对象。

bool xrtXlonWriterObject(xxlonwriter* pWriter)

参数

参数方向约束说明
pWriter输入非空目标写入器
返回值
返回含义失败时状态
true已开始—
false位置或预算非法xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

xlon · 开始对象

		!xrtXlonWriterObject(pWriter) ||

xrtXlonWriterArray函数

在当前位置开始数组。

bool xrtXlonWriterArray(xxlonwriter* pWriter)

参数

参数方向约束说明
pWriter输入非空目标写入器
返回值
返回含义失败时状态
true已开始—
false位置或预算非法xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

xlon_tour · 开始数组

		!xrtXlonWriterArray(pWriter) ||

xrtXlonWriterIntMap函数

在当前位置开始整数键映射。

bool xrtXlonWriterIntMap(xxlonwriter* pWriter)

参数

参数方向约束说明
pWriter输入非空目标写入器
返回值
返回含义失败时状态
true已开始—
false位置或预算非法xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

xlon_tour · 开始整数映射

		!xrtXlonWriterIntMap(pWriter) ||

xrtXlonWriterSet函数

在当前位置开始集合。

bool xrtXlonWriterSet(xxlonwriter* pWriter)

参数

参数方向约束说明
pWriter输入非空目标写入器
返回值
返回含义失败时状态
true已开始—
false位置或预算非法xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

xlon · 开始集合

		!xrtXlonWriterSet(pWriter) ||                     /* 开 set */

xrtXlonWriterEnd函数

结束最近开始的容器。

bool xrtXlonWriterEnd(xxlonwriter* pWriter)

参数

参数方向约束说明
pWriter输入非空目标写入器
返回值
返回含义失败时状态
true已结束—
false没有未结束容器xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 没有可结束的容器

范例已编译验证

xlon · 结束容器

		!xrtXlonWriterEnd(pWriter) ||                     /* 闭 set */

xrtXlonWriterName函数

为对象中的下一个值写入字符串名称。

bool xrtXlonWriterName(xxlonwriter* pWriter, xstrview Name)

参数

参数方向约束说明
pWriter输入非空目标写入器
Name输入借用、严格 UTF-8成员名称
返回值
返回含义失败时状态
true已写出—
false位置或 UTF-8 非法xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

xlon · 写字符串键

		!xrtXlonWriterName(pWriter, XRT_STR_LITERAL("code")) ||

xrtXlonWriterKey函数

为整数映射中的下一个值写入 int64 键。

bool xrtXlonWriterKey(xxlonwriter* pWriter, int64 iKey)

参数

参数方向约束说明
pWriter输入非空目标写入器
iKey输入—键值
返回值
返回含义失败时状态
true已写出—
false位置非法xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

xlon_tour · 写整数键

		!xrtXlonWriterKey(pWriter, 7) ||

xrtXlonWriterNull函数

写入 null。

bool xrtXlonWriterNull(xxlonwriter* pWriter)

参数

参数方向约束说明
pWriter输入非空目标写入器
返回值
返回含义失败时状态
true已写出—
false位置非法xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

xlon_tour · 写 null

		!xrtXlonWriterNull(pWriter) ||

xrtXlonWriterBool函数

写入布尔值。

bool xrtXlonWriterBool(xxlonwriter* pWriter, bool bValue)

参数

参数方向约束说明
pWriter输入非空目标写入器
bValue输入—布尔值
返回值
返回含义失败时状态
true已写出—
false位置非法xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

xlon_tour · 写布尔

		!xrtXlonWriterBool(pWriter, true) ||

xrtXlonWriterInt函数

写入 int64。

bool xrtXlonWriterInt(xxlonwriter* pWriter, int64 iValue)

参数

参数方向约束说明
pWriter输入非空目标写入器
iValue输入—整数值
返回值
返回含义失败时状态
true已写出—
false位置非法xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

xlon · 写 int64

		!xrtXlonWriterInt(pWriter, 200) ||

xrtXlonWriterUInt函数

写入 uint64。

bool xrtXlonWriterUInt(xxlonwriter* pWriter, uint64 iValue)

参数

参数方向约束说明
pWriter输入非空目标写入器
iValue输入—无符号值
返回值
返回含义失败时状态
true已写出—
false位置非法xrt.xlon 域错误

xrtXlonWriterChar函数

写入保留字符身份的 Unicode 标量标签;非法标量或写入器状态错误时返回 false,并设置 xrt.xlon 错误。

bool xrtXlonWriterChar(xxlonwriter* pWriter, uint32 iValue)
错误
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

xlon_tour · 写 uint64

		!xrtXlonWriterUInt(pWriter, 12u) ||

xrtXlonWriterFloat函数

写入 double,非有限值使用显式 float 标签。

bool xrtXlonWriterFloat(xxlonwriter* pWriter, double fValue)

参数

参数方向约束说明
pWriter输入非空目标写入器
fValue输入—浮点值
返回值
返回含义失败时状态
true已写出—
false位置非法xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

xlon_tour · 写 double

		!xrtXlonWriterFloat(pWriter, 0.5) ||

xrtXlonWriterString函数

写入严格 UTF-8 字符串。

bool xrtXlonWriterString(xxlonwriter* pWriter, xstrview Text)

参数

参数方向约束说明
pWriter输入非空目标写入器
Text输入借用、严格 UTF-8文本
返回值
返回含义失败时状态
true已写出—
falseUTF-8 或位置非法xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

xlon · 写字符串

		!xrtXlonWriterString(pWriter, XRT_STR_LITERAL("xrt")) ||

xrtXlonWriterBytes函数

写入规范 Base64 二进制标签。

bool xrtXlonWriterBytes(xxlonwriter* pWriter, xbytesview Data)

参数

参数方向约束说明
pWriter输入非空目标写入器
Data输入借用二进制数据
返回值
返回含义失败时状态
true已写出—
false位置非法xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

xlon_tour · 写二进制

		!xrtXlonWriterBytes(pWriter,
			(xbytesview) { (const uint8*)"xy", 2u }) ||

xrtXlonWriterTime函数

写入 UTC RFC 3339 时间标签。

bool xrtXlonWriterTime(xxlonwriter* pWriter, xtime Time)

参数

参数方向约束说明
pWriter输入非空目标写入器
Time输入—UTC 时间值
返回值
返回含义失败时状态
true已写出—
false位置非法xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 容器顺序非法、根值重复或输出预算耗尽
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

xlon_tour · 写时间

		!xrtXlonWriterTime(pWriter, (xtime)1000000) ||

xrtXlonWriterTag函数

写入已经验证名称和载荷的自定义标签。

bool xrtXlonWriterTag(xxlonwriter* pWriter, xstrview Tag, xstrview Payload)

参数

参数方向约束说明
pWriter输入非空目标写入器
Tag输入借用、已验证标签名
Payload输入借用载荷文本
返回值
返回含义失败时状态
true已写出—
false标签名或载荷未通过验证xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 标签名非法或载荷不是合法标签载荷

范例已编译验证

xlon_tour · 写自定义标签

		!xrtXlonWriterTag(pWriter, XRT_STR_LITERAL("base64"),
			XRT_STR_LITERAL("eHl6")) ||

xrtXlonWriterValue函数

在当前位置写入完整 Value 子树。

bool xrtXlonWriterValue(xxlonwriter* pWriter, const xvalue* pValue)

参数

参数方向约束说明
pWriter输入非空目标写入器
pValue输入非空源 Value
返回值
返回含义失败时状态
true已写出—
false序列化失败xrt.xlon 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.xlon 域错误 — Value 类型不受支持或输出预算耗尽

范例已编译验证

xlon_tour · 写 Value 子树

		!xrtXlonWriterValue(pWriter, pSub) ||

xrtXlonWriterFinish函数

验证根值和容器已完整结束,并关闭写入器。

bool xrtXlonWriterFinish(xxlonwriter* pWriter)

参数

参数方向约束说明
pWriter输入非空目标写入器
返回值
返回含义失败时状态
true已完成并关闭—
false根值缺失或容器未结束xrt.xlon 域错误
错误
  • xrt.xlon 域错误 — 根值缺失、容器未全部结束或根值重复

范例已编译验证

xlon · 完成写入

		!xrtXlonWriterFinish(pWriter)

xrtXlonWriterTake函数

从已完成的内存写入器移交文本。

str xrtXlonWriterTake(xxlonwriter* pWriter, size_t* pSize)

参数

参数方向约束说明
pWriter输入非空、已完成目标写入器
pSize输出允许空接收长度
返回值
返回含义失败时状态
非空零结尾文本,xrtFree 释放—
NULL未完成或非内存写入器XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 写入器尚未成功 Finish 或为 sink 写入器

范例已编译验证

xlon · 移交文本

	sText = xrtXlonWriterTake(pWriter, &iSize);
文件

xrtXlonParseFile函数

使用默认严格配置读取并解析 XLON 文件。

xvalue* xrtXlonParseFile(cstr sPath)

参数

参数方向约束说明
sPath输入非空、零结尾UTF-8 文件路径
返回值
返回含义失败时状态
非空Value DOM 根,用后 xrtValueFree 释放—
NULL解析失败xrt.xlon 域错误

(读取失败同错误节)

错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.file 域错误 — 文件读取失败
  • xrt.xlon 域错误 — 语法或结构非法,位置可由 xrtXlonErrorLocation 读取
  • xrt.xlon 域错误 — 超出嵌套深度或资源预算
  • XERR_MEMORY — DOM 或缓冲分配失败

范例已编译验证

xlon_tour · 默认解析文件

	pFileDom = xrtXlonParseFile(sFile);

xrtXlonReadFile函数

使用读取配置及其输入上限解析 XLON 文件。

xvalue* xrtXlonReadFile(cstr sPath, const xxlonreadconfig* pConfig)

参数

参数方向约束说明
sPath输入非空、零结尾UTF-8 文件路径
pConfig输入允许空读取配置,空 = 默认
返回值
返回含义失败时状态
非空Value DOM 根,用后 xrtValueFree 释放—
NULL解析失败xrt.xlon 域错误

(读取失败同错误节)

错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.file 域错误 — 文件读取失败或超过输入上限
  • xrt.xlon 域错误 — 语法或结构非法,位置可由 xrtXlonErrorLocation 读取
  • xrt.xlon 域错误 — 超出嵌套深度或资源预算
  • XERR_MEMORY — DOM 或缓冲分配失败

范例已编译验证

xlon_tour · 高级配置解析文件

		(xrtXlonReadFile(sFile, &ReadConfig) == NULL) ) {

常量索引常量

以下常量在本页所属头文件中定义,语义见公共头注释。

常量说明
XXLON_BIGINT_FLOAT见头文件注释
XXLON_BIGINT_REJECT见头文件注释
XXLON_CODE_ERROR见头文件注释
XXLON_CODE_OK见头文件注释
XXLON_CODE_UNSUPPORTED见头文件注释
XXLON_CONTAINER_DEFAULT见头文件注释
XXLON_DECODED_DEFAULT见头文件注释
XXLON_DEPTH_DEFAULT见头文件注释
XXLON_DUPLICATE_KEEP见头文件注释
XXLON_DUPLICATE_REJECT见头文件注释
XXLON_DUPLICATE_REPLACE见头文件注释
XXLON_ERROR_CONFIG见头文件注释
XXLON_ERROR_DUPLICATE见头文件注释
XXLON_ERROR_IO见头文件注释
XXLON_ERROR_LIMIT见头文件注释
XXLON_ERROR_NUMBER见头文件注释
XXLON_ERROR_OUTPUT见头文件注释
XXLON_ERROR_STATE见头文件注释
XXLON_ERROR_SYNTAX见头文件注释
XXLON_ERROR_TAG见头文件注释
XXLON_ERROR_UNSUPPORTED见头文件注释
XXLON_EVENT_ARRAY_BEGIN见头文件注释
XXLON_EVENT_ARRAY_END见头文件注释
XXLON_EVENT_BOOL见头文件注释
XXLON_EVENT_BYTES见头文件注释
XXLON_EVENT_CHAR见头文件注释
XXLON_EVENT_CUSTOM见头文件注释
XXLON_EVENT_FLOAT见头文件注释
XXLON_EVENT_INT见头文件注释
XXLON_EVENT_INT_MAP_BEGIN见头文件注释
XXLON_EVENT_INT_MAP_END见头文件注释
XXLON_EVENT_NULL见头文件注释
XXLON_EVENT_OBJECT_BEGIN见头文件注释
XXLON_EVENT_OBJECT_END见头文件注释
XXLON_EVENT_SET_BEGIN见头文件注释
XXLON_EVENT_SET_END见头文件注释
XXLON_EVENT_STRING见头文件注释
XXLON_EVENT_TIME见头文件注释
XXLON_EVENT_UINT见头文件注释
XXLON_INPUT_DEFAULT见头文件注释
XXLON_READ_COMMENTS见头文件注释
XXLON_READ_CUSTOM见头文件注释
XXLON_READ_TRAILING_COMMA见头文件注释
XXLON_STRING_DEFAULT见头文件注释
XXLON_UNSUPPORTED_REJECT见头文件注释
XXLON_UNSUPPORTED_SKIP见头文件注释
XXLON_VALUES_DEFAULT见头文件注释
XXLON_VISIT_DONE见头文件注释
XXLON_VISIT_ERROR见头文件注释
XXLON_VISIT_FAIL见头文件注释
XXLON_VISIT_NEXT见头文件注释
XXLON_VISIT_STOP见头文件注释
XXLON_VISIT_STOPPED见头文件注释
XXLON_WRITE_ESCAPE_HTML见头文件注释
XXLON_WRITE_ESCAPE_NON_ASCII见头文件注释
XXLON_WRITE_ESCAPE_SLASH见头文件注释
XXLON_WRITE_PRETTY见头文件注释