diff options
| author | Tyge Løvset <[email protected]> | 2020-08-08 23:39:05 +0200 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2020-08-08 23:39:05 +0200 |
| commit | fd69cd250ff98670c4cfd57e4b72d6850f9d9391 (patch) | |
| tree | 5bb4103ade61a4fb288d24804259ccee59d969a6 | |
| parent | 67c15a839caa8d5abb6d8fa637c37c45dd0e69ff (diff) | |
| download | STC-modified-fd69cd250ff98670c4cfd57e4b72d6850f9d9391.tar.gz STC-modified-fd69cd250ff98670c4cfd57e4b72d6850f9d9391.zip | |
Added cstr_iter_t + begin/next, and cstr_front.
| -rw-r--r-- | stc/cstr.h | 37 | ||||
| -rw-r--r-- | stc/cvec.h | 14 |
2 files changed, 25 insertions, 26 deletions
@@ -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);
@@ -164,10 +169,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;
}
@@ -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; \
|
