xmalloc: remove delim param from xstrjoin() and add separate xstrjoin3()

This avoids the need for an unused third argument for most xstrjoin()
calls and replaces the cases where it's needed with a more flexible
function. Code generation is the same in both cases, when there are 2
string params and a compile-time known delimiter.

This commit also converts 4 uses of xasprintf() to use xstrjoin*().

See also: https://godbolt.org/z/xsjrhv9b6
This commit is contained in:
Craig Barnes 2024-08-03 08:12:13 +01:00
parent 62b0b65d47
commit f87c9bb9f7
7 changed files with 44 additions and 31 deletions

View file

@ -25,16 +25,25 @@ xmemdup(const void *ptr, size_t size)
}
static inline char *
xstrjoin(const char *s1, const char *s2, char delim)
xstrjoin(const char *s1, const char *s2)
{
size_t n1 = strlen(s1);
size_t n2 = delim > 0 ? 1 : 0;
size_t n3 = strlen(s2);
char *joined = xmalloc(n1 + n2 + n3 + 1);
size_t n2 = strlen(s2);
char *joined = xmalloc(n1 + n2 + 1);
memcpy(joined, s1, n1);
if (delim > 0)
joined[n1] = delim;
memcpy(joined + n1 + n2, s2, n3 + 1);
memcpy(joined + n1, s2, n2 + 1);
return joined;
}
static inline char *
xstrjoin3(const char *s1, const char *s2, const char *s3)
{
size_t n1 = strlen(s1);
size_t n2 = strlen(s2);
size_t n3 = strlen(s3);
char *joined = xmalloc(n1 + n2 + n3 + 1);
memcpy(joined, s1, n1);
memcpy(joined + n1, s2, n2);
memcpy(joined + n1 + n2, s3, n3 + 1);
return joined;
}