summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2020-08-08 23:39:05 +0200
committerTyge Løvset <[email protected]>2020-08-08 23:39:05 +0200
commitfd69cd250ff98670c4cfd57e4b72d6850f9d9391 (patch)
tree5bb4103ade61a4fb288d24804259ccee59d969a6
parent67c15a839caa8d5abb6d8fa637c37c45dd0e69ff (diff)
downloadSTC-modified-fd69cd250ff98670c4cfd57e4b72d6850f9d9391.tar.gz
STC-modified-fd69cd250ff98670c4cfd57e4b72d6850f9d9391.zip
Added cstr_iter_t + begin/next, and cstr_front.
-rw-r--r--stc/cstr.h37
-rw-r--r--stc/cvec.h14
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);
@@ -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;
}
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; \