diff options
author | Joshua Haberman <joshua@reverberate.org> | 2011-02-05 18:53:32 -0800 |
---|---|---|
committer | Joshua Haberman <joshua@reverberate.org> | 2011-02-05 18:53:32 -0800 |
commit | 3affb319260263efc3cee502896d9f981186c7da (patch) | |
tree | 6d519e32a23dc1d3b03c3da0791fd2ea00f154f4 /stream/upb_decoder.h | |
parent | e170259e4ababf39829fa9339fdf0817e38c949e (diff) |
Tons of work: we're close to passing test_vs_proto2 again.
Diffstat (limited to 'stream/upb_decoder.h')
-rw-r--r-- | stream/upb_decoder.h | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/stream/upb_decoder.h b/stream/upb_decoder.h index 6ba4d77..0684ea2 100644 --- a/stream/upb_decoder.h +++ b/stream/upb_decoder.h @@ -27,14 +27,44 @@ extern "C" { /* upb_decoder *****************************************************************/ +// The decoder keeps a stack with one entry per level of recursion. +// upb_decoder_frame is one frame of that stack. +typedef struct { + upb_msgdef *msgdef; + size_t end_offset; // For groups, 0. +} upb_decoder_frame; + +struct _upb_decoder { + // Immutable state of the decoder. + upb_src src; + upb_dispatcher dispatcher; + upb_bytesrc *bytesrc; + upb_msgdef *toplevel_msgdef; + upb_decoder_frame stack[UPB_MAX_NESTING]; + + // Mutable state of the decoder. + + // Where we will store any errors that occur. + upb_status *status; + + // Stack entries store the offset where the submsg ends (for groups, 0). + upb_decoder_frame *top, *limit; + + // Current input buffer. + upb_string *buf; + + // The offset within the overall stream represented by the *beginning* of buf. + size_t buf_stream_offset; +}; + // A upb_decoder decodes the binary protocol buffer format, writing the data it // decodes to a upb_sink. -struct upb_decoder; -typedef struct upb_decoder upb_decoder; +struct _upb_decoder; +typedef struct _upb_decoder upb_decoder; // Allocates and frees a upb_decoder, respectively. -upb_decoder *upb_decoder_new(upb_msgdef *md); -void upb_decoder_free(upb_decoder *d); +void upb_decoder_init(upb_decoder *d, upb_msgdef *md); +void upb_decoder_uninit(upb_decoder *d); // Resets the internal state of an already-allocated decoder. This puts it in a // state where it has not seen any data, and expects the next data to be from |