diff options
| author | Tyge Løvset <[email protected]> | 2022-09-22 07:28:20 +0200 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2022-09-22 07:28:20 +0200 |
| commit | 43b5d0ec65ecf06bc28c4ba90bd75aaa16d4169b (patch) | |
| tree | 00497ba77f0c47a0943cb52861fa2179e5c4052b | |
| parent | c3cefd740a90378a53698df639d7889c6baffcb8 (diff) | |
| download | STC-modified-43b5d0ec65ecf06bc28c4ba90bd75aaa16d4169b.tar.gz STC-modified-43b5d0ec65ecf06bc28c4ba90bd75aaa16d4169b.zip | |
Renamed c_forfiltered() back to c_forfilter(), and iter member .count => .taken
| -rw-r--r-- | examples/forfiltered.c | 30 | ||||
| -rw-r--r-- | include/stc/ccommon.h | 14 | ||||
| -rw-r--r-- | src/utf8code.c | 7 |
3 files changed, 33 insertions, 18 deletions
diff --git a/examples/forfiltered.c b/examples/forfiltered.c index 71327629..2bea9a0a 100644 --- a/examples/forfiltered.c +++ b/examples/forfiltered.c @@ -1,4 +1,6 @@ #include <stdio.h> +#define i_implement +#include <stc/cstr.h> #include <stc/csview.h> #define i_type IVec @@ -15,14 +17,14 @@ void demo1(void) c_forarray (int, v, {0, 1, 2, 3, 4, 5, 80, 6, 7, 80, 8, 9, 80, 10, 11, 12, 13}) IVec_push(&vec, *v); - c_forfiltered (i, IVec, vec, *i.ref != 80) + c_forfilter (i, IVec, vec, *i.ref != 80) printf(" %d", *i.ref); puts(""); - c_forfiltered (i, IVec, vec, i.idx >= 3 // drop(3) - && i.idx != 5 - && *i.ref != 7, - i.count < 5) // take(5) + c_forfilter (i, IVec, vec, i.idx >= 3 // drop(3) + && i.idx != 5 + && *i.ref != 7, + i.taken < 5) // take(5) printf(" %d", *i.ref); puts(""); } @@ -73,8 +75,8 @@ void demo3(void) c_fortoken (w, sentence, " ") SVec_push(&words, *w.ref); - c_forfiltered (w, SVec, words, - csview_contains(*w.ref, c_sv("i"))) + c_forfilter (w, SVec, words, + csview_contains(*w.ref, c_sv("i"))) SVec_push(&words_containing_i, *w.ref); c_foreach (w, SVec, words_containing_i) @@ -83,10 +85,24 @@ void demo3(void) } } +void demo4(void) +{ + csview s = c_sv("ab123cReAghNGnΩoEp"); + cstr out = cstr_null; + c_forfilter (i, csview, s, utf8_isupper(utf8_peek(i.ref, 0))) + cstr_push(&out, i.ref); + //cstr_append_sv(&out, i.it.u8.chr); + + printf("%s", cstr_str(&out)); +} + int main(void) { demo1(); demo2(); demo3(); + demo4(); } + +#include "../src/utf8code.c"
\ No newline at end of file diff --git a/include/stc/ccommon.h b/include/stc/ccommon.h index 64c39da0..0bf371fc 100644 --- a/include/stc/ccommon.h +++ b/include/stc/ccommon.h @@ -162,15 +162,15 @@ STC_INLINE char* c_strnstrn(const char *s, const char *needle, for (C##_iter it = start, *_endref = (C##_iter*)(finish).ref \ ; it.ref != (C##_value*)_endref; C##_next(&it)) -#define c_forfiltered(...) c_MACRO_OVERLOAD(c_forfiltered, __VA_ARGS__) -#define c_forfiltered4(it, C, cnt, filter) \ - c_forloop(it, C, cnt, true) if (!(filter)) ; else -#define c_forfiltered5(it, C, cnt, filter, cond) \ - c_forloop(it, C, cnt, cond) if (!((filter) && ++it.count)) ; else +#define c_forfilter(...) c_MACRO_OVERLOAD(c_forfilter, __VA_ARGS__) +#define c_forfilter4(it, C, cnt, filter) \ + c_forfilter5(it, C, cnt, filter, true) +#define c_forfilter5(it, C, cnt, filter, cond) \ + c_forloop(it, C, cnt, cond) if (!((filter) && ++it.taken)) ; else #define c_forloop(i, C, cnt, cond) \ - for (struct {C##_iter it; const C##_value *ref; size_t idx, count;} \ - i = {.it=C##_begin(&cnt), .ref=i.it.ref, .idx=0, .count=0} \ + for (struct {C##_iter it; const C##_value *ref; size_t idx, taken;} \ + i = {.it=C##_begin(&cnt), .ref=i.it.ref, .idx=0, .taken=0} \ ; i.ref && (cond); C##_next(&i.it), i.ref = i.it.ref, ++i.idx) #define c_forpair(key, val, C, cnt) /* structured binding */ \ diff --git a/src/utf8code.c b/src/utf8code.c index 45f1613d..25244f07 100644 --- a/src/utf8code.c +++ b/src/utf8code.c @@ -48,10 +48,9 @@ unsigned utf8_encode(char *out, uint32_t c) uint32_t utf8_peek(const char* s, int pos) { int inc = -1; - if (pos > 0) - pos = -pos, inc = 1; - while (pos) - pos += (*(s += inc) & 0xC0) != 0x80; + if (pos > 0) pos = -pos, inc = 1; + while (pos) pos += (*(s += inc) & 0xC0) != 0x80; + utf8_decode_t d = {.state=0}; do { utf8_decode(&d, (uint8_t)*s++); } while (d.state); return d.codep; |
