diff options
-rw-r--r-- | tools/make_c_api.lua | 12 | ||||
-rw-r--r-- | upb/port_def.inc | 18 | ||||
-rw-r--r-- | upb/port_undef.inc | 5 |
3 files changed, 33 insertions, 2 deletions
diff --git a/tools/make_c_api.lua b/tools/make_c_api.lua index 11d4258..47a5b08 100644 --- a/tools/make_c_api.lua +++ b/tools/make_c_api.lua @@ -357,7 +357,9 @@ local function write_h_file(filedef, append) end end + append('\n') append("/* Enums */\n\n") + for _, def in ipairs(sorted_defs(filedef:defs(upb.DEF_ENUM))) do local cident = to_cident(def:full_name()) append('typedef enum {\n') @@ -434,7 +436,7 @@ local function write_h_file(filedef, append) append('\n\n') end - append('UPB_END_EXTERN_C') + append('UPB_END_EXTERN_C\n') append('\n') append('#include "upb/port_undef.inc"\n'); @@ -448,7 +450,7 @@ local function write_c_file(filedef, hfilename, append) append('#include <stddef.h>\n') append('#include "upb/msg.h"\n') - append('#include "%s"\n\n', hfilename) + append('#include "%s"\n', hfilename) for dep in filedef:dependencies() do local outbase = strip_proto(dep:name()) @@ -456,6 +458,8 @@ local function write_c_file(filedef, hfilename, append) end append('\n') + append('#include "upb/port_def.inc"\n') + append('\n') for msg in filedef:defs(upb.DEF_MSG) do local msgname = to_cident(msg:full_name()) @@ -567,8 +571,12 @@ local function write_c_file(filedef, hfilename, append) 'false', -- TODO: extendable msg:file():syntax() == upb.SYNTAX_PROTO2 ) + append('};\n\n') end + + append('#include "upb/port_undef.inc"\n') + append('\n') end function export.write_gencode(filedef, hfilename, append_h, append_c) diff --git a/upb/port_def.inc b/upb/port_def.inc new file mode 100644 index 0000000..33ff78c --- /dev/null +++ b/upb/port_def.inc @@ -0,0 +1,18 @@ + +#if UINTPTR_MAX == 0xffffffff +#define UPB_SIZE(size32, size64) size32 +#else +#define UPB_SIZE(size32, size64) size64 +#endif + +#define UPB_FIELD_AT(msg, fieldtype, offset) \ + *(fieldtype*)((const char*)(msg) + offset) + +#define UPB_READ_ONEOF(msg, fieldtype, offset, case_offset, case_val, default) \ + UPB_FIELD_AT(msg, int, case_offset) == case_val \ + ? UPB_FIELD_AT(msg, fieldtype, offset) \ + : default + +#define UPB_WRITE_ONEOF(msg, fieldtype, offset, value, case_offset, case_val) \ + UPB_FIELD_AT(msg, int, case_offset) = case_val; \ + UPB_FIELD_AT(msg, fieldtype, offset) = value; diff --git a/upb/port_undef.inc b/upb/port_undef.inc new file mode 100644 index 0000000..7db97ca --- /dev/null +++ b/upb/port_undef.inc @@ -0,0 +1,5 @@ + +#undef UPB_SIZE +#undef UPB_FIELD_AT +#undef UPB_READ_ONEOF +#undef UPB_WRITE_ONEOF |