Fix potential unaligned access
[apps/low-level-can-service.git] / pb_encode.c
1 /* pb_encode.c -- encode a protobuf using minimal resources
2  *
3  * 2011 Petteri Aimonen <jpa@kapsi.fi>
4  */
5
6 #include "pb.h"
7 #include "pb_encode.h"
8 #include "pb_common.h"
9
10 /* Use the GCC warn_unused_result attribute to check that all return values
11  * are propagated correctly. On other compilers and gcc before 3.4.0 just
12  * ignore the annotation.
13  */
14 #if !defined(__GNUC__) || ( __GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)
15     #define checkreturn
16 #else
17     #define checkreturn __attribute__((warn_unused_result))
18 #endif
19
20 /**************************************
21  * Declarations internal to this file *
22  **************************************/
23 typedef bool (*pb_encoder_t)(pb_ostream_t *stream, const pb_field_t *field, const void *src) checkreturn;
24
25 static bool checkreturn buf_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count);
26 static bool checkreturn encode_array(pb_ostream_t *stream, const pb_field_t *field, const void *pData, size_t count, pb_encoder_t func);
27 static bool checkreturn encode_field(pb_ostream_t *stream, const pb_field_t *field, const void *pData);
28 static bool checkreturn default_extension_encoder(pb_ostream_t *stream, const pb_extension_t *extension);
29 static bool checkreturn encode_extension_field(pb_ostream_t *stream, const pb_field_t *field, const void *pData);
30 static bool checkreturn pb_enc_varint(pb_ostream_t *stream, const pb_field_t *field, const void *src);
31 static bool checkreturn pb_enc_uvarint(pb_ostream_t *stream, const pb_field_t *field, const void *src);
32 static bool checkreturn pb_enc_svarint(pb_ostream_t *stream, const pb_field_t *field, const void *src);
33 static bool checkreturn pb_enc_fixed32(pb_ostream_t *stream, const pb_field_t *field, const void *src);
34 static bool checkreturn pb_enc_fixed64(pb_ostream_t *stream, const pb_field_t *field, const void *src);
35 static bool checkreturn pb_enc_bytes(pb_ostream_t *stream, const pb_field_t *field, const void *src);
36 static bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_field_t *field, const void *src);
37 static bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb_field_t *field, const void *src);
38
39 /* --- Function pointers to field encoders ---
40  * Order in the array must match pb_action_t LTYPE numbering.
41  */
42 static const pb_encoder_t PB_ENCODERS[PB_LTYPES_COUNT] = {
43     &pb_enc_varint,
44     &pb_enc_uvarint,
45     &pb_enc_svarint,
46     &pb_enc_fixed32,
47     &pb_enc_fixed64,
48     
49     &pb_enc_bytes,
50     &pb_enc_string,
51     &pb_enc_submessage,
52     NULL, /* extensions */
53     &pb_enc_bytes /* PB_LTYPE_FIXED_LENGTH_BYTES */
54 };
55
56 /*******************************
57  * pb_ostream_t implementation *
58  *******************************/
59
60 static bool checkreturn buf_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count)
61 {
62     pb_byte_t *dest = (pb_byte_t*)stream->state;
63     stream->state = dest + count;
64     
65     while (count--)
66         *dest++ = *buf++;
67     
68     return true;
69 }
70
71 pb_ostream_t pb_ostream_from_buffer(pb_byte_t *buf, size_t bufsize)
72 {
73     pb_ostream_t stream;
74 #ifdef PB_BUFFER_ONLY
75     stream.callback = (void*)1; /* Just a marker value */
76 #else
77     stream.callback = &buf_write;
78 #endif
79     stream.state = buf;
80     stream.max_size = bufsize;
81     stream.bytes_written = 0;
82 #ifndef PB_NO_ERRMSG
83     stream.errmsg = NULL;
84 #endif
85     return stream;
86 }
87
88 bool checkreturn pb_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count)
89 {
90     if (stream->callback != NULL)
91     {
92         if (stream->bytes_written + count > stream->max_size)
93             PB_RETURN_ERROR(stream, "stream full");
94
95 #ifdef PB_BUFFER_ONLY
96         if (!buf_write(stream, buf, count))
97             PB_RETURN_ERROR(stream, "io error");
98 #else        
99         if (!stream->callback(stream, buf, count))
100             PB_RETURN_ERROR(stream, "io error");
101 #endif
102     }
103     
104     stream->bytes_written += count;
105     return true;
106 }
107
108 /*************************
109  * Encode a single field *
110  *************************/
111
112 /* Encode a static array. Handles the size calculations and possible packing. */
113 static bool checkreturn encode_array(pb_ostream_t *stream, const pb_field_t *field,
114                          const void *pData, size_t count, pb_encoder_t func)
115 {
116     size_t i;
117     const void *p;
118     size_t size;
119     
120     if (count == 0)
121         return true;
122
123     if (PB_ATYPE(field->type) != PB_ATYPE_POINTER && count > field->array_size)
124         PB_RETURN_ERROR(stream, "array max size exceeded");
125     
126     /* We always pack arrays if the datatype allows it. */
127     if (PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE)
128     {
129         if (!pb_encode_tag(stream, PB_WT_STRING, field->tag))
130             return false;
131         
132         /* Determine the total size of packed array. */
133         if (PB_LTYPE(field->type) == PB_LTYPE_FIXED32)
134         {
135             size = 4 * count;
136         }
137         else if (PB_LTYPE(field->type) == PB_LTYPE_FIXED64)
138         {
139             size = 8 * count;
140         }
141         else
142         { 
143             pb_ostream_t sizestream = PB_OSTREAM_SIZING;
144             p = pData;
145             for (i = 0; i < count; i++)
146             {
147                 if (!func(&sizestream, field, p))
148                     return false;
149                 p = (const char*)p + field->data_size;
150             }
151             size = sizestream.bytes_written;
152         }
153         
154         if (!pb_encode_varint(stream, (uint64_t)size))
155             return false;
156         
157         if (stream->callback == NULL)
158             return pb_write(stream, NULL, size); /* Just sizing.. */
159         
160         /* Write the data */
161         p = pData;
162         for (i = 0; i < count; i++)
163         {
164             if (!func(stream, field, p))
165                 return false;
166             p = (const char*)p + field->data_size;
167         }
168     }
169     else
170     {
171         p = pData;
172         for (i = 0; i < count; i++)
173         {
174             if (!pb_encode_tag_for_field(stream, field))
175                 return false;
176
177             /* Normally the data is stored directly in the array entries, but
178              * for pointer-type string and bytes fields, the array entries are
179              * actually pointers themselves also. So we have to dereference once
180              * more to get to the actual data. */
181             if (PB_ATYPE(field->type) == PB_ATYPE_POINTER &&
182                 (PB_LTYPE(field->type) == PB_LTYPE_STRING ||
183                  PB_LTYPE(field->type) == PB_LTYPE_BYTES))
184             {
185                 if (!func(stream, field, *(const void* const*)p))
186                     return false;      
187             }
188             else
189             {
190                 if (!func(stream, field, p))
191                     return false;
192             }
193             p = (const char*)p + field->data_size;
194         }
195     }
196     
197     return true;
198 }
199
200 /* Encode a field with static or pointer allocation, i.e. one whose data
201  * is available to the encoder directly. */
202 static bool checkreturn encode_basic_field(pb_ostream_t *stream,
203     const pb_field_t *field, const void *pData)
204 {
205     pb_encoder_t func;
206     const void *pSize;
207     bool implicit_has = true;
208     
209     func = PB_ENCODERS[PB_LTYPE(field->type)];
210     
211     if (field->size_offset)
212         pSize = (const char*)pData + field->size_offset;
213     else if (!field->size_offset && PB_HTYPE(field->type) == PB_HTYPE_OPTIONAL)
214     {
215         /* In proto3 there are optional fields but no has_ flag, do not encode this fields 
216          * when value is default or empty. */
217         if(PB_LTYPE(field->type) == PB_LTYPE_BYTES)
218         {
219             const pb_bytes_array_t *bytes = (const pb_bytes_array_t*)pData;
220             if(bytes->size == 0)
221                 implicit_has = false;
222         }
223         else if (PB_LTYPE(field->type) == PB_LTYPE_STRING )
224         {
225                 if( *(const char*)pData == '\0')
226                                  implicit_has = false;
227         }
228                 else if ((field->data_size == sizeof(uint_least8_t) && *(const uint_least8_t*)pData == 0) ||
229                  (field->data_size == sizeof(uint_least16_t) && *(const uint_least16_t*)pData == 0) ||
230                  (field->data_size == sizeof(uint32_t) && *(const uint_least32_t*)pData == 0) ||
231                          (field->data_size == sizeof(uint64_t) && *(const uint_least64_t*)pData == 0))
232         {                   
233             implicit_has = false;
234         }
235         pSize = &implicit_has;
236     }
237     else
238         pSize = &implicit_has;
239
240     if (PB_ATYPE(field->type) == PB_ATYPE_POINTER)
241     {
242         /* pData is a pointer to the field, which contains pointer to
243          * the data. If the 2nd pointer is NULL, it is interpreted as if
244          * the has_field was false.
245          */
246         
247         pData = *(const void* const*)pData;
248         implicit_has = (pData != NULL);
249     }
250
251     switch (PB_HTYPE(field->type))
252     {
253         case PB_HTYPE_REQUIRED:
254             if (!pData)
255                 PB_RETURN_ERROR(stream, "missing required field");
256             if (!pb_encode_tag_for_field(stream, field))
257                 return false;
258             if (!func(stream, field, pData))
259                 return false;
260             break;
261         
262         case PB_HTYPE_OPTIONAL:
263             if (*(const bool*)pSize)
264             {
265                 if (!pb_encode_tag_for_field(stream, field))
266                     return false;
267             
268                 if (!func(stream, field, pData))
269                     return false;
270             }
271             break;
272         
273         case PB_HTYPE_REPEATED:
274             if (!encode_array(stream, field, pData, *(const pb_size_t*)pSize, func))
275                 return false;
276             break;
277         
278         case PB_HTYPE_ONEOF:
279             if (*(const pb_size_t*)pSize == field->tag)
280             {
281                 if (!pb_encode_tag_for_field(stream, field))
282                     return false;
283
284                 if (!func(stream, field, pData))
285                     return false;
286             }
287             break;
288             
289         default:
290             PB_RETURN_ERROR(stream, "invalid field type");
291     }
292     
293     return true;
294 }
295
296 /* Encode a field with callback semantics. This means that a user function is
297  * called to provide and encode the actual data. */
298 static bool checkreturn encode_callback_field(pb_ostream_t *stream,
299     const pb_field_t *field, const void *pData)
300 {
301     const pb_callback_t *callback = (const pb_callback_t*)pData;
302     
303 #ifdef PB_OLD_CALLBACK_STYLE
304     const void *arg = callback->arg;
305 #else
306     void * const *arg = &(callback->arg);
307 #endif    
308     
309     if (callback->funcs.encode != NULL)
310     {
311         if (!callback->funcs.encode(stream, field, arg))
312             PB_RETURN_ERROR(stream, "callback error");
313     }
314     return true;
315 }
316
317 /* Encode a single field of any callback or static type. */
318 static bool checkreturn encode_field(pb_ostream_t *stream,
319     const pb_field_t *field, const void *pData)
320 {
321     switch (PB_ATYPE(field->type))
322     {
323         case PB_ATYPE_STATIC:
324         case PB_ATYPE_POINTER:
325             return encode_basic_field(stream, field, pData);
326         
327         case PB_ATYPE_CALLBACK:
328             return encode_callback_field(stream, field, pData);
329         
330         default:
331             PB_RETURN_ERROR(stream, "invalid field type");
332     }
333 }
334
335 /* Default handler for extension fields. Expects to have a pb_field_t
336  * pointer in the extension->type->arg field. */
337 static bool checkreturn default_extension_encoder(pb_ostream_t *stream,
338     const pb_extension_t *extension)
339 {
340     const pb_field_t *field = (const pb_field_t*)extension->type->arg;
341     
342     if (PB_ATYPE(field->type) == PB_ATYPE_POINTER)
343     {
344         /* For pointer extensions, the pointer is stored directly
345          * in the extension structure. This avoids having an extra
346          * indirection. */
347         return encode_field(stream, field, &extension->dest);
348     }
349     else
350     {
351         return encode_field(stream, field, extension->dest);
352     }
353 }
354
355 /* Walk through all the registered extensions and give them a chance
356  * to encode themselves. */
357 static bool checkreturn encode_extension_field(pb_ostream_t *stream,
358     const pb_field_t *field, const void *pData)
359 {
360     const pb_extension_t *extension = *(const pb_extension_t* const *)pData;
361     PB_UNUSED(field);
362     
363     while (extension)
364     {
365         bool status;
366         if (extension->type->encode)
367             status = extension->type->encode(stream, extension);
368         else
369             status = default_extension_encoder(stream, extension);
370
371         if (!status)
372             return false;
373         
374         extension = extension->next;
375     }
376     
377     return true;
378 }
379
380 /*********************
381  * Encode all fields *
382  *********************/
383
384 static void *remove_const(const void *p)
385 {
386     /* Note: this casts away const, in order to use the common field iterator
387      * logic for both encoding and decoding. */
388     union {
389         void *p1;
390         const void *p2;
391     } t;
392     t.p2 = p;
393     return t.p1;
394 }
395
396 bool checkreturn pb_encode(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct)
397 {
398     pb_field_iter_t iter;
399     if (!pb_field_iter_begin(&iter, fields, remove_const(src_struct)))
400         return true; /* Empty message type */
401     
402     do {
403         if (PB_LTYPE(iter.pos->type) == PB_LTYPE_EXTENSION)
404         {
405             /* Special case for the extension field placeholder */
406             if (!encode_extension_field(stream, iter.pos, iter.pData))
407                 return false;
408         }
409         else
410         {
411             /* Regular field */
412             if (!encode_field(stream, iter.pos, iter.pData))
413                 return false;
414         }
415     } while (pb_field_iter_next(&iter));
416     
417     return true;
418 }
419
420 bool pb_encode_delimited(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct)
421 {
422     return pb_encode_submessage(stream, fields, src_struct);
423 }
424
425 bool pb_get_encoded_size(size_t *size, const pb_field_t fields[], const void *src_struct)
426 {
427     pb_ostream_t stream = PB_OSTREAM_SIZING;
428     
429     if (!pb_encode(&stream, fields, src_struct))
430         return false;
431     
432     *size = stream.bytes_written;
433     return true;
434 }
435
436 /********************
437  * Helper functions *
438  ********************/
439 bool checkreturn pb_encode_varint(pb_ostream_t *stream, uint64_t value)
440 {
441     pb_byte_t buffer[10];
442     size_t i = 0;
443     
444     if (value <= 0x7F)
445     {
446         pb_byte_t v = (pb_byte_t)value;
447         return pb_write(stream, &v, 1);
448     }
449     
450     while (value)
451     {
452         buffer[i] = (pb_byte_t)((value & 0x7F) | 0x80);
453         value >>= 7;
454         i++;
455     }
456     buffer[i-1] &= 0x7F; /* Unset top bit on last byte */
457     
458     return pb_write(stream, buffer, i);
459 }
460
461 bool checkreturn pb_encode_svarint(pb_ostream_t *stream, int64_t value)
462 {
463     uint64_t zigzagged;
464     if (value < 0)
465         zigzagged = ~((uint64_t)value << 1);
466     else
467         zigzagged = (uint64_t)value << 1;
468     
469     return pb_encode_varint(stream, zigzagged);
470 }
471
472 bool checkreturn pb_encode_fixed32(pb_ostream_t *stream, const void *value)
473 {
474     uint32_t val = *(const uint32_t*)value;
475     pb_byte_t bytes[4];
476     bytes[0] = (pb_byte_t)(val & 0xFF);
477     bytes[1] = (pb_byte_t)((val >> 8) & 0xFF);
478     bytes[2] = (pb_byte_t)((val >> 16) & 0xFF);
479     bytes[3] = (pb_byte_t)((val >> 24) & 0xFF);
480     return pb_write(stream, bytes, 4);
481 }
482
483 bool checkreturn pb_encode_fixed64(pb_ostream_t *stream, const void *value)
484 {
485     uint64_t val = *(const uint64_t*)value;
486     pb_byte_t bytes[8];
487     bytes[0] = (pb_byte_t)(val & 0xFF);
488     bytes[1] = (pb_byte_t)((val >> 8) & 0xFF);
489     bytes[2] = (pb_byte_t)((val >> 16) & 0xFF);
490     bytes[3] = (pb_byte_t)((val >> 24) & 0xFF);
491     bytes[4] = (pb_byte_t)((val >> 32) & 0xFF);
492     bytes[5] = (pb_byte_t)((val >> 40) & 0xFF);
493     bytes[6] = (pb_byte_t)((val >> 48) & 0xFF);
494     bytes[7] = (pb_byte_t)((val >> 56) & 0xFF);
495     return pb_write(stream, bytes, 8);
496 }
497
498 bool checkreturn pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, uint32_t field_number)
499 {
500     uint64_t tag = ((uint64_t)field_number << 3) | wiretype;
501     return pb_encode_varint(stream, tag);
502 }
503
504 bool checkreturn pb_encode_tag_for_field(pb_ostream_t *stream, const pb_field_t *field)
505 {
506     pb_wire_type_t wiretype;
507     switch (PB_LTYPE(field->type))
508     {
509         case PB_LTYPE_VARINT:
510         case PB_LTYPE_UVARINT:
511         case PB_LTYPE_SVARINT:
512             wiretype = PB_WT_VARINT;
513             break;
514         
515         case PB_LTYPE_FIXED32:
516             wiretype = PB_WT_32BIT;
517             break;
518         
519         case PB_LTYPE_FIXED64:
520             wiretype = PB_WT_64BIT;
521             break;
522         
523         case PB_LTYPE_BYTES:
524         case PB_LTYPE_STRING:
525         case PB_LTYPE_SUBMESSAGE:
526         case PB_LTYPE_FIXED_LENGTH_BYTES:
527             wiretype = PB_WT_STRING;
528             break;
529         
530         default:
531             PB_RETURN_ERROR(stream, "invalid field type");
532     }
533     
534     return pb_encode_tag(stream, wiretype, field->tag);
535 }
536
537 bool checkreturn pb_encode_string(pb_ostream_t *stream, const pb_byte_t *buffer, size_t size)
538 {
539     if (!pb_encode_varint(stream, (uint64_t)size))
540         return false;
541     
542     return pb_write(stream, buffer, size);
543 }
544
545 bool checkreturn pb_encode_submessage(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct)
546 {
547     /* First calculate the message size using a non-writing substream. */
548     pb_ostream_t substream = PB_OSTREAM_SIZING;
549     size_t size;
550     bool status;
551     
552     if (!pb_encode(&substream, fields, src_struct))
553     {
554 #ifndef PB_NO_ERRMSG
555         stream->errmsg = substream.errmsg;
556 #endif
557         return false;
558     }
559     
560     size = substream.bytes_written;
561     
562     if (!pb_encode_varint(stream, (uint64_t)size))
563         return false;
564     
565     if (stream->callback == NULL)
566         return pb_write(stream, NULL, size); /* Just sizing */
567     
568     if (stream->bytes_written + size > stream->max_size)
569         PB_RETURN_ERROR(stream, "stream full");
570         
571     /* Use a substream to verify that a callback doesn't write more than
572      * what it did the first time. */
573     substream.callback = stream->callback;
574     substream.state = stream->state;
575     substream.max_size = size;
576     substream.bytes_written = 0;
577 #ifndef PB_NO_ERRMSG
578     substream.errmsg = NULL;
579 #endif
580     
581     status = pb_encode(&substream, fields, src_struct);
582     
583     stream->bytes_written += substream.bytes_written;
584     stream->state = substream.state;
585 #ifndef PB_NO_ERRMSG
586     stream->errmsg = substream.errmsg;
587 #endif
588     
589     if (substream.bytes_written != size)
590         PB_RETURN_ERROR(stream, "submsg size changed");
591     
592     return status;
593 }
594
595 /* Field encoders */
596
597 static bool checkreturn pb_enc_varint(pb_ostream_t *stream, const pb_field_t *field, const void *src)
598 {
599     int64_t value = 0;
600     
601     if (field->data_size == sizeof(int_least8_t))
602         value = *(const int_least8_t*)src;
603     else if (field->data_size == sizeof(int_least16_t))
604         value = *(const int_least16_t*)src;
605     else if (field->data_size == sizeof(int32_t))
606         value = *(const int32_t*)src;
607     else if (field->data_size == sizeof(int64_t))
608         value = *(const int64_t*)src;
609     else
610         PB_RETURN_ERROR(stream, "invalid data_size");
611     
612     return pb_encode_varint(stream, (uint64_t)value);
613 }
614
615 static bool checkreturn pb_enc_uvarint(pb_ostream_t *stream, const pb_field_t *field, const void *src)
616 {
617     uint64_t value = 0;
618     
619     if (field->data_size == sizeof(uint_least8_t))
620         value = *(const uint_least8_t*)src;
621     else if (field->data_size == sizeof(uint_least16_t))
622         value = *(const uint_least16_t*)src;
623     else if (field->data_size == sizeof(uint32_t))
624         value = *(const uint32_t*)src;
625     else if (field->data_size == sizeof(uint64_t))
626         value = *(const uint64_t*)src;
627     else
628         PB_RETURN_ERROR(stream, "invalid data_size");
629     
630     return pb_encode_varint(stream, value);
631 }
632
633 static bool checkreturn pb_enc_svarint(pb_ostream_t *stream, const pb_field_t *field, const void *src)
634 {
635     int64_t value = 0;
636     
637     if (field->data_size == sizeof(int_least8_t))
638         value = *(const int_least8_t*)src;
639     else if (field->data_size == sizeof(int_least16_t))
640         value = *(const int_least16_t*)src;
641     else if (field->data_size == sizeof(int32_t))
642         value = *(const int32_t*)src;
643     else if (field->data_size == sizeof(int64_t))
644         value = *(const int64_t*)src;
645     else
646         PB_RETURN_ERROR(stream, "invalid data_size");
647     
648     return pb_encode_svarint(stream, value);
649 }
650
651 static bool checkreturn pb_enc_fixed64(pb_ostream_t *stream, const pb_field_t *field, const void *src)
652 {
653     PB_UNUSED(field);
654     return pb_encode_fixed64(stream, src);
655 }
656
657 static bool checkreturn pb_enc_fixed32(pb_ostream_t *stream, const pb_field_t *field, const void *src)
658 {
659     PB_UNUSED(field);
660     return pb_encode_fixed32(stream, src);
661 }
662
663 static bool checkreturn pb_enc_bytes(pb_ostream_t *stream, const pb_field_t *field, const void *src)
664 {
665     const pb_bytes_array_t *bytes = NULL;
666
667     if (PB_LTYPE(field->type) == PB_LTYPE_FIXED_LENGTH_BYTES)
668         return pb_encode_string(stream, (const pb_byte_t*)src, field->data_size);
669
670     bytes = (const pb_bytes_array_t*)src;
671     
672     if (src == NULL)
673     {
674         /* Treat null pointer as an empty bytes field */
675         return pb_encode_string(stream, NULL, 0);
676     }
677     
678     if (PB_ATYPE(field->type) == PB_ATYPE_STATIC &&
679         PB_BYTES_ARRAY_T_ALLOCSIZE(bytes->size) > field->data_size)
680     {
681         PB_RETURN_ERROR(stream, "bytes size exceeded");
682     }
683     
684     return pb_encode_string(stream, bytes->bytes, bytes->size);
685 }
686
687 static bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_field_t *field, const void *src)
688 {
689     size_t size = 0;
690     size_t max_size = field->data_size;
691     const char *p = (const char*)src;
692     
693     if (PB_ATYPE(field->type) == PB_ATYPE_POINTER)
694         max_size = (size_t)-1;
695
696     if (src == NULL)
697     {
698         size = 0; /* Treat null pointer as an empty string */
699     }
700     else
701     {
702         /* strnlen() is not always available, so just use a loop */
703         while (size < max_size && *p != '\0')
704         {
705             size++;
706             p++;
707         }
708     }
709
710     return pb_encode_string(stream, (const pb_byte_t*)src, size);
711 }
712
713 static bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb_field_t *field, const void *src)
714 {
715     if (field->ptr == NULL)
716         PB_RETURN_ERROR(stream, "invalid field descriptor");
717     
718     return pb_encode_submessage(stream, (const pb_field_t*)field->ptr, src);
719 }
720