10#if (defined(__GNUC__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))) || \
11 (defined(__IAR_SYSTEMS_ICC__) && (__VER__ >= 9040001))
12 #define checkreturn __attribute__((warn_unused_result))
45#ifdef PB_ENABLE_MALLOC
46static bool checkreturn allocate_field(pb_istream_t *stream,
void *pData,
size_t data_size,
size_t array_size);
47static void initialize_pointer_field(
void *pItem, pb_field_iter_t *field);
48static bool checkreturn pb_release_union_field(pb_istream_t *stream, pb_field_iter_t *field);
49static void pb_release_single_field(pb_field_iter_t *field);
52#ifdef PB_WITHOUT_64BIT
53#define pb_int64_t int32_t
54#define pb_uint64_t uint32_t
56#define pb_int64_t int64_t
57#define pb_uint64_t uint64_t
71 stream->state = (
pb_byte_t*)stream->state + count;
99 return pb_read(stream, tmp, count);
103 if (stream->bytes_left < count)
106#ifndef PB_BUFFER_ONLY
107 if (!stream->callback(stream, buf, count))
114 if (stream->bytes_left < count)
115 stream->bytes_left = 0;
117 stream->bytes_left -= count;
126 if (stream->bytes_left == 0)
129#ifndef PB_BUFFER_ONLY
130 if (!stream->callback(stream, buf, 1))
134 stream->state = (
pb_byte_t*)stream->state + 1;
137 stream->bytes_left--;
153 stream.callback =
NULL;
158 stream.state = state.state;
159 stream.bytes_left = msglen;
161 stream.errmsg =
NULL;
181 if ((
byte & 0x80) == 0)
190 result =
byte & 0x7F;
200 pb_byte_t sign_extension = (bitpos < 63) ? 0xFF : 0x01;
201 bool valid_extension = ((
byte & 0x7F) == 0x00 ||
202 ((result >> 31) != 0 &&
byte == sign_extension));
204 if (bitpos >= 64 || !valid_extension)
209 else if (bitpos == 28)
211 if ((
byte & 0x70) != 0 && (
byte & 0x78) != 0x78)
215 result |= (
uint32_t)(
byte & 0x0F) << bitpos;
219 result |= (
uint32_t)(
byte & 0x7F) << bitpos;
222 }
while (
byte & 0x80);
229#ifndef PB_WITHOUT_64BIT
241 if (bitpos >= 63 && (
byte & 0xFE) != 0)
244 result |= (
uint64_t)(
byte & 0x7F) << bitpos;
246 }
while (
byte & 0x80);
258 if (!
pb_read(stream, &
byte, 1))
260 }
while (
byte & 0x80);
270 if ((
size_t)length != length)
285 if (stream->bytes_left == 0)
293#ifndef PB_BUFFER_ONLY
301 if (stream->callback !=
buf_read && stream->bytes_left == 0)
304 if (
strcmp(stream->errmsg,
"io error") == 0)
305 stream->errmsg =
NULL;
340 size_t max_size = *
size;
348 if (*
size > max_size)
353 }
while (*buf++ & 0x80);
358 return pb_read(stream, buf, 8);
362 return pb_read(stream, buf, 4);
389 *substream = *stream;
390 if (substream->bytes_left <
size)
400 if (substream->bytes_left) {
401 if (!
pb_read(substream,
NULL, substream->bytes_left))
405 stream->state = substream->state;
408 stream->errmsg = substream->errmsg;
445#ifdef PB_CONVERT_DOUBLE_FLOAT
446 if (field->data_size ==
sizeof(
float))
448 return pb_decode_double_as_float(stream, (
float*)field->pData);
452#ifdef PB_WITHOUT_64BIT
496 if (field->pSize !=
NULL)
497 *(
bool*)field->pSize =
true;
506 pb_istream_t substream;
508 field->pData = (
char*)field->pField + field->data_size * (*
size);
521 field->pData = (
char*)field->pData + field->data_size;
524 if (substream.bytes_left != 0)
535 field->pData = (
char*)field->pField + field->data_size * (*
size);
537 if ((*
size)++ >= field->array_size)
554 memset(field->pData, 0, (
size_t)field->data_size);
557 if (field->submsg_desc->default_value !=
NULL ||
558 field->submsg_desc->field_callback !=
NULL ||
559 field->submsg_desc->submsg_info[0] !=
NULL)
561 pb_field_iter_t submsg_iter;
578#ifdef PB_ENABLE_MALLOC
583static bool checkreturn allocate_field(pb_istream_t *stream,
void *pData,
size_t data_size,
size_t array_size)
585 void *
ptr = *(
void**)pData;
587 if (data_size == 0 || array_size == 0)
594 if (data_size == 1 && array_size == 1)
606 const size_t check_limit = (
size_t)1 << (
sizeof(
size_t) * 4);
607 if (data_size >= check_limit || array_size >= check_limit)
609 const size_t size_max = (
size_t)-1;
610 if (size_max / array_size < data_size)
624 *(
void**)pData =
ptr;
629static void initialize_pointer_field(
void *pItem, pb_field_iter_t *field)
634 *(
void**)pItem =
NULL;
640 memset(pItem, 0, field->data_size);
647#ifndef PB_ENABLE_MALLOC
661 pb_release_single_field(field);
673 field->pData = field->pField;
678 if (!allocate_field(stream, field->pField, field->data_size, 1))
681 field->pData = *(
void**)field->pField;
682 initialize_pointer_field(field->pData, field);
693 size_t allocated_size = *
size;
694 pb_istream_t substream;
699 while (substream.bytes_left)
704 stream->errmsg =
"too many array entries";
710 if ((
size_t)*
size + 1 > allocated_size)
715 size_t remain = (substream.bytes_left - 1) / field->data_size + 1;
717 allocated_size += remain;
721 if (!allocate_field(&substream, field->pField, field->data_size, allocated_size))
729 field->pData = *(
char**)field->pField + field->data_size * (*
size);
730 if (field->pData ==
NULL)
736 initialize_pointer_field(field->pData, field);
758 if (!allocate_field(stream, field->pField, field->data_size, (
size_t)(*
size + 1)))
761 field->pData = *(
char**)field->pField + field->data_size * (*
size);
763 initialize_pointer_field(field->pData, field);
775 if (!field->descriptor->field_callback)
780 pb_istream_t substream;
781 size_t prev_bytes_left;
788 prev_bytes_left = substream.bytes_left;
789 if (!field->descriptor->field_callback(&substream,
NULL, field))
791 PB_SET_ERROR(stream, substream.errmsg ? substream.errmsg :
"callback failed");
794 }
while (substream.bytes_left > 0 && substream.bytes_left < prev_bytes_left);
807 pb_istream_t substream;
815 return field->descriptor->field_callback(&substream,
NULL, field);
821#ifdef PB_ENABLE_MALLOC
826 if (!pb_release_union_field(stream, field))
853 pb_field_iter_t iter;
858 if (iter.tag != tag || !iter.message)
861 extension->found =
true;
870 size_t pos = stream->bytes_left;
872 while (extension !=
NULL && pos == stream->bytes_left)
875 if (extension->type->decode)
876 status = extension->type->decode(stream, extension, tag, wire_type);
883 extension = extension->next;
897 pb_extension_t *ext = *(pb_extension_t*
const *)field->pData;
900 pb_field_iter_t ext_iter;
912 bool init_data =
true;
917 *(
bool*)field->pSize =
false;
931 (field->submsg_desc->default_value !=
NULL ||
932 field->submsg_desc->field_callback !=
NULL ||
933 field->submsg_desc->submsg_info[0] !=
NULL))
938 pb_field_iter_t submsg_iter;
948 memset(field->pData, 0, (
size_t)field->data_size);
955 *(
void**)field->pField =
NULL;
979 if (iter->descriptor->default_value)
991 if (tag != 0 && iter->tag == tag)
1000 *(
bool*)iter->pSize =
false;
1017 uint32_t extension_range_start = 0;
1018 pb_extension_t *extensions =
NULL;
1038 pb_field_iter_t iter;
1067 if (extension_range_start == 0)
1071 extensions = *(pb_extension_t*
const *)iter.pData;
1072 extension_range_start = iter.tag;
1077 extension_range_start = (
uint32_t)-1;
1081 if (tag >= extension_range_start)
1083 size_t pos = stream->bytes_left;
1088 if (pos != stream->bytes_left)
1106 if (fixed_count_field != iter.index) {
1112 fixed_count_size != fixed_count_total_size)
1117 fixed_count_field = iter.index;
1118 fixed_count_size = 0;
1119 fixed_count_total_size = iter.array_size;
1122 iter.pSize = &fixed_count_size;
1129 fields_seen.
bitfield[iter.required_field_index >> 5] |= tmp;
1144 fixed_count_size != fixed_count_total_size)
1151 pb_size_t req_field_count = iter.descriptor->required_field_count;
1153 if (req_field_count > 0)
1161 for (i = 0; i < (req_field_count >> 5); i++)
1163 if (fields_seen.
bitfield[i] != allbits)
1168 if ((req_field_count & 31) != 0)
1170 if (fields_seen.
bitfield[req_field_count >> 5] !=
1192 pb_istream_t substream;
1202#ifdef PB_ENABLE_MALLOC
1215#ifdef PB_ENABLE_MALLOC
1218static bool pb_release_union_field(pb_istream_t *stream, pb_field_iter_t *field)
1220 pb_field_iter_t old_field = *field;
1227 if (old_tag == new_tag)
1235 pb_release_single_field(&old_field);
1241 *(
void**)field->pField =
NULL;
1242 field->pData =
NULL;
1248static void pb_release_single_field(pb_field_iter_t *field)
1255 if (*(
pb_size_t*)field->pSize != field->tag)
1265 pb_extension_t *ext = *(pb_extension_t**)field->pData;
1268 pb_field_iter_t ext_iter;
1271 pb_release_single_field(&ext_iter);
1283 field->pData = *(
void**)field->pField;
1287 field->pData = field->pField;
1297 count = field->array_size;
1303 for (; count > 0; count--)
1305 pb_release(field->submsg_desc, field->pData);
1306 field->pData = (
char*)field->pData + field->data_size;
1318 void **pItem = *(
void***)field->pField;
1320 for (; count > 0; count--)
1334 pb_free(*(
void**)field->pField);
1335 *(
void**)field->pField =
NULL;
1339void pb_release(
const pb_msgdesc_t *fields,
void *dest_struct)
1341 pb_field_iter_t iter;
1351 pb_release_single_field(&iter);
1371 *(
bool*)dest = (value != 0);
1396 if (!
pb_read(stream, u.bytes, 4))
1399#if defined(PB_LITTLE_ENDIAN_8BIT) && PB_LITTLE_ENDIAN_8BIT == 1
1411#ifndef PB_WITHOUT_64BIT
1419 if (!
pb_read(stream, u.bytes, 8))
1422#if defined(PB_LITTLE_ENDIAN_8BIT) && PB_LITTLE_ENDIAN_8BIT == 1
1455 else if (field->data_size ==
sizeof(
uint32_t))
1464 if (clamped != value)
1499 clamped = *(
pb_int64_t*)field->pData = svalue;
1500 else if (field->data_size ==
sizeof(
int32_t))
1509 if (clamped != svalue)
1520 pb_bytes_array_t *dest;
1529 if (
size > alloc_size)
1534#ifndef PB_ENABLE_MALLOC
1537 if (stream->bytes_left <
size)
1540 if (!allocate_field(stream, field->pData, alloc_size, 1))
1542 dest = *(pb_bytes_array_t**)field->pData;
1547 if (alloc_size > field->data_size)
1549 dest = (pb_bytes_array_t*)field->pData;
1553 return pb_read(stream, dest->bytes, (
size_t)
size);
1571 if (alloc_size <
size)
1576#ifndef PB_ENABLE_MALLOC
1579 if (stream->bytes_left <
size)
1582 if (!allocate_field(stream, field->pData, alloc_size, 1))
1589 if (alloc_size > field->data_size)
1598#ifdef PB_VALIDATE_UTF8
1599 if (!pb_validate_utf8((
const char*)dest))
1609 bool submsg_consumed =
false;
1610 pb_istream_t substream;
1615 if (field->submsg_desc ==
NULL)
1624 pb_callback_t *
callback = (pb_callback_t*)field->pSize - 1;
1629 if (substream.bytes_left == 0)
1631 submsg_consumed =
true;
1637 if (status && !submsg_consumed)
1639 unsigned int flags = 0;
1649 status =
pb_decode_inner(&substream, field->submsg_desc, field->pData, flags);
1671 memset(field->pData, 0, (
size_t)field->data_size);
1675 if (
size != field->data_size)
1678 return pb_read(stream, (
pb_byte_t*)field->pData, (
size_t)field->data_size);
1681#ifdef PB_CONVERT_DOUBLE_FLOAT
1682bool pb_decode_double_as_float(pb_istream_t *stream,
float *dest)
1695 exponent = (
int)((value >> 52) & 0x7FF) - 1023;
1696 mantissa = (value >> 28) & 0xFFFFFF;
1699 if (exponent == 1024)
1713 else if (exponent < -150)
1719 else if (exponent < -126)
1722 mantissa |= 0x1000000;
1723 mantissa >>= (-126 - exponent);
1728 mantissa = (mantissa + 1) >> 1;
1731 if (mantissa & 0x800000)
1734 mantissa &= 0x7FFFFF;
1741 out.i |= (
uint32_t)(exponent + 127) << 23;
bool callback(pb_istream_t *stream, uint8_t *buf, size_t count)
MOSAPI s32 strcmp(const char *str1, const char *str2)
MOSAPI int(2, 3) sprintf(char *__restrict str
#define pb_realloc(ptr, size)
#define PB_LTYPE_SUBMSG_W_CB
#define PB_MAX_REQUIRED_FIELDS
#define PB_LTYPE_EXTENSION
#define PB_ATYPE_CALLBACK
#define PB_SET_ERROR(stream, msg)
#define PB_BYTES_ARRAY_T_ALLOCSIZE(n)
#define PB_HTYPE_REQUIRED
#define PB_LTYPE_LAST_PACKABLE
#define PB_HTYPE_OPTIONAL
#define PB_HTYPE_REPEATED
#define PB_LTYPE_FIXED_LENGTH_BYTES
#define PB_RETURN_ERROR(stream, msg)
#define PB_LTYPE_IS_SUBMSG(x)
#define PB_LTYPE_SUBMESSAGE
bool pb_field_iter_next(pb_field_iter_t *iter)
bool pb_field_iter_find_extension(pb_field_iter_t *iter)
bool pb_field_iter_begin_extension(pb_field_iter_t *iter, pb_extension_t *extension)
bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_msgdesc_t *desc, void *message)
bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag)
bool pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t count)
bool pb_decode_varint(pb_istream_t *stream, uint64_t *dest)
bool pb_decode(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct)
static bool decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
static bool pb_dec_varint(pb_istream_t *stream, const pb_field_iter_t *field)
static bool buf_read(pb_istream_t *stream, pb_byte_t *buf, size_t count)
void pb_release(const pb_msgdesc_t *fields, void *dest_struct)
static bool pb_dec_bytes(pb_istream_t *stream, const pb_field_iter_t *field)
static bool decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
bool pb_decode_fixed32(pb_istream_t *stream, void *dest)
bool pb_decode_varint32(pb_istream_t *stream, uint32_t *dest)
static bool pb_dec_bool(pb_istream_t *stream, const pb_field_iter_t *field)
bool pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream)
pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t msglen)
bool pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type)
static bool pb_dec_fixed_length_bytes(pb_istream_t *stream, const pb_field_iter_t *field)
static bool default_extension_decoder(pb_istream_t *stream, pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type)
static bool pb_field_set_to_default(pb_field_iter_t *field)
static bool decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
bool pb_decode_bool(pb_istream_t *stream, bool *dest)
bool pb_decode_ex(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct, unsigned int flags)
static bool decode_basic_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
static bool decode_pointer_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
static bool pb_message_set_to_defaults(pb_field_iter_t *iter)
static bool pb_readbyte(pb_istream_t *stream, pb_byte_t *buf)
bool pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream)
bool pb_decode_fixed64(pb_istream_t *stream, void *dest)
static bool pb_dec_submessage(pb_istream_t *stream, const pb_field_iter_t *field)
bool pb_decode_svarint(pb_istream_t *stream, int64_t *dest)
bool pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof)
static bool pb_skip_varint(pb_istream_t *stream)
static bool pb_skip_string(pb_istream_t *stream)
static bool pb_decode_inner(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct, unsigned int flags)
static bool pb_dec_string(pb_istream_t *stream, const pb_field_iter_t *field)
static bool decode_extension(pb_istream_t *stream, uint32_t tag, pb_wire_type_t wire_type, pb_extension_t *extension)
static bool read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, pb_byte_t *buf, size_t *size)
#define PB_DECODE_DELIMITED
#define PB_DECODE_NULLTERMINATED
static void * memcpy(void *s1, const void *s2, size_t n)
static void * memset(void *s, int c, size_t n)
uint32_t bitfield[(64+31)/32]