Commit b56bc8c5 authored by Kinsbursky Stanislav's avatar Kinsbursky Stanislav Committed by Pavel Emelyanov

protobuf: added support for optional fields

Signed-off-by: 's avatarStanislav Kinsbursky <skinsbursky@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 01228a19
...@@ -163,6 +163,24 @@ static void pb_show_field(const ProtobufCFieldDescriptor *fd, void *where, ...@@ -163,6 +163,24 @@ static void pb_show_field(const ProtobufCFieldDescriptor *fd, void *where,
pr_msg(" "); pr_msg(" ");
} }
static int pb_optional_field_present(const ProtobufCFieldDescriptor *field,
void *msg)
{
if ((field->type == PROTOBUF_C_TYPE_MESSAGE) ||
(field->type == PROTOBUF_C_TYPE_STRING)) {
const void *opt_flag = * (const void * const *)(msg + field->offset);
if ((opt_flag == NULL) || (opt_flag == field->default_value))
return 0;
} else {
const protobuf_c_boolean *has = msg + field->quantifier_offset;
if (!*has)
return 0;
}
return 1;
}
static void pb_show_msg(const void *msg, pb_pr_ctl_t *ctl) static void pb_show_msg(const void *msg, pb_pr_ctl_t *ctl)
{ {
int i; int i;
...@@ -175,12 +193,14 @@ static void pb_show_msg(const void *msg, pb_pr_ctl_t *ctl) ...@@ -175,12 +193,14 @@ static void pb_show_msg(const void *msg, pb_pr_ctl_t *ctl)
unsigned long *data; unsigned long *data;
size_t nr_fields; size_t nr_fields;
if (fd.label == PROTOBUF_C_LABEL_OPTIONAL)
continue;
nr_fields = 1; nr_fields = 1;
data = (unsigned long *)(msg + fd.offset); data = (unsigned long *)(msg + fd.offset);
if (fd.label == PROTOBUF_C_LABEL_OPTIONAL) {
if (!pb_optional_field_present(&fd, data))
continue;
}
if (fd.label == PROTOBUF_C_LABEL_REPEATED) { if (fd.label == PROTOBUF_C_LABEL_REPEATED) {
nr_fields = *(size_t *)(msg + fd.quantifier_offset); nr_fields = *(size_t *)(msg + fd.quantifier_offset);
data = (unsigned long *)*data; data = (unsigned long *)*data;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment