ccan: update to get new helpers in ccan/tal

tal_dup_talarr() is simply stolen from common/utils, but tal_dup_or_null is new.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2021-12-28 09:50:09 +10:30
parent 5aa8663c98
commit 8759641b06
5 changed files with 43 additions and 30 deletions

View File

@ -1,3 +1,3 @@
CCAN imported from http://ccodearchive.net. CCAN imported from http://ccodearchive.net.
CCAN version: init-2522-g21543f83 CCAN version: init-2523-gb15b3673

View File

@ -767,11 +767,17 @@ out:
} }
void *tal_dup_(const tal_t *ctx, const void *p, size_t size, void *tal_dup_(const tal_t *ctx, const void *p, size_t size,
size_t n, size_t extra, const char *label) size_t n, size_t extra, bool nullok, const char *label)
{ {
void *ret; void *ret;
size_t nbytes = size; size_t nbytes = size;
if (nullok && p == NULL) {
/* take(NULL) works. */
(void)taken(p);
return NULL;
}
if (!adjust_size(&nbytes, n)) { if (!adjust_size(&nbytes, n)) {
if (taken(p)) if (taken(p))
tal_free(p); tal_free(p);
@ -802,6 +808,11 @@ void *tal_dup_(const tal_t *ctx, const void *p, size_t size,
return ret; return ret;
} }
void *tal_dup_talarr_(const tal_t *ctx, const tal_t *src TAKES, const char *label)
{
return tal_dup_(ctx, src, 1, tal_bytelen(src), 0, true, label);
}
void tal_set_backend(void *(*alloc_fn)(size_t size), void tal_set_backend(void *(*alloc_fn)(size_t size),
void *(*resize_fn)(void *, size_t size), void *(*resize_fn)(void *, size_t size),
void (*free_fn)(void *), void (*free_fn)(void *),

View File

@ -352,10 +352,21 @@ tal_t *tal_parent(const tal_t *ctx);
* tal_dup - duplicate an object. * tal_dup - duplicate an object.
* @ctx: The tal allocated object to be parent of the result (may be NULL). * @ctx: The tal allocated object to be parent of the result (may be NULL).
* @type: the type (should match type of @p!) * @type: the type (should match type of @p!)
* @p: the object to copy (or reparented if take()) * @p: the object to copy (or reparented if take()). Must not be NULL.
*/ */
#define tal_dup(ctx, type, p) \ #define tal_dup(ctx, type, p) \
tal_dup_label(ctx, type, p, TAL_LABEL(type, "")) tal_dup_label(ctx, type, p, TAL_LABEL(type, ""), false)
/**
* tal_dup_or_null - duplicate an object, or just pass NULL.
* @ctx: The tal allocated object to be parent of the result (may be NULL).
* @type: the type (should match type of @p!)
* @p: the object to copy (or reparented if take())
*
* if @p is NULL, just return NULL, otherwise to tal_dup().
*/
#define tal_dup_or_null(ctx, type, p) \
tal_dup_label(ctx, type, p, TAL_LABEL(type, ""), true)
/** /**
* tal_dup_arr - duplicate an array. * tal_dup_arr - duplicate an array.
@ -369,7 +380,17 @@ tal_t *tal_parent(const tal_t *ctx);
tal_dup_arr_label(ctx, type, p, n, extra, TAL_LABEL(type, "[]")) tal_dup_arr_label(ctx, type, p, n, extra, TAL_LABEL(type, "[]"))
/**
* tal_dup_arr - duplicate a tal array.
* @ctx: The tal allocated object to be parent of the result (may be NULL).
* @type: the type (should match type of @p!)
* @p: the tal array to copy (or resized & reparented if take())
*
* The comon case of duplicating an entire tal array.
*/
#define tal_dup_talarr(ctx, type, p) \
((type *)tal_dup_talarr_((ctx), tal_typechk_(p, type *), \
TAL_LABEL(type, "[]")))
/* Lower-level interfaces, where you want to supply your own label string. */ /* Lower-level interfaces, where you want to supply your own label string. */
#define tal_label(ctx, type, label) \ #define tal_label(ctx, type, label) \
((type *)tal_alloc_((ctx), sizeof(type), false, label)) ((type *)tal_alloc_((ctx), sizeof(type), false, label))
@ -379,13 +400,13 @@ tal_t *tal_parent(const tal_t *ctx);
((type *)tal_alloc_arr_((ctx), sizeof(type), (count), false, label)) ((type *)tal_alloc_arr_((ctx), sizeof(type), (count), false, label))
#define tal_arrz_label(ctx, type, count, label) \ #define tal_arrz_label(ctx, type, count, label) \
((type *)tal_alloc_arr_((ctx), sizeof(type), (count), true, label)) ((type *)tal_alloc_arr_((ctx), sizeof(type), (count), true, label))
#define tal_dup_label(ctx, type, p, label) \ #define tal_dup_label(ctx, type, p, label, nullok) \
((type *)tal_dup_((ctx), tal_typechk_(p, type *), \ ((type *)tal_dup_((ctx), tal_typechk_(p, type *), \
sizeof(type), 1, 0, \ sizeof(type), 1, 0, nullok, \
label)) label))
#define tal_dup_arr_label(ctx, type, p, n, extra, label) \ #define tal_dup_arr_label(ctx, type, p, n, extra, label) \
((type *)tal_dup_((ctx), tal_typechk_(p, type *), \ ((type *)tal_dup_((ctx), tal_typechk_(p, type *), \
sizeof(type), (n), (extra), \ sizeof(type), (n), (extra), false, \
label)) label))
/** /**
@ -505,7 +526,9 @@ void *tal_alloc_arr_(const tal_t *ctx, size_t bytes, size_t count, bool clear,
const char *label); const char *label);
void *tal_dup_(const tal_t *ctx, const void *p TAKES, size_t size, void *tal_dup_(const tal_t *ctx, const void *p TAKES, size_t size,
size_t n, size_t extra, const char *label); size_t n, size_t extra, bool nullok, const char *label);
void *tal_dup_talarr_(const tal_t *ctx, const tal_t *src TAKES,
const char *label);
tal_t *tal_steal_(const tal_t *new_parent, const tal_t *t); tal_t *tal_steal_(const tal_t *new_parent, const tal_t *t);

View File

@ -175,16 +175,6 @@ void tal_arr_remove_(void *p, size_t elemsize, size_t n)
tal_resize((char **)p, len - elemsize); tal_resize((char **)p, len - elemsize);
} }
void *tal_dup_talarr_(const tal_t *ctx, const tal_t *src TAKES, const char *label)
{
if (!src) {
/* Correctly handle TAKES on a NULL `src`. */
(void) taken(src);
return NULL;
}
return tal_dup_(ctx, src, 1, tal_bytelen(src), 0, label);
}
/* Check for valid UTF-8 */ /* Check for valid UTF-8 */
bool utf8_check(const void *vbuf, size_t buflen) bool utf8_check(const void *vbuf, size_t buflen)
{ {

View File

@ -85,17 +85,6 @@ void clear_softref_(const tal_t *outer, size_t outersize, void **ptr);
#define tal_arr_remove(p, n) tal_arr_remove_((p), sizeof(**p), (n)) #define tal_arr_remove(p, n) tal_arr_remove_((p), sizeof(**p), (n))
void tal_arr_remove_(void *p, size_t elemsize, size_t n); void tal_arr_remove_(void *p, size_t elemsize, size_t n);
/**
* The comon case of duplicating an entire tal array.
*
* A macro because we must not double-evaluate p.
*/
#define tal_dup_talarr(ctx, type, p) \
((type *)tal_dup_talarr_((ctx), tal_typechk_(p, type *), \
TAL_LABEL(type, "[]")))
void *tal_dup_talarr_(const tal_t *ctx, const tal_t *src TAKES,
const char *label);
/* Check for valid UTF-8 */ /* Check for valid UTF-8 */
bool utf8_check(const void *buf, size_t buflen); bool utf8_check(const void *buf, size_t buflen);