]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/basic/strxcpyx.c
tree-wide: beautify remaining copyright statements
[thirdparty/systemd.git] / src / basic / strxcpyx.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
d5a89d7d 2/***
96b2fb93 3 Copyright © 2013 Kay Sievers
d5a89d7d
KS
4***/
5
6/*
7 * Concatenates/copies strings. In any case, terminates in all cases
9e5bd85a
VC
8 * with '\0' and moves the @dest pointer forward to the added '\0'.
9 * Returns the remaining size, and 0 if the string was truncated.
10 *
11 * Due to the intended usage, these helpers silently noop invocations
12 * having zero size. This is technically an exception to the above
13 * statement "terminates in all cases". It's unexpected for such calls to
14 * occur outside of a loop where this is the preferred behavior.
d5a89d7d
KS
15 */
16
11c3a366 17#include <stdarg.h>
d5a89d7d
KS
18#include <stdio.h>
19#include <string.h>
cf0fbc49 20
d5a89d7d
KS
21#include "strxcpyx.h"
22
f168c273 23size_t strpcpy(char **dest, size_t size, const char *src) {
d5a89d7d
KS
24 size_t len;
25
f91049d5
VC
26 assert(dest);
27 assert(src);
28
9e5bd85a
VC
29 if (size == 0)
30 return 0;
31
d5a89d7d
KS
32 len = strlen(src);
33 if (len >= size) {
34 if (size > 1)
35 *dest = mempcpy(*dest, src, size-1);
36 size = 0;
37 } else {
38 if (len > 0) {
39 *dest = mempcpy(*dest, src, len);
40 size -= len;
41 }
42 }
43 *dest[0] = '\0';
44 return size;
45}
46
f168c273 47size_t strpcpyf(char **dest, size_t size, const char *src, ...) {
d5a89d7d
KS
48 va_list va;
49 int i;
50
f91049d5
VC
51 assert(dest);
52 assert(src);
53
9e5bd85a
VC
54 if (size == 0)
55 return 0;
56
d5a89d7d
KS
57 va_start(va, src);
58 i = vsnprintf(*dest, size, src, va);
59 if (i < (int)size) {
60 *dest += i;
61 size -= i;
62 } else {
d5a89d7d
KS
63 size = 0;
64 }
65 va_end(va);
d5a89d7d
KS
66 return size;
67}
68
f168c273 69size_t strpcpyl(char **dest, size_t size, const char *src, ...) {
d5a89d7d
KS
70 va_list va;
71
f91049d5
VC
72 assert(dest);
73 assert(src);
74
d5a89d7d
KS
75 va_start(va, src);
76 do {
77 size = strpcpy(dest, size, src);
78 src = va_arg(va, char *);
79 } while (src != NULL);
80 va_end(va);
81 return size;
82}
83
f168c273 84size_t strscpy(char *dest, size_t size, const char *src) {
d5a89d7d
KS
85 char *s;
86
f91049d5
VC
87 assert(dest);
88 assert(src);
89
d5a89d7d
KS
90 s = dest;
91 return strpcpy(&s, size, src);
92}
93
94size_t strscpyl(char *dest, size_t size, const char *src, ...) {
95 va_list va;
96 char *s;
97
f91049d5
VC
98 assert(dest);
99 assert(src);
100
d5a89d7d
KS
101 va_start(va, src);
102 s = dest;
103 do {
104 size = strpcpy(&s, size, src);
105 src = va_arg(va, char *);
106 } while (src != NULL);
107 va_end(va);
108
109 return size;
110}