summaryrefslogtreecommitdiff
path: root/upbc.c
diff options
context:
space:
mode:
Diffstat (limited to 'upbc.c')
-rw-r--r--upbc.c21
1 files changed, 19 insertions, 2 deletions
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);
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback