From abdd7a28ede091f06325b3e5b8a77fc9130e6ee3 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Thu, 19 Oct 2017 02:40:01 +0200 Subject: add osmo_talloc_asprintf() and ctrl_cmd_reply_printf() Add macro to append to a CTRL commands' reply string, ctrl_cmd_reply_printf(). The talloc_asprintf() part of it is generic enough to qualify for a separate macro, osmo_talloc_asprintf(). The idea is to not have to decide for each bit added to a string whether the string is already allocated or not, but simply be able to issue printf commands and let the macro worry about initial allocation or reallocation. This originally came from osmo-hlr change I1bd62ae0d4eefde7e1517db15a2155640a1bab58, where it was requested to move this bit to libosmocore. Change-Id: Ic9dba0e4a1eb5a7dc3cee2f181b9024ed4fc7005 --- include/osmocom/core/utils.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'include/osmocom/core') diff --git a/include/osmocom/core/utils.h b/include/osmocom/core/utils.h index 5f412139..4b083f6c 100644 --- a/include/osmocom/core/utils.h +++ b/include/osmocom/core/utils.h @@ -85,6 +85,24 @@ static inline void osmo_talloc_replace_string(void *ctx, char **dst, const char *dst = talloc_strdup(ctx, newstr); } +/*! Append to a string and re-/allocate if necessary. + * \param[in] ctx Talloc context to use for initial allocation. + * \param[in,out] dest char* to re-/allocate and append to. + * \param[in] fmt printf-like string format. + * \param[in] args Arguments for fmt. + * + * \a dest may be passed in NULL, or a string previously allocated by talloc. + * If an existing string is passed in, it will remain associated with whichever + * ctx it was allocated before, regardless whether it matches \a ctx or not. + */ +#define osmo_talloc_asprintf(ctx, dest, fmt, args ...) \ + do { \ + if (!dest) \ + dest = talloc_asprintf(ctx, fmt, ## args); \ + else \ + dest = talloc_asprintf_append((char*)dest, fmt, ## args); \ + } while (0) + int osmo_constant_time_cmp(const uint8_t *exp, const uint8_t *rel, const int count); uint64_t osmo_decode_big_endian(const uint8_t *data, size_t data_len); uint8_t *osmo_encode_big_endian(uint64_t value, size_t data_len); -- cgit v1.2.3