From 05b5d8547f5f98ca4b907bf6a21564e2384740a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Fri, 15 Feb 2019 18:09:00 +0100 Subject: Improve FOR macro. --- graphs.c | 22 +++++++++++----------- linked_list.h | 14 ++++++++++---- linked_list.inc.h | 4 ++-- macro.h | 16 +++++++++------- trie.inc.h | 3 ++- vcal.c | 6 +++--- vector.h | 12 ++++++++---- 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 */ -- cgit v1.2.3