]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/strxcpyx.c
9126e1dfe26d51b23e8fae67f18908968b5e0f80
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
4 * Concatenates/copies strings. In any case, terminates in all cases
5 * with '\0' and moves the @dest pointer forward to the added '\0'.
6 * Returns the remaining size, and 0 if the string was truncated.
8 * Due to the intended usage, these helpers silently noop invocations
9 * having zero size. This is technically an exception to the above
10 * statement "terminates in all cases". It's unexpected for such calls to
11 * occur outside of a loop where this is the preferred behavior.
19 size_t strnpcpy_full(char **dest
, size_t size
, const char *src
, size_t len
, bool *ret_truncated
) {
20 bool truncated
= false;
27 *ret_truncated
= len
> 0;
33 *dest
= mempcpy(*dest
, src
, size
-1);
37 *dest
= mempcpy(*dest
, src
, len
);
42 *ret_truncated
= truncated
;
48 size_t strpcpy_full(char **dest
, size_t size
, const char *src
, bool *ret_truncated
) {
52 return strnpcpy_full(dest
, size
, src
, strlen(src
), ret_truncated
);
55 size_t strpcpyf_full(char **dest
, size_t size
, bool *ret_truncated
, const char *src
, ...) {
56 bool truncated
= false;
64 i
= vsnprintf(*dest
, size
, src
, va
);
76 *ret_truncated
= truncated
;
81 size_t strpcpyl_full(char **dest
, size_t size
, bool *ret_truncated
, const char *src
, ...) {
82 bool truncated
= false;
92 size
= strpcpy_full(dest
, size
, src
, &t
);
93 truncated
= truncated
|| t
;
94 src
= va_arg(va
, char *);
99 *ret_truncated
= truncated
;
103 size_t strnscpy_full(char *dest
, size_t size
, const char *src
, size_t len
, bool *ret_truncated
) {
110 return strnpcpy_full(&s
, size
, src
, len
, ret_truncated
);
113 size_t strscpy_full(char *dest
, size_t size
, const char *src
, bool *ret_truncated
) {
117 return strnscpy_full(dest
, size
, src
, strlen(src
), ret_truncated
);
120 size_t strscpyl_full(char *dest
, size_t size
, bool *ret_truncated
, const char *src
, ...) {
121 bool truncated
= false;
133 size
= strpcpy_full(&s
, size
, src
, &t
);
134 truncated
= truncated
|| t
;
135 src
= va_arg(va
, char *);
140 *ret_truncated
= truncated
;