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 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 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 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 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 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 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 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 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 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 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 * 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 * 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 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 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 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 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 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 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 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 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 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