#include "str.h" #include #include #include #include #include char * str_fmt(const struct allocator *allocator, int *rc, const char *fmtstr, ...) { va_list ap, cpy; char *str; ssize_t n; LIBSTR_ABORT_ON_ARGS(!allocator || !fmtstr); va_copy(cpy, ap); va_start(cpy, fmtstr); n = vsnprintf(NULL, 0, fmtstr, cpy); va_end(cpy); if (n <= 0) { if (rc) *rc = 1; return NULL; } str = allocator->alloc(allocator, (size_t) (n + 1), rc); LIBSTR_ABORT_ON_ALLOC(!str); if (!str && rc) *rc = -*rc; if (!str) return NULL; va_start(ap, fmtstr); vsnprintf(str, (size_t) (n + 1), fmtstr, ap); va_end(ap); return str; } char * str_fmt_realloc(const struct allocator *allocator, int *rc, void *alloc, const char *fmtstr, ...) { va_list ap, cpy; char *str; ssize_t n; LIBSTR_ABORT_ON_ARGS(!allocator || !fmtstr); va_copy(cpy, ap); va_start(cpy, fmtstr); n = vsnprintf(NULL, 0, fmtstr, cpy); va_end(cpy); if (n <= 0) { if (rc) *rc = 1; return NULL; } str = allocator->realloc(allocator, alloc, (size_t) (n + 1), rc); LIBSTR_ABORT_ON_ALLOC(!str); if (!str && rc) *rc = -*rc; if (!str) return NULL; va_start(ap, fmtstr); vsnprintf(str, (size_t) (n + 1), fmtstr, ap); va_end(ap); return str; } char * str_dup(const struct allocator *allocator, int *rc, const char *str) { return str_ndup(allocator, rc, str, strlen(str)); } char * str_dup_realloc(const struct allocator *allocator, int *rc, void *alloc, const char *str) { return str_ndup_realloc(allocator, rc, alloc, str, strlen(str)); } char * str_ndup(const struct allocator *allocator, int *rc, const char *str, size_t n) { char *nstr; LIBSTR_ABORT_ON_ARGS(!allocator || !str); nstr = allocator->alloc(allocator, n + 1, rc); LIBSTR_ABORT_ON_ALLOC(!nstr); if (!nstr && rc) *rc = -*rc; if (!nstr) return NULL; strncpy(nstr, str, n + 1); return nstr; } char * str_ndup_realloc(const struct allocator *allocator, int *rc, void *alloc, const char *str, size_t n) { char *nstr; LIBSTR_ABORT_ON_ARGS(!allocator || !str); nstr = allocator->realloc(allocator, alloc, n + 1, rc); LIBSTR_ABORT_ON_ALLOC(!nstr); if (!nstr && rc) *rc = -*rc; if (!nstr) return NULL; strncpy(nstr, str, n + 1); return nstr; } char * str_app(const struct allocator *allocator, int *rc, char *str, const char *app) { size_t slen, alen; LIBSTR_ABORT_ON_ARGS(!allocator); alen = strlen(app); slen = str ? strlen(str) : 0; str = allocator->realloc(allocator, str, slen + alen + 1, rc); LIBSTR_ABORT_ON_ALLOC(!str); if (!str && rc) *rc = -*rc; if (!str) return NULL; memcpy(str + slen, app, alen + 1); return str; }