Commit 6ffe171d authored by lahiker42's avatar lahiker42

random todo items


git-svn-id: https://protobuf-c.googlecode.com/svn/trunk@35 00440858-1255-0410-a3e6-75ea37f81c3a
parent 16df2633
...@@ -2,13 +2,14 @@ ...@@ -2,13 +2,14 @@
- handle unknown fields when packing - handle unknown fields when packing
- test code - test code
- ensure enums are 32-bit - ensure enums are 32-bit
- make messages derive from ProtobufCMessage,
which should have the unknown field array
- make services derive from ProtobufCService; - make services derive from ProtobufCService;
be usable with a cast. be usable with a cast.
- provide example rpc - provide example rpc
- use size_t wherever appropriate in generated code, and in uses of that code (eg - use size_t wherever appropriate in generated code,
pack and unpack) and in uses of that code (eg pack and unpack)
- To document:
- __INIT macro
- support Group (whatever it is) - support Group (whatever it is)
- almost no code generator options are obeyed - almost no code generator options are obeyed
......
...@@ -31,3 +31,6 @@ struct _ProtobufCIntRange ...@@ -31,3 +31,6 @@ struct _ProtobufCIntRange
int protobuf_c_int_ranges_lookup (unsigned n_ranges, int protobuf_c_int_ranges_lookup (unsigned n_ranges,
ProtobufCIntRange *ranges); ProtobufCIntRange *ranges);
#define PROTOBUF_C_SERVICE_DESCRIPTOR_MAGIC 0x14159bc3
#define PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC 0x28aaeef9
#define PROTOBUF_C_ENUM_DESCRIPTOR_MAGIC 0x114315af
...@@ -823,7 +823,7 @@ parse_tag_and_wiretype (size_t len, ...@@ -823,7 +823,7 @@ parse_tag_and_wiretype (size_t len,
for (rv = 1; rv < max_rv; rv++) for (rv = 1; rv < max_rv; rv++)
if (data[rv] & 0x80) if (data[rv] & 0x80)
{ {
tag |= (data[rv++] & 0x7f) << shift; tag |= (data[rv] & 0x7f) << shift;
shift += 7; shift += 7;
} }
else else
...@@ -1110,8 +1110,7 @@ parse_member (ScannedMember *scanned_member, ...@@ -1110,8 +1110,7 @@ parse_member (ScannedMember *scanned_member,
void *member; void *member;
if (field == NULL) if (field == NULL)
{ {
ProtobufCMessageUnknownFieldArray *array = MESSAGE_GET_UNKNOWNS (message); ProtobufCMessageUnknownField *ufield = message->unknown_fields + (message->n_unknown_fields++);
ProtobufCMessageUnknownField *ufield = array->unknown_fields + (array->n_unknown_fields++);
ufield->tag = scanned_member->tag; ufield->tag = scanned_member->tag;
ufield->wire_type = scanned_member->wire_type; ufield->wire_type = scanned_member->wire_type;
ufield->len = scanned_member->len; ufield->len = scanned_member->len;
...@@ -1157,7 +1156,7 @@ protobuf_c_message_unpack (const ProtobufCMessageDescriptor *desc, ...@@ -1157,7 +1156,7 @@ protobuf_c_message_unpack (const ProtobufCMessageDescriptor *desc,
rv = ALLOC (allocator, desc->sizeof_message); rv = ALLOC (allocator, desc->sizeof_message);
scanned_member_slabs[0] = first_member_slab; scanned_member_slabs[0] = first_member_slab;
memset (rv + 1, 0, desc->sizeof_message - sizeof (ProtobufCMessage)); memset (rv, 0, desc->sizeof_message);
rv->descriptor = desc; rv->descriptor = desc;
while (rem > 0) while (rem > 0)
...@@ -1274,8 +1273,7 @@ protobuf_c_message_unpack (const ProtobufCMessageDescriptor *desc, ...@@ -1274,8 +1273,7 @@ protobuf_c_message_unpack (const ProtobufCMessageDescriptor *desc,
/* allocate space for unknown fields */ /* allocate space for unknown fields */
if (n_unknown) if (n_unknown)
{ {
ProtobufCMessageUnknownFieldArray *array = MESSAGE_GET_UNKNOWNS (rv); rv->unknown_fields = ALLOC (allocator, n_unknown * sizeof (ProtobufCMessageUnknownField));
array->unknown_fields = ALLOC (allocator, n_unknown * sizeof (ProtobufCMessageUnknownField));
} }
/* do real parsing */ /* do real parsing */
......
...@@ -86,6 +86,8 @@ struct _ProtobufCEnumValue ...@@ -86,6 +86,8 @@ struct _ProtobufCEnumValue
struct _ProtobufCEnumDescriptor struct _ProtobufCEnumDescriptor
{ {
uint32_t magic;
const char *name; const char *name;
const char *short_name; const char *short_name;
const char *c_name; const char *c_name;
...@@ -115,6 +117,8 @@ struct _ProtobufCFieldDescriptor ...@@ -115,6 +117,8 @@ struct _ProtobufCFieldDescriptor
}; };
struct _ProtobufCMessageDescriptor struct _ProtobufCMessageDescriptor
{ {
uint32_t magic;
const char *name; const char *name;
const char *short_name; const char *short_name;
const char *c_name; const char *c_name;
...@@ -129,16 +133,17 @@ struct _ProtobufCMessageDescriptor ...@@ -129,16 +133,17 @@ struct _ProtobufCMessageDescriptor
/* ranges, optimization for looking up fields */ /* ranges, optimization for looking up fields */
unsigned n_field_ranges; unsigned n_field_ranges;
const ProtobufCIntRange *field_ranges; const ProtobufCIntRange *field_ranges;
/* offset in message to the array of unknown fields */
unsigned unknown_field_array_offset;
}; };
typedef struct _ProtobufCMessage ProtobufCMessage; typedef struct _ProtobufCMessage ProtobufCMessage;
typedef struct _ProtobufCMessageUnknownField ProtobufCMessageUnknownField;
struct _ProtobufCMessage struct _ProtobufCMessage
{ {
const ProtobufCMessageDescriptor *descriptor; const ProtobufCMessageDescriptor *descriptor;
unsigned n_unknown_fields;
ProtobufCMessageUnknownField *unknown_fields;
}; };
#define PROTOBUF_C_MESSAGE_INIT(descriptor) { descriptor, 0, NULL }
size_t protobuf_c_message_get_packed_size(const ProtobufCMessage *message); size_t protobuf_c_message_get_packed_size(const ProtobufCMessage *message);
size_t protobuf_c_message_pack (const ProtobufCMessage *message, size_t protobuf_c_message_pack (const ProtobufCMessage *message,
...@@ -167,6 +172,8 @@ struct _ProtobufCMethodDescriptor ...@@ -167,6 +172,8 @@ struct _ProtobufCMethodDescriptor
}; };
struct _ProtobufCServiceDescriptor struct _ProtobufCServiceDescriptor
{ {
uint32_t magic;
const char *name; const char *name;
const char *short_name; const char *short_name;
const char *c_name; const char *c_name;
...@@ -207,8 +214,6 @@ typedef enum ...@@ -207,8 +214,6 @@ typedef enum
} ProtobufCWireType; } ProtobufCWireType;
/* --- unknown message fields --- */ /* --- unknown message fields --- */
typedef struct _ProtobufCMessageUnknownField ProtobufCMessageUnknownField;
typedef struct _ProtobufCMessageUnknownFieldArray ProtobufCMessageUnknownFieldArray;
struct _ProtobufCMessageUnknownField struct _ProtobufCMessageUnknownField
{ {
uint32_t tag; uint32_t tag;
...@@ -216,11 +221,6 @@ struct _ProtobufCMessageUnknownField ...@@ -216,11 +221,6 @@ struct _ProtobufCMessageUnknownField
size_t len; size_t len;
unsigned char *data; unsigned char *data;
}; };
struct _ProtobufCMessageUnknownFieldArray
{
unsigned n_unknown_fields;
ProtobufCMessageUnknownField *unknown_fields;
};
/* --- extra (superfluous) api: trivial buffer --- */ /* --- extra (superfluous) api: trivial buffer --- */
typedef struct _ProtobufCBufferSimple ProtobufCBufferSimple; typedef struct _ProtobufCBufferSimple ProtobufCBufferSimple;
......
...@@ -185,6 +185,7 @@ void EnumGenerator::GenerateEnumDescriptor(io::Printer* printer) { ...@@ -185,6 +185,7 @@ void EnumGenerator::GenerateEnumDescriptor(io::Printer* printer) {
printer->Print(vars, printer->Print(vars,
"const ProtobufCEnumDescriptor $lcclassname$__descriptor =\n" "const ProtobufCEnumDescriptor $lcclassname$__descriptor =\n"
"{\n" "{\n"
" PROTOBUF_C_ENUM_DESCRIPTOR_MAGIC,\n"
" \"$fullname$\",\n" " \"$fullname$\",\n"
" \"$shortname$\",\n" " \"$shortname$\",\n"
" \"$cname$\",\n" " \"$cname$\",\n"
......
...@@ -110,7 +110,7 @@ GenerateStructDefinition(io::Printer* printer) { ...@@ -110,7 +110,7 @@ GenerateStructDefinition(io::Printer* printer) {
printer->Print(vars, printer->Print(vars,
"struct $dllexport$ _$classname$\n" "struct $dllexport$ _$classname$\n"
"{\n" "{\n"
" const ProtobufCMessageDescriptor *descriptor;\n"); " ProtobufCMessage base;\n");
// Generate fields. // Generate fields.
printer->Indent(); printer->Indent();
...@@ -120,12 +120,10 @@ GenerateStructDefinition(io::Printer* printer) { ...@@ -120,12 +120,10 @@ GenerateStructDefinition(io::Printer* printer) {
} }
printer->Outdent(); printer->Outdent();
printer->Print(vars, " /* private */\n");
printer->Print(vars, " ProtobufCMessageUnknownFieldArray unknown_field_array;\n");
printer->Print(vars, "};\n\n"); printer->Print(vars, "};\n\n");
printer->Print(vars, "#define $ucclassname$__INIT \\\n" printer->Print(vars, "#define $ucclassname$__INIT \\\n"
" { &$lcclassname$__descriptor"); " { PROTOBUF_C_MESSAGE_INIT (&$lcclassname$__descriptor)");
for (int i = 0; i < descriptor_->field_count(); i++) { for (int i = 0; i < descriptor_->field_count(); i++) {
const FieldDescriptor *field = descriptor_->field(i); const FieldDescriptor *field = descriptor_->field(i);
printer->Print(", "); printer->Print(", ");
...@@ -208,21 +206,21 @@ GenerateHelperFunctionDefinitions(io::Printer* printer) ...@@ -208,21 +206,21 @@ GenerateHelperFunctionDefinitions(io::Printer* printer)
"size_t $lcclassname$__get_packed_size\n" "size_t $lcclassname$__get_packed_size\n"
" (const $classname$ *message)\n" " (const $classname$ *message)\n"
"{\n" "{\n"
" PROTOBUF_C_ASSERT (message->descriptor == &$lcclassname$__descriptor);\n" " PROTOBUF_C_ASSERT (message->base.descriptor == &$lcclassname$__descriptor);\n"
" return protobuf_c_message_get_packed_size ((ProtobufCMessage*)(message));\n" " return protobuf_c_message_get_packed_size ((ProtobufCMessage*)(message));\n"
"}\n" "}\n"
"size_t $lcclassname$__pack\n" "size_t $lcclassname$__pack\n"
" (const $classname$ *message,\n" " (const $classname$ *message,\n"
" unsigned char *out)\n" " unsigned char *out)\n"
"{\n" "{\n"
" PROTOBUF_C_ASSERT (message->descriptor == &$lcclassname$__descriptor);\n" " PROTOBUF_C_ASSERT (message->base.descriptor == &$lcclassname$__descriptor);\n"
" return protobuf_c_message_pack ((ProtobufCMessage*)message, out);\n" " return protobuf_c_message_pack ((ProtobufCMessage*)message, out);\n"
"}\n" "}\n"
"size_t $lcclassname$__pack_to_buffer\n" "size_t $lcclassname$__pack_to_buffer\n"
" (const $classname$ *message,\n" " (const $classname$ *message,\n"
" ProtobufCBuffer *buffer)\n" " ProtobufCBuffer *buffer)\n"
"{\n" "{\n"
" PROTOBUF_C_ASSERT (message->descriptor == &$lcclassname$__descriptor);\n" " PROTOBUF_C_ASSERT (message->base.descriptor == &$lcclassname$__descriptor);\n"
" return protobuf_c_message_pack_to_buffer ((ProtobufCMessage*)message, buffer);\n" " return protobuf_c_message_pack_to_buffer ((ProtobufCMessage*)message, buffer);\n"
"}\n" "}\n"
"$classname$ *\n" "$classname$ *\n"
...@@ -239,7 +237,7 @@ GenerateHelperFunctionDefinitions(io::Printer* printer) ...@@ -239,7 +237,7 @@ GenerateHelperFunctionDefinitions(io::Printer* printer)
" ($classname$ *message,\n" " ($classname$ *message,\n"
" ProtobufCAllocator *allocator)\n" " ProtobufCAllocator *allocator)\n"
"{\n" "{\n"
" PROTOBUF_C_ASSERT (message->descriptor == &$lcclassname$__descriptor);\n" " PROTOBUF_C_ASSERT (message->base.descriptor == &$lcclassname$__descriptor);\n"
" protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator);\n" " protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator);\n"
"}\n" "}\n"
); );
...@@ -297,6 +295,7 @@ GenerateMessageDescriptor(io::Printer* printer) { ...@@ -297,6 +295,7 @@ GenerateMessageDescriptor(io::Printer* printer) {
printer->Print(vars, printer->Print(vars,
"const ProtobufCMessageDescriptor $lcclassname$__descriptor =\n" "const ProtobufCMessageDescriptor $lcclassname$__descriptor =\n"
"{\n" "{\n"
" PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC,\n"
" \"$fullname$\",\n" " \"$fullname$\",\n"
" \"$shortname$\",\n" " \"$shortname$\",\n"
" \"$classname$\",\n" " \"$classname$\",\n"
...@@ -305,8 +304,7 @@ GenerateMessageDescriptor(io::Printer* printer) { ...@@ -305,8 +304,7 @@ GenerateMessageDescriptor(io::Printer* printer) {
" $n_fields$,\n" " $n_fields$,\n"
" $lcclassname$__field_descriptors,\n" " $lcclassname$__field_descriptors,\n"
" $n_ranges$," " $n_ranges$,"
" $lcclassname$__number_ranges,\n" " $lcclassname$__number_ranges\n"
" PROTOBUF_C_OFFSETOF($classname$, unknown_field_array)\n"
"};\n"); "};\n");
} }
......
...@@ -131,6 +131,7 @@ void ServiceGenerator::GenerateServiceDescriptor(io::Printer* printer) ...@@ -131,6 +131,7 @@ void ServiceGenerator::GenerateServiceDescriptor(io::Printer* printer)
printer->Print(vars_, "};\n"); printer->Print(vars_, "};\n");
printer->Print(vars_, "const ProtobufCServiceDescriptor $lcfullname$__descriptor =\n" printer->Print(vars_, "const ProtobufCServiceDescriptor $lcfullname$__descriptor =\n"
"{\n" "{\n"
" PROTOBUF_C_SERVICE_DESCRIPTOR_MAGIC,\n"
" \"$fullname$\",\n" " \"$fullname$\",\n"
" \"$name$\",\n" " \"$name$\",\n"
" \"$cname$\",\n" " \"$cname$\",\n"
......
...@@ -47,11 +47,29 @@ dump_test_enum_big (void) ...@@ -47,11 +47,29 @@ dump_test_enum_big (void)
eb.set_test(VALUE2097152); dump_message_bytes(&eb, "test_enum_big_VALUE2097152"); eb.set_test(VALUE2097152); dump_message_bytes(&eb, "test_enum_big_VALUE2097152");
eb.set_test(VALUE268435455); dump_message_bytes(&eb, "test_enum_big_VALUE268435455"); eb.set_test(VALUE268435455); dump_message_bytes(&eb, "test_enum_big_VALUE268435455");
eb.set_test(VALUE268435456); dump_message_bytes(&eb, "test_enum_big_VALUE268435456"); eb.set_test(VALUE268435456); dump_message_bytes(&eb, "test_enum_big_VALUE268435456");
} }
static void
dump_test_field_numbers (void)
{
#define DUMP_ONE(num) \
{ TestFieldNo##num f; \
f.set_test("tst"); \
dump_message_bytes(&f, "test_field_number_" #num); }
DUMP_ONE (15)
DUMP_ONE (16)
DUMP_ONE (2047)
DUMP_ONE (2048)
DUMP_ONE (262143)
DUMP_ONE (262144)
DUMP_ONE (33554431)
DUMP_ONE (33554432)
#undef DUMP_ONE
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
dump_test_enum_small (); dump_test_enum_small ();
dump_test_enum_big (); dump_test_enum_big ();
dump_test_field_numbers ();
return 0; return 0;
} }
...@@ -5,15 +5,13 @@ ...@@ -5,15 +5,13 @@
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
Foo__Person person; Foo__Person person = FOO__PERSON__INIT;
Foo__Person *person2; Foo__Person *person2;
unsigned char simple_pad[8]; unsigned char simple_pad[8];
size_t size, size2; size_t size, size2;
unsigned char *packed; unsigned char *packed;
ProtobufCBufferSimple bs = PROTOBUF_C_BUFFER_SIMPLE_INIT (simple_pad); ProtobufCBufferSimple bs = PROTOBUF_C_BUFFER_SIMPLE_INIT (simple_pad);
memset (&person, 0, sizeof (person));
person.descriptor = &foo__person__descriptor;
person.name = "dave b"; person.name = "dave b";
person.id = 42; person.id = 42;
size = foo__person__get_packed_size (&person); size = foo__person__get_packed_size (&person);
......
...@@ -55,6 +55,8 @@ static void test_enum_small (void) ...@@ -55,6 +55,8 @@ static void test_enum_small (void)
uint8_t *data; uint8_t *data;
Foo__TestMessRequiredEnumSmall *unpacked; Foo__TestMessRequiredEnumSmall *unpacked;
assert (sizeof (Foo__TestEnumSmall) == 4);
small.test = FOO__TEST_ENUM_SMALL__VALUE; small.test = FOO__TEST_ENUM_SMALL__VALUE;
unpacked = test_compare_pack_methods ((ProtobufCMessage*)&small, &len, &data); unpacked = test_compare_pack_methods ((ProtobufCMessage*)&small, &len, &data);
assert (unpacked->test == FOO__TEST_ENUM_SMALL__VALUE); assert (unpacked->test == FOO__TEST_ENUM_SMALL__VALUE);
...@@ -75,7 +77,9 @@ static void test_enum_big (void) ...@@ -75,7 +77,9 @@ static void test_enum_big (void)
Foo__TestMessRequiredEnum big = FOO__TEST_MESS_REQUIRED_ENUM__INIT; Foo__TestMessRequiredEnum big = FOO__TEST_MESS_REQUIRED_ENUM__INIT;
size_t len; size_t len;
uint8_t *data; uint8_t *data;
Foo__TestMessRequiredEnumSmall *unpacked; Foo__TestMessRequiredEnum *unpacked;
assert (sizeof (Foo__TestEnum) == 4);
#define DO_ONE_TEST(shortname, numeric_value, encoded_len) \ #define DO_ONE_TEST(shortname, numeric_value, encoded_len) \
do{ \ do{ \
...@@ -101,6 +105,33 @@ static void test_enum_big (void) ...@@ -101,6 +105,33 @@ static void test_enum_big (void)
#undef DO_ONE_TEST #undef DO_ONE_TEST
} }
static void test_field_numbers (void)
{
size_t len;
uint8_t *data;
#define DO_ONE_TEST(num, exp_len) \
{ \
Foo__TestFieldNo##num t = FOO__TEST_FIELD_NO##num##__INIT; \
Foo__TestFieldNo##num *t2; \
t.test = "tst"; \
t2 = test_compare_pack_methods ((ProtobufCMessage*)(&t), &len, &data); \
assert (strcmp (t2->test, "tst") == 0); \
TEST_VERSUS_STATIC_ARRAY (len, data, test_field_number_##num); \
assert (len == exp_len); \
free (data); \
foo__test_field_no##num##__free_unpacked (t2, NULL); \
}
DO_ONE_TEST (15, 1 + 1 + 3);
DO_ONE_TEST (16, 2 + 1 + 3);
DO_ONE_TEST (2047, 2 + 1 + 3);
DO_ONE_TEST (2048, 3 + 1 + 3);
DO_ONE_TEST (262143, 3 + 1 + 3);
DO_ONE_TEST (262144, 4 + 1 + 3);
DO_ONE_TEST (33554431, 4 + 1 + 3);
DO_ONE_TEST (33554432, 5 + 1 + 3);
#undef DO_ONE_TEST
}
/* === simple testing framework === */ /* === simple testing framework === */
...@@ -115,7 +146,7 @@ static Test tests[] = ...@@ -115,7 +146,7 @@ static Test tests[] =
{ {
{ "small enums", test_enum_small }, { "small enums", test_enum_small },
{ "big enums", test_enum_big }, { "big enums", test_enum_big },
//{ "test field numbers", test_field_numbers }, { "test field numbers", test_field_numbers },
//{ "test repeated int32" ,test_repeated_int32 }, //{ "test repeated int32" ,test_repeated_int32 },
//{ "test repeated sint32" ,test_repeated_sint32 }, //{ "test repeated sint32" ,test_repeated_sint32 },
//{ "test repeated sfixed32" ,test_repeated_sfixed32 }, //{ "test repeated sfixed32" ,test_repeated_sfixed32 },
......
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