diff options
author | Joshua Haberman <jhaberman@gmail.com> | 2011-12-22 11:37:01 -0800 |
---|---|---|
committer | Joshua Haberman <jhaberman@gmail.com> | 2011-12-22 11:37:01 -0800 |
commit | 1bcab1377de6afe8c0f9c895cdba04baacf3e4a5 (patch) | |
tree | 4d478ccff5da0dee3c217c01f815ee1764965501 /examples/stream_transcode.c | |
parent | b5f5ee867e6c91b77490dc8894236f17a47bde00 (diff) |
Sync with internal Google development.
This breaks the open-source build, will
follow up with a change to fix it.
Diffstat (limited to 'examples/stream_transcode.c')
-rw-r--r-- | examples/stream_transcode.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/examples/stream_transcode.c b/examples/stream_transcode.c new file mode 100644 index 0000000..21c375b --- /dev/null +++ b/examples/stream_transcode.c @@ -0,0 +1,76 @@ + +#include <stdlib.h> +#include "upb/bytestream.h" +#include "upb/pb/decoder.h" +#include "upb/pb/glue.h" +#include "upb/pb/textprinter.h" + +int main(int argc, char *argv[]) { + if (argc < 3) { + fprintf(stderr, "Usage: stream_transcode <descfile> <msgname>\n"); + return 1; + } + + upb_symtab *symtab = upb_symtab_new(); + size_t desc_len; + const char *desc = upb_readfile(argv[1], &desc_len); + if (!desc) { + fprintf(stderr, "Couldn't open descriptor file: %s\n", argv[1]); + return 1; + } + + upb_status status = UPB_STATUS_INIT; + upb_load_descriptor_into_symtab(symtab, desc, desc_len, &status); + if (!upb_ok(&status)) { + fprintf(stderr, "Error parsing descriptor: %s", upb_status_getstr(&status)); + return 1; + } + free((void*)desc); + + const upb_def *md = upb_symtab_lookup(symtab, argv[2]); + if (!md) { + fprintf(stderr, "Descriptor did not contain message: %s\n", argv[2]); + return 1; + } + + const upb_msgdef *m = upb_dyncast_msgdef_const(md); + if (!m) { + fprintf(stderr, "Def was not a msgdef.\n"); + return 1; + } + + upb_stdio in, out; + upb_stdio_init(&in); + upb_stdio_init(&out); + upb_stdio_reset(&in, stdin); + upb_stdio_reset(&out, stdout); + + upb_handlers *handlers = upb_handlers_new(); + upb_textprinter *p = upb_textprinter_new(); + upb_textprinter_reset(p, upb_stdio_bytesink(&out), false); + upb_textprinter_reghandlers(handlers, m); + + upb_decoder d; + upb_decoder_init(&d, handlers); + upb_decoder_reset(&d, upb_stdio_bytesrc(&in), 0, UPB_NONDELIMITED, p); + + upb_status_clear(&status); + upb_decoder_decode(&d, &status); + + if (!upb_ok(&status)) { + fprintf(stderr, "Error parsing input: %s", upb_status_getstr(&status)); + } + + upb_status_uninit(&status); + upb_stdio_uninit(&in); + upb_stdio_uninit(&out); + upb_decoder_uninit(&d); + upb_textprinter_free(p); + upb_def_unref(UPB_UPCAST(m)); + upb_symtab_unref(symtab); + + // Prevent C library from holding buffers open, so Valgrind doesn't see + // memory leaks. + fclose(stdin); + fclose(stdout); +} |