Line data Source code
1 : /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2 :
3 : /***
4 : This file is part of systemd.
5 :
6 : Copyright 2013 Kay Sievers
7 :
8 : systemd is free software; you can redistribute it and/or modify it
9 : under the terms of the GNU Lesser General Public License as published by
10 : the Free Software Foundation; either version 2.1 of the License, or
11 : (at your option) any later version.
12 :
13 : systemd is distributed in the hope that it will be useful, but
14 : WITHOUT ANY WARRANTY; without even the implied warranty of
15 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 : Lesser General Public License for more details.
17 :
18 : You should have received a copy of the GNU Lesser General Public License
19 : along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 : ***/
21 :
22 : /*
23 : * Concatenates/copies strings. In any case, terminates in all cases
24 : * with '\0' * and moves the @dest pointer forward to the added '\0'.
25 : * Returns the * remaining size, and 0 if the string was truncated.
26 : */
27 :
28 : #include <stdio.h>
29 : #include <string.h>
30 : #include "strxcpyx.h"
31 :
32 104 : size_t strpcpy(char **dest, size_t size, const char *src) {
33 : size_t len;
34 :
35 104 : len = strlen(src);
36 104 : if (len >= size) {
37 1 : if (size > 1)
38 0 : *dest = mempcpy(*dest, src, size-1);
39 1 : size = 0;
40 : } else {
41 103 : if (len > 0) {
42 103 : *dest = mempcpy(*dest, src, len);
43 103 : size -= len;
44 : }
45 : }
46 104 : *dest[0] = '\0';
47 104 : return size;
48 : }
49 :
50 2 : size_t strpcpyf(char **dest, size_t size, const char *src, ...) {
51 : va_list va;
52 : int i;
53 :
54 2 : va_start(va, src);
55 2 : i = vsnprintf(*dest, size, src, va);
56 2 : if (i < (int)size) {
57 2 : *dest += i;
58 2 : size -= i;
59 : } else {
60 0 : *dest += size;
61 0 : size = 0;
62 : }
63 2 : va_end(va);
64 2 : *dest[0] = '\0';
65 2 : return size;
66 : }
67 :
68 2 : size_t strpcpyl(char **dest, size_t size, const char *src, ...) {
69 : va_list va;
70 :
71 2 : va_start(va, src);
72 : do {
73 4 : size = strpcpy(dest, size, src);
74 4 : src = va_arg(va, char *);
75 4 : } while (src != NULL);
76 2 : va_end(va);
77 2 : return size;
78 : }
79 :
80 91 : size_t strscpy(char *dest, size_t size, const char *src) {
81 : char *s;
82 :
83 91 : s = dest;
84 91 : return strpcpy(&s, size, src);
85 : }
86 :
87 1 : size_t strscpyl(char *dest, size_t size, const char *src, ...) {
88 : va_list va;
89 : char *s;
90 :
91 1 : va_start(va, src);
92 1 : s = dest;
93 : do {
94 3 : size = strpcpy(&s, size, src);
95 3 : src = va_arg(va, char *);
96 3 : } while (src != NULL);
97 1 : va_end(va);
98 :
99 1 : return size;
100 : }
|