More configuration options for dynamic alloc
This commit is contained in:
14
pb.h
14
pb.h
@@ -10,6 +10,9 @@
|
|||||||
* uncommenting the lines, or on the compiler command line. *
|
* 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
|
/* Define this if your CPU architecture is big endian, i.e. it
|
||||||
* stores the most-significant byte first. */
|
* stores the most-significant byte first. */
|
||||||
/* #define __BIG_ENDIAN__ 1 */
|
/* #define __BIG_ENDIAN__ 1 */
|
||||||
@@ -340,6 +343,17 @@ struct _pb_extension_t {
|
|||||||
pb_extension_t *next;
|
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. */
|
/* These macros are used to declare pb_field_t's in the constant array. */
|
||||||
/* Size of a structure member, in bytes. */
|
/* Size of a structure member, in bytes. */
|
||||||
#define pb_membersize(st, m) (sizeof ((st*)0)->m)
|
#define pb_membersize(st, m) (sizeof ((st*)0)->m)
|
||||||
|
|||||||
@@ -480,7 +480,7 @@ static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t
|
|||||||
/* Allocate new or expand previous allocation */
|
/* Allocate new or expand previous allocation */
|
||||||
/* Note: on failure the old pointer will remain in the structure,
|
/* Note: on failure the old pointer will remain in the structure,
|
||||||
* the message must be freed by caller also on error return. */
|
* the message must be freed by caller also on error return. */
|
||||||
ptr = realloc(ptr, size);
|
ptr = pb_realloc(ptr, size);
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
PB_RETURN_ERROR(stream, "realloc failed");
|
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;
|
size_t count = *(size_t*)iter.pSize;
|
||||||
while (count--)
|
while (count--)
|
||||||
{
|
{
|
||||||
free(*pItem);
|
pb_free(*pItem);
|
||||||
*pItem++ = NULL;
|
*pItem++ = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -968,7 +968,7 @@ void pb_release(const pb_field_t fields[], void *dest_struct)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Release main item */
|
/* Release main item */
|
||||||
free(*(void**)iter.pData);
|
pb_free(*(void**)iter.pData);
|
||||||
*(void**)iter.pData = NULL;
|
*(void**)iter.pData = NULL;
|
||||||
}
|
}
|
||||||
} while (pb_field_next(&iter));
|
} while (pb_field_next(&iter));
|
||||||
|
|||||||
Reference in New Issue
Block a user