Skip to main content

Crate msime_engine_capi

Crate msime_engine_capi 

Source
Expand description

水杉输入法引擎的 C ABI:把核心层 msime_engine::Session 包成带版本的 C 函数,符号一律以 msime_engine_ 开头,头文件是 cbindgen 生成并提交的 include/msime_engine.h。

设计与取舍见 .agents/notes/implemented/architecture/2026-10-29-engine-capi.md,给 C 采用方的用法(生命周期、按键路由、线程、内存、要带的数据文件、许可证)见 crate 的 README。这里只包核心层,不包 host 门面,也不扩展 host-api。

Structs§

msime_engine_candidate
一行候选(ABI 1.0),msime_engine_candidate_get 填写,收发规则同 msime_engine_result,字符串的有效期同 msime_engine_state。
msime_engine_paths
运行时的四个根目录(ABI 1.0),都要是绝对路径,UTF-8。库只读 min(调用方大小, 库内大小) 个字节,读不到的字段按全零处理。
msime_engine_result
一次按键、命令或选择的结果(ABI 1.0)。调用前把 struct_size 设为 sizeof(msime_engine_result);库写入 min(调用方大小, 库内大小) 个字节,把 struct_size 改成写入的大小,多出的部分清零。commit 和 diagnostic 借自会话,到同一会话下一次改变状态的调用为止有效。
msime_engine_session
不透明的会话句柄,由 msime_engine_session_new 建、msime_engine_session_free 释放。
msime_engine_state
组字状态(ABI 1.0),msime_engine_state_get 填写,收发规则同 msime_engine_result。字符串借自会话按修订号缓存的快照,msime_engine_state_get、msime_engine_candidate_get 这类只读调用不让它们失效。
msime_engine_str
库借给调用方的一段 UTF-8 文本:len 个字节,不以 NUL 结尾,按长度读。空串时 ptr 也不是 NULL。指向会话里缓存的数据,有效期见各个函数:热路径上的都到同一会话下一次改变状态的调用为止。

Constants§

