From 907e3d7cd2b97c89dadfcda712f95c07212e5a67 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Mon, 6 Jul 2009 03:10:27 -0700 Subject: More compiler work. --- upb_context.c | 13 ++----------- upbc.c | 21 +++++++++++++++++++-- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/upb_context.c b/upb_context.c index ba6fc4a..fc558be 100644 --- a/upb_context.c +++ b/upb_context.c @@ -188,7 +188,6 @@ static bool insert_message(struct upb_strtable *t, free(fqname.ptr); return false; } - printf("Inserting: " UPB_STRFMT ", len=%d\n", UPB_STRARG(e.e.key), e.e.key.byte_len); upb_strtable_insert(t, &e.e); /* Add nested messages and enums. */ @@ -227,15 +226,9 @@ bool addfd(struct upb_strtable *addto, struct upb_strtable *existingdefs, /* Attempt to resolve all references. */ struct upb_symtab_entry *e; - printf("Table dump:\n"); for(e = upb_strtable_begin(addto); e; e = upb_strtable_next(addto, &e->e)) { - printf(" key: " UPB_STRFMT "\n", UPB_STRARG(e->e.key)); - } - for(e = upb_strtable_begin(addto); e; e = upb_strtable_next(addto, &e->e)) { - if(upb_strtable_lookup(existingdefs, &e->e.key)) { - printf("Redef!\n"); + if(upb_strtable_lookup(existingdefs, &e->e.key)) return false; /* Redefinition prohibited. */ - } if(e->type == UPB_SYM_MESSAGE) { struct upb_msg *m = e->ref.msg; for(unsigned int i = 0; i < m->num_fields; i++) { @@ -250,9 +243,7 @@ bool addfd(struct upb_strtable *addto, struct upb_strtable *existingdefs, UPB_SYM_ENUM); else continue; /* No resolving necessary. */ - printf("Resolving '" UPB_STRFMT "'...", UPB_STRARG(*fd->type_name)); - if(!ref.msg) { printf("undefined: " UPB_STRFMT ", len=%d\n", UPB_STRARG(*fd->type_name), fd->type_name->byte_len);return false;} /* Ref. to undefined symbol. */ - printf("OK!\n"); + if(!ref.msg) return false; /* Ref. to undefined symbol. */ upb_msg_ref(m, f, ref); } } diff --git a/upbc.c b/upbc.c index b27568e..33955f8 100644 --- a/upbc.c +++ b/upbc.c @@ -28,6 +28,13 @@ static void to_preproc(struct upb_string str) str.ptr[i] = toupper(str.ptr[i]); } +static int memrchr(char *data, char c, size_t len) +{ + int off = len-1; + while(off > 0 && data[off] != c) --off; + return off; +} + /* The .h file defines structs for the types defined in the .proto file. It * also defines constants for the enum values. * @@ -55,6 +62,14 @@ static void write_header(struct upb_symtab_entry entries[], int num_entries, /* We use entry->e.key (the fully qualified name) instead of ed->name. */ struct upb_string enum_name = upb_strdup(entry->e.key); to_cident(enum_name); + + struct upb_string enum_val_prefix = upb_strdup(entry->e.key); + enum_val_prefix.byte_len = memrchr(enum_val_prefix.ptr, + UPB_CONTEXT_SEPARATOR, + enum_val_prefix.byte_len); + enum_val_prefix.byte_len++; + to_preproc(enum_val_prefix); + fprintf(stream, "typedef enum " UPB_STRFMT " {\n", UPB_STRARG(enum_name)); if(ed->set_flags.has.value) { for(uint32_t j = 0; j < ed->value->len; j++) { /* Foreach enum value. */ @@ -62,8 +77,8 @@ static void write_header(struct upb_symtab_entry entries[], int num_entries, struct upb_string value_name = upb_strdup(*v->name); to_preproc(value_name); /* " GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_UINT32 = 13," */ - fprintf(stream, " " UPB_STRFMT " = %" PRIu32, - UPB_STRARG(value_name), v->number); + fprintf(stream, " " UPB_STRFMT UPB_STRFMT " = %" PRIu32, + UPB_STRARG(enum_val_prefix), UPB_STRARG(value_name), v->number); if(j != ed->value->len-1) fputc(',', stream); fputc('\n', stream); upb_strfree(value_name); @@ -71,6 +86,7 @@ static void write_header(struct upb_symtab_entry entries[], int num_entries, } fprintf(stream, "} " UPB_STRFMT ";\n\n", UPB_STRARG(enum_name)); upb_strfree(enum_name); + upb_strfree(enum_val_prefix); } /* Epilogue. */ @@ -98,5 +114,6 @@ int main() assert(e == NULL && i == symcount); struct upb_string name = UPB_STRLIT("descriptor.proto"); write_header(entries, symcount, name, stdout); + upb_context_free(&c); } -- cgit v1.2.3