mirror of
https://github.com/labwc/labwc.git
synced 2025-11-04 13:30:07 -05:00
session: run shutdown script, clean up activation env before exit
This commit is contained in:
parent
4ddeb3cd42
commit
f90b7dca2a
6 changed files with 157 additions and 16 deletions
|
|
@ -1,4 +1,5 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
|
@ -83,3 +84,73 @@ strdup_printf(const char *fmt, ...)
|
|||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
char *
|
||||
str_join(const char * const parts[],
|
||||
const char *restrict fmt, const char *restrict sep)
|
||||
{
|
||||
assert(parts);
|
||||
|
||||
if (!fmt) {
|
||||
fmt = "%s";
|
||||
}
|
||||
|
||||
if (!sep) {
|
||||
sep = " ";
|
||||
}
|
||||
|
||||
size_t size = 0;
|
||||
size_t n_parts = 0;
|
||||
|
||||
size_t sep_len = strlen(sep);
|
||||
|
||||
/* Count the length of each formatted string */
|
||||
for (const char *const *s = parts; *s; ++s) {
|
||||
int n = snprintf(NULL, 0, fmt, *s);
|
||||
if (n < 0) {
|
||||
return NULL;
|
||||
}
|
||||
size += (size_t)n;
|
||||
++n_parts;
|
||||
}
|
||||
|
||||
if (n_parts < 1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Need (n_parts - 1) separators, plus one NULL terminator */
|
||||
size += (n_parts - 1) * sep_len + 1;
|
||||
|
||||
/* Concatenate the strings and separators */
|
||||
char *buf = xzalloc(size);
|
||||
char *p = buf;
|
||||
for (const char *const *s = parts; *s; ++s) {
|
||||
int n = 0;
|
||||
|
||||
if (p != buf) {
|
||||
n = snprintf(p, size, "%s", sep);
|
||||
if (n < 0 || (size_t)n >= size) {
|
||||
p = NULL;
|
||||
break;
|
||||
}
|
||||
size -= (size_t)n;
|
||||
p += (size_t)n;
|
||||
}
|
||||
|
||||
n = snprintf(p, size, fmt, *s);
|
||||
if (n < 0 || (size_t)n >= size) {
|
||||
p = NULL;
|
||||
break;
|
||||
}
|
||||
size -= (size_t)n;
|
||||
p += (size_t)n;
|
||||
}
|
||||
|
||||
if (!p) {
|
||||
free(buf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue