ATF_TC_BODY(init_raw, tc) { const char *src = "String 1, String 2"; atf_dynstr_t str; RE(atf_dynstr_init_raw(&str, src, 0)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "") == 0); atf_dynstr_fini(&str); RE(atf_dynstr_init_raw(&str, src, 8)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 1") == 0); atf_dynstr_fini(&str); RE(atf_dynstr_init_raw(&str, src + 10, 8)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 2") == 0); atf_dynstr_fini(&str); RE(atf_dynstr_init_raw(&str, "String\0Lost", 11)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String") == 0); atf_dynstr_fini(&str); { atf_error_t err = atf_dynstr_init_raw(&str, "NULL", SIZE_MAX - 1); ATF_REQUIRE(atf_is_error(err)); ATF_REQUIRE(atf_error_is(err, "no_memory")); atf_error_free(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; }