ATF_TC_BODY(fini_disown, tc) { const char *cstr; char *cstr2; atf_dynstr_t str; RE(atf_dynstr_init_fmt(&str, "Test string 1")); cstr = atf_dynstr_cstring(&str); cstr2 = atf_dynstr_fini_disown(&str); ATF_REQUIRE_EQ(cstr, cstr2); free(cstr2); }
atf_error_t atf_text_format_ap(char **dest, const char *fmt, va_list ap) { atf_error_t err; atf_dynstr_t tmp; va_list ap2; va_copy(ap2, ap); err = atf_dynstr_init_ap(&tmp, fmt, ap2); va_end(ap2); if (!atf_is_error(err)) *dest = atf_dynstr_fini_disown(&tmp); return err; }
atf_error_t atf_text_split(const char *str, const char *delim, atf_list_t *words) { atf_error_t err; const char *end; const char *iter; err = atf_list_init(words); if (atf_is_error(err)) goto err; end = str + strlen(str); INV(*end == '\0'); iter = str; while (iter < end) { const char *ptr; INV(iter != NULL); ptr = strstr(iter, delim); if (ptr == NULL) ptr = end; INV(ptr >= iter); if (ptr > iter) { atf_dynstr_t word; err = atf_dynstr_init_raw(&word, iter, ptr - iter); if (atf_is_error(err)) goto err_list; err = atf_list_append(words, atf_dynstr_fini_disown(&word), true); if (atf_is_error(err)) goto err_list; } iter = ptr + strlen(delim); } INV(!atf_is_error(err)); return err; err_list: atf_list_fini(words); err: return err; }
/** Reads a line of arbitrary length. * * \param fd The descriptor from which to read the line. * * \return A pointer to the read line, which must be released with free(), or * NULL if there was nothing to read from the file. */ char * atf_utils_readline(const int fd) { char ch; ssize_t cnt; atf_dynstr_t temp; atf_error_t error; error = atf_dynstr_init(&temp); ATF_REQUIRE(!atf_is_error(error)); while ((cnt = read(fd, &ch, sizeof(ch))) == sizeof(ch) && ch != '\n') { error = atf_dynstr_append_fmt(&temp, "%c", ch); ATF_REQUIRE(!atf_is_error(error)); } ATF_REQUIRE(cnt != -1); if (cnt == 0 && atf_dynstr_length(&temp) == 0) { atf_dynstr_fini(&temp); return NULL; } else return atf_dynstr_fini_disown(&temp); }