aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2019-02-15 18:09:00 +0100
committerHugo Hörnquist <hugo@lysator.liu.se>2019-02-15 20:03:45 +0100
commit05b5d8547f5f98ca4b907bf6a21564e2384740a6 (patch)
treed1a5c0a856f938721b92076e328ef22647fcaddb
parentAdd toggle for node data output. (diff)
downloadcalp-05b5d8547f5f98ca4b907bf6a21564e2384740a6.tar.gz
calp-05b5d8547f5f98ca4b907bf6a21564e2384740a6.tar.xz
Improve FOR macro.
-rw-r--r--graphs.c22
-rw-r--r--linked_list.h14
-rw-r--r--linked_list.inc.h4
-rw-r--r--macro.h16
-rw-r--r--trie.inc.h3
-rw-r--r--vcal.c6
-rw-r--r--vector.h12
7 files changed, 45 insertions, 32 deletions
diff --git a/graphs.c b/graphs.c
index ab10286b..ff23be00 100644
--- a/graphs.c
+++ b/graphs.c
@@ -104,27 +104,27 @@ int trie_to_dot_helper ( TRIE_NODE(T)* root, FILE* f ) {
TRIE_NODE(T)* child = root->child;
// ----------------------------------------
-#if 0 /* Toggle values */
- if (root->value != NULL) {
+#if 1 /* Toggle values */
+ if (L(root) != NULL) {
- FOR(LLIST(content_set), link, &L(root)->val) {
+ FOR(LLIST(content_set), content_set, v, &L(root)->val) {
char buf[0x100];
- FMT(strbuf)(&L(link)->key, buf);
+ FMT(strbuf)(&v->key, buf);
fprintf(f, "\"%p\" [label=\"%s\" shape=rectangle color=darkgreen];\n",
- link->value, buf);
- fprintf(f, "\"%p\" -> \"%p\";\n", root, L(link));
+ v, buf);
+ fprintf(f, "\"%p\" -> \"%p\";\n", root, v);
/* Parameters */
- FOR(LLIST(param_set), param_link, &L(link)->val) {
- strbuf* param_key = &L(param_link)->key;
+ FOR(LLIST(param_set), param_set, p, &v->val) {
+ strbuf* param_key = &p->key;
fprintf(f, "\"%p\" [label=\"%s\" color=blue];\n",
param_key, param_key->mem);
- fprintf(f, "\"%p\" -> \"%p\";", L(link), param_key);
+ fprintf(f, "\"%p\" -> \"%p\";", p, param_key);
- FOR(LLIST(strbuf), str, &L(param_link)->val) {
+ FOR(LLIST(strbuf), strbuf, str, &p->val) {
fprintf(f, "\"%p\" [label=\"%s\" color=orange];",
- str, L(str)->mem);
+ str, str->mem);
fprintf(f, "\"%p\" -> \"%p\";", param_key, str);
}
}
diff --git a/linked_list.h b/linked_list.h
index 8c09d5e0..909a38a8 100644
--- a/linked_list.h
+++ b/linked_list.h
@@ -69,14 +69,20 @@ FMT_F(LLIST(TYPE));
/* Iterator */
+#define __PRE_LLIST(T, l, set) \
+ T* l; LINK(T)* __INTER(l);
+
+#define PRE_FOR_LLIST(T) __PRE_LLIST
+
// #define __BEG_LLIST(v, set) v = (set)->head
-#define __BEG_LLIST(l, set) l = FIRST(set)
-#define BEG_LLIST(T) LINK(T)* __BEG_LLIST
+#define __BEG_LLIST(T, l, set) __INTER(l) = FIRST(set), l = L(__INTER(l))
+#define BEG_LLIST(T) __BEG_LLIST
-#define __END_LLIST(l, set) l != (set)->tail
+#define __END_LLIST(T, l, set) __INTER(l) != (set)->tail
#define END_LLIST(T) __END_LLIST
-#define __NXT_LLIST(l, set) l = l->after
+#define __NXT_LLIST(T, l, set) __INTER(l) = __INTER(l)->after, l = L(__INTER(l))
+// #define __NXT_LLIST(T, l, set) l = L(__INTER(l) = __INTER(l)->after)
#define NXT_LLIST(T) __NXT_LLIST
#endif /* TYPE */
diff --git a/linked_list.inc.h b/linked_list.inc.h
index 831da5fb..6102720a 100644
--- a/linked_list.inc.h
+++ b/linked_list.inc.h
@@ -168,8 +168,8 @@ int RESET(LLIST(TYPE)) ( LLIST(TYPE)* llist ) {
FMT_F(LLIST(TYPE)) {
int seek = 0;
fmtf("(");
- FOR(LLIST(TYPE), link, this) {
- seek += FMT(TYPE)(link->value, buf + seek);
+ FOR(LLIST(TYPE), TYPE, v, this) {
+ seek += FMT(TYPE)(v, buf + seek);
fmtf(" ");
}
fmtf(")");
diff --git a/macro.h b/macro.h
index ae69ddd3..0057df25 100644
--- a/macro.h
+++ b/macro.h
@@ -78,18 +78,20 @@
/* Declare destructor */
#define FREE_F(T) int FREE(T) (T* this)
+/* generate reusable internal symbol */
+#define __INTER(s) TP3(__, s, __internal)
-/*
- * Iterator macros.
- */
-#define FOR(T, var, set) for( \
- BEG_ ## T (var, set); \
- END_ ## T (var, set); \
- NXT_ ## T (var, set))
+/* Iterator macros. */
+#define FOR(CONT_T, T, var, set) \
+ PRE_FOR_ ## CONT_T (T, var, set); \
+ for( BEG_ ## CONT_T (T, var, set); \
+ END_ ## CONT_T (T, var, set); \
+ NXT_ ## CONT_T (T, var, set))
/* Example int implementation
* FOR(int, i, 10) { } */
+#define PRE_FOR_int(i, set)
#define BEG_int(i, set) int i = 0
#define NXT_int(i, set) i++
#define END_int(i, set) i < set
diff --git a/trie.inc.h b/trie.inc.h
index c03cee22..3ac9acac 100644
--- a/trie.inc.h
+++ b/trie.inc.h
@@ -137,7 +137,8 @@ FMT_F(TRIE_NODE(TYPE)) {
if (n == NULL) { fmtf("\n"); }
while (n != NULL) {
fmtf("|");
- FOR(int, i, depth) fmtf(" ");
+ // FOR(int, i, depth) fmtf(" ");
+ for (int i = 0; i < depth; i++) fmtf(" ");
fmtf("%c ", n->c == '\0' ? '0' : n->c);
if (n->value != NULL) {
seek += FMT(TYPE)(n->value, buf + seek);
diff --git a/vcal.c b/vcal.c
index 7545ccf3..dda509db 100644
--- a/vcal.c
+++ b/vcal.c
@@ -115,15 +115,15 @@ int DEEP_COPY(vcomponent)(vcomponent* a, vcomponent* b) {
FMT_F(vcomponent) {
int seek = 0;
- FOR(int, i, 40) fmtf("_");
+ for (int i = 0; i < 40; i++) fmtf("_");
seek += sprintf(buf + seek, _YELLOW);
seek += sprintf(buf + seek, "\nVComponet (Type := %s)\n", this->type);
seek += sprintf(buf + seek, _RESET);
seek += FMT(TRIE(content_line))(&this->clines, buf + seek);
seek += sprintf(buf + seek, "\nComponents:\n");
- FOR(VECT(vcomponent), i, &this->components) {
- seek += FMT(vcomponent)(GET(VECT(vcomponent))(&this->components, i), buf + seek);
+ FOR(VECT(vcomponent), vcomponent, comp, &this->components) {
+ seek += FMT(vcomponent)(comp, buf + seek);
}
return seek;
diff --git a/vector.h b/vector.h
index 7dea4d58..073252bf 100644
--- a/vector.h
+++ b/vector.h
@@ -24,13 +24,17 @@ TYPE* GET(VECT(TYPE))(VECT(TYPE)*, unsigned int idx);
int EMPTY(VECT(TYPE))(VECT(TYPE)*);
unsigned int SIZE(VECT(TYPE))(VECT(TYPE)*);
-#define __BEG_VECT(i, set) unsigned int i = 0
+#define __PRE_VECT(T, i, set) \
+ unsigned int __INTER(i) = 0; T* i;
+#define PRE_FOR_VECT(T) __PRE_VECT
+
+#define __BEG_VECT(T, i, set) i = GET(VECT(T))(set, __INTER(i))
#define BEG_VECT(T) __BEG_VECT
-#define __END_VECT(i, set) (set) > i
-#define END_VECT(T) SIZE(VECT(T)) __END_VECT
+#define __END_VECT(T, i, set) __INTER(i) < SIZE(VECT(T))(set)
+#define END_VECT(T) __END_VECT
-#define __NXT_VECT(l, set) i++
+#define __NXT_VECT(T, i, set) i = GET(VECT(T))(set, ++__INTER(i))
#define NXT_VECT(T) __NXT_VECT
#endif /* TYPE */