xref: /freebsd/contrib/atf/atf-c/detail/dynstr.c (revision 8f0ea33f2bbf3a6aa80235f0a02fa5f2780c2b17)
1*0677dfd1SJulio Merino /* Copyright (c) 2008 The NetBSD Foundation, Inc.
2c243e490SMarcel Moolenaar  * All rights reserved.
3c243e490SMarcel Moolenaar  *
4c243e490SMarcel Moolenaar  * Redistribution and use in source and binary forms, with or without
5c243e490SMarcel Moolenaar  * modification, are permitted provided that the following conditions
6c243e490SMarcel Moolenaar  * are met:
7c243e490SMarcel Moolenaar  * 1. Redistributions of source code must retain the above copyright
8c243e490SMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer.
9c243e490SMarcel Moolenaar  * 2. Redistributions in binary form must reproduce the above copyright
10c243e490SMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer in the
11c243e490SMarcel Moolenaar  *    documentation and/or other materials provided with the distribution.
12c243e490SMarcel Moolenaar  *
13c243e490SMarcel Moolenaar  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
14c243e490SMarcel Moolenaar  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
15c243e490SMarcel Moolenaar  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16c243e490SMarcel Moolenaar  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17c243e490SMarcel Moolenaar  * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
18c243e490SMarcel Moolenaar  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19c243e490SMarcel Moolenaar  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
20c243e490SMarcel Moolenaar  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21c243e490SMarcel Moolenaar  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22c243e490SMarcel Moolenaar  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23c243e490SMarcel Moolenaar  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
24*0677dfd1SJulio Merino  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */
25*0677dfd1SJulio Merino 
26*0677dfd1SJulio Merino #include "atf-c/detail/dynstr.h"
27c243e490SMarcel Moolenaar 
28c243e490SMarcel Moolenaar #include <errno.h>
29c243e490SMarcel Moolenaar #include <stdarg.h>
30c243e490SMarcel Moolenaar #include <stdint.h>
31c243e490SMarcel Moolenaar #include <stdio.h>
32c243e490SMarcel Moolenaar #include <stdlib.h>
33c243e490SMarcel Moolenaar #include <string.h>
34c243e490SMarcel Moolenaar 
35*0677dfd1SJulio Merino #include "atf-c/detail/sanity.h"
36*0677dfd1SJulio Merino #include "atf-c/detail/text.h"
37c243e490SMarcel Moolenaar #include "atf-c/error.h"
38c243e490SMarcel Moolenaar 
39c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
40c243e490SMarcel Moolenaar  * Auxiliary functions.
41c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
42c243e490SMarcel Moolenaar 
43c243e490SMarcel Moolenaar static
44c243e490SMarcel Moolenaar atf_error_t
resize(atf_dynstr_t * ad,size_t newsize)45c243e490SMarcel Moolenaar resize(atf_dynstr_t *ad, size_t newsize)
46c243e490SMarcel Moolenaar {
47c243e490SMarcel Moolenaar     char *newdata;
48c243e490SMarcel Moolenaar     atf_error_t err;
49c243e490SMarcel Moolenaar 
50c243e490SMarcel Moolenaar     PRE(newsize > ad->m_datasize);
51c243e490SMarcel Moolenaar 
52c243e490SMarcel Moolenaar     newdata = (char *)malloc(newsize);
53c243e490SMarcel Moolenaar     if (newdata == NULL) {
54c243e490SMarcel Moolenaar         err = atf_no_memory_error();
55c243e490SMarcel Moolenaar     } else {
56c243e490SMarcel Moolenaar         strcpy(newdata, ad->m_data);
57c243e490SMarcel Moolenaar         free(ad->m_data);
58c243e490SMarcel Moolenaar         ad->m_data = newdata;
59c243e490SMarcel Moolenaar         ad->m_datasize = newsize;
60c243e490SMarcel Moolenaar         err = atf_no_error();
61c243e490SMarcel Moolenaar     }
62c243e490SMarcel Moolenaar 
63c243e490SMarcel Moolenaar     return err;
64c243e490SMarcel Moolenaar }
65c243e490SMarcel Moolenaar 
66c243e490SMarcel Moolenaar static
67c243e490SMarcel Moolenaar atf_error_t
prepend_or_append(atf_dynstr_t * ad,const char * fmt,va_list ap,bool prepend)68c243e490SMarcel Moolenaar prepend_or_append(atf_dynstr_t *ad, const char *fmt, va_list ap,
69c243e490SMarcel Moolenaar                   bool prepend)
70c243e490SMarcel Moolenaar {
71c243e490SMarcel Moolenaar     char *aux;
72c243e490SMarcel Moolenaar     atf_error_t err;
73c243e490SMarcel Moolenaar     size_t newlen;
74c243e490SMarcel Moolenaar     va_list ap2;
75c243e490SMarcel Moolenaar 
76c243e490SMarcel Moolenaar     va_copy(ap2, ap);
77c243e490SMarcel Moolenaar     err = atf_text_format_ap(&aux, fmt, ap2);
78c243e490SMarcel Moolenaar     va_end(ap2);
79c243e490SMarcel Moolenaar     if (atf_is_error(err))
80c243e490SMarcel Moolenaar         goto out;
81c243e490SMarcel Moolenaar     newlen = ad->m_length + strlen(aux);
82c243e490SMarcel Moolenaar 
83c243e490SMarcel Moolenaar     if (newlen + sizeof(char) > ad->m_datasize) {
84c243e490SMarcel Moolenaar         err = resize(ad, newlen + sizeof(char));
85c243e490SMarcel Moolenaar         if (atf_is_error(err))
86c243e490SMarcel Moolenaar             goto out_free;
87c243e490SMarcel Moolenaar     }
88c243e490SMarcel Moolenaar 
89c243e490SMarcel Moolenaar     if (prepend) {
90c243e490SMarcel Moolenaar         memmove(ad->m_data + strlen(aux), ad->m_data, ad->m_length + 1);
91c243e490SMarcel Moolenaar         memcpy(ad->m_data, aux, strlen(aux));
92c243e490SMarcel Moolenaar     } else
93c243e490SMarcel Moolenaar         strcpy(ad->m_data + ad->m_length, aux);
94c243e490SMarcel Moolenaar     ad->m_length = newlen;
95c243e490SMarcel Moolenaar     err = atf_no_error();
96c243e490SMarcel Moolenaar 
97c243e490SMarcel Moolenaar out_free:
98c243e490SMarcel Moolenaar     free(aux);
99c243e490SMarcel Moolenaar out:
100c243e490SMarcel Moolenaar     return err;
101c243e490SMarcel Moolenaar }
102c243e490SMarcel Moolenaar 
103c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
104c243e490SMarcel Moolenaar  * The "atf_dynstr" type.
105c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
106c243e490SMarcel Moolenaar 
107c243e490SMarcel Moolenaar /*
108c243e490SMarcel Moolenaar  * Constants.
109c243e490SMarcel Moolenaar  */
110c243e490SMarcel Moolenaar 
111c243e490SMarcel Moolenaar const size_t atf_dynstr_npos = SIZE_MAX;
112c243e490SMarcel Moolenaar 
113c243e490SMarcel Moolenaar /*
114c243e490SMarcel Moolenaar  * Constructors and destructors.
115c243e490SMarcel Moolenaar  */
116c243e490SMarcel Moolenaar 
117c243e490SMarcel Moolenaar atf_error_t
atf_dynstr_init(atf_dynstr_t * ad)118c243e490SMarcel Moolenaar atf_dynstr_init(atf_dynstr_t *ad)
119c243e490SMarcel Moolenaar {
120c243e490SMarcel Moolenaar     atf_error_t err;
121c243e490SMarcel Moolenaar 
122c243e490SMarcel Moolenaar     ad->m_data = (char *)malloc(sizeof(char));
123c243e490SMarcel Moolenaar     if (ad->m_data == NULL) {
124c243e490SMarcel Moolenaar         err = atf_no_memory_error();
125c243e490SMarcel Moolenaar         goto out;
126c243e490SMarcel Moolenaar     }
127c243e490SMarcel Moolenaar 
128c243e490SMarcel Moolenaar     ad->m_data[0] = '\0';
129c243e490SMarcel Moolenaar     ad->m_datasize = 1;
130c243e490SMarcel Moolenaar     ad->m_length = 0;
131c243e490SMarcel Moolenaar     err = atf_no_error();
132c243e490SMarcel Moolenaar 
133c243e490SMarcel Moolenaar out:
134c243e490SMarcel Moolenaar     return err;
135c243e490SMarcel Moolenaar }
136c243e490SMarcel Moolenaar 
137c243e490SMarcel Moolenaar atf_error_t
atf_dynstr_init_ap(atf_dynstr_t * ad,const char * fmt,va_list ap)138c243e490SMarcel Moolenaar atf_dynstr_init_ap(atf_dynstr_t *ad, const char *fmt, va_list ap)
139c243e490SMarcel Moolenaar {
140c243e490SMarcel Moolenaar     atf_error_t err;
141c243e490SMarcel Moolenaar 
142c243e490SMarcel Moolenaar     ad->m_datasize = strlen(fmt) + 1;
143c243e490SMarcel Moolenaar     ad->m_length = 0;
144c243e490SMarcel Moolenaar 
145c243e490SMarcel Moolenaar     do {
146c243e490SMarcel Moolenaar         va_list ap2;
147c243e490SMarcel Moolenaar         int ret;
148c243e490SMarcel Moolenaar 
149c243e490SMarcel Moolenaar         ad->m_datasize *= 2;
150c243e490SMarcel Moolenaar         ad->m_data = (char *)malloc(ad->m_datasize);
151c243e490SMarcel Moolenaar         if (ad->m_data == NULL) {
152c243e490SMarcel Moolenaar             err = atf_no_memory_error();
153c243e490SMarcel Moolenaar             goto out;
154c243e490SMarcel Moolenaar         }
155c243e490SMarcel Moolenaar 
156c243e490SMarcel Moolenaar         va_copy(ap2, ap);
157c243e490SMarcel Moolenaar         ret = vsnprintf(ad->m_data, ad->m_datasize, fmt, ap2);
158c243e490SMarcel Moolenaar         va_end(ap2);
159c243e490SMarcel Moolenaar         if (ret < 0) {
160c243e490SMarcel Moolenaar             free(ad->m_data);
161c243e490SMarcel Moolenaar             err = atf_libc_error(errno, "Cannot format string");
162c243e490SMarcel Moolenaar             goto out;
163c243e490SMarcel Moolenaar         }
164c243e490SMarcel Moolenaar 
165c243e490SMarcel Moolenaar         INV(ret >= 0);
166c243e490SMarcel Moolenaar         if ((size_t)ret >= ad->m_datasize) {
167c243e490SMarcel Moolenaar             free(ad->m_data);
168c243e490SMarcel Moolenaar             ad->m_data = NULL;
169c243e490SMarcel Moolenaar         }
170c243e490SMarcel Moolenaar         ad->m_length = ret;
171c243e490SMarcel Moolenaar     } while (ad->m_length >= ad->m_datasize);
172c243e490SMarcel Moolenaar 
173c243e490SMarcel Moolenaar     err = atf_no_error();
174c243e490SMarcel Moolenaar out:
175c243e490SMarcel Moolenaar     POST(atf_is_error(err) || ad->m_data != NULL);
176c243e490SMarcel Moolenaar     return err;
177c243e490SMarcel Moolenaar }
178c243e490SMarcel Moolenaar 
179c243e490SMarcel Moolenaar atf_error_t
atf_dynstr_init_fmt(atf_dynstr_t * ad,const char * fmt,...)180c243e490SMarcel Moolenaar atf_dynstr_init_fmt(atf_dynstr_t *ad, const char *fmt, ...)
181c243e490SMarcel Moolenaar {
182c243e490SMarcel Moolenaar     va_list ap;
183c243e490SMarcel Moolenaar     atf_error_t err;
184c243e490SMarcel Moolenaar 
185c243e490SMarcel Moolenaar     va_start(ap, fmt);
186c243e490SMarcel Moolenaar     err = atf_dynstr_init_ap(ad, fmt, ap);
187c243e490SMarcel Moolenaar     va_end(ap);
188c243e490SMarcel Moolenaar 
189c243e490SMarcel Moolenaar     return err;
190c243e490SMarcel Moolenaar }
191c243e490SMarcel Moolenaar 
192c243e490SMarcel Moolenaar atf_error_t
atf_dynstr_init_raw(atf_dynstr_t * ad,const void * mem,size_t memlen)193c243e490SMarcel Moolenaar atf_dynstr_init_raw(atf_dynstr_t *ad, const void *mem, size_t memlen)
194c243e490SMarcel Moolenaar {
195c243e490SMarcel Moolenaar     atf_error_t err;
196c243e490SMarcel Moolenaar 
197c243e490SMarcel Moolenaar     if (memlen >= SIZE_MAX - 1) {
198c243e490SMarcel Moolenaar         err = atf_no_memory_error();
199c243e490SMarcel Moolenaar         goto out;
200c243e490SMarcel Moolenaar     }
201c243e490SMarcel Moolenaar 
202c243e490SMarcel Moolenaar     ad->m_data = (char *)malloc(memlen + 1);
203c243e490SMarcel Moolenaar     if (ad->m_data == NULL) {
204c243e490SMarcel Moolenaar         err = atf_no_memory_error();
205c243e490SMarcel Moolenaar         goto out;
206c243e490SMarcel Moolenaar     }
207c243e490SMarcel Moolenaar 
208c243e490SMarcel Moolenaar     ad->m_datasize = memlen + 1;
209c243e490SMarcel Moolenaar     memcpy(ad->m_data, mem, memlen);
210c243e490SMarcel Moolenaar     ad->m_data[memlen] = '\0';
211c243e490SMarcel Moolenaar     ad->m_length = strlen(ad->m_data);
212c243e490SMarcel Moolenaar     INV(ad->m_length <= memlen);
213c243e490SMarcel Moolenaar     err = atf_no_error();
214c243e490SMarcel Moolenaar 
215c243e490SMarcel Moolenaar out:
216c243e490SMarcel Moolenaar     return err;
217c243e490SMarcel Moolenaar }
218c243e490SMarcel Moolenaar 
219c243e490SMarcel Moolenaar atf_error_t
atf_dynstr_init_rep(atf_dynstr_t * ad,size_t len,char ch)220c243e490SMarcel Moolenaar atf_dynstr_init_rep(atf_dynstr_t *ad, size_t len, char ch)
221c243e490SMarcel Moolenaar {
222c243e490SMarcel Moolenaar     atf_error_t err;
223c243e490SMarcel Moolenaar 
224c243e490SMarcel Moolenaar     if (len == SIZE_MAX) {
225c243e490SMarcel Moolenaar         err = atf_no_memory_error();
226c243e490SMarcel Moolenaar         goto out;
227c243e490SMarcel Moolenaar     }
228c243e490SMarcel Moolenaar 
229c243e490SMarcel Moolenaar     ad->m_datasize = (len + 1) * sizeof(char);
230c243e490SMarcel Moolenaar     ad->m_data = (char *)malloc(ad->m_datasize);
231c243e490SMarcel Moolenaar     if (ad->m_data == NULL) {
232c243e490SMarcel Moolenaar         err = atf_no_memory_error();
233c243e490SMarcel Moolenaar         goto out;
234c243e490SMarcel Moolenaar     }
235c243e490SMarcel Moolenaar 
236c243e490SMarcel Moolenaar     memset(ad->m_data, ch, len);
237c243e490SMarcel Moolenaar     ad->m_data[len] = '\0';
238c243e490SMarcel Moolenaar     ad->m_length = len;
239c243e490SMarcel Moolenaar     err = atf_no_error();
240c243e490SMarcel Moolenaar 
241c243e490SMarcel Moolenaar out:
242c243e490SMarcel Moolenaar     return err;
243c243e490SMarcel Moolenaar }
244c243e490SMarcel Moolenaar 
245c243e490SMarcel Moolenaar atf_error_t
atf_dynstr_init_substr(atf_dynstr_t * ad,const atf_dynstr_t * src,size_t beg,size_t end)246c243e490SMarcel Moolenaar atf_dynstr_init_substr(atf_dynstr_t *ad, const atf_dynstr_t *src,
247c243e490SMarcel Moolenaar                        size_t beg, size_t end)
248c243e490SMarcel Moolenaar {
249c243e490SMarcel Moolenaar     if (beg > src->m_length)
250c243e490SMarcel Moolenaar         beg = src->m_length;
251c243e490SMarcel Moolenaar 
252c243e490SMarcel Moolenaar     if (end == atf_dynstr_npos || end > src->m_length)
253c243e490SMarcel Moolenaar         end = src->m_length;
254c243e490SMarcel Moolenaar 
255c243e490SMarcel Moolenaar     return atf_dynstr_init_raw(ad, src->m_data + beg, end - beg);
256c243e490SMarcel Moolenaar }
257c243e490SMarcel Moolenaar 
258c243e490SMarcel Moolenaar atf_error_t
atf_dynstr_copy(atf_dynstr_t * dest,const atf_dynstr_t * src)259c243e490SMarcel Moolenaar atf_dynstr_copy(atf_dynstr_t *dest, const atf_dynstr_t *src)
260c243e490SMarcel Moolenaar {
261c243e490SMarcel Moolenaar     atf_error_t err;
262c243e490SMarcel Moolenaar 
263c243e490SMarcel Moolenaar     dest->m_data = (char *)malloc(src->m_datasize);
264c243e490SMarcel Moolenaar     if (dest->m_data == NULL)
265c243e490SMarcel Moolenaar         err = atf_no_memory_error();
266c243e490SMarcel Moolenaar     else {
267c243e490SMarcel Moolenaar         memcpy(dest->m_data, src->m_data, src->m_datasize);
268c243e490SMarcel Moolenaar         dest->m_datasize = src->m_datasize;
269c243e490SMarcel Moolenaar         dest->m_length = src->m_length;
270c243e490SMarcel Moolenaar         err = atf_no_error();
271c243e490SMarcel Moolenaar     }
272c243e490SMarcel Moolenaar 
273c243e490SMarcel Moolenaar     return err;
274c243e490SMarcel Moolenaar }
275c243e490SMarcel Moolenaar 
276c243e490SMarcel Moolenaar void
atf_dynstr_fini(atf_dynstr_t * ad)277c243e490SMarcel Moolenaar atf_dynstr_fini(atf_dynstr_t *ad)
278c243e490SMarcel Moolenaar {
279c243e490SMarcel Moolenaar     INV(ad->m_data != NULL);
280c243e490SMarcel Moolenaar     free(ad->m_data);
281c243e490SMarcel Moolenaar }
282c243e490SMarcel Moolenaar 
283c243e490SMarcel Moolenaar char *
atf_dynstr_fini_disown(atf_dynstr_t * ad)284c243e490SMarcel Moolenaar atf_dynstr_fini_disown(atf_dynstr_t *ad)
285c243e490SMarcel Moolenaar {
286c243e490SMarcel Moolenaar     INV(ad->m_data != NULL);
287c243e490SMarcel Moolenaar     return ad->m_data;
288c243e490SMarcel Moolenaar }
289c243e490SMarcel Moolenaar 
290c243e490SMarcel Moolenaar /*
291c243e490SMarcel Moolenaar  * Getters.
292c243e490SMarcel Moolenaar  */
293c243e490SMarcel Moolenaar 
294c243e490SMarcel Moolenaar const char *
atf_dynstr_cstring(const atf_dynstr_t * ad)295c243e490SMarcel Moolenaar atf_dynstr_cstring(const atf_dynstr_t *ad)
296c243e490SMarcel Moolenaar {
297c243e490SMarcel Moolenaar     return ad->m_data;
298c243e490SMarcel Moolenaar }
299c243e490SMarcel Moolenaar 
300c243e490SMarcel Moolenaar size_t
atf_dynstr_length(const atf_dynstr_t * ad)301c243e490SMarcel Moolenaar atf_dynstr_length(const atf_dynstr_t *ad)
302c243e490SMarcel Moolenaar {
303c243e490SMarcel Moolenaar     return ad->m_length;
304c243e490SMarcel Moolenaar }
305c243e490SMarcel Moolenaar 
306c243e490SMarcel Moolenaar size_t
atf_dynstr_rfind_ch(const atf_dynstr_t * ad,char ch)307c243e490SMarcel Moolenaar atf_dynstr_rfind_ch(const atf_dynstr_t *ad, char ch)
308c243e490SMarcel Moolenaar {
309c243e490SMarcel Moolenaar     size_t pos;
310c243e490SMarcel Moolenaar 
311c243e490SMarcel Moolenaar     for (pos = ad->m_length; pos > 0 && ad->m_data[pos - 1] != ch; pos--)
312c243e490SMarcel Moolenaar         ;
313c243e490SMarcel Moolenaar 
314c243e490SMarcel Moolenaar     return pos == 0 ? atf_dynstr_npos : pos - 1;
315c243e490SMarcel Moolenaar }
316c243e490SMarcel Moolenaar 
317c243e490SMarcel Moolenaar /*
318c243e490SMarcel Moolenaar  * Modifiers.
319c243e490SMarcel Moolenaar  */
320c243e490SMarcel Moolenaar 
321c243e490SMarcel Moolenaar atf_error_t
atf_dynstr_append_ap(atf_dynstr_t * ad,const char * fmt,va_list ap)322c243e490SMarcel Moolenaar atf_dynstr_append_ap(atf_dynstr_t *ad, const char *fmt, va_list ap)
323c243e490SMarcel Moolenaar {
324c243e490SMarcel Moolenaar     atf_error_t err;
325c243e490SMarcel Moolenaar     va_list ap2;
326c243e490SMarcel Moolenaar 
327c243e490SMarcel Moolenaar     va_copy(ap2, ap);
328c243e490SMarcel Moolenaar     err = prepend_or_append(ad, fmt, ap2, false);
329c243e490SMarcel Moolenaar     va_end(ap2);
330c243e490SMarcel Moolenaar 
331c243e490SMarcel Moolenaar     return err;
332c243e490SMarcel Moolenaar }
333c243e490SMarcel Moolenaar 
334c243e490SMarcel Moolenaar atf_error_t
atf_dynstr_append_fmt(atf_dynstr_t * ad,const char * fmt,...)335c243e490SMarcel Moolenaar atf_dynstr_append_fmt(atf_dynstr_t *ad, const char *fmt, ...)
336c243e490SMarcel Moolenaar {
337c243e490SMarcel Moolenaar     va_list ap;
338c243e490SMarcel Moolenaar     atf_error_t err;
339c243e490SMarcel Moolenaar 
340c243e490SMarcel Moolenaar     va_start(ap, fmt);
341c243e490SMarcel Moolenaar     err = prepend_or_append(ad, fmt, ap, false);
342c243e490SMarcel Moolenaar     va_end(ap);
343c243e490SMarcel Moolenaar 
344c243e490SMarcel Moolenaar     return err;
345c243e490SMarcel Moolenaar }
346c243e490SMarcel Moolenaar 
347c243e490SMarcel Moolenaar void
atf_dynstr_clear(atf_dynstr_t * ad)348c243e490SMarcel Moolenaar atf_dynstr_clear(atf_dynstr_t *ad)
349c243e490SMarcel Moolenaar {
350c243e490SMarcel Moolenaar     ad->m_data[0] = '\0';
351c243e490SMarcel Moolenaar     ad->m_length = 0;
352c243e490SMarcel Moolenaar }
353c243e490SMarcel Moolenaar 
354c243e490SMarcel Moolenaar atf_error_t
atf_dynstr_prepend_ap(atf_dynstr_t * ad,const char * fmt,va_list ap)355c243e490SMarcel Moolenaar atf_dynstr_prepend_ap(atf_dynstr_t *ad, const char *fmt, va_list ap)
356c243e490SMarcel Moolenaar {
357c243e490SMarcel Moolenaar     atf_error_t err;
358c243e490SMarcel Moolenaar     va_list ap2;
359c243e490SMarcel Moolenaar 
360c243e490SMarcel Moolenaar     va_copy(ap2, ap);
361c243e490SMarcel Moolenaar     err = prepend_or_append(ad, fmt, ap2, true);
362c243e490SMarcel Moolenaar     va_end(ap2);
363c243e490SMarcel Moolenaar 
364c243e490SMarcel Moolenaar     return err;
365c243e490SMarcel Moolenaar }
366c243e490SMarcel Moolenaar 
367c243e490SMarcel Moolenaar atf_error_t
atf_dynstr_prepend_fmt(atf_dynstr_t * ad,const char * fmt,...)368c243e490SMarcel Moolenaar atf_dynstr_prepend_fmt(atf_dynstr_t *ad, const char *fmt, ...)
369c243e490SMarcel Moolenaar {
370c243e490SMarcel Moolenaar     va_list ap;
371c243e490SMarcel Moolenaar     atf_error_t err;
372c243e490SMarcel Moolenaar 
373c243e490SMarcel Moolenaar     va_start(ap, fmt);
374c243e490SMarcel Moolenaar     err = prepend_or_append(ad, fmt, ap, true);
375c243e490SMarcel Moolenaar     va_end(ap);
376c243e490SMarcel Moolenaar 
377c243e490SMarcel Moolenaar     return err;
378c243e490SMarcel Moolenaar }
379c243e490SMarcel Moolenaar 
380c243e490SMarcel Moolenaar /*
381c243e490SMarcel Moolenaar  * Operators.
382c243e490SMarcel Moolenaar  */
383c243e490SMarcel Moolenaar 
384c243e490SMarcel Moolenaar bool
atf_equal_dynstr_cstring(const atf_dynstr_t * ad,const char * str)385c243e490SMarcel Moolenaar atf_equal_dynstr_cstring(const atf_dynstr_t *ad, const char *str)
386c243e490SMarcel Moolenaar {
387c243e490SMarcel Moolenaar     return strcmp(ad->m_data, str) == 0;
388c243e490SMarcel Moolenaar }
389c243e490SMarcel Moolenaar 
390c243e490SMarcel Moolenaar bool
atf_equal_dynstr_dynstr(const atf_dynstr_t * s1,const atf_dynstr_t * s2)391c243e490SMarcel Moolenaar atf_equal_dynstr_dynstr(const atf_dynstr_t *s1, const atf_dynstr_t *s2)
392c243e490SMarcel Moolenaar {
393c243e490SMarcel Moolenaar     return strcmp(s1->m_data, s2->m_data) == 0;
394c243e490SMarcel Moolenaar }
395