From fd69cd250ff98670c4cfd57e4b72d6850f9d9391 Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Sat, 8 Aug 2020 23:39:05 +0200 Subject: Added cstr_iter_t + begin/next, and cstr_front. --- stc/cstr.h | 37 +++++++++++++++++++------------------ stc/cvec.h | 14 ++++++-------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/stc/cstr.h b/stc/cstr.h index 5e7f4fc8..38b1bd72 100644 --- a/stc/cstr.h +++ b/stc/cstr.h @@ -33,13 +33,19 @@ typedef struct cstr_t { char* str; } cstr_t; +typedef struct { + char *item, *end; +} cstr_iter_t; static size_t _cstr_nullrep[] = {0, 0, 0}; -static cstr_t cstr_init = {(char* ) &_cstr_nullrep[2]}; -#define cstr_size(s) ((const size_t *) (s).str)[-2] -#define cstr_capacity(s) ((const size_t *) (s).str)[-1] -#define cstr_npos ((size_t) (-1)) +static cstr_t cstr_init = {(char* ) &_cstr_nullrep[2]}; +#define cstr_size(s) ((const size_t *) (s).str)[-2] +#define cstr_capacity(s) ((const size_t *) (s).str)[-1] +#define cstr_empty(s) (cstr_size(s) == 0) +#define cstr_front(s) (s).str[0] +#define cstr_back(s) (s).str[_cstr_size(s) - 1] /* may have side effect */ +#define cstr_npos ((size_t) (-1)) STC_API cstr_t cstr_make_n(const char* str, size_t len); @@ -79,14 +85,12 @@ cstr_with_capacity(size_t cap) { cstr_reserve(&s, cap); return s; } - STC_INLINE cstr_t cstr_with_size(size_t len, char fill) { cstr_t s = cstr_init; cstr_resize(&s, len, fill); return s; } - STC_INLINE cstr_t cstr_make(const char* str) { return cstr_make_n(str, strlen(str)); @@ -99,15 +103,20 @@ cstr_clone(cstr_t s) { STC_INLINE void cstr_clear(cstr_t* self) { - cstr_destroy(self); - *self = cstr_init; + self->str[_cstr_size(*self) = 0] = '\0'; } +STC_INLINE cstr_iter_t +cstr_begin(cstr_t* self) { + cstr_iter_t it = {self->str, self->str + cstr_size(*self)}; return it; +} +STC_INLINE void +cstr_next(cstr_iter_t* it) { ++it->item; } + STC_INLINE cstr_t* cstr_assign(cstr_t* self, const char* str) { return cstr_assign_n(self, str, strlen(str)); } - STC_INLINE cstr_t* cstr_assign_s(cstr_t* self, cstr_t s) { return cstr_assign_n(self, s.str, cstr_size(s)); @@ -120,7 +129,6 @@ cstr_take(cstr_t* self, cstr_t s) { self->str = s.str; return self; } - STC_INLINE cstr_t cstr_move(cstr_t* self) { cstr_t tmp = *self; @@ -144,10 +152,7 @@ STC_INLINE void cstr_pop_back(cstr_t* self) { --_cstr_size(*self); } -STC_INLINE char -cstr_back(cstr_t s) { - return s.str[cstr_size(s) - 1]; -} + STC_INLINE void cstr_insert_n(cstr_t* self, size_t pos, const char* str, size_t n) { cstr_replace_n(self, pos, 0, str, n); @@ -163,10 +168,6 @@ cstr_replace(cstr_t* self, size_t pos, size_t len, const char* str) { /* readonly */ -STC_INLINE bool -cstr_empty(cstr_t s) { - return cstr_size(s) == 0; -} STC_INLINE bool cstr_equals(cstr_t s1, const char* str) { return strcmp(s1.str, str) == 0; diff --git a/stc/cvec.h b/stc/cvec.h index 062be92b..b0102405 100644 --- a/stc/cvec.h +++ b/stc/cvec.h @@ -28,11 +28,11 @@ #include "cdefs.h" #define cvec_init {NULL} -#define cvec_size(cv) _cvec_safe_size((cv).data) -#define cvec_capacity(cv) _cvec_safe_capacity((cv).data) -#define cvec_empty(cv) (_cvec_safe_size((cv).data) == 0) -#define cvec_front(cv) (cv).data[0] -#define cvec_back(cv) (cv).data[_cvec_size(cv) - 1] /* may have side effect */ +#define cvec_size(v) _cvec_safe_size((v).data) +#define cvec_capacity(v) _cvec_safe_capacity((v).data) +#define cvec_empty(v) (_cvec_safe_size((v).data) == 0) +#define cvec_front(v) (v).data[0] +#define cvec_back(v) (v).data[_cvec_size(v) - 1] /* may have side effect */ #define declare_cvec(...) c_MACRO_OVERLOAD(declare_cvec, __VA_ARGS__) #define declare_cvec_2(tag, Value) \ @@ -128,9 +128,7 @@ cvec_##tag##_begin(cvec_##tag* vec) { \ return it; \ } \ STC_INLINE void \ -cvec_##tag##_next(cvec_##tag##_iter_t* it) { \ - ++it->item; \ -} \ +cvec_##tag##_next(cvec_##tag##_iter_t* it) { ++it->item; } \ \ implement_cvec_6(tag, Value, valueDestroy, RawValue, valueCompareRaw, valueToRaw) \ typedef Value cvec_##tag##_value_t, cvec_##tag##_input_t; \ -- cgit v1.2.3