From: Martin Mares Date: Thu, 15 May 2014 07:20:57 +0000 (+0200) Subject: Mempool: Implemented various functions for appending to a growing buffer X-Git-Tag: v6.0~38 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=740ac727cc632470ee341799b8f9e196e0293b2c;p=libucw.git Mempool: Implemented various functions for appending to a growing buffer --- diff --git a/maint/libucw.abi b/maint/libucw.abi index 00377b47..c2ca648b 100644 --- a/maint/libucw.abi +++ b/maint/libucw.abi @@ -387,8 +387,8 @@ mp_strjoin mp_str_from_mem mp_printf mp_vprintf -mp_printf_append -mp_vprintf_append +mp_append_printf +mp_append_vprintf # ucw/opt-internal.h opt_precompute # ucw/opt.h diff --git a/ucw/mempool-fmt.c b/ucw/mempool-fmt.c index 4f81dd8b..dbda703d 100644 --- a/ucw/mempool-fmt.c +++ b/ucw/mempool-fmt.c @@ -65,7 +65,7 @@ mp_printf(struct mempool *p, const char *fmt, ...) } char * -mp_vprintf_append(struct mempool *mp, char *ptr, const char *fmt, va_list args) +mp_append_vprintf(struct mempool *mp, char *ptr, const char *fmt, va_list args) { uns ofs = mp_open(mp, ptr); ASSERT(ofs && !ptr[ofs - 1]); @@ -73,7 +73,7 @@ mp_vprintf_append(struct mempool *mp, char *ptr, const char *fmt, va_list args) } char * -mp_printf_append(struct mempool *mp, char *ptr, const char *fmt, ...) +mp_append_printf(struct mempool *mp, char *ptr, const char *fmt, ...) { va_list args; va_start(args, fmt); @@ -89,9 +89,9 @@ int main(void) struct mempool *mp = mp_new(64); char *x = mp_printf(mp, "", "World"); fputs(x, stdout); - x = mp_printf_append(mp, x, ""); + x = mp_append_printf(mp, x, ""); fputs(x, stdout); - x = mp_printf(mp, "\n", "World"); + x = mp_append_printf(mp, "\n", "World"); fputs(x, stdout); return 0; } diff --git a/ucw/mempool.h b/ucw/mempool.h index ad24a398..562d8f99 100644 --- a/ucw/mempool.h +++ b/ucw/mempool.h @@ -12,12 +12,15 @@ #define _UCW_POOLS_H #include +#include #ifdef CONFIG_UCW_CLEAN_ABI #define mp_alloc ucw_mp_alloc #define mp_alloc_internal ucw_mp_alloc_internal #define mp_alloc_noalign ucw_mp_alloc_noalign #define mp_alloc_zero ucw_mp_alloc_zero +#define mp_append_printf ucw_mp_append_printf +#define mp_append_vprintf ucw_mp_append_vprintf #define mp_delete ucw_mp_delete #define mp_flush ucw_mp_flush #define mp_grow_internal ucw_mp_grow_internal @@ -28,7 +31,6 @@ #define mp_open ucw_mp_open #define mp_pop ucw_mp_pop #define mp_printf ucw_mp_printf -#define mp_printf_append ucw_mp_printf_append #define mp_push ucw_mp_push #define mp_realloc ucw_mp_realloc #define mp_realloc_zero ucw_mp_realloc_zero @@ -43,7 +45,6 @@ #define mp_strjoin ucw_mp_strjoin #define mp_total_size ucw_mp_total_size #define mp_vprintf ucw_mp_vprintf -#define mp_vprintf_append ucw_mp_vprintf_append #endif /*** @@ -318,6 +319,40 @@ static inline void *mp_spread(struct mempool *pool, void *p, uns size) return (((uns)((byte *)pool->state.last[pool->idx] - (byte *)p) >= size) ? p : mp_spread_internal(pool, p, size)); } +/** + * Append a character to the growing buffer. Called with @p pointing after + * the last byte in the buffer, returns a pointer after the last byte + * of the new (possibly reallocated) buffer. + **/ +static inline char *mp_append_char(struct mempool *pool, char *p, uns c) +{ + p = mp_spread(pool, p, 1); + *p++ = c; + return p; +} + +/** + * Append a memory block to the growing buffer. Called with @p pointing after + * the last byte in the buffer, returns a pointer after the last byte + * of the new (possibly reallocated) buffer. + **/ +static inline void *mp_append_block(struct mempool *pool, void *p, const void *block, uns size) +{ + char *q = mp_spread(pool, p, size); + memcpy(q, block, size); + return q + size; +} + +/** + * Append a string to the growing buffer. Called with @p pointing after + * the last byte in the buffer, returns a pointer after the last byte + * of the new (possibly reallocated) buffer. + **/ +static inline void *mp_append_string(struct mempool *pool, void *p, const char *str) +{ + return mp_append_block(pool, p, str, strlen(str)); +} + /** * Close the growing buffer. The @end must point just behind the data, you want to keep * allocated (so it can be in the interval `[@mp_ptr(@pool), @mp_ptr(@pool) + @mp_avail(@pool)]`). @@ -330,6 +365,15 @@ static inline void *mp_end(struct mempool *pool, void *end) return p; } +/** + * Close the growing buffer as a string. That is, append a zero byte and call mp_end(). + **/ +static inline char *mp_end_string(struct mempool *pool, void *end) +{ + end = mp_append_char(pool, end, 0); + return mp_end(pool, end); +} + /** * Return size in bytes of the last allocated memory block (with @mp_alloc() or @mp_end()). **/ @@ -489,11 +533,19 @@ char *mp_vprintf(struct mempool *mp, const char *fmt, va_list args) LIKE_MALLOC; * * Returns pointer to the beginning of the string (the pointer may have * changed due to reallocation). + * + * Alternatively, this function may be called mp_printf_append() for compatibility with + * previous releases of LibUCW. **/ -char *mp_printf_append(struct mempool *mp, char *ptr, const char *fmt, ...) FORMAT_CHECK(printf,3,4); +char *mp_append_printf(struct mempool *mp, char *ptr, const char *fmt, ...) FORMAT_CHECK(printf,3,4); +#define mp_printf_append mp_append_printf /** - * Like @mp_printf_append(), but uses `va_list` for parameters. + * Like @mp_append_printf(), but uses `va_list` for parameters. + * + * Alternatively, this function may be called mp_vprintf_append() for compatibility with + * previous releases of LibUCW. **/ -char *mp_vprintf_append(struct mempool *mp, char *ptr, const char *fmt, va_list args); +char *mp_append_vprintf(struct mempool *mp, char *ptr, const char *fmt, va_list args); +#define mp_vprintf_append mp_append_vprintf #endif