Skip to content

Commit

Permalink
Fix encoding of selected oneof with default value.
Browse files Browse the repository at this point in the history
  • Loading branch information
eerimoq committed May 13, 2020
1 parent 23254e0 commit ce0725b
Show file tree
Hide file tree
Showing 11 changed files with 3,384 additions and 727 deletions.
8 changes: 4 additions & 4 deletions pbtools/c_source/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@

ENCODE_ONEOF_CHOICE_FMT = '''\
case {oneof.full_name_snake_case}_choice_{field.name_snake_case}_e:
pbtools_encoder_write_{field.full_type_snake_case}(
pbtools_encoder_write_{field.full_type_snake_case}_always(
encoder_p,
{field.field_number},
{ref}self_p->value.{field.name_snake_case});
Expand All @@ -285,7 +285,7 @@

ENCODE_ONEOF_STRING_MEMBER_FMT = '''\
case {oneof.full_name_snake_case}_choice_{field.name_snake_case}_e:
pbtools_encoder_write_string(
pbtools_encoder_write_string_always(
encoder_p,
{field.field_number},
{ref}self_p->value.{field.name_snake_case}_p);
Expand All @@ -294,7 +294,7 @@

ENCODE_ONEOF_SUB_MESSAGE_MEMBER_FMT = '''\
case {oneof.full_name_snake_case}_choice_{field.name_snake_case}_e:
pbtools_encoder_sub_message_encode(
pbtools_encoder_sub_message_encode_always(
encoder_p,
{field.field_number},
&self_p->value.{field.name_snake_case}.base,
Expand All @@ -304,7 +304,7 @@

ENCODE_ONEOF_ENUM_FMT = '''\
case {oneof.full_name_snake_case}_choice_{field.name_snake_case}_e:
pbtools_encoder_write_enum(
pbtools_encoder_write_enum_always(
encoder_p,
{field.field_number},
self_p->value.{field.name_snake_case});
Expand Down
289 changes: 231 additions & 58 deletions pbtools/c_source/pbtools.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,16 @@ static void encoder_write_tagged_varint(struct pbtools_encoder_t *self_p,
}
}

void encoder_write_length_delimited(struct pbtools_encoder_t *self_p,
static void encoder_write_tagged_varint_always(struct pbtools_encoder_t *self_p,
int field_number,
int wire_type,
uint64_t value)
{
encoder_write_varint(self_p, value);
encoder_write_tag(self_p, field_number, wire_type);
}

static void encoder_write_length_delimited(struct pbtools_encoder_t *self_p,
int field_number,
uint64_t value)
{
Expand All @@ -200,34 +209,7 @@ void encoder_write_length_delimited(struct pbtools_encoder_t *self_p,
PBTOOLS_WIRE_TYPE_LENGTH_DELIMITED);
}

void pbtools_encoder_write_int32(struct pbtools_encoder_t *self_p,
int field_number,
int32_t value)
{
encoder_write_tagged_varint(self_p,
field_number,
PBTOOLS_WIRE_TYPE_VARINT,
(uint64_t)(int64_t)value);
}

void pbtools_encoder_write_int64(struct pbtools_encoder_t *self_p,
int field_number,
int64_t value)
{
encoder_write_tagged_varint(self_p,
field_number,
PBTOOLS_WIRE_TYPE_VARINT,
(uint64_t)value);
}

void pbtools_encoder_write_sint32(struct pbtools_encoder_t *self_p,
int field_number,
int32_t value)
{
pbtools_encoder_write_sint64(self_p, field_number, value);
}

uint32_t sint32_encode(int32_t value)
static uint32_t sint32_encode(int32_t value)
{
uint32_t data;

Expand All @@ -240,7 +222,7 @@ uint32_t sint32_encode(int32_t value)
return (data);
}

int32_t sint32_decode(uint64_t value)
static int32_t sint32_decode(uint64_t value)
{
if (value & 0x1) {
value >>= 1;
Expand Down Expand Up @@ -277,6 +259,61 @@ static int64_t sint64_decode(uint64_t value)
return ((int64_t)value);
}

static void encoder_write_32_bit_value(struct pbtools_encoder_t *self_p,
uint32_t value)
{
uint8_t buf[4];

buf[0] = (uint8_t)(value & 0xff);
buf[1] = (uint8_t)((value >> 8) & 0xff);
buf[2] = (uint8_t)((value >> 16) & 0xff);
buf[3] = (uint8_t)((value >> 24) & 0xff);
encoder_write(self_p, &buf[0], 4);
}

static void encoder_write_64_bit_value(struct pbtools_encoder_t *self_p,
uint64_t value)
{
uint8_t buf[8];

buf[0] = (uint8_t)(value & 0xff);
buf[1] = (uint8_t)((value >> 8) & 0xff);
buf[2] = (uint8_t)((value >> 16) & 0xff);
buf[3] = (uint8_t)((value >> 24) & 0xff);
buf[4] = (uint8_t)((value >> 32) & 0xff);
buf[5] = (uint8_t)((value >> 40) & 0xff);
buf[6] = (uint8_t)((value >> 48) & 0xff);
buf[7] = (uint8_t)((value >> 56) & 0xff);
encoder_write(self_p, &buf[0], 8);
}

void pbtools_encoder_write_int32(struct pbtools_encoder_t *self_p,
int field_number,
int32_t value)
{
encoder_write_tagged_varint(self_p,
field_number,
PBTOOLS_WIRE_TYPE_VARINT,
(uint64_t)(int64_t)value);
}

void pbtools_encoder_write_int64(struct pbtools_encoder_t *self_p,
int field_number,
int64_t value)
{
encoder_write_tagged_varint(self_p,
field_number,
PBTOOLS_WIRE_TYPE_VARINT,
(uint64_t)value);
}

void pbtools_encoder_write_sint32(struct pbtools_encoder_t *self_p,
int field_number,
int32_t value)
{
pbtools_encoder_write_sint64(self_p, field_number, value);
}

void pbtools_encoder_write_sint64(struct pbtools_encoder_t *self_p,
int field_number,
int64_t value)
Expand All @@ -301,18 +338,6 @@ void pbtools_encoder_write_uint64(struct pbtools_encoder_t *self_p,
value);
}

static void encoder_write_32_bit_value(struct pbtools_encoder_t *self_p,
uint32_t value)
{
uint8_t buf[4];

buf[0] = (uint8_t)(value & 0xff);
buf[1] = (uint8_t)((value >> 8) & 0xff);
buf[2] = (uint8_t)((value >> 16) & 0xff);
buf[3] = (uint8_t)((value >> 24) & 0xff);
encoder_write(self_p, &buf[0], 4);
}

void pbtools_encoder_write_fixed32(struct pbtools_encoder_t *self_p,
int field_number,
uint32_t value)
Expand All @@ -325,22 +350,6 @@ void pbtools_encoder_write_fixed32(struct pbtools_encoder_t *self_p,
}
}

static void encoder_write_64_bit_value(struct pbtools_encoder_t *self_p,
uint64_t value)
{
uint8_t buf[8];

buf[0] = (uint8_t)(value & 0xff);
buf[1] = (uint8_t)((value >> 8) & 0xff);
buf[2] = (uint8_t)((value >> 16) & 0xff);
buf[3] = (uint8_t)((value >> 24) & 0xff);
buf[4] = (uint8_t)((value >> 32) & 0xff);
buf[5] = (uint8_t)((value >> 40) & 0xff);
buf[6] = (uint8_t)((value >> 48) & 0xff);
buf[7] = (uint8_t)((value >> 56) & 0xff);
encoder_write(self_p, &buf[0], 8);
}

void pbtools_encoder_write_fixed64(struct pbtools_encoder_t *self_p,
int field_number,
uint64_t value)
Expand Down Expand Up @@ -437,6 +446,154 @@ void pbtools_encoder_write_bytes(struct pbtools_encoder_t *self_p,
}
}

