summaryrefslogtreecommitdiff
path: root/tools/upbc.lua
blob: 5db5fba7ad5146fc93b4bd1770991798d19efd3c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
--[[

  The upb compiler.  Unlike the proto2 compiler, this does
  not output any parsing code or generated classes or anything
  specific to the protobuf binary format at all.  At the moment
  it only dumps C initializers for upb_defs, so that a .proto
  file can be represented in a .o file.

--]]

local dump_cinit = require "dump_cinit"
local upb = require "upb"

local src = arg[1]

if not src then
  print("Usage: upbc <binary descriptor>")
  return 1
end

function strip_proto(filename)
  return string.gsub(filename, '%.proto$','')
end

-- Open input/output files.
local f = assert(io.open(src, "r"), "couldn't open input file " .. src)
local descriptor = f:read("*all")
local files = upb.load_descriptor(descriptor)
local symtab = upb.SymbolTable()

for _, file in ipairs(files) do
  symtab:add_file(file)
  local outbase = strip_proto(file:name())

  local hfilename = outbase .. ".upbdefs.h"
  local cfilename = outbase .. ".upbdefs.c"

  if os.getenv("UPBC_VERBOSE") then
    print("upbc:")
    print(string.format("  source file=%s", src))
    print(string.format("  output file base=%s", outbase))
    print(string.format("  hfilename=%s", hfilename))
    print(string.format("  cfilename=%s", cfilename))
  end

  os.execute(string.format("mkdir -p `dirname %s`", outbase))
  local hfile = assert(io.open(hfilename, "w"), "couldn't open " .. hfilename)
  local cfile = assert(io.open(cfilename, "w"), "couldn't open " .. cfilename)

  local happend = dump_cinit.file_appender(hfile)
  local cappend = dump_cinit.file_appender(cfile)

  -- Dump defs
  dump_cinit.dump_defs(file, happend, cappend)

  hfile:close()
  cfile:close()
end
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback