More decoder work.

pull/13171/head
Joshua Haberman 15 years ago
parent edd1f5a61f
commit 61a0f0bc5f
  1. 58
      src/upb_decoder.c

@ -39,23 +39,22 @@ struct upb_decoder {
upb_msgdef *toplevel_msgdef;
upb_bytesrc *bytesrc;
// We keep a stack of messages we have recursed into.
upb_decoder_frame stack[UPB_MAX_NESTING], *top, *limit;
// The buffer of input data. NULL is equivalent to the empty string.
upb_string *buf;
// Holds residual bytes when fewer than UPB_MAX_ENCODED_SIZE bytes remain.
uint8_t tmpbuf[UPB_MAX_ENCODED_SIZE];
// The number of bytes we have yet to consume from "buf". This can be
// negative if we have skipped more bytes than are in the buffer, or if we
// have started to consume bytes from "nextbuf".
// The number of bytes we have yet to consume from "buf" or tmpbuf. This is
// always >= 0 unless we were just reset or are eof.
int32_t buf_bytesleft;
// The offset within "buf" from where we are currently reading. This can be
// <0 if we are reading some residual bytes from the previous buffer, which
// are stored in tmpbuf and combined with bytes from "buf".
int32_t buf_offset;
// The overall stream offset of the end of "buf". If "buf" is NULL, it is as
// if "buf" was the empty string.
// The overall stream offset of the beginning of "buf".
uint32_t buf_stream_offset;
// Fielddef for the key we just read.
@ -71,6 +70,9 @@ struct upb_decoder {
// String we return for string values. We try to recycle it if possible.
upb_string *str;
// We keep a stack of messages we have recursed into.
upb_decoder_frame *top, *limit, stack[UPB_MAX_NESTING];
};
@ -116,24 +118,15 @@ static bool upb_decoder_nextbuf(upb_decoder *d)
return true;
}
static bool upb_decoder_skipbytes(upb_decoder *d, int32_t bytes)
{
// TODO.
return true;
}
static upb_strlen_t upb_decoder_append(uint8_t *buf, upb_string *frombuf,
upb_strlen_t len, upb_strlen_t total_len)
{
upb_strlen_t copy = UPB_MIN(total_len - len, upb_string_len(frombuf));
//memcpy(buf, upb_string_getrobuf(frombuf) )
return 0;
}
static const uint8_t *upb_decoder_getbuf_full(upb_decoder *d, uint32_t *bytes)
{
if(d->buf_bytesleft < UPB_MAX_ENCODED_SIZE)
if(d->buf_bytesleft < UPB_MAX_ENCODED_SIZE) {
// GCC is currently complaining about use of an uninitialized value if we
// don't set this now. I think this is incorrect, but leaving this in
// to suppress the warning for now.
*bytes = 0;
if(!upb_decoder_nextbuf(d)) return NULL;
}
assert(d->buf_bytesleft >= UPB_MAX_ENCODED_SIZE);
@ -187,9 +180,28 @@ static bool upb_decoder_consume(upb_decoder *d, uint32_t bytes)
// We still have residual bytes we have not consumed.
memmove(d->tmpbuf, d->tmpbuf + bytes, -d->buf_offset);
}
assert(d->buf_bytesleft >= 0);
return true;
}
static bool upb_decoder_skipbytes(upb_decoder *d, int32_t bytes)
{
d->buf_offset += bytes;
d->buf_bytesleft -= bytes;
while(d->buf_bytesleft < 0) {
if(!upb_decoder_nextbuf(d)) return false;
}
return true;
}
static upb_strlen_t upb_decoder_append(uint8_t *buf, upb_string *frombuf,
upb_strlen_t len, upb_strlen_t total_len)
{
upb_strlen_t copy = UPB_MIN(total_len - len, upb_string_len(frombuf));
//memcpy(buf, upb_string_getrobuf(frombuf) )
return 0;
}
/* Functions to read wire values. *********************************************/

Loading…
Cancel
Save