MSIME_ENGINE_ABI_MAJOR
ABI 主版本。同一个主版本内只追加函数、常量和结构体尾部的字段,不改已有的含义;Linux 的 SONAME 带的就是它(libmsime_engine.so.1)。
MSIME_ENGINE_ABI_MINOR
ABI 次版本,每次追加加一。调用方可以按 msime_engine_abi_version() 判断运行时的库有没有某个后加的函数。
MSIME_ENGINE_BUSY
会话正被另一个线程调用(同一会话的调用不能并发),或者词库正被别的会话、别的进程占着(维护要等所有会话关掉)。什么也没做,稍后重试。
MSIME_ENGINE_CANDIDATE_ANSWERS_KEY
msime_engine_candidate::flags:这一行回答的是整段输入,不是它的前缀或更长的补全。
MSIME_ENGINE_CANDIDATE_FUZZY
msime_engine_candidate::flags:按模糊音读出的行。
MSIME_ENGINE_CANDIDATE_SENTENCE
msime_engine_candidate::flags:整句联想解出的整句。
MSIME_ENGINE_CARET_END
msime_engine_set_caret 的 caret_byte 取这个值(或任何负数)时光标回到末尾。
MSIME_ENGINE_COMMAND_BACKSPACE
MSIME_ENGINE_COMMAND_CANCEL
丢弃组字(Esc)。越南文和藏文的第一次只把显示切回按键原文,再发一次才丢弃;开着可打开的候选列表(韩文汉字)时第一次只关列表。
MSIME_ENGINE_COMMAND_COMMIT_CANDIDATE
上屏首选(引擎顺序的第 0 行)。宿主自己高亮了别的行时用 msime_engine_select。
MSIME_ENGINE_COMMAND_COMMIT_RAW
上屏按键原文(回车)。专用英文里打的词学进英文词库;选项 english.learn_typed_spellings_on_enter 打开时,临时英文的字母和拼不成音节的拼音也学。
MSIME_ENGINE_COMMAND_COMMIT_RAW_WITHOUT_LEARNING
ABI 1.1 起:与 COMMIT_RAW 上屏同样的原文,但不学英文词(例如宿主的 Shift+回车)。1.0 的库对它返回 MSIME_ENGINE_UNSUPPORTED。
MSIME_ENGINE_COMMAND_COMMIT_READING
只用于日文:上屏假名读音。
MSIME_ENGINE_COMMAND_CONVERSION_LEFT
整句改字的光标左移一个字;进不了改字时与 MOVE_LEFT 相同。
MSIME_ENGINE_COMMAND_CONVERSION_RIGHT
整句改字的光标右移一个字;不在改字里时与 MOVE_RIGHT 相同。
MSIME_ENGINE_COMMAND_CYCLE_KANA_VARIANT
只用于日文:切换假名写法。
MSIME_ENGINE_COMMAND_DELETE_FORWARD
MSIME_ENGINE_COMMAND_MOVE_END
MSIME_ENGINE_COMMAND_MOVE_HOME
MSIME_ENGINE_COMMAND_MOVE_LEFT
MSIME_ENGINE_COMMAND_MOVE_RIGHT
MSIME_ENGINE_COMMAND_OPEN_CANDIDATE_LIST
打开或关闭当前方案可打开的候选列表:韩文当前音节的汉字、注音整句的其他转换。
MSIME_ENGINE_EDGE_FIRST_HAN
msime_engine_select_edge 的 edge:上屏这一行的第一个汉字。
MSIME_ENGINE_EDGE_LAST_HAN
msime_engine_select_edge 的 edge:上屏这一行的最后一个汉字。
MSIME_ENGINE_FAILED
引擎没能完成操作(例如换到一个没有词库的方案)。
MSIME_ENGINE_FLUSH_STOP_THREAD
msime_engine_flush_learning 的 flags:写完之后停掉后台写线程并等它结束。卸载库或退出进程前用;之后会话照常可用,下一次学习重新起线程。
MSIME_ENGINE_FREQUENCY_DISABLED
不调频:选词不改变以后的排序(缺省)。
MSIME_ENGINE_FREQUENCY_HALVE
选中的词挪到原位置的一半处:下标 n 挪到 n/2(下标从 0 数)。
MSIME_ENGINE_FREQUENCY_LINEAR
选中的词前移 linear_step 位。
MSIME_ENGINE_FREQUENCY_PIN
选中的词直接排到首位。
MSIME_ENGINE_FREQUENCY_PROMOTE
选中的词前移一位;下标大于 4 的直接挪到下标 4(第 5 位)。
MSIME_ENGINE_INVALID_ARGUMENT
参数不合法:选项 JSON 有未知键或取值不对、索引越界、不是 UTF-8、struct_size 比 1.0 的布局还小等。
MSIME_ENGINE_KEY_SHIFT_ONLY
msime_engine_key_char 的 flags:这是单独按下的 Shift 加字母(大写字母开本地模式的入口)。
MSIME_ENGINE_LOCAL_MODE_CHAIZI
MSIME_ENGINE_LOCAL_MODE_COMMAND
MSIME_ENGINE_LOCAL_MODE_DATE_TIME
MSIME_ENGINE_LOCAL_MODE_EMOJI
MSIME_ENGINE_LOCAL_MODE_EXPRESSION
MSIME_ENGINE_LOCAL_MODE_KAOMOJI
MSIME_ENGINE_LOCAL_MODE_MENTION
MSIME_ENGINE_LOCAL_MODE_NONE
MSIME_ENGINE_LOCAL_MODE_QUICK_PHRASE
MSIME_ENGINE_LOCAL_MODE_SUPER_JIANPIN
MSIME_ENGINE_LOCAL_MODE_SYMBOL
MSIME_ENGINE_LOCAL_MODE_TEMPORARY_ENGLISH
MSIME_ENGINE_LOCAL_MODE_TEMPORARY_JAPANESE
MSIME_ENGINE_LOCAL_MODE_UNICODE
MSIME_ENGINE_LOCAL_MODE_URL
MSIME_ENGINE_MODEL_JAPANESE
msime_engine_preload_model 的 kind:msime-japanese.dat。
MSIME_ENGINE_NULL
必需的指针参数是 NULL。
MSIME_ENGINE_OK
成功。
MSIME_ENGINE_OPTION_CHINESE_PUNCT
整数:中文标点开关,0 或 1。
MSIME_ENGINE_OPTION_DEDICATED_ENGLISH
整数:专用英文模式,0 或 1;只在模式真的改变时丢弃组字。
MSIME_ENGINE_OPTION_FIRST_PAGE_ROWS
整数:宿主每页的候选数(1 到 255);决定全长组的同音词够多少行就不再并入更长的补全词。
MSIME_ENGINE_OPTION_FREQUENCY_LINEAR_STEP
整数,ABI 1.1 起:MSIME_ENGINE_FREQUENCY_LINEAR 每次前移几位(1 到 10),与选项 frequency.linear_step 相同。
MSIME_ENGINE_OPTION_FREQUENCY_MODE
整数,ABI 1.1 起:调频方式,MSIME_ENGINE_FREQUENCY_*,与选项 frequency.mode 相同。从下一次选择起按新方式学,已经学下的排序照旧生效,眼前的候选不重排。
MSIME_ENGINE_OPTION_FREQUENCY_TRIGGER_COUNT
整数,ABI 1.1 起:同一个词要被选中几次才挪位(1 到 10),与选项 frequency.trigger_count 相同。
MSIME_ENGINE_OPTION_HELPCODE_ENABLED
整数:辅助码开关(全拼和双拼一起),0 或 1。
MSIME_ENGINE_OPTION_HELPCODE_SCHEMA
字符串:辅助码表名,例如 wubi86;读不到表时 MSIME_ENGINE_FAILED。
MSIME_ENGINE_OPTION_PAIRED_PUNCT
整数:成对标点开关,0 或 1。
MSIME_ENGINE_OPTION_PERSONAL_CONTEXT
整数:个人上下文学习(词序与搭配),0 或 1;关掉时也结束当前上下文。
MSIME_ENGINE_OPTION_PREDICTION_ALLOWED
整数:宿主的即时隐私门禁,0 时清掉上屏后联想、之后不再给出,选项 next_word_prediction 本身不变。
MSIME_ENGINE_OPTION_PUNCT_LOCK
整数:标点锁,0 跟随模式、1 强制中文、2 强制 ASCII。
MSIME_ENGINE_OPTION_RESCORING_CONTEXT
字符串:整句模型参照的已上屏文字(只看最后 64 个字),宿主在光标前文字变化时交来。
MSIME_ENGINE_OPTION_WUBI_MIXED_PINYIN
整数,ABI 1.1 起:五笔拼音混输(码表没有时按全拼出字),0 或 1,与选项 wubi.mixed_pinyin 相同;五笔组字中切换时立即按新设置重查候选。
MSIME_ENGINE_PANIC
之前的某次调用在库里 panic 了,会话已作废,只能 msime_engine_session_free。进程级函数 panic 时也返回它,但不作废任何东西。
MSIME_ENGINE_SCHEME_CANTONESE
MSIME_ENGINE_SCHEME_JAPANESE
MSIME_ENGINE_SCHEME_KOREAN
MSIME_ENGINE_SCHEME_QUANPIN
MSIME_ENGINE_SCHEME_SHUANGPIN
MSIME_ENGINE_SCHEME_STROKE
MSIME_ENGINE_SCHEME_TIBETAN
MSIME_ENGINE_SCHEME_VIETNAMESE
MSIME_ENGINE_SCHEME_WUBI
MSIME_ENGINE_SCHEME_ZHUYIN
MSIME_ENGINE_SOURCE_AI_PENDING
MSIME_ENGINE_SOURCE_AI_SUGGESTION
MSIME_ENGINE_SOURCE_CLOUD_PENDING
MSIME_ENGINE_SOURCE_CLOUD_SUGGESTION
MSIME_ENGINE_SOURCE_COLLOCATION
MSIME_ENGINE_SOURCE_CONTACT
MSIME_ENGINE_SOURCE_DATABASE
MSIME_ENGINE_SOURCE_EMOJI
emoji 行,也用于打拼音出符号的符号行:选中时整段上屏,不学习。
MSIME_ENGINE_SOURCE_ENGLISH_DICTIONARY
MSIME_ENGINE_SOURCE_FALLBACK
解码器给不出词时的原文或兜底行。
MSIME_ENGINE_SOURCE_GENERATED
词格解出的整句。
MSIME_ENGINE_SOURCE_KAOMOJI
MSIME_ENGINE_SOURCE_MIXED_JAPANESE
MSIME_ENGINE_SOURCE_MULTILINGUAL
MSIME_ENGINE_SOURCE_NEURAL_KEYBOARD
MSIME_ENGINE_SOURCE_PLUGIN
MSIME_ENGINE_SOURCE_QUICK_PHRASE
MSIME_ENGINE_SOURCE_USER_DATABASE
MSIME_ENGINE_STALE
传入的 revision 不是会话当前的候选修订号:候选已经变了,先重新 msime_engine_state_get。
MSIME_ENGINE_STATE_CANDIDATE_LIST_OPEN
msime_engine_state::flags:方案可打开的候选列表(韩文汉字)正开着。
MSIME_ENGINE_STATE_DEDICATED_ENGLISH
msime_engine_state::flags:专用英文模式开着。
MSIME_ENGINE_STATE_PREDICTION
msime_engine_state::flags:候选是上屏后的联想,只接受显式选择,空格、回车不上屏它们。
MSIME_ENGINE_STATE_TAKES_SEPARATOR
msime_engine_state::flags:此刻的 ' 是分隔符(单位与目标之间、/fy 的词之间),要按字符交给 msime_engine_key_char,不能当标点结束组字。
MSIME_ENGINE_STORAGE
SQLite 或文件系统出错。
MSIME_ENGINE_UNSUPPORTED
这个库不认识的选项编号、模型种类或标志位。
MSIME_ENGINE_USER_DICT_INCLUDE_LEARNED
msime_engine_user_dict_list 的 flags:同时列出随包多字词被学习或编辑过的拼音权重。

