mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Add a "smart strdup" helper named copy_string()
If the string is non-NULL, copy it, otherwise return NULL. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
56501dda1e
commit
2cfe97e4dd
2 changed files with 17 additions and 14 deletions
26
dive.c
26
dive.c
|
@ -258,14 +258,12 @@ struct dive *alloc_dive(void)
|
||||||
static void free_dc(struct divecomputer *dc);
|
static void free_dc(struct divecomputer *dc);
|
||||||
static void free_pic(struct picture *picture);
|
static void free_pic(struct picture *picture);
|
||||||
|
|
||||||
#define STRDUP(_ptr) ((_ptr) ? strdup(_ptr) : NULL)
|
|
||||||
|
|
||||||
/* this is very different from the copy_divecomputer later in this file;
|
/* this is very different from the copy_divecomputer later in this file;
|
||||||
* this function actually makes full copies of the content */
|
* this function actually makes full copies of the content */
|
||||||
static void copy_dc(struct divecomputer *sdc, struct divecomputer *ddc)
|
static void copy_dc(struct divecomputer *sdc, struct divecomputer *ddc)
|
||||||
{
|
{
|
||||||
*ddc = *sdc;
|
*ddc = *sdc;
|
||||||
ddc->model = STRDUP(sdc->model);
|
ddc->model = copy_string(sdc->model);
|
||||||
copy_samples(sdc, ddc);
|
copy_samples(sdc, ddc);
|
||||||
copy_events(sdc, ddc);
|
copy_events(sdc, ddc);
|
||||||
}
|
}
|
||||||
|
@ -274,15 +272,15 @@ static void copy_dc(struct divecomputer *sdc, struct divecomputer *ddc)
|
||||||
static void copy_pl(struct picture *sp, struct picture *dp)
|
static void copy_pl(struct picture *sp, struct picture *dp)
|
||||||
{
|
{
|
||||||
*dp = *sp;
|
*dp = *sp;
|
||||||
dp->filename = STRDUP(sp->filename);
|
dp->filename = copy_string(sp->filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy an element in a list of tags */
|
/* copy an element in a list of tags */
|
||||||
static void copy_tl(struct tag_entry *st, struct tag_entry *dt)
|
static void copy_tl(struct tag_entry *st, struct tag_entry *dt)
|
||||||
{
|
{
|
||||||
dt->tag = malloc(sizeof(struct divetag));
|
dt->tag = malloc(sizeof(struct divetag));
|
||||||
dt->tag->name = STRDUP(st->tag->name);
|
dt->tag->name = copy_string(st->tag->name);
|
||||||
dt->tag->source = STRDUP(st->tag->source);
|
dt->tag->source = copy_string(st->tag->source);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear everything but the first element;
|
/* Clear everything but the first element;
|
||||||
|
@ -335,11 +333,11 @@ void copy_dive(struct dive *s, struct dive *d)
|
||||||
* relevant components that are referenced through pointers,
|
* relevant components that are referenced through pointers,
|
||||||
* so all the strings and the structured lists */
|
* so all the strings and the structured lists */
|
||||||
*d = *s;
|
*d = *s;
|
||||||
d->buddy = STRDUP(s->buddy);
|
d->buddy = copy_string(s->buddy);
|
||||||
d->divemaster = STRDUP(s->divemaster);
|
d->divemaster = copy_string(s->divemaster);
|
||||||
d->location = STRDUP(s->location);
|
d->location = copy_string(s->location);
|
||||||
d->notes = STRDUP(s->notes);
|
d->notes = copy_string(s->notes);
|
||||||
d->suit = STRDUP(s->suit);
|
d->suit = copy_string(s->suit);
|
||||||
STRUCTURED_LIST_COPY(struct divecomputer, s->dc.next, d->dc.next, copy_dc);
|
STRUCTURED_LIST_COPY(struct divecomputer, s->dc.next, d->dc.next, copy_dc);
|
||||||
STRUCTURED_LIST_COPY(struct picture, s->picture_list, d->picture_list, copy_pl);
|
STRUCTURED_LIST_COPY(struct picture, s->picture_list, d->picture_list, copy_pl);
|
||||||
STRUCTURED_LIST_COPY(struct tag_entry, s->tag_list, d->tag_list, copy_tl);
|
STRUCTURED_LIST_COPY(struct tag_entry, s->tag_list, d->tag_list, copy_tl);
|
||||||
|
@ -1209,11 +1207,11 @@ static char *merge_text(const char *a, const char *b)
|
||||||
if (!a && !b)
|
if (!a && !b)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (!a || !*a)
|
if (!a || !*a)
|
||||||
return b ? strdup(b) : NULL;
|
return copy_string(b);
|
||||||
if (!b || !*b)
|
if (!b || !*b)
|
||||||
return strdup(a);
|
return strdup(a);
|
||||||
if (!strcmp(a, b))
|
if (!strcmp(a, b))
|
||||||
return a ? strdup(a) : NULL;
|
return copy_string(a);
|
||||||
res = malloc(strlen(a) + strlen(b) + 32);
|
res = malloc(strlen(a) + strlen(b) + 32);
|
||||||
if (!res)
|
if (!res)
|
||||||
return (char *)a;
|
return (char *)a;
|
||||||
|
@ -1984,7 +1982,7 @@ static struct divecomputer *find_matching_computer(struct divecomputer *match, s
|
||||||
static void copy_dive_computer(struct divecomputer *res, struct divecomputer *a)
|
static void copy_dive_computer(struct divecomputer *res, struct divecomputer *a)
|
||||||
{
|
{
|
||||||
*res = *a;
|
*res = *a;
|
||||||
res->model = a->model ? strdup(a->model) : NULL;
|
res->model = copy_string(a->model);
|
||||||
res->samples = res->alloc_samples = 0;
|
res->samples = res->alloc_samples = 0;
|
||||||
res->sample = NULL;
|
res->sample = NULL;
|
||||||
res->events = NULL;
|
res->events = NULL;
|
||||||
|
|
5
dive.h
5
dive.h
|
@ -29,6 +29,11 @@ static inline int same_string(const char *a, const char *b)
|
||||||
return !strcmp(a ?: "", b ?: "");
|
return !strcmp(a ?: "", b ?: "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline char *copy_string(const char *s)
|
||||||
|
{
|
||||||
|
return s ? strdup(s) : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
#include <libxml/tree.h>
|
#include <libxml/tree.h>
|
||||||
#include <libxslt/transform.h>
|
#include <libxslt/transform.h>
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue