static const pb_decoder_t PB_DECODERS[PB_LTYPES_COUNT]
=
{
&pb_dec_bool,
&pb_dec_varint,
&pb_dec_uvarint,
&pb_dec_svarint,
&pb_dec_fixed32,
&pb_dec_fixed64,
&pb_dec_bytes,
&pb_dec_string,
&pb_dec_submessage,
NULL,
/
*
extensions
*
/
&pb_dec_fixed_length_bytes
};
static
bool
checkreturn decode_static_field(pb_istream_t
*
stream, pb_wire_type_t wire_type, pb_field_iter_t
*
iter
)
{
pb_type_t
type
;
pb_decoder_t func;
type
=
iter
-
>pos
-
>
type
;
func
=
PB_DECODERS[PB_LTYPE(
type
)];
switch (PB_HTYPE(
type
))
{
case PB_HTYPE_REQUIRED:
return
func(stream,
iter
-
>pos,
iter
-
>pData);
case PB_HTYPE_OPTIONAL:
if
(
iter
-
>pSize !
=
iter
-
>pData)
*
(
bool
*
)
iter
-
>pSize
=
true;
return
func(stream,
iter
-
>pos,
iter
-
>pData);
case PB_HTYPE_REPEATED:
if
(wire_type
=
=
PB_WT_STRING
&& PB_LTYPE(
type
) <
=
PB_LTYPE_LAST_PACKABLE)
{
/
*
Packed array
*
/
bool
status
=
true;
pb_size_t
*
size
=
(pb_size_t
*
)
iter
-
>pSize;
pb_istream_t substream;
if
(!pb_make_string_substream(stream, &substream))
return
false;
while
(substream.bytes_left >
0
&&
*
size <
iter
-
>pos
-
>array_size)
{
void
*
pItem
=
(char
*
)
iter
-
>pData
+
iter
-
>pos
-
>data_size
*
(
*
size);
if
(!func(&substream,
iter
-
>pos, pItem))
{
status
=
false;
break
;
}
(
*
size)
+
+
;
}
if
(substream.bytes_left !
=
0
)
PB_RETURN_ERROR(stream,
"array overflow"
);
if
(!pb_close_string_substream(stream, &substream))
return
false;
return
status;
}
else
{
/
*
Repeated field
*
/
pb_size_t
*
size
=
(pb_size_t
*
)
iter
-
>pSize;
char
*
pItem
=
(char
*
)
iter
-
>pData
+
iter
-
>pos
-
>data_size
*
(
*
size);
if
((
*
size)
+
+
>
=
iter
-
>pos
-
>array_size)
PB_RETURN_ERROR(stream,
"array overflow"
);
return
func(stream,
iter
-
>pos, pItem);
}
case PB_HTYPE_ONEOF:
if
(PB_LTYPE(
type
)
=
=
PB_LTYPE_SUBMESSAGE &&
*
(pb_size_t
*
)
iter
-
>pSize !
=
iter
-
>pos
-
>tag)
{
/
*
We memset to zero so that
any
callbacks are
set
to NULL.
*
This
is
because the callbacks might otherwise have values
*
from
some other union field.
*
/
memset(
iter
-
>pData,
0
,
iter
-
>pos
-
>data_size);
pb_message_set_to_defaults((const pb_field_t
*
)
iter
-
>pos
-
>ptr,
iter
-
>pData);
}
*
(pb_size_t
*
)
iter
-
>pSize
=
iter
-
>pos
-
>tag;
return
func(stream,
iter
-
>pos,
iter
-
>pData);
default:
PB_RETURN_ERROR(stream,
"invalid field type"
);
}
}