summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2022-09-22 07:28:20 +0200
committerTyge Løvset <[email protected]>2022-09-22 07:28:20 +0200
commit43b5d0ec65ecf06bc28c4ba90bd75aaa16d4169b (patch)
tree00497ba77f0c47a0943cb52861fa2179e5c4052b
parentc3cefd740a90378a53698df639d7889c6baffcb8 (diff)
downloadSTC-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.c30
-rw-r--r--include/stc/ccommon.h14
-rw-r--r--src/utf8code.c7
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;