]>
git.proxmox.com Git - mirror_corosync-qdevice.git/blob - qdevices/dynar-str.c
2 * Copyright (c) 2015-2016 Red Hat, Inc.
6 * Author: Jan Friesse (jfriesse@redhat.com)
8 * This software licensed under BSD license, the text of which follows:
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions are met:
13 * - Redistributions of source code must retain the above copyright notice,
14 * this list of conditions and the following disclaimer.
15 * - Redistributions in binary form must reproduce the above copyright notice,
16 * this list of conditions and the following disclaimer in the documentation
17 * and/or other materials provided with the distribution.
18 * - Neither the name of the Red Hat, Inc. nor the names of its
19 * contributors may be used to endorse or promote products derived from this
20 * software without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32 * THE POSSIBILITY OF SUCH DAMAGE.
39 #include "dynar-str.h"
42 dynar_str_cpy(struct dynar
*dest
, const char *str
)
45 if (strlen(str
) > dynar_max_size(dest
)) {
51 return (dynar_str_cat(dest
, str
));
55 dynar_str_cat(struct dynar
*dest
, const char *str
)
58 return (dynar_cat(dest
, str
, strlen(str
)));
62 dynar_str_prepend(struct dynar
*dest
, const char *str
)
65 return (dynar_prepend(dest
, str
, strlen(str
)));
69 dynar_str_vcatf(struct dynar
*dest
, const char *format
, va_list ap
)
79 * Find out how much bytes is needed
82 to_write
= vsnprintf(&buf
, sizeof(buf
), format
, ap_copy
);
89 if ((size_t)to_write
< sizeof(buf
)) {
91 * Writing 1 byte string (snprintf writes also '\0') means string is empty
97 allocated
= to_write
+ 1;
98 if (dynar_prealloc(dest
, allocated
) != 0) {
102 p
= dynar_data(dest
) + dynar_size(dest
);
104 va_copy(ap_copy
, ap
);
105 written
= vsnprintf(p
, allocated
, format
, ap_copy
);
112 if ((size_t)written
>= allocated
) {
116 dest
->size
+= written
;
122 dynar_str_catf(struct dynar
*dest
, const char *format
, ...)
127 va_start(ap
, format
);
128 res
= dynar_str_vcatf(dest
, format
, ap
);
135 dynar_str_quote_cat(struct dynar
*dest
, const char *str
)
139 if (dynar_str_cat(dest
, "\"") != 0) {
143 for (zi
= 0; zi
< strlen(str
); zi
++) {
144 if (str
[zi
] == '"' || str
[zi
] == '\\') {
145 if (dynar_str_cat(dest
, "\\") != 0) {
150 if (dynar_cat(dest
, &str
[zi
], sizeof(str
[zi
])) != 0) {
155 if (dynar_str_cat(dest
, "\"") != 0) {
163 dynar_str_quote_cpy(struct dynar
*dest
, const char *str
)
168 return (dynar_str_quote_cat(dest
, str
));