Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions include/re_fmt.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ struct pl {
extern const struct pl pl_null;

struct pl *pl_alloc_str(const char *str);
struct pl *pl_alloc_dup(const struct pl *src);
void pl_set_str(struct pl *pl, const char *str);
void pl_set_mbuf(struct pl *pl, const struct mbuf *mb);
int32_t pl_i32(const struct pl *pl);
Expand Down
35 changes: 35 additions & 0 deletions src/fmt/pl.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,41 @@ struct pl *pl_alloc_str(const char *str)
}


/**
* Duplicate a pointer-length object
*
* @param src Pointer-length object to duplicate
*
* @return Allocated Pointer-length object or NULL
*/
struct pl *pl_alloc_dup(const struct pl *src)
{
struct pl *pl;

if (!src)
return NULL;

size_t sz = src->l;

pl = mem_zalloc(sizeof(struct pl), pl_alloc_destruct);
if (!pl)
return NULL;

if (!pl_isset(src))
return pl;

pl->p = mem_alloc(sz, NULL);
if (!pl->p) {
mem_deref(pl);
return NULL;
}

memcpy((void *)pl->p, src->p, sz);
pl->l = sz;
return pl;
}


/**
* Initialise a pointer-length object from a NULL-terminated string
*
Expand Down
21 changes: 21 additions & 0 deletions test/fmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,27 @@ int test_fmt_pl(void)
}


int test_fmt_pl_alloc_dup(void)
{
int err = 0;
const struct pl pl0 = PL("rAtTaReI");

struct pl *pl = pl_alloc_dup(&pl0);
if (!pl)
return ENOMEM;

TEST_EQUALS(pl0.l, pl->l);
TEST_MEMCMP(pl0.p, pl0.l, pl->p, pl->l);
err = pl_cmp(&pl0, pl);
TEST_ERR(err);

out:
mem_deref(pl);

return err;
}


int test_fmt_pl_alloc_str(void)
{
int err = 0;
Expand Down
1 change: 1 addition & 0 deletions test/test.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ static const struct test tests[] = {
TEST(test_fmt_human_time),
TEST(test_fmt_param),
TEST(test_fmt_pl),
TEST(test_fmt_pl_alloc_dup),
TEST(test_fmt_pl_alloc_str),
TEST(test_fmt_pl_float),
TEST(test_fmt_pl_i32),
Expand Down
1 change: 1 addition & 0 deletions test/test.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ int test_fmt_hexdump(void);
int test_fmt_human_time(void);
int test_fmt_param(void);
int test_fmt_pl(void);
int test_fmt_pl_alloc_dup(void);
int test_fmt_pl_alloc_str(void);
int test_fmt_pl_float(void);
int test_fmt_pl_i32(void);
Expand Down
Loading