Xavier Wang
Xavier Wang
我用一个具体的例子给你看怎么改好了,比如`lpbE_map`这个函数,改完以后长这样: ```c static void lpbE_map(lpb_Env *e, const pb_Field *f, int idx) { lua_State *L = e->L; const pb_Field *kf = pb_field(f->type, 1); const pb_Field *vf = pb_field(f->type, 2); if (kf...
多谢~ 有了sortfields很多事情就都比较好办了~
不过说起来你好像忘了改文档🤣
`local parser = protoc.new(); parser.proto3_optional = true`
Lua只支持有符号64位数,你可以使用字符串"#9...",会自动转成64位数字编码
的确有这个问题,所以在pb.c里提供了unsafe接口用于和其他C库交互。但是对于导出的话,为了性能目前的确耦合的很紧密,不太方便提供对应的数据类型。但是我可以考虑提供一个lpb.h用于提供一些不透明类型和API接口。可以先提出一下需要哪些API吗?这样可以规划下如何提供这些接口。 changnet ***@***.***>于2022年6月11日 周六18:01写道: > 当前这个库是只提供了Lua的接口,并且相关的数据结构(如lpb_State)是放在pb.c,在不修改原代码的情况下几乎无法对这个库进行二次开发 > > 例如,通过socket的协议,不能直接在c调用decode函数来解析,哪怕想重新实现一个decode接口也不行,因为include不到对应的数据结构。又或者想实现不使用lua > table而是lua栈来encode、decode,也法在不修改原代码的情况下实现。 > > 我知道大概是不会拆分的,现有的设置和Lua耦合比较紧密,拆分是需要大改。只是问一下对这事的看法 > > — > Reply to this email directly, view it on GitHub > , or...
对于第一个需求,可以考虑提供接口,但是pb终归是给Lua用的,你最终给socket也是提供给Lua具体的表的,我看不出来将读取循环放在Lua里会有什么问题。在pb.c里有创建Slice的方法,你可以用`lpb_newslice`得到一个slice,并且设置它的值,然后在Lua里传递给pb: ```Lua socket.receive(slice) local pkg = pb.decode("xxx", slice) ``` 也可以`pb.encode`到一个`pb.Buffer`,然后在C里处理。我没看出来有什么不方便的地方。你有什么**必须**的地方一定需要一个C接口的理由吗? 对于第二个,这个几乎完全是一个全新的需求,它涉及到很多麻烦的地方(比如栈上最多255个,比如如何表达嵌套数据结构)。注意到Lua的原则**table是Lua唯一的数据结构**,你的这个需求必然是小众和有限制的。如果你有这样的需求,你可以使用底层接口(buffer, slice等),完全可以用纯Lua做到这个效果,但是性能问题你自己承担。如果要用C来实现,这个就属于为了2%的需求要写98%的代码的示例了。你可以考虑fork本项目然后自己改自己用甚至开源,但是这不是本项目支持的范畴。当然同样的,如果你有非常完善的理由说明有特殊情况必须要这种接口不可(而不是为了所谓方便或者效率?)那么我会缓慢地考虑做支持(比如按顺序encode这个需求就是提了好几年我才想到办法用简单的方式做到了支持),但是时间上就不会很快了。
@changnet 既然你打算自己先实现一下试试了,那么就祝愿你能顺利实现啦,为了方便你实现,这里提几个点: 1. 不要导出任何结构,不然可能导致版本不同而类型结构不匹配,使用不透明类型做这个事。 2. 推荐你还是看看`lpb_newslice`这个函数,推荐用相同的方法做这件事: 1. 直接在pb.c里提供一些基本的函数的实现(可以把现在某些函数的static改成LUALIB_API的) 2. 单独提供一个lpb.h文件,内容可以是: ```c #include #include #include LUALIB_API int lpb_newslice(lua_State *L, const char *s, size_t len); ``` 这样,可以做到这个头文件和pb.c的完全解耦。 然后,要做的事情,就是选择暴露的函数,并且写一些可能的包装函数了~
另外关于错误处理函数:Lua接口直接报错其实是很正常的,如果要处理错误,那么应该用户那边来做`lua_pcall`
我做了一个 https://github.com/starwing/lua-protobuf/tree/capi 分支写了些初步的C API代码,你看看是不是满足你的需求。