Functions§

msime_engine_abi_version
运行时这份库的 ABI 版本:(major << 16) | minor。主版本与编译时的 MSIME_ENGINE_ABI_MAJOR 不同就不要用它;次版本比编译时小时,后加的函数不可用。
msime_engine_candidate_get⚠
读第 index 行候选。revision 必须是当前的候选修订号,否则 MSIME_ENGINE_STALE;越界是 MSIME_ENGINE_INVALID_ARGUMENT。只读,可以先取状态再逐个取一页候选。
msime_engine_candidate_key⚠
ABI 1.1 起。数字键当选择键,引擎自己的数字选词入口:有组字时 1–9 上屏整张候选表的第 digit - 1 行(也就是第一页,msime_engine_select 的那套学习照常);越南文 VNI 和注音此刻拼写用的数字交给拼写;没有组字时不处理(handled 为 0),并且忘掉上屏的上下文,因为这个数字由宿主自己交给应用;上屏后联想的候选不接数字,按下时被清掉。digit 只收 ASCII 数字 0–9,其余是 MSIME_ENGINE_INVALID_ARGUMENT。不带修订号:它选的是调用时的候选。Unicode、日期、计算这些用数字拼写的本地模式里它照样选词,所以按键路由仍是先 msime_engine_key_char,没被处理时再用它(只显示第一页的前端)或 msime_engine_select(翻过页的前端),见 README 按键路由第 4 条。
msime_engine_clear_position⚠
取消第 index 行的固定位置。
msime_engine_close_databases
关掉所有线程上缓存着的空闲数据库连接。删除或替换数据目录之前调;正被某次调用用着的连接在那次调用结束时关。
msime_engine_command⚠
一个编辑命令(MSIME_ENGINE_COMMAND_*)。
msime_engine_expand_candidates⚠
单字母全拼只先给出一部分候选;宿主翻过第一页时调它要回其余的。*grew 写 1 表示列表变长了(修订号随之改变),否则写 0。会改变状态。
msime_engine_finish⚠
结束组字:从第 first_index 行(宿主高亮的那一行)起上屏,用于失焦、标点前或宿主自己的结束键。
msime_engine_fix_position⚠
把第 index 行固定在第 position 位(1..=5)。
msime_engine_flush_learning
立刻写下所有排着的个人上下文学习(平时延迟约 2 秒写)。flags 带 MSIME_ENGINE_FLUSH_STOP_THREAD 时再停掉后台写线程并等它结束:卸载库、退出进程前用。
msime_engine_key_char⚠
一个 ASCII 字符(0x20 到 0x7E,另收 Tab 0x09):字母、拼写用的数字,以及 spelling_symbols 里列出的符号。flags 是 MSIME_ENGINE_KEY_*。结果写进 result(可以是 NULL)。按键路由见 README。
msime_engine_key_punct⚠
一个 ASCII 标点:有组字时以首选结束组字,再接上中文标点;中文标点关着、锁成 ASCII 或这个键没有中文标点时不处理(handled 为 0),宿主自己输出这个键。宿主高亮了首选以外的行时,先用 msime_engine_finish 以那一行结束,再调这个函数。
msime_engine_last_error
本线程上一次调用失败的说明(英文,NUL 结尾),没有失败时是空串。有效到本线程下一次调用这个库为止(调它自己除外),不要释放。
msime_engine_pin⚠
把第 index 行(词库里的词)提到前面,不上屏。不支持的行不处理(handled 为 0)。
msime_engine_preload_model⚠
把模型的字节直接交给引擎,给没有文件系统或想自己读文件的宿主。kind 是 MSIME_ENGINE_MODEL_*,path 是会话读这个模型的位置(日文是 resources/msime-japanese.dat 或选项 language_dictionaries.japanese)。bytes 为 NULL 且 bytes_len 为 0 时撤掉之前交的那份。字节不是合法模型时 MSIME_ENGINE_INVALID_ARGUMENT,什么也不改。库复制一份,调用返回后 bytes 可以释放。
msime_engine_prepare_runtime⚠
准备运行时:在 user_data/dictionaries/<content_id> 原子地准备一个代次(从 resources 复制工作词库并回放学习日志),已就绪的代次只补回放。content_id 是 1 到 128 个 [0-9A-Za-z_-],随包数据变了就换一个;带点的版本号要先换掉点(dict-v2_0_39)。三个根目录必须是绝对路径、互不重叠。paths.dictionaries 不读。按全部方案准备:resources 里必须有 msime-pinyin.db 和 msime-english.db;只用其中几个方案时用 msime_engine_prepare_runtime_for,只带那几个方案的数据。成功时把代次目录写进 *dictionaries(可以是 NULL),用 msime_engine_string_free 释放;建会话时它就是 paths.dictionaries。
msime_engine_prepare_runtime_for⚠
ABI 1.1 起。同 msime_engine_prepare_runtime,只为 schemes 里的方案准备:resources 只要有这些方案读的词库。schemes 的第 n 位是序号为 n 的方案(1u << MSIME_ENGINE_SCHEME_KOREAN),要与会话选项的 enabled_schemes 相同,不能是 0,不认识的位是 MSIME_ENGINE_INVALID_ARGUMENT。有全拼、双拼或五笔时与 msime_engine_prepare_runtime 相同,要 msime-pinyin.db 和 msime-english.db;没有时两者都不要求,resources 带了 msime-english.db 就照样复制进代次(专用英文的补全与回车学词用它),没带时代次里没有它。日文的 msime-japanese.dat 和粤语、注音、笔画的语言库不经过代次,会话从 resources 或选项给的路径直接读。
msime_engine_release_caches
内存告警时调:放掉进程级缓存里没有会话在用的日文模型和个人学习模型。正在用的会话不受影响。
msime_engine_remove⚠
删掉第 index 行:用户自己的词从个人词典删除,随包的词不再出现。
msime_engine_reset_context⚠
忘掉上屏的上下文(焦点或应用变了、宿主自己插入了文字),清掉上屏后联想。
msime_engine_reset_learning⚠
清空学到的一切:换回随包的工作词库、清空学习日志。和 msime_engine_prepare_runtime 一样要求 resources 里有 msime-pinyin.db 和 msime-english.db;代次是用 msime_engine_prepare_runtime_for 准备的,就用 msime_engine_reset_learning_for 传同一个方案集合。还有会话开着时返回 MSIME_ENGINE_BUSY,什么也不换。
msime_engine_reset_learning_for⚠
ABI 1.1 起。同 msime_engine_reset_learning,只换回 schemes 读的词库,规则与 msime_engine_prepare_runtime_for 相同:没有全拼、双拼、五笔时不要求 msime-pinyin.db,msime-english.db 在 resources 里有才换回,都没有时只清空日志。schemes 的写法同 msime_engine_prepare_runtime_for。
msime_engine_select⚠
选第 index 行上屏(或消耗它覆盖的那段编码,剩下的接着组字),并照常学习。
msime_engine_select_edge⚠
以词定字:上屏第 index 行的第一个或最后一个汉字(MSIME_ENGINE_EDGE_*),丢掉其余组字。
msime_engine_session_free⚠
结束并释放会话:写下最近的学习,交还日志连接和词库租约。NULL 什么也不做。另一个线程正在调这个会话时返回 MSIME_ENGINE_BUSY、不释放;已作废的会话照样可以释放。释放之后句柄不能再用。
msime_engine_session_new⚠
按选项 JSON(版本 1,键表见 README)建一个会话,成功时把句柄写进 *session,失败时写 NULL。会话持有这两个目录上的共享词库租约,直到释放:租约在维护(msime_engine_user_dict_edit、msime_engine_reset_learning)进行时拿不到,这时返回 MSIME_ENGINE_BUSY。
msime_engine_set_caret⚠
把组字光标放到 editing_text 的第 caret_byte 个字节前;负数(MSIME_ENGINE_CARET_END)回到末尾。位置限制在可编辑的范围内,九键组码时什么也不做。
msime_engine_set_int⚠
设一个整数选项(MSIME_ENGINE_OPTION_* 里标着「整数」的)。不认识的编号是 MSIME_ENGINE_UNSUPPORTED,字符串选项或越界的值是 MSIME_ENGINE_INVALID_ARGUMENT。
msime_engine_set_log_callback⚠
ABI 1.1 起。把引擎的警告日志交给 callback,callback 为 NULL 时回到缺省:写到标准错误,每行前缀 msime: 。日志是进程级的:所有会话和库的后台线程记的都交给它,再注册一次就换掉上一个。
msime_engine_set_string⚠
设一个字符串选项(MSIME_ENGINE_OPTION_* 里标着「字符串」的),value 是 value_len 个字节的 UTF-8。不认识的编号是 MSIME_ENGINE_UNSUPPORTED,整数选项是 MSIME_ENGINE_INVALID_ARGUMENT。
msime_engine_state_get⚠
读组字状态。只读:不改变会话,之前借出的字符串照样有效。
msime_engine_state_json⚠
整个状态和全部候选的 JSON,给调试和日志用;格式不属于 ABI,随版本变化。返回的字符串用 msime_engine_string_free 释放。只读。
msime_engine_string_free⚠
释放库交出的字符串(选项以外的 JSON、路径)。NULL 什么也不做。不要用 free(),库和调用方可能用不同的分配器。
msime_engine_switch_scheme⚠
换方案(MSIME_ENGINE_SCHEME_*),丢弃组字。方案必须在选项的 enabled_schemes 里;新方案的词库打不开时失败,留在原方案、组字不动。
msime_engine_user_dict_edit⚠
改个人词典:{"previous": 条目或 null, "replacement": 条目或 null, "request_id": "..."},previous 为 null 是新增,replacement 为 null 是删除,都有是替换(previous 必须与列表里的那条完全相同)。request_id(1 到 128 个 [A-Za-z0-9_-],可以省略)让同一次编辑重试时不重复生效。还有会话开着(本进程或别的进程,包括 msime 自己的输入法)时返回 MSIME_ENGINE_BUSY,什么也不写:先释放这些路径上的会话。
msime_engine_user_dict_list⚠
列出个人词典(用户自己加的词,含自动造的词),按种类、编码、词排序,从第 offset 条起最多 limit 条(limit 为 0 时取 100)。flags 是 MSIME_ENGINE_USER_DICT_*。结果是 JSON:{"entries":[{"kind":"pinyin","key":"ni'hao","value":"你好","weight":100000}],"has_more":false},用 msime_engine_string_free 释放。
msime_engine_user_dict_validate⚠
ABI 1.1 起。按 msime_engine_user_dict_edit 收新词条(replacement)的同一套规则检查一条词条,不碰任何文件,也不需要路径:输入是一条 {"kind": "pinyin", "key": "NI HAO", "value": "你好", "weight": 100000}(weight 可以省略),合法时把规范化后的词条写进 *normalized_json(编码换成小写,拼音编码里的空格换成 ':NI HAO 成为 ni'hao),用 msime_engine_string_free 释放。词条不合法时返回 MSIME_ENGINE_INVALID_ARGUMENT,msime_engine_last_error 是引擎给的英文原因(例如 Use complete pinyin syllables separated by apostrophes or spaces),可以直接显示给用户;*normalized_json 不写。给前端在用户填编辑框时就提示,不必等到真的写入。
msime_engine_version
库的发布版本,静态的 NUL 结尾字符串,不要释放。

Type Aliases§

msime_engine_log_callback
日志回调,ABI 1.1 起。message 是一行 UTF-8 的警告(不带 msime: 前缀和换行),NUL 结尾,message_len 是不含 NUL 的字节数;只在这次调用期间有效。user_data 是注册时交来的那个指针,库不碰它。