#include #include #include #include #define NSTR_IMPLEMENTATION #define NSTR_LEN_TYPE size_t #include "nstr.h" #define tmsg(s) fputs(s "... ", stderr) #define tpass() fputs("passed\n", stderr) int main(void) { { tmsg("String heap allocation with copy"); const char *cs1 = "hello woooooooooooooooorld aaaaaa!!!!aaaaaaaaaaaaaaaaaa"; size_t cs1len = strlen(cs1); Str s1 = nstr_new(cs1, cs1len); s1.len = cs1len; assert(!nstr_is_null(s1)); /* ensure allocation success */ assert(s1.s[s1.len] == '\0'); assert(s1.len == cs1len); assert(memcmp(s1.s, cs1, s1.len) == 0); nstr_free(s1); tpass(); } { tmsg("nstr_afmt"); Str s1 = nstr_afmt("%s/file/path/to/%s_%d", "/var", "log", 3129); Str s2 = nstr_from_c("/var/file/path/to/log_3129"); assert(nstr_equal(s1, s2)); nstr_free(s1); tpass(); } { tmsg("nstr_fmt"); Str buf = { .s = (char [128]){0}, .cap = 128 }; Str s1 = nstr_fmt(buf, "%s/file/path/to/%s_%d", "/var", "log", 3129); Str s2 = nstr_from_c("/var/file/path/to/log_3129"); assert(nstr_equal(s1, s2)); tpass(); } { tmsg("nstr_append with truncation"); Str s1 = { .s = (char [12]){0}, .cap = 12 }; Str s2 = nstr_from_c("abcde"); s1 = nstr_append(s1, s2, NSTR_TRUNCATE); assert(nstr_equal(s1, s2)); s1 = nstr_append(s1, s2, NSTR_TRUNCATE); assert(nstr_equal(s1, nstr_from_c("abcdeabcde"))); s1 = nstr_append(s1, s2, NSTR_TRUNCATE); assert(nstr_equal(s1, nstr_from_c("abcdeabcdea"))); tpass(); } { tmsg("nstr_append with resizing"); Str s1 = nstr_new(NULL, 8); s1 = nstr_append(s1, nstr_from_c("ABCDEFGHIJ"), NSTR_RESIZE); s1 = nstr_append(s1, nstr_from_c("KLMNOP"), NSTR_RESIZE); s1 = nstr_append(s1, nstr_from_c("QRSTUVWXYZ"), NSTR_RESIZE); assert(nstr_equal(s1, nstr_from_c("ABCDEFGHIJKLMNOPQRSTUVWXYZ"))); nstr_free(s1); tpass(); } return 0; }