void pbtools_encoder_write_int32_always(struct pbtools_encoder_t *self_p,
int field_number,
int32_t value)
{
encoder_write_tagged_varint_always(self_p,
field_number,
PBTOOLS_WIRE_TYPE_VARINT,
(uint64_t)(int64_t)value);
}

void pbtools_encoder_write_int64_always(struct pbtools_encoder_t *self_p,
int field_number,
int64_t value)
{
encoder_write_tagged_varint_always(self_p,
field_number,
PBTOOLS_WIRE_TYPE_VARINT,
(uint64_t)value);
}

void pbtools_encoder_write_sint32_always(struct pbtools_encoder_t *self_p,
int field_number,
int32_t value)
{
pbtools_encoder_write_sint64_always(self_p, field_number, value);
}

void pbtools_encoder_write_sint64_always(struct pbtools_encoder_t *self_p,
int field_number,
int64_t value)
{
pbtools_encoder_write_uint64_always(self_p, field_number, sint64_encode(value));
}

void pbtools_encoder_write_uint32_always(struct pbtools_encoder_t *self_p,
int field_number,
uint32_t value)
{
pbtools_encoder_write_uint64_always(self_p, field_number, value);
}

void pbtools_encoder_write_uint64_always(struct pbtools_encoder_t *self_p,
int field_number,
uint64_t value)
{
encoder_write_tagged_varint_always(self_p,
field_number,
PBTOOLS_WIRE_TYPE_VARINT,
value);
}

void pbtools_encoder_write_fixed32_always(struct pbtools_encoder_t *self_p,
int field_number,
uint32_t value)
{
encoder_write_32_bit_value(self_p, value);
encoder_write_tag(self_p,
field_number,
PBTOOLS_WIRE_TYPE_32_BIT);
}

void pbtools_encoder_write_fixed64_always(struct pbtools_encoder_t *self_p,
int field_number,
uint64_t value)
{
encoder_write_64_bit_value(self_p, value);
encoder_write_tag(self_p,
field_number,
PBTOOLS_WIRE_TYPE_64_BIT);
}

void pbtools_encoder_write_sfixed32_always(struct pbtools_encoder_t *self_p,
int field_number,
int32_t value)
{
pbtools_encoder_write_fixed32_always(self_p, field_number, (uint32_t)value);
}

void pbtools_encoder_write_sfixed64_always(struct pbtools_encoder_t *self_p,
int field_number,
int64_t value)
{
pbtools_encoder_write_fixed64_always(self_p, field_number, (uint64_t)value);
}

#if PBTOOLS_CONFIG_FLOAT == 1

void pbtools_encoder_write_float_always(struct pbtools_encoder_t *self_p,
int field_number,
float value)
{
uint32_t data;

memcpy(&data, &value, sizeof(data));
pbtools_encoder_write_fixed32_always(self_p, field_number, data);
}

void pbtools_encoder_write_double_always(struct pbtools_encoder_t *self_p,
int field_number,
double value)
{
uint64_t data;

memcpy(&data, &value, sizeof(data));
pbtools_encoder_write_fixed64_always(self_p, field_number, data);
}

#endif

void pbtools_encoder_write_bool_always(struct pbtools_encoder_t *self_p,
int field_number,
bool value)
{
pbtools_encoder_write_int32_always(self_p, field_number, value ? 1 : 0);
}

void pbtools_encoder_write_enum_always(struct pbtools_encoder_t *self_p,
int field_number,
int value)
{
pbtools_encoder_write_int32_always(self_p, field_number, value);
}

void pbtools_encoder_write_string_always(struct pbtools_encoder_t *self_p,
int field_number,
char *value_p)
{
size_t length;

length = strlen(value_p);
encoder_write(self_p, (uint8_t *)value_p, (int)length);
encoder_write_tagged_varint_always(self_p,
field_number,
PBTOOLS_WIRE_TYPE_LENGTH_DELIMITED,
length);
}

void pbtools_encoder_write_bytes_always(struct pbtools_encoder_t *self_p,
int field_number,
struct pbtools_bytes_t *value_p)
{
encoder_write(self_p, value_p->buf_p, (int)value_p->size);
encoder_write_tagged_varint_always(self_p,
field_number,
PBTOOLS_WIRE_TYPE_LENGTH_DELIMITED,
value_p->size);
}

static void encoder_write_repeated(struct pbtools_encoder_t *self_p,
int field_number,
struct pbtools_repeated_message_t *repeated_p,
Expand Down Expand Up @@ -2349,6 +2506,22 @@ void pbtools_encoder_sub_message_encode(
(uint64_t)(pos - self_p->pos));
}

void pbtools_encoder_sub_message_encode_always(
struct pbtools_encoder_t *self_p,
int field_number,
struct pbtools_message_base_t *message_p,
pbtools_message_encode_inner_t encode_inner)
{
int pos;

pos = self_p->pos;
encode_inner(self_p, message_p);
encoder_write_tagged_varint_always(self_p,
field_number,
PBTOOLS_WIRE_TYPE_LENGTH_DELIMITED,
(uint64_t)(pos - self_p->pos));
}

void pbtools_decoder_sub_message_decode(
struct pbtools_decoder_t *self_p,
int wire_type,
Expand Down

0 comments on commit ce0725b

Please sign in to comment.