Implement generator support for extension fields (no encoder/decoder support yet)

This commit is contained in:
Petteri Aimonen
2013-07-17 00:06:54 +03:00
parent f064c2c48a
commit 7c5e184c26
6 changed files with 182 additions and 15 deletions

View File

@@ -8,7 +8,7 @@ TESTS= decode_unittests encode_unittests \
test_decode_callbacks test_encode_callbacks \
test_missing_fields test_no_messages test_funny_name \
test_multiple_files test_cxxcompile test_options \
bc_encode bc_decode
bc_encode bc_decode test_encode_extensions
# More strict checks for the core part of nanopb
CC_VERSION=$(shell $(CC) -v 2>&1)
@@ -84,6 +84,7 @@ test_no_messages: no_messages.pb.h no_messages.pb.c no_messages.pb.o
test_funny_name: funny-proto+name.pb.h funny-proto+name.pb.o
bc_encode: bc_alltypes.pb.o pb_encode.o bc_encode.o
bc_decode: bc_alltypes.pb.o pb_decode.o bc_decode.o
test_encode_extensions: test_encode_extensions.c pb_encode.o alltypes.pb.o extensions.pb.o
%.pb: %.proto
protoc -I. -I../generator -I/usr/include -o$@ $<
@@ -125,7 +126,7 @@ run_unittests: $(TESTS)
./test_encode3_buf 1 | ./test_decode3_buf 1
./test_decode3 < alltypes_with_extra_fields.pb
./bc_encode | ./bc_decode
./test_missing_fields
test_options: options.pb.h options.expected options.pb.o

View File

@@ -86,5 +86,8 @@ message AllTypes {
// Just to make sure that the size of the fields has been calculated
// properly, i.e. otherwise a bug in last field might not be detected.
required int32 end = 99;
extensions 200 to 255;
}

5
tests/extensions.proto Normal file
View File

@@ -0,0 +1,5 @@
import 'alltypes.proto';
extend AllTypes {
optional int32 AllTypes_extensionfield1 = 255;
}

View File

@@ -0,0 +1,34 @@
/* Tests extension fields.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pb_encode.h>
#include "alltypes.pb.h"
#include "extensions.pb.h"
int main(int argc, char **argv)
{
AllTypes alltypes = {0};
int32_t extensionfield1 = 12345;
pb_extension_t ext1 = {&AllTypes_extensionfield1, &extensionfield1, NULL};
alltypes.extensions = &ext1;
uint8_t buffer[1024];
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
/* Now encode it and check if we succeeded. */
if (pb_encode(&stream, AllTypes_fields, &alltypes))
{
fwrite(buffer, 1, stream.bytes_written, stdout);
return 0; /* Success */
}
else
{
fprintf(stderr, "Encoding failed: %s\n", PB_GET_ERROR(&stream));
return 1; /* Failure */
}
}