diff options
author | Romain Forlot <romain.forlot@iot.bzh> | 2017-06-20 10:24:05 +0000 |
---|---|---|
committer | Romain Forlot <romain.forlot@iot.bzh> | 2017-06-20 10:24:05 +0000 |
commit | 32e25cbca210a359b09768537b6f443fe90a3070 (patch) | |
tree | 3309794c15d8a8f8e9c1c08cad072ee1378813ba /CAN-binder/libs/nanopb/tests/cyclic_messages | |
parent | 76c43dec62b2e21cd6446360c00d4fe6b437533f (diff) |
Separation Generator to a dedicated repo
Change-Id: Id94831651c3266861435272a6e36c7884bef2c45
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'CAN-binder/libs/nanopb/tests/cyclic_messages')
4 files changed, 0 insertions, 193 deletions
diff --git a/CAN-binder/libs/nanopb/tests/cyclic_messages/SConscript b/CAN-binder/libs/nanopb/tests/cyclic_messages/SConscript deleted file mode 100644 index c782001..0000000 --- a/CAN-binder/libs/nanopb/tests/cyclic_messages/SConscript +++ /dev/null @@ -1,11 +0,0 @@ -Import("env") - -# Encode cyclic messages with callback fields - -c = Copy("$TARGET", "$SOURCE") -env.Command("cyclic_callback.proto", "cyclic.proto", c) -env.NanopbProto(["cyclic_callback", "cyclic_callback.options"]) - -enc_callback = env.Program(["encode_cyclic_callback.c", "cyclic_callback.pb.c", "$COMMON/pb_encode.o", "$COMMON/pb_common.o"]) - - diff --git a/CAN-binder/libs/nanopb/tests/cyclic_messages/cyclic.proto b/CAN-binder/libs/nanopb/tests/cyclic_messages/cyclic.proto deleted file mode 100644 index 8cab0b1..0000000 --- a/CAN-binder/libs/nanopb/tests/cyclic_messages/cyclic.proto +++ /dev/null @@ -1,27 +0,0 @@ -// Test structures with cyclic references. -// These can only be handled in pointer/callback mode, -// see associated .options files. - -syntax = "proto2"; - -message TreeNode -{ - optional int32 leaf = 1; - optional TreeNode left = 2; - optional TreeNode right = 3; -} - -message Dictionary -{ - repeated KeyValuePair dictItem = 1; -} - -message KeyValuePair -{ - required string key = 1; - optional string stringValue = 2; - optional int32 intValue = 3; - optional Dictionary dictValue = 4; - optional TreeNode treeValue = 5; -} - diff --git a/CAN-binder/libs/nanopb/tests/cyclic_messages/cyclic_callback.options b/CAN-binder/libs/nanopb/tests/cyclic_messages/cyclic_callback.options deleted file mode 100644 index fd4e1e1..0000000 --- a/CAN-binder/libs/nanopb/tests/cyclic_messages/cyclic_callback.options +++ /dev/null @@ -1,7 +0,0 @@ -TreeNode.left type:FT_CALLBACK -TreeNode.right type:FT_CALLBACK - -Dictionary.data type:FT_CALLBACK -KeyValuePair.key max_size:8 -KeyValuePair.stringValue max_size:8 -KeyValuePair.treeValue type:FT_CALLBACK diff --git a/CAN-binder/libs/nanopb/tests/cyclic_messages/encode_cyclic_callback.c b/CAN-binder/libs/nanopb/tests/cyclic_messages/encode_cyclic_callback.c deleted file mode 100644 index 7f67e70..0000000 --- a/CAN-binder/libs/nanopb/tests/cyclic_messages/encode_cyclic_callback.c +++ /dev/null @@ -1,148 +0,0 @@ -/* This program parses an input string in a format a bit like JSON: - * {'foobar': 1234, 'xyz': 'abc', 'tree': [[[1, 2], 3], [4, 5]]} - * and encodes it as protobuf - * - * Note: The string parsing here is not in any way intended to be robust - * nor safe against buffer overflows. It is just for this test. - */ - -#include <pb_encode.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include "cyclic_callback.pb.h" - -static char *find_end_of_item(char *p) -{ - int depth = 0; - do { - if (*p == '[' || *p == '{') depth++; - if (*p == ']' || *p == '}') depth--; - p++; - } while (depth > 0 || (*p != ',' && *p != '}')); - - if (*p == '}') - return p; /* End of parent dict */ - - p++; - while (*p == ' ') p++; - return p; -} - -/* Parse a tree in format [[1 2] 3] and encode it directly to protobuf */ -static bool encode_tree(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) -{ - TreeNode tree = TreeNode_init_zero; - char *p = (char*)*arg; - - if (*p == '[') - { - /* This is a tree branch */ - p++; - tree.left.funcs.encode = encode_tree; - tree.left.arg = p; - - p = find_end_of_item(p); - tree.right.funcs.encode = encode_tree; - tree.right.arg = p; - } - else - { - /* This is a leaf node */ - tree.has_leaf = true; - tree.leaf = atoi(p); - } - - return pb_encode_tag_for_field(stream, field) && - pb_encode_submessage(stream, TreeNode_fields, &tree); -} - -/* Parse a dictionary in format {'name': value} and encode it directly to protobuf */ -static bool encode_dictionary(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) -{ - int textlen; - char *p = (char*)*arg; - if (*p == '{') p++; - while (*p != '}') - { - KeyValuePair pair = KeyValuePair_init_zero; - - if (*p != '\'') - PB_RETURN_ERROR(stream, "invalid key, missing quote"); - - p++; /* Starting quote of key */ - textlen = strchr(p, '\'') - p; - strncpy(pair.key, p, textlen); - pair.key[textlen] = 0; - p += textlen + 2; - - while (*p == ' ') p++; - - if (*p == '[') - { - /* Value is a tree */ - pair.treeValue.funcs.encode = encode_tree; - pair.treeValue.arg = p; - } - else if (*p == '\'') - { - /* Value is a string */ - pair.has_stringValue = true; - p++; - textlen = strchr(p, '\'') - p; - strncpy(pair.stringValue, p, textlen); - pair.stringValue[textlen] = 0; - } - else if (*p == '{') - { - /* Value is a dictionary */ - pair.has_dictValue = true; - pair.dictValue.dictItem.funcs.encode = encode_dictionary; - pair.dictValue.dictItem.arg = p; - } - else - { - /* Value is integer */ - pair.has_intValue = true; - pair.intValue = atoi(p); - } - - p = find_end_of_item(p); - - if (!pb_encode_tag_for_field(stream, field)) - return false; - - if (!pb_encode_submessage(stream, KeyValuePair_fields, &pair)) - return false; - } - - return true; -} - - -int main(int argc, char *argv[]) -{ - uint8_t buffer[256]; - pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer)); - Dictionary dict = Dictionary_init_zero; - - if (argc <= 1) - { - fprintf(stderr, "Usage: %s \"{'foobar': 1234, ...}\"\n", argv[0]); - return 1; - } - - dict.dictItem.funcs.encode = encode_dictionary; - dict.dictItem.arg = argv[1]; - - if (!pb_encode(&stream, Dictionary_fields, &dict)) - { - fprintf(stderr, "Encoding error: %s\n", PB_GET_ERROR(&stream)); - return 1; - } - - fwrite(buffer, 1, stream.bytes_written, stdout); - return 0; -} - - |