summaryrefslogtreecommitdiff
path: root/tools/upbc.lua
diff options
context:
space:
mode:
authorJosh Haberman <jhaberman@gmail.com>2016-03-16 18:07:32 -0700
committerJosh Haberman <jhaberman@gmail.com>2016-04-05 17:52:21 -0700
commite9d79d2441732264e2b990a5b2dc76d13724db07 (patch)
tree7faaccbd62043ef5652f891e61577a218a74adbc /tools/upbc.lua
parentd0b9d0a9b782e46a483d4d72515f9ab4f72e402a (diff)
Added upb::FileDef, which represents the file defs are declared in.
It is entirely optional: MessageDef/EnumDef can still exist on their own. But this can represent a def's file when it is desirable to do so (eg. for code generators). This approach will require that we change the way we handle extensions. But I think it will be a good change overall. Specifically, we previously handled extensions by duplicating the extended message and then adding the extension as a regular field to the duplicated message. This required also duplicating any messages that could reach the extended message. In the new world we will need a way of declaring and looking up extensions separately from the message being extended. This change also involves some notable changes to the generated code: - files are now called foo.upbdefs.h instead of foo.upb.h. This reflects the fact that we might possibly generate several different output files for a .proto file, and this one is just for defs. - we no longer generate selectors in the .h file. - the upbdefs.c no longer vends a SymbolTable. Now it vends the individual messages (and possibly a FileDef later). I think this will compose better once we can generate files where one generated files imports another. We also make the descriptor reader vend a list of FileDefs now. This is the best conceptual match for parsing a FileDescriptorSet.
Diffstat (limited to 'tools/upbc.lua')
-rw-r--r--tools/upbc.lua53
1 files changed, 30 insertions, 23 deletions
diff --git a/tools/upbc.lua b/tools/upbc.lua
index a248318..5db5fba 100644
--- a/tools/upbc.lua
+++ b/tools/upbc.lua
@@ -12,40 +12,47 @@ local dump_cinit = require "dump_cinit"
local upb = require "upb"
local src = arg[1]
-local outbase = arg[2]
-local basename = arg[3]
-if not (src and outbase and basename) then
- print("Usage: upbc <binary descriptor> <output filename base> <symbol prefix>")
+if not src then
+ print("Usage: upbc <binary descriptor>")
return 1
end
-local hfilename = outbase .. ".upb.h"
-local cfilename = outbase .. ".upb.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))
+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()
-symtab:load_descriptor(descriptor)
-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)
+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
-local happend = dump_cinit.file_appender(hfile)
-local cappend = dump_cinit.file_appender(cfile)
+ 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)
--- Dump defs
-dump_cinit.dump_defs(symtab, basename, happend, cappend)
+ local happend = dump_cinit.file_appender(hfile)
+ local cappend = dump_cinit.file_appender(cfile)
-hfile:close()
-cfile:close()
+ -- 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