diff options
| -rw-r--r-- | docs/cstr_api.md | 5 | ||||
| -rw-r--r-- | stc/ccommon.h | 1 | ||||
| -rw-r--r-- | stc/cstr.h | 26 |
3 files changed, 13 insertions, 19 deletions
diff --git a/docs/cstr_api.md b/docs/cstr_api.md index 0f481b92..77fbe86c 100644 --- a/docs/cstr_api.md +++ b/docs/cstr_api.md @@ -38,13 +38,12 @@ void cstr_clear(cstr* self); cstr* cstr_assign(cstr* self, const char* str); cstr* cstr_assign_s(cstr* self, cstr s); // cstr_take(self, cstr_clone(s)) -cstr* cstr_assign_n(cstr* self, const char* str, size_t n); +cstr* cstr_assign_n(cstr* self, const char* str, size_t n); // assign n first chars of str cstr* cstr_assign_fmt(cstr* self, const char* fmt, ...); // printf() formatting cstr* cstr_append(cstr* self, const char* str); cstr* cstr_append_s(cstr* self, cstr s); -cstr* cstr_append_n(cstr* self, const char* str, size_t n); // appends n characters -cstr* cstr_append_fmt(cstr* self, const char* fmt, ...); // printf() formatting +cstr* cstr_append_n(cstr* self, const char* str, size_t n); void cstr_insert(cstr* self, size_t pos, const char* str); void cstr_insert_s(cstr* self, size_t pos, cstr s); diff --git a/stc/ccommon.h b/stc/ccommon.h index 5b5f7e59..37458243 100644 --- a/stc/ccommon.h +++ b/stc/ccommon.h @@ -120,6 +120,7 @@ for (type i=start, i##_inc_=step, i##_end_=(stop) - (0 < i##_inc_) \
; (i <= i##_end_) == (0 < i##_inc_); i += i##_inc_)
+#define c_with(start, end) for (int _c_w = (start, 0); !_c_w; end, ++_c_w)
#define c_withfile(f, open) for (FILE *f = open; f; fclose(f), f = NULL)
#define c_withbuffer(b, type, n) c_withbuffer_x(b, type, n, 256)
#define c_withbuffer_x(b, type, n, BYTES) \
@@ -220,18 +220,18 @@ cstr_from_n(const char* str, size_t n) { # pragma warning(push)
# pragma warning(disable: 4996)
#endif
-///
+
STC_DEF void
-cstr_vfmt(cstr* self, size_t pos, const char* fmt, va_list args) {
+cstr_vfmt(cstr* self, const char* fmt, va_list args) {
va_list args2;
va_copy(args2, args);
int len = vsnprintf(NULL, (size_t)0, fmt, args);
- cstr_reserve(self, pos + len);
- vsprintf(self->str + pos, fmt, args2);
+ cstr_reserve(self, len);
+ vsprintf(self->str, fmt, args2);
va_end(args2);
- _cstr_rep(self)->size = pos + len;
+ _cstr_rep(self)->size = len;
}
-///
+
#if defined(__clang__)
# pragma clang diagnostic pop
#elif defined(_MSC_VER)
@@ -242,24 +242,18 @@ STC_DEF cstr cstr_from_fmt(const char* fmt, ...) {
cstr ret = cstr_inits;
va_list args; va_start(args, fmt);
- cstr_vfmt(&ret, 0, fmt, args);
+ cstr_vfmt(&ret, fmt, args);
va_end(args);
return ret;
}
STC_DEF cstr*
cstr_assign_fmt(cstr* self, const char* fmt, ...) {
+ cstr ret = cstr_inits;
va_list args; va_start(args, fmt);
- cstr_vfmt(self, 0, fmt, args);
- va_end(args);
- return self;
-}
-
-STC_DEF cstr*
-cstr_append_fmt(cstr* self, const char* fmt, ...) {
- va_list args; va_start(args, fmt);
- cstr_vfmt(self, cstr_size(*self), fmt, args);
+ cstr_vfmt(&ret, fmt, args);
va_end(args);
+ cstr_del(self); *self = ret;
return self;
}
|
