| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 | 
							- /* This program takes a command line argument and encodes a message in
 
-  * one of MsgType1, MsgType2 or MsgType3.
 
-  */
 
-  
 
- #include <stdio.h>
 
- #include <string.h>
 
- #include <stdlib.h>
 
- #include <pb_encode.h>
 
- #include <pb_common.h>
 
- #include "unionproto.pb.h"
 
- /* This function is the core of the union encoding process. It handles
 
-  * the top-level pb_field_t array manually, in order to encode a correct
 
-  * field tag before the message. The pointer to MsgType_fields array is
 
-  * used as an unique identifier for the message type.
 
-  */
 
- bool encode_unionmessage(pb_ostream_t *stream, const pb_msgdesc_t *messagetype, void *message)
 
- {
 
-     pb_field_iter_t iter;
 
-     if (!pb_field_iter_begin(&iter, UnionMessage_fields, message))
 
-         return false;
 
-     do
 
-     {
 
-         if (iter.submsg_desc == messagetype)
 
-         {
 
-             /* This is our field, encode the message using it. */
 
-             if (!pb_encode_tag_for_field(stream, &iter))
 
-                 return false;
 
-             
 
-             return pb_encode_submessage(stream, messagetype, message);
 
-         }
 
-     } while (pb_field_iter_next(&iter));
 
-     
 
-     /* Didn't find the field for messagetype */
 
-     return false;
 
- }
 
- int main(int argc, char **argv)
 
- {
 
-     if (argc != 2)
 
-     {
 
-         fprintf(stderr, "Usage: %s (1|2|3)\n", argv[0]);
 
-         return 1;
 
-     }
 
-     
 
-     uint8_t buffer[512];
 
-     pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
 
-     
 
-     bool status = false;
 
-     int msgtype = atoi(argv[1]);
 
-     if (msgtype == 1)
 
-     {
 
-         /* Send message of type 1 */
 
-         MsgType1 msg = {42};
 
-         status = encode_unionmessage(&stream, MsgType1_fields, &msg);
 
-     }
 
-     else if (msgtype == 2)
 
-     {
 
-         /* Send message of type 2 */
 
-         MsgType2 msg = {true};
 
-         status = encode_unionmessage(&stream, MsgType2_fields, &msg);
 
-     }
 
-     else if (msgtype == 3)
 
-     {
 
-         /* Send message of type 3 */
 
-         MsgType3 msg = {3, 1415};
 
-         status = encode_unionmessage(&stream, MsgType3_fields, &msg);
 
-     }
 
-     else
 
-     {
 
-         fprintf(stderr, "Unknown message type: %d\n", msgtype);
 
-         return 2;
 
-     }
 
-     
 
-     if (!status)
 
-     {
 
-         fprintf(stderr, "Encoding failed!\n");
 
-         return 3;
 
-     }
 
-     else
 
-     {
 
-         fwrite(buffer, 1, stream.bytes_written, stdout);
 
-         return 0; /* Success */
 
-     }
 
- }
 
 
  |