From 887abe669f9a71c5fb530f0315e350ba22a150a7 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Mon, 12 Sep 2011 18:33:06 -0700 Subject: Added an example, constified some more methods. --- examples/msg.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 examples/msg.c (limited to 'examples/msg.c') diff --git a/examples/msg.c b/examples/msg.c new file mode 100644 index 0000000..487e743 --- /dev/null +++ b/examples/msg.c @@ -0,0 +1,59 @@ +/* + * upb - a minimalist implementation of protocol buffers. + * + * Copyright (c) 2011 Google Inc. See LICENSE for details. + * Author: Josh Haberman + * + * A simple example that demonstrates creating a standard message object + * and parsing into it, using a dynamic reflection-based approach. + * + * Note that with this approach there are no strongly-typed struct or class + * definitions to use from C -- this is essentially a reflection-based + * interface. Note that parsing and serializing are still very fast since + * they are JIT-based. + * + * If this seems a bit verbose, you may prefer an approach that generates + * strongly-typed struct definitions (upb will likely provide this, but it is + * not yet implemented). + * + * TODO: make this file compiled as part of "make examples" + * TODO: test that this actually works (WARNING: UNTESTED!) + */ + +#include "upb/msg.h" +#include "upb/pb/glue.h" + +const char *descfile = "example.proto.pb"; +const char *type = "example.SampleMessage"; +const char *msgfile = "sample_message.pb"; + +int main() { + // First we load the descriptor that describes the message into a upb_msgdef. + // This could come from a string that is compiled into the program or from a + // separate file as we do here. Since defs always live in a symtab, we + // create one of those also. + upb_symtab *s = upb_symtab_new(); + upb_status status = UPB_STATUS_INIT; + if (!upb_load_descriptor_file_into_symtab(s, descfile, &status)) { + fprintf(stderr, "Couldn't load descriptor file '%s': %s\n", descfile, + upb_status_getstr(&status)); + return -1; + } + + const upb_msgdef *md = upb_symtab_lookupmsg(s, type); + if (!md) { + fprintf(stderr, "Descriptor did not contain type '%s'\n", type); + return -1; + } + + // Parse a file into a new message object. + void *msg = upb_filetonewmsg(msgfile, md, &status); + if (!msg) { + fprintf(stderr, "Error parsing message file '%s': %s\n", msgfile, + upb_status_getstr(&status)); + return -1; + } + + // TODO: Inspect some fields. + return 0; +} -- cgit v1.2.3