diff options
-rw-r--r-- | pb.h | 14 | ||||
-rw-r--r-- | pb_decode.c | 6 |
2 files changed, 17 insertions, 3 deletions
@@ -10,6 +10,9 @@ * uncommenting the lines, or on the compiler command line. * *****************************************************************/ +/* Enable support for dynamically allocated fields */ +/* #define PB_ENABLE_MALLOC 1 */ + /* Define this if your CPU architecture is big endian, i.e. it * stores the most-significant byte first. */ /* #define __BIG_ENDIAN__ 1 */ @@ -340,6 +343,17 @@ struct _pb_extension_t { pb_extension_t *next; }; +/* Memory allocation functions to use. You can define pb_realloc and + * pb_free to custom functions if you want. */ +#ifdef PB_ENABLE_MALLOC +# ifndef pb_realloc +# define pb_realloc(ptr, size) realloc(ptr, size) +# endif +# ifndef pb_free +# define pb_free(ptr) free(ptr) +# endif +#endif + /* These macros are used to declare pb_field_t's in the constant array. */ /* Size of a structure member, in bytes. */ #define pb_membersize(st, m) (sizeof ((st*)0)->m) diff --git a/pb_decode.c b/pb_decode.c index 7938d70b..9a2abd6e 100644 --- a/pb_decode.c +++ b/pb_decode.c @@ -480,7 +480,7 @@ static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t /* Allocate new or expand previous allocation */ /* Note: on failure the old pointer will remain in the structure, * the message must be freed by caller also on error return. */ - ptr = realloc(ptr, size); + ptr = pb_realloc(ptr, size); if (ptr == NULL) PB_RETURN_ERROR(stream, "realloc failed"); @@ -945,7 +945,7 @@ void pb_release(const pb_field_t fields[], void *dest_struct) size_t count = *(size_t*)iter.pSize; while (count--) { - free(*pItem); + pb_free(*pItem); *pItem++ = NULL; } } @@ -968,7 +968,7 @@ void pb_release(const pb_field_t fields[], void *dest_struct) } /* Release main item */ - free(*(void**)iter.pData); + pb_free(*(void**)iter.pData); *(void**)iter.pData = NULL; } } while (pb_field_next(&iter)); |