neo c74d47dc3e 初始仓库 2 gadi atpakaļ
..
Makefile c74d47dc3e 初始仓库 2 gadi atpakaļ
README.md c74d47dc3e 初始仓库 2 gadi atpakaļ
build_ios.sh c74d47dc3e 初始仓库 2 gadi atpakaļ
parser.lua c74d47dc3e 初始仓库 2 gadi atpakaļ
pbc-lua.c c74d47dc3e 初始仓库 2 gadi atpakaļ
protobuf.lua c74d47dc3e 初始仓库 2 gadi atpakaļ
test.lua c74d47dc3e 初始仓库 2 gadi atpakaļ
test2.lua c74d47dc3e 初始仓库 2 gadi atpakaļ
testparser.lua c74d47dc3e 初始仓库 2 gadi atpakaļ

README.md

Install

Make and install protobuf.so ( or protobuf.dll in windows ) and protobuf.lua into your lua path.

Register

pb = require "protobuf"

pb.register_file "addressbook.pb"

or

file = io.open("addressbook.pb","rb")
buffer = file:read "*a"
file:close()

pb.register(buffer)

Lua parser

You can use the lua parser to register .proto file instead of .pb file .

parser = require "parser"

parser.register(filename [,path])
-- filename can be a string (single file) or a table (filename set)

See testparser.lua for detail .

parser.lua use Lpeg (http://www.inf.puc-rio.br/~roberto/lpeg/) to parser .proto file.

Message Mode

pb = require "protobuf"

pb.register_file "addressbook.pb"

stringbuffer = pb.encode("tutorial.Person", 
  {
    name = "Alice",
    id = 12345,
    phone = {
      {
        number = "87654321"
      },
    }
  })

-- If you want to get a lightuserdata(C pointer) and a length

pb.encode("tutorial.Person",
  {
    name = "Alice",
    id = 12345,
    phone = {
      {
        number = "87654321"
      },
    }
  },
  function (pointer, length)
    -- do something
  end)

For decode :

result = pb.decode("tutorial.Person", stringbuffer)
-- decode also support lightuserdata and length of data instead of a string :
-- pb.decode("tutorial.Person", buffer, length)

Pattern mode

Pattern mode is cheaper than message mode.

phone = pb.pack("tutorial.Person.PhoneNumber number","87654321")  -- pack a PhoneNumber package.
person = pb.pack("tutorial.Person name id phone","Alice",123,{phone}) -- phone list is a repeated field

-- use pb.unpack to unpack package

name, id, phone_package = pb.unpack("tutorial.Person name id phone", person)
number = pb.unpack("tutorial.Person.PhoneNumber number",unpack(phone_package[1])) -- unpack return message with { buffer, length }

Other API

pb.check(typename , field) can check the field of typename exist.

or you can use pb.check(typename) to check the typename registered.

pb.lasterror() will return an internal error string .