summaryrefslogtreecommitdiff
path: root/tools/upbc.c
diff options
context:
space:
mode:
authorJoshua Haberman <joshua@reverberate.org>2009-07-23 16:08:20 -0700
committerJoshua Haberman <joshua@reverberate.org>2009-07-23 16:08:20 -0700
commite58c871c19dc7d6e6f097fce1104287a19af5732 (patch)
tree30ff840211ce167e490764d0ad2c1108cd2cab98 /tools/upbc.c
parentd8c93dc1a2a435a102d6d2c92b478962372ffb14 (diff)
upb is fully self-hosting (except for text->descriptor)!
Diffstat (limited to 'tools/upbc.c')
-rw-r--r--tools/upbc.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/tools/upbc.c b/tools/upbc.c
index b3759be..3234a34 100644
--- a/tools/upbc.c
+++ b/tools/upbc.c
@@ -571,6 +571,14 @@ void error(char *err)
exit(1);
}
+void sort_fields_in_descriptor(google_protobuf_DescriptorProto *d)
+{
+ if(d->set_flags.has.field) upb_msg_sortfds(d->field->elements, d->field->len);
+ if(d->set_flags.has.nested_type)
+ for(uint32_t i = 0; i < d->nested_type->len; i++)
+ sort_fields_in_descriptor(d->nested_type->elements[i]);
+}
+
int main(int argc, char *argv[])
{
/* Parse arguments. */
@@ -612,6 +620,16 @@ int main(int argc, char *argv[])
if(!upb_context_addfds(&c, fds))
error("Failed to resolve symbols in descriptor.\n");
+ /* We need to sort the fields of all the descriptors. They will already be
+ * sorted in the upb_msgs that we base our header file output on, so we must
+ * sort here to match. */
+ for(uint32_t i = 0; i < fds->file->len; i++) {
+ google_protobuf_FileDescriptorProto *fd = fds->file->elements[i];
+ if(!fd->set_flags.has.message_type) continue;
+ for(uint32_t j = 0; j < fd->message_type->len; j++)
+ sort_fields_in_descriptor(fd->message_type->elements[j]);
+ }
+
/* Emit output files. */
const int maxsize = 256;
char h_filename[maxsize], c_filename[maxsize];
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback