From 1bcab1377de6afe8c0f9c895cdba04baacf3e4a5 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Thu, 22 Dec 2011 11:37:01 -0800 Subject: Sync with internal Google development. This breaks the open-source build, will follow up with a change to fix it. --- examples/stream_transcode.c | 76 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 examples/stream_transcode.c (limited to 'examples/stream_transcode.c') 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 +#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 \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); +} -- cgit v1.2.3