prev_size *= iter->pos->array_size;
}
- if (PB_HTYPE(iter->pos->type) == PB_HTYPE_REQUIRED)
- iter->required_field_index++;
-
if (iter->pos->tag == 0)
return false; /* Only happens with empty message types */
+ if (PB_HTYPE(iter->pos->type) == PB_HTYPE_REQUIRED)
+ iter->required_field_index++;
+
iter->pos++;
iter->field_index++;
if (iter->pos->tag == 0)
if (!pb_make_string_substream(stream, &substream))
return false;
- while (substream.bytes_left)
+ do
{
if (!pCallback->funcs.decode(&substream, iter->pos, arg))
PB_RETURN_ERROR(stream, "callback failed");
- }
+ } while (substream.bytes_left);
pb_close_string_substream(stream, &substream);
return true;
return pb_decode_noinit(stream, fields, dest_struct);
}
+bool pb_decode_delimited(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct)
+{
+ pb_istream_t substream;
+ bool status;
+
+ if (!pb_make_string_substream(stream, &substream))
+ return false;
+
+ status = pb_decode(&substream, fields, dest_struct);
+ pb_close_string_substream(stream, &substream);
+ return status;
+}
+
/* Field decoders */
bool pb_decode_svarint(pb_istream_t *stream, int64_t *dest)
bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_t *field, void *dest)
{
uint64_t value;
- bool status = pb_decode_varint(stream, &value);
+ if (!pb_decode_varint(stream, &value))
+ return false;
switch (field->data_size)
{
default: PB_RETURN_ERROR(stream, "invalid data_size");
}
- return status;
+ return true;
}
bool checkreturn pb_dec_svarint(pb_istream_t *stream, const pb_field_t *field, void *dest)
{
int64_t value;
- bool status = pb_decode_svarint(stream, &value);
+ if (!pb_decode_svarint(stream, &value))
+ return false;
switch (field->data_size)
{
default: PB_RETURN_ERROR(stream, "invalid data_size");
}
- return status;
+ return true;
}
bool checkreturn pb_dec_fixed32(pb_istream_t *stream, const pb_field_t *field, void *dest)