From f2788e6a61e7c2c2d7122f8a90812f55a9958f76 Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 14 Nov 2014 20:19:14 +0100 Subject: Add another helper-macro for array allocation --- libass/ass_utils.c | 17 +++++++++++++++++ libass/ass_utils.h | 15 +++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/libass/ass_utils.c b/libass/ass_utils.c index 27fc025..593d787 100644 --- a/libass/ass_utils.c +++ b/libass/ass_utils.c @@ -102,6 +102,23 @@ void *ass_realloc_array(void *ptr, size_t nmemb, size_t size) return realloc(ptr, size); } +/** + * Like ass_realloc_array(), but: + * 1. on failure, return the original ptr value, instead of NULL + * 2. set errno to indicate failure (errno!=0) or success (errno==0) + */ +void *ass_try_realloc_array(void *ptr, size_t nmemb, size_t size) +{ + void *new_ptr = ass_realloc_array(ptr, nmemb, size); + if (new_ptr) { + errno = 0; + return new_ptr; + } else { + errno = ENOMEM; + return ptr; + } +} + void skip_spaces(char **str) { char *p = *str; diff --git a/libass/ass_utils.h b/libass/ass_utils.h index 5548a93..5055e88 100644 --- a/libass/ass_utils.h +++ b/libass/ass_utils.h @@ -25,6 +25,7 @@ #include #include #include +#include #ifdef CONFIG_ENCA #include @@ -57,6 +58,20 @@ void *ass_aligned_alloc(size_t alignment, size_t size); void ass_aligned_free(void *ptr); void *ass_realloc_array(void *ptr, size_t nmemb, size_t size); +void *ass_try_realloc_array(void *ptr, size_t nmemb, size_t size); + +/** + * Reallocate the array in ptr to at least count elements. For example, if + * you do "int *ptr = NULL; ASS_REALLOC_ARRAY(ptr, 5)", you can access ptr[0] + * through ptr[4] (inclusive). + * + * If memory allocation fails, ptr is left unchanged, and the macro returns 0: + * "if (!ASS_REALLOC_ARRAY(ptr, 5)) goto error;" + * + * A count of 0 does not free the array (see ass_realloc_array for remarks). + */ +#define ASS_REALLOC_ARRAY(ptr, count) \ + (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno) void skip_spaces(char **str); void rskip_spaces(char **str, char *limit); -- cgit v1.2.3