模块契约Pattern
所有权
- 编译对象通过
xrtPatternRef、xrtPatternRelease 管理。 - Builder 通过
xrtPatternBuilderFree 释放。 - 模式和捕获名由 Builder/编译对象复制。
xpatternspec.Value 不转移所有权。- 捕获
xstrview 只在输入文本仍然有效时有效。
完整函数列表见 Pattern API reference。
Builder 的关联元数据事务
ID 为 Builder 实例局部的槽位/代际;不同 Builder 可产生相同数字,调用方 必须同时保存实例身份。代际或版本耗尽时拒绝相应结构修改并报 StateError, 不回绕、不使旧 ID 复活。xrtPatternBuilderContains 查询活动 ID;无效或 陈旧 ID 为 false,不设置错误(NULL Builder 仍报 ArgumentError)。
当模式表与语言对象 tag 等关联元数据必须一起更新时,使用 xpatternedit:
1. xrtPatternBuilderPrepareAdd(builder, specs, count) 准备整批追加; PrepareSet(builder, id, spec)、PrepareRemove(builder, id)、 PrepareClear(builder) 准备替换、删除、清空。Set/Remove 的无效 ID 报 StateError,不采用原有非报错 false 的查找语义。 2. xrtPatternEditReady/Count/Id 查询独占编辑及确定的 ID。准备不改变活动 条目、版本、Dirty 或缓存;可能增长物理容量。失败或取消不消费 ID。 3. 调用方完成关联元数据的可能失败部分,再调用 xrtPatternEditCommit。 有效且串行的提交不分配、不失败;空 Add/Clear 不增加版本。 4. xrtPatternEditFree 释放编辑。未提交时即取消;已提交时只释放元数据。 Commit 不自动释放编辑,提交后仍可读取其 Count/Id,但不能再次提交。
Pending 期间其他结构修改(包含 Reserve)报 StateError;读取与 Compile 仍使用提交前的完整状态。Builder Free 自动使 edit 失效,但不代替调用方 EditFree。Builder/edit 须串行且不得重入修改;元数据及用户析构/回调等 外部副作用不由原生事务自动回滚。事务/代际白盒、实际 OOM 及无分配提交 回归在 tests/pattern/test_pattern_edit.c;OOM 子集仅在 MEMORY_DEBUG 开启时执行。
模式语法
- 字面字段按字节精确匹配。
{name} 捕获一个非空字段,不能跨越配置中的分隔字节。prefix{name}、{name}suffix 与 prefix{name}suffix 捕获同一字段中
前后缀之间的非空字节;前后缀按字节精确匹配。
{*name} 捕获剩余文本,只能位于模式末尾,并允许空值。{{ 和 }} 在字面字段中分别表示 { 和 }。- 捕获名必须是 ASCII 标识符,同一模式内不能重名。
- 一个字段至多包含一个普通捕获;
{a}-{b} 当前是编译错误,尾捕获不能
与任何字面量混合。
- 匹配始终锚定完整输入,不执行路径规范化、URL 解码或大小写折叠。
默认分隔符为 /。xpatternconfig.Separators 是分隔字节集合;模式中的 分隔符仍要求精确匹配。设置为 /. 后,/file/{name}.{ext} 可以分别捕获 文件名和扩展名,但 / 与 . 不会互相替代。
一次性提取
xrtPatternExtract 在模式、参数和捕获容量有效时不分配内存,适合偶发 匹配;错误报告本身仍可能创建 xerror。同一模式被重复使用时,应通过 xrtPatternCompile 编译一次。
批量编译与匹配
xrtPatternCompileMany 将多条模式编译成不可变对象。xrtPatternLookup 只返回获胜模式;xrtPatternMatch 还按出现顺序写入捕获视图。编译对象没有 可变 matcher 缓存,可由多个线程同时查询。
模式按第一个不同字段决定特异度:字面字段优先于混合捕获,混合捕获优先于 整字段捕获,整字段捕获优先于尾捕获。多个混合捕获同时命中时,固定字节 总数更多者优先;总数相同时,前缀更长者优先。结构无法区分且优先级相同的模式会产生 XPATTERN_ERROR_CONFLICT;不同优先级可以显式替换这种同结构模式。优先级 不会令参数模式反超可同时命中的字面模式。
动态模式
xpatternbuilder 复制并缓存模式解析结果。Add、Set、Remove 只修改 Builder;xrtPatternBuilderCompile 生成新的不可变快照。旧快照不会观察到 后续修改,因而可以由上层使用 generation 或 RCU 风格生命周期安全发布。
Builder 不保证并发安全。未修改的 Builder 再次编译会返回缓存快照的新 引用;批量追加具有事务性。
xpatternresult类型
未命中不是错误,全部匹配入口使用同一三态结果。
| 值 | 语义 |
|---|
XPATTERN_ERROR | 失败 |
XPATTERN_NONE | 无 |
XPATTERN_MATCH | 命中 |
typedef enum xpatternresult { XPATTERN_ERROR = -1, XPATTERN_NONE = 0, XPATTERN_MATCH = 1 } xpatternresult;
xpatternerror类型
pattern 模块错误代码在 xrt.pattern 域内保持稳定。
| 值 | 语义 |
|---|
XPATTERN_ERROR_CONFIG | 配置非法 |
XPATTERN_ERROR_PATTERN | 失败 |
XPATTERN_ERROR_LIMIT | 超限 |
XPATTERN_ERROR_CONFLICT | 冲突 |
XPATTERN_ERROR_CAPACITY | 捕获容量不足 |
typedef enum xpatternerror { XPATTERN_ERROR_CONFIG = 1601, XPATTERN_ERROR_PATTERN, XPATTERN_ERROR_LIMIT, XPATTERN_ERROR_CONFLICT, XPATTERN_ERROR_CAPACITY } xpatternerror;
xpatternconfig类型
分隔符是字节集合:模式中的分隔字节仍要求精确匹配,捕获不能吞掉 集合中的任意字节。全部模式共享一份配置,以便编译成单一确定性程序。
| 字段 | 类型 | 语义 |
|---|
Flags | uint32 | 标志位 |
Separators | xstrview | 分隔符集合 |
MaxPatternBytes | size_t | MaxPatternBytes |
MaxPatterns | size_t | MaxPatterns |
MaxCaptures | size_t | MaxCaptures |
MaxStates | size_t | MaxStates |
MaxCompiledBytes | size_t | MaxCompiledBytes |
typedef struct xpatternconfig { uint32 Flags; xstrview Separators; size_t MaxPatternBytes; size_t MaxPatterns; size_t MaxCaptures; size_t MaxStates; size_t MaxCompiledBytes; uint32 Reserved[4]; } xpatternconfig;
xpatternspec类型
Value 仅作为借用值随命中返回,XRT 不获取或释放其所有权。
| 字段 | 类型 | 语义 |
|---|
Pattern | xstrview | 模式串 |
Value | ptr | 值 |
Priority | int32 | 优先级 |
Flags | uint32 | 标志位 |
typedef struct xpatternspec { xstrview Pattern; ptr Value; int32 Priority; uint32 Flags; } xpatternspec;
xpatternmatch类型
{name} 捕获非空字段,也可写成 prefix{name}suffix;一个字段至多一个普通 捕获,前后缀至少一侧非空。{*name} 仍独占最终字段并可捕获空尾部。 捕获由调用方数组按模式中的出现顺序保存,PatternIndex 属于当前快照。
| 字段 | 类型 | 语义 |
|---|
Id | xpatternid | 标识 |
PatternIndex | size_t | PatternIndex |
Value | ptr | 值 |
CaptureCount | size_t | CaptureCount |
typedef struct xpatternmatch { xpatternid Id; size_t PatternIndex; ptr Value; size_t CaptureCount; } xpatternmatch;
xpatternid类型
零值永远不是有效的 Builder 条目句柄。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
typedef uint64 xpatternid;
xpattern类型
编译对象不可变、可跨线程共享并通过引用计数管理。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
typedef struct xpattern xpattern;
xpatternbuilder类型
Builder 可变且不保证并发安全;成功编译不会清空其中的模式。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
typedef struct xpatternbuilder xpatternbuilder;
一次性提取
xrtPatternConfigInit函数
初始化默认的 "/" 分隔符、严格语义和有限资源预算。
void xrtPatternConfigInit(xpatternconfig* pConfig)
xrtPatternErrorOffset函数
从 xrt.pattern 错误的机器数据中读取模式内字节位置。
bool xrtPatternErrorOffset(const xerror* pError, size_t* pOffset)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pError | 输入 | 非空、xrt.pattern 域 | 编译/匹配错误 |
pOffset | 输出 | 非空 | 接收模式内字节偏移 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已写出偏移 | — |
false | 错误不含位置数据 | 不设错 |
错误XERR_ARGUMENT — 指针为空或参数非法- 无位置数据时返回
false 且不设置错误
范例已编译验证
pattern_tour · 错误定位
!xrtPatternErrorOffset(pError, &iOffset) ) {
xrtPatternErrorPattern函数
从批量编译错误的机器数据中读取失败模式索引。
bool xrtPatternErrorPattern(const xerror* pError, size_t* pPatternIndex)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pError | 输入 | 非空、xrt.pattern 域 | 批量编译错误 |
pPatternIndex | 输出 | 非空 | 接收失败模式索引 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已写出索引 | — |
false | 错误不含模式索引 | 不设错 |
错误XERR_ARGUMENT — 指针为空或参数非法- 无模式索引时返回
false 且不设置错误
范例已编译验证
pattern_tour · 失败模式定位
!xrtPatternErrorPattern(pError, &iBadIndex) ||
批量编译与匹配
xrtPatternCompile函数
使用默认配置编译一条可重复匹配的模式。
xpattern* xrtPatternCompile(xstrview Pattern)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 不可变编译对象(引用 1) | — |
NULL | 编译失败 | xrt.pattern 域错误 |
错误xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算XERR_MEMORY — 编译或扩容分配失败
范例已编译验证
pattern_tour · 单条编译
xpattern* pBad = xrtPatternCompile(SV("{a}{b}"));
xrtPatternCompileConfig函数
使用高级配置编译一条可重复匹配的模式。
xpattern* xrtPatternCompileConfig(xstrview Pattern, const xpatternconfig* pConfig)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
Pattern | 输入 | 借用 | 模式表达式 |
pConfig | 输入 | 非空 | 分隔符与预算配置 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 不可变编译对象(引用 1) | — |
NULL | 编译失败 | xrt.pattern 域错误 |
错误xrt.pattern / XPATTERN_ERROR_CONFIG(XERR_ARGUMENT) — 配置字段非法、保留字段非零或花括号被配置为分隔符xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算XERR_MEMORY — 编译或扩容分配失败
范例已编译验证
pattern_tour · 单条编译(自定义配置)
pSingle = xrtPatternCompileConfig(SV("{user}@{host}"), &Config);
xrtPatternCompileMany函数
使用默认配置把多条模式编译成一个不可变匹配程序。
xpattern* xrtPatternCompileMany(const xpatternspec* arrSpec, size_t iCount)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
arrSpec | 输入 | 非空数组 | 模式规格 |
iCount | 输入 | > 0 | 模式数量 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 不可变编译对象(引用 1) | — |
NULL | 编译失败 | xrt.pattern 域错误 |
错误XERR_ARGUMENT — 指针为空或参数非法xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算xrt.pattern / XPATTERN_ERROR_CONFLICT(XERR_EXISTS) — 不可区分模式具有相同优先级XERR_MEMORY — 编译或扩容分配失败
范例已编译验证
pattern_tour · 批量编译
xpattern* pBadMany = xrtPatternCompileMany(BadSpecs, 2u);
xrtPatternCompileManyConfig函数
使用高级配置把多条模式编译成一个不可变匹配程序。
xpattern* xrtPatternCompileManyConfig(const xpatternspec* arrSpec, size_t iCount, const xpatternconfig* pConfig)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
arrSpec | 输入 | 非空数组 | 模式规格 |
iCount | 输入 | > 0 | 模式数量 |
pConfig | 输入 | 非空 | 分隔符与预算配置 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 不可变编译对象(引用 1) | — |
NULL | 编译失败 | xrt.pattern 域错误 |
错误XERR_ARGUMENT — 指针为空或参数非法xrt.pattern / XPATTERN_ERROR_CONFIG(XERR_ARGUMENT) — 配置字段非法、保留字段非零或花括号被配置为分隔符xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算xrt.pattern / XPATTERN_ERROR_CONFLICT(XERR_EXISTS) — 不可区分模式具有相同优先级XERR_MEMORY — 编译或扩容分配失败
范例已编译验证
pattern_tour · 批量编译(自定义配置)
pMulti = xrtPatternCompileManyConfig(Specs, 2u, &Config);
xrtPatternRef函数
增加不可变编译对象引用并返回原指针。
xpattern* xrtPatternRef(xpattern* pPattern)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pPattern | 输入 | 非空 | 目标编译对象 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 原指针,引用 +1 | — |
NULL | 参数非法 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
pattern_tour · 共享引用
(xrtPatternRef(pSingle) != pSingle) ||
xrtPatternRelease函数
释放不可变编译对象引用;归零时释放单块存储。
void xrtPatternRelease(xpattern* pPattern)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pPattern | 输入 | 允许空 | 空 = 空操作 |
范例已编译验证
pattern · 释放引用
xrtPatternRelease(pPattern);
xrtPatternCount函数
返回编译对象中的模式数量。
size_t xrtPatternCount(const xpattern* pPattern)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pPattern | 输入 | 非空 | 目标编译对象 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
pattern_tour · 模式数量
(xrtPatternCount(pSingle) != 1u) ||
xrtPatternCompiledBytes函数
返回编译对象实际占用的单块存储字节数。
size_t xrtPatternCompiledBytes(const xpattern* pPattern)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pPattern | 输入 | 非空 | 目标编译对象 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
pattern_tour · 存储占用
(xrtPatternCompiledBytes(pSingle) == 0u) ||
xrtPatternSeparators函数
返回编译对象复制并归一化后的分隔符集合。
xstrview xrtPatternSeparators(const xpattern* pPattern)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pPattern | 输入 | 非空 | 目标编译对象 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 视图 | 分隔符借用(对象存活期有效) | — |
| 空视图 | 参数非法 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
pattern_tour · 分隔符集合
(xrtPatternSeparators(pSingle).Size != 2u) ||
xrtPatternSource函数
返回指定模式的原始表达式视图。
xstrview xrtPatternSource(const xpattern* pPattern, size_t iPattern)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pPattern | 输入 | 非空 | 目标编译对象 |
iPattern | 输入 | < 模式数量 | 模式索引 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 视图 | 表达式借用 | — |
| 空视图 | 索引越界 | XERR_RANGE |
错误XERR_RANGE — 模式索引越界;空句柄 XERR_ARGUMENT
范例已编译验证
pattern_tour · 原始表达式
(xrtPatternSource(pSingle, 0u).Size != 13u) ||
xrtPatternId函数
返回指定模式的稳定 Builder ID;直接批量编译时 ID 也保持非零。
xpatternid xrtPatternId(const xpattern* pPattern, size_t iPattern)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pPattern | 输入 | 非空 | 目标编译对象 |
iPattern | 输入 | < 模式数量 | 模式索引 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非零 | 稳定 ID | — |
0 | 索引越界或句柄为空 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 句柄为空XERR_RANGE — 模式索引越界
范例已编译验证
pattern_tour · 稳定 ID
(xrtPatternId(pSingle, 0u) == XPATTERN_ID_INVALID) ||
xrtPatternValue函数
返回指定模式携带的借用值。
ptr xrtPatternValue(const xpattern* pPattern, size_t iPattern)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pPattern | 输入 | 非空 | 目标编译对象 |
iPattern | 输入 | < 模式数量 | 模式索引 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 值 | xpatternspec.Value 原样返回 | — |
NULL | 未携带或索引越界 | XERR_RANGE |
错误XERR_ARGUMENT — 句柄为空XERR_RANGE — 模式索引越界
范例已编译验证
pattern_tour · 携带值
(xrtPatternValue(pMulti, 0u) != (ptr)"Jane") ||
xrtPatternCaptureCount函数
返回指定模式的捕获数量。
size_t xrtPatternCaptureCount(const xpattern* pPattern, size_t iPattern)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pPattern | 输入 | 非空 | 目标编译对象 |
iPattern | 输入 | < 模式数量 | 模式索引 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
pattern_tour · 捕获数量
(xrtPatternCaptureCount(pSingle, 0u) != 2u) ||
xrtPatternMaxCaptureCount函数
返回整个编译对象中单条模式所需的最大捕获数量。
size_t xrtPatternMaxCaptureCount(const xpattern* pPattern)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pPattern | 输入 | 非空 | 目标编译对象 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
pattern_tour · 最大捕获数
(xrtPatternMaxCaptureCount(pSingle) != 2u) ||
xrtPatternCaptureName函数
返回指定捕获的借用名称。
bool xrtPatternCaptureName(const xpattern* pPattern, size_t iPattern, size_t iCapture, xstrview* pName)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pPattern | 输入 | 非空 | 目标编译对象 |
iPattern | 输入 | < 模式数量 | 模式索引 |
iCapture | 输入 | < 该模式捕获数 | 捕获索引 |
pName | 输出 | 非空 | 接收名称视图 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已写出名称 | — |
false | 无名称或索引越界 | 不设错 |
错误- 无名称或索引越界返回
false 且不设置错误;句柄为空 XERR_ARGUMENT
范例已编译验证
pattern_tour · 捕获名称
!xrtPatternCaptureName(pSingle, 0u, 0u, &Captures[2]) ||
xrtPatternCaptureIndex函数
按名称查找捕获索引,未找到时返回 XRT_NPOS。
size_t xrtPatternCaptureIndex(const xpattern* pPattern, size_t iPattern, xstrview Name)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pPattern | 输入 | 非空 | 目标编译对象 |
iPattern | 输入 | < 模式数量 | 模式索引 |
Name | 输入 | 借用 | 捕获名称 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 索引 | 命中的捕获索引 | — |
XRT_NPOS | 未找到 | 不设错 |
错误- 未找到返回
XRT_NPOS 且不设置错误;句柄为空 XERR_ARGUMENT
范例已编译验证
pattern_tour · 按名查找捕获
(xrtPatternCaptureIndex(pSingle, 0u, SV("host")) != 1u) ) {
xrtPatternLookup函数
只选择最优模式,不记录或输出捕获。
xpatternresult xrtPatternLookup(const xpattern* pPattern, xstrview Text, xpatternmatch* pMatch)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pPattern | 输入 | 非空 | 目标编译对象 |
Text | 输入 | 借用 | 待匹配文本 |
pMatch | 输出 | 允许空 | 接收命中模式信息 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
XPATTERN_MATCH | 命中一条模式 | — |
XPATTERN_NONE | 没有模式匹配 | 不设错误 |
XPATTERN_ERROR | 参数、容量或预算失败 | xrt.pattern 域错误 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
pattern_tour · 最优选择
if ( (xrtPatternLookup(pMulti, SV("mail/hello"),
&Match) != XPATTERN_MATCH) ||
(Match.PatternIndex != 1u) ||
(Match.Value != (ptr)"Mailbox") ||
(xrtPatternLookup(pMulti, SV("nothing"),
&Match) != XPATTERN_NONE) ) {
xrtPatternMatch函数
选择最优模式并按出现顺序输出借用 Text 的捕获视图。
xpatternresult xrtPatternMatch(const xpattern* pPattern, xstrview Text, xstrview* arrCapture, size_t iCapacity, xpatternmatch* pMatch)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pPattern | 输入 | 非空 | 目标编译对象 |
Text | 输入 | 借用 | 待匹配文本 |
arrCapture | 输出 | 容量足够时非空 | 捕获视图数组 |
iCapacity | 输入 | — | 捕获容量 |
pMatch | 输出 | 允许空 | 接收命中模式信息 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
XPATTERN_MATCH | 命中一条模式 | — |
XPATTERN_NONE | 没有模式匹配 | 不设错误 |
XPATTERN_ERROR | 参数、容量或预算失败 | xrt.pattern 域错误 |
错误XERR_ARGUMENT — 指针为空或参数非法xrt.pattern / XPATTERN_ERROR_CAPACITY(XERR_RANGE) — 捕获输出容量不足;pCaptureCount 写入所需数量,不产生部分捕获
范例已编译验证
pattern · 选择并捕获
if ( xrtPatternMatch(
pPattern,
XRT_STR_LITERAL("/users/admin/item-42.json"),
arrCapture,
2u,
&Match
) == XPATTERN_MATCH ) {
xrtPatternTest函数
只判断是否有模式匹配,不返回模式或捕获。
xpatternresult xrtPatternTest(const xpattern* pPattern, xstrview Text)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pPattern | 输入 | 非空 | 目标编译对象 |
Text | 输入 | 借用 | 待匹配文本 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
XPATTERN_MATCH | 命中一条模式 | — |
XPATTERN_NONE | 没有模式匹配 | 不设错误 |
XPATTERN_ERROR | 参数、容量或预算失败 | xrt.pattern 域错误 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
pattern_tour · 存在性判断
if ( (xrtPatternTest(pMulti, SV("a@b")) != XPATTERN_MATCH) ||
(xrtPatternTest(pMulti, SV("-")) != XPATTERN_NONE) ) {
动态模式
xrtPatternBuilderCreate函数
使用默认配置创建空 Builder。
xpatternbuilder* xrtPatternBuilderCreate()
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | Builder | — |
NULL | 分配失败 | XERR_MEMORY |
范例已编译验证
pattern · 创建 Builder
xpatternbuilder* pBuilder = xrtPatternBuilderCreate();
xrtPatternBuilderCreateConfig函数
使用高级配置创建空 Builder;分隔符会立即被复制。
xpatternbuilder* xrtPatternBuilderCreateConfig(const xpatternconfig* pConfig)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pConfig | 输入 | 非空 | 分隔符与预算配置 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | Builder | — |
NULL | 失败 | xrt.pattern 域错误 |
错误xrt.pattern / XPATTERN_ERROR_CONFIG(XERR_ARGUMENT) — 配置字段非法、保留字段非零或花括号被配置为分隔符XERR_MEMORY — 编译或扩容分配失败
范例已编译验证
pattern_tour · 创建 Builder(自定义配置)
pBuilder = xrtPatternBuilderCreateConfig(&Config);
xrtPatternBuilderFree函数
释放 Builder、其中复制的模式以及内部缓存的编译快照。
void xrtPatternBuilderFree(xpatternbuilder* pBuilder)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pBuilder | 输入 | 允许空 | 空 = 空操作 |
范例已编译验证
pattern · 释放 Builder
xrtPatternBuilderFree(pBuilder);
xrtPatternBuilderClear函数
清空全部条目并使已有 ID 失效,同时保留已分配槽容量。
void xrtPatternBuilderClear(xpatternbuilder* pBuilder)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pBuilder | 输入 | 非空 | 目标 Builder |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
pattern_tour · 清空条目
xrtPatternBuilderClear(pBuilder);
xrtPatternBuilderReserve函数
保证 Builder 至少可保存指定数量的活动条目。
bool xrtPatternBuilderReserve(xpatternbuilder* pBuilder, size_t iCapacity)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pBuilder | 输入 | 非空 | 目标 Builder |
iCapacity | 输入 | — | 期望容量 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 容量已保证 | — |
false | 扩容失败 | XERR_MEMORY / XERR_RANGE |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_MEMORY — 槽数组扩容失败XERR_RANGE — 容量引起尺寸溢出
范例已编译验证
pattern_tour · 预留容量
!xrtPatternBuilderReserve(pBuilder, 8u) ||
xrtPatternBuilderCount函数
返回 Builder 中的活动条目数量。
size_t xrtPatternBuilderCount(const xpatternbuilder* pBuilder)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pBuilder | 输入 | 非空 | 目标 Builder |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
pattern_tour · 条目数量
(xrtPatternBuilderCount(pBuilder) != 1u) ||
xrtPatternBuilderVersion函数
返回每次成功结构修改后递增的版本。
uint64 xrtPatternBuilderVersion(const xpatternbuilder* pBuilder)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pBuilder | 输入 | 非空 | 目标 Builder |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
pattern_tour · 结构版本
iVersion = xrtPatternBuilderVersion(pBuilder);
xrtPatternBuilderDirty函数
判断 Builder 是否存在尚未成功编译的结构修改。
bool xrtPatternBuilderDirty(const xpatternbuilder* pBuilder)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pBuilder | 输入 | 非空 | 目标 Builder |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 是有未编译修改 | — |
false | 不是有未编译修改 | — |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
pattern_tour · 未编译修改
!xrtPatternBuilderDirty(pBuilder) ) {
xrtPatternBuilderAdd函数
复制并追加一条模式,返回稳定代际 ID。
xpatternid xrtPatternBuilderAdd(xpatternbuilder* pBuilder, const xpatternspec* pSpec)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pBuilder | 输入/输出 | 非空 | 目标 Builder |
pSpec | 输入 | 非空 | 模式规格 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非零 | 稳定代际 ID | — |
0 | 追加失败 | xrt.pattern 域错误 |
错误XERR_ARGUMENT — 指针为空或参数非法xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算XERR_MEMORY — 编译或扩容分配失败
范例已编译验证
pattern · 追加模式
(xrtPatternBuilderAdd(pBuilder, &Spec) == XPATTERN_ID_INVALID) ) {
xrtPatternBuilderAddMany函数
原子追加一批模式;任意一条失败时 Builder 保持不变。
bool xrtPatternBuilderAddMany(xpatternbuilder* pBuilder, const xpatternspec* arrSpec, size_t iCount, xpatternid* arrId)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pBuilder | 输入/输出 | 非空 | 目标 Builder |
arrSpec | 输入 | 非空数组 | 模式规格数组 |
iCount | 输入 | > 0 | 追加数量 |
arrId | 输出 | 允许空 | 接收各条 ID |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 全部追加成功 | — |
false | 任一条失败,Builder 保持不变 | xrt.pattern 域错误 |
错误XERR_ARGUMENT — 指针为空或参数非法xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算XERR_MEMORY — 编译或扩容分配失败
范例已编译验证
pattern_tour · 批量追加
if ( !xrtPatternBuilderAddMany(pBuilder, More, 2u,
Ids) ||
(Ids[0] == XPATTERN_ID_INVALID) ||
(Ids[1] == XPATTERN_ID_INVALID) ||
(xrtPatternBuilderCount(pBuilder) != 3u) ) {
xrtPatternBuilderSet函数
替换有效 ID 的模式和值,同时保留 ID 与原始注册顺序。
bool xrtPatternBuilderSet(xpatternbuilder* pBuilder, xpatternid Id, const xpatternspec* pSpec)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pBuilder | 输入/输出 | 非空 | 目标 Builder |
Id | 输入 | 有效 ID | 目标条目 |
pSpec | 输入 | 非空 | 新模式规格 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已替换,版本递增 | — |
false | ID 陈旧或规格失败 | xrt.pattern 域错误 |
错误XERR_ARGUMENT — 指针为空或参数非法- ID 不存在或已因清空失效返回
false 且不设置错误 xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算XERR_MEMORY — 编译或扩容分配失败
范例已编译验证
pattern_tour · 替换模式
if ( !xrtPatternBuilderSet(pBuilder, IdUser, &Extra) ||
!xrtPatternBuilderRemove(pBuilder, Ids[1]) ||
(xrtPatternBuilderCount(pBuilder) != 2u) ||
xrtPatternBuilderRemove(pBuilder, Ids[1]) ) {
xrtPatternBuilderRemove函数
删除有效 ID;不存在或陈旧 ID 返回 false,但不属于执行错误。
bool xrtPatternBuilderRemove(xpatternbuilder* pBuilder, xpatternid Id)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pBuilder | 输入/输出 | 非空 | 目标 Builder |
Id | 输入 | 有效 ID | 目标条目 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已删除,版本递增 | — |
false | ID 不存在或陈旧 | 不设错误 |
错误- 不存在或陈旧 ID 返回
false 且不设置错误;句柄为空 XERR_ARGUMENT
范例已编译验证
pattern_tour · 删除模式
!xrtPatternBuilderRemove(pBuilder, Ids[1]) ||
xrtPatternBuilderCompile函数
编译当前版本并返回新引用;无修改时复用缓存,失败不影响上一个快照,也不会撤销等待修正的修改。
xpattern* xrtPatternBuilderCompile(xpatternbuilder* pBuilder)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pBuilder | 输入 | 非空 | 目标 Builder |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 当前版本的编译快照(新引用) | — |
NULL | 编译失败 | xrt.pattern 域错误 |
错误XERR_ARGUMENT — 指针为空或参数非法xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算xrt.pattern / XPATTERN_ERROR_CONFLICT(XERR_EXISTS) — 不可区分模式具有相同优先级XERR_MEMORY — 编译或扩容分配失败
范例已编译验证
pattern · 编译快照
pPattern = xrtPatternBuilderCompile(pBuilder);
补充参考 · 契约见公共头注释
xrtPatternBuilderContains函数
契约注释见公共头文件。
XRT_API bool xrtPatternBuilderContains(const xpatternbuilder* pBuilder, xpatternid Id)
xrtPatternBuilderPrepareAdd函数
契约注释见公共头文件。
XRT_API xpatternedit* xrtPatternBuilderPrepareAdd(xpatternbuilder* pBuilder, const xpatternspec* arrSpec, size_t iCount)
xrtPatternBuilderPrepareSet函数
契约注释见公共头文件。
XRT_API xpatternedit* xrtPatternBuilderPrepareSet(xpatternbuilder* pBuilder, xpatternid Id, const xpatternspec* pSpec)
xrtPatternBuilderPrepareRemove函数
契约注释见公共头文件。
XRT_API xpatternedit* xrtPatternBuilderPrepareRemove(xpatternbuilder* pBuilder, xpatternid Id)
xrtPatternBuilderPrepareClear函数
契约注释见公共头文件。
XRT_API xpatternedit* xrtPatternBuilderPrepareClear(xpatternbuilder* pBuilder)
xrtPatternEditFree函数
契约注释见公共头文件。
XRT_API void xrtPatternEditFree(xpatternedit* pEdit)
xrtPatternEditReady函数
契约注释见公共头文件。
XRT_API bool xrtPatternEditReady(const xpatternedit* pEdit)
xrtPatternEditCount函数
契约注释见公共头文件。
XRT_API size_t xrtPatternEditCount(const xpatternedit* pEdit)
xrtPatternEditId函数
契约注释见公共头文件。
XRT_API xpatternid xrtPatternEditId(const xpatternedit* pEdit, size_t iIndex)
xrtPatternEditCommit函数
契约注释见公共头文件。
XRT_API bool xrtPatternEditCommit(xpatternedit* pEdit)
常量索引常量
以下常量在本页所属头文件中定义,语义见公共头注释。
| 常量 | 说明 |
| XPATTERN_CAPTURES_DEFAULT | 见头文件注释 |
| XPATTERN_COMPILED_DEFAULT | 见头文件注释 |
| XPATTERN_ERROR | 见头文件注释 |
| XPATTERN_ERROR_CAPACITY | 见头文件注释 |
| XPATTERN_ERROR_CONFIG | 见头文件注释 |
| XPATTERN_ERROR_CONFLICT | 见头文件注释 |
| XPATTERN_ERROR_LIMIT | 见头文件注释 |
| XPATTERN_ERROR_PATTERN | 见头文件注释 |
| XPATTERN_ID_INVALID | 见头文件注释 |
| XPATTERN_MATCH | 见头文件注释 |
| XPATTERN_NONE | 见头文件注释 |
| XPATTERN_PATTERNS_DEFAULT | 见头文件注释 |
| XPATTERN_PATTERN_DEFAULT | 见头文件注释 |
| XPATTERN_STATES_DEFAULT | 见头文件注释 |