changeset 438:b4ddad459690

suite_aggr; - made generator produce unique signatures - reduced dcNewStruct() calls to once only per sig - added missing free()s - cleanup: removal of unused decl, func renaming for clarity, static for tu-local symbols, ...
author Tassilo Philipp
date Wed, 26 Jan 2022 13:37:19 +0100
parents 135c7fb49c2f
children 252f32fa59d8
files test/suite_aggrs/cases.h test/suite_aggrs/design.txt test/suite_aggrs/globals.c test/suite_aggrs/globals.h test/suite_aggrs/main.c test/suite_aggrs/mk-cases.lua test/suite_aggrs/rand-sig.lua
diffstat 7 files changed, 290 insertions(+), 207 deletions(-) [+]
line wrap: on
line diff
--- a/test/suite_aggrs/cases.h	Wed Jan 26 13:26:39 2022 +0100
+++ b/test/suite_aggrs/cases.h	Wed Jan 26 13:37:19 2022 +0100
@@ -2,274 +2,331 @@
 struct A1 { };
 void f_cpA1(struct A1 *x, const struct A1 *y) { 1; };
 int f_cmpA1(const struct A1 *x, const struct A1 *y) { return 1; };
-DCstruct* f_newdcstA1() {
-	DCstruct* st = dcNewStruct(0, sizeof(struct A1), 0, 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA1() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(0, sizeof(struct A1), DC_TRUE);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {i} */
 struct A2 { i m0; };
 void f_cpA2(struct A2 *x, const struct A2 *y) { x->m0 = y->m0; };
 int f_cmpA2(const struct A2 *x, const struct A2 *y) { return x->m0 == y->m0; };
-DCstruct* f_newdcstA2() {
-	DCstruct* st = dcNewStruct(1, sizeof(struct A2), 0, 1);
-	dcStructField(st, 'i', offsetof(struct A2, m0), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA2() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(1, sizeof(struct A2), DC_TRUE);
+		dcStructField(st, 'i', offsetof(struct A2, m0), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {s} */
 struct A3 { s m0; };
 void f_cpA3(struct A3 *x, const struct A3 *y) { x->m0 = y->m0; };
 int f_cmpA3(const struct A3 *x, const struct A3 *y) { return x->m0 == y->m0; };
-DCstruct* f_newdcstA3() {
-	DCstruct* st = dcNewStruct(1, sizeof(struct A3), 0, 1);
-	dcStructField(st, 's', offsetof(struct A3, m0), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA3() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(1, sizeof(struct A3), DC_TRUE);
+		dcStructField(st, 's', offsetof(struct A3, m0), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {dlclpfifpifsf} */
 struct A4 { d m0; l m1; c m2; l m3; p m4; f m5; i m6; f m7; p m8; i m9; f m10; s m11; f m12; };
 void f_cpA4(struct A4 *x, const struct A4 *y) { x->m0 = y->m0; x->m1 = y->m1; x->m2 = y->m2; x->m3 = y->m3; x->m4 = y->m4; x->m5 = y->m5; x->m6 = y->m6; x->m7 = y->m7; x->m8 = y->m8; x->m9 = y->m9; x->m10 = y->m10; x->m11 = y->m11; x->m12 = y->m12; };
 int f_cmpA4(const struct A4 *x, const struct A4 *y) { return x->m0 == y->m0 && x->m1 == y->m1 && x->m2 == y->m2 && x->m3 == y->m3 && x->m4 == y->m4 && x->m5 == y->m5 && x->m6 == y->m6 && x->m7 == y->m7 && x->m8 == y->m8 && x->m9 == y->m9 && x->m10 == y->m10 && x->m11 == y->m11 && x->m12 == y->m12; };
-DCstruct* f_newdcstA4() {
-	DCstruct* st = dcNewStruct(13, sizeof(struct A4), 0, 1);
-	dcStructField(st, 'd', offsetof(struct A4, m0), 1);
-	dcStructField(st, 'l', offsetof(struct A4, m1), 1);
-	dcStructField(st, 'c', offsetof(struct A4, m2), 1);
-	dcStructField(st, 'l', offsetof(struct A4, m3), 1);
-	dcStructField(st, 'p', offsetof(struct A4, m4), 1);
-	dcStructField(st, 'f', offsetof(struct A4, m5), 1);
-	dcStructField(st, 'i', offsetof(struct A4, m6), 1);
-	dcStructField(st, 'f', offsetof(struct A4, m7), 1);
-	dcStructField(st, 'p', offsetof(struct A4, m8), 1);
-	dcStructField(st, 'i', offsetof(struct A4, m9), 1);
-	dcStructField(st, 'f', offsetof(struct A4, m10), 1);
-	dcStructField(st, 's', offsetof(struct A4, m11), 1);
-	dcStructField(st, 'f', offsetof(struct A4, m12), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA4() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(13, sizeof(struct A4), DC_TRUE);
+		dcStructField(st, 'd', offsetof(struct A4, m0), 1);
+		dcStructField(st, 'l', offsetof(struct A4, m1), 1);
+		dcStructField(st, 'c', offsetof(struct A4, m2), 1);
+		dcStructField(st, 'l', offsetof(struct A4, m3), 1);
+		dcStructField(st, 'p', offsetof(struct A4, m4), 1);
+		dcStructField(st, 'f', offsetof(struct A4, m5), 1);
+		dcStructField(st, 'i', offsetof(struct A4, m6), 1);
+		dcStructField(st, 'f', offsetof(struct A4, m7), 1);
+		dcStructField(st, 'p', offsetof(struct A4, m8), 1);
+		dcStructField(st, 'i', offsetof(struct A4, m9), 1);
+		dcStructField(st, 'f', offsetof(struct A4, m10), 1);
+		dcStructField(st, 's', offsetof(struct A4, m11), 1);
+		dcStructField(st, 'f', offsetof(struct A4, m12), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {dijpiccjpf} */
 struct A5 { d m0; i m1; j m2; p m3; i m4; c m5; c m6; j m7; p m8; f m9; };
 void f_cpA5(struct A5 *x, const struct A5 *y) { x->m0 = y->m0; x->m1 = y->m1; x->m2 = y->m2; x->m3 = y->m3; x->m4 = y->m4; x->m5 = y->m5; x->m6 = y->m6; x->m7 = y->m7; x->m8 = y->m8; x->m9 = y->m9; };
 int f_cmpA5(const struct A5 *x, const struct A5 *y) { return x->m0 == y->m0 && x->m1 == y->m1 && x->m2 == y->m2 && x->m3 == y->m3 && x->m4 == y->m4 && x->m5 == y->m5 && x->m6 == y->m6 && x->m7 == y->m7 && x->m8 == y->m8 && x->m9 == y->m9; };
-DCstruct* f_newdcstA5() {
-	DCstruct* st = dcNewStruct(10, sizeof(struct A5), 0, 1);
-	dcStructField(st, 'd', offsetof(struct A5, m0), 1);
-	dcStructField(st, 'i', offsetof(struct A5, m1), 1);
-	dcStructField(st, 'j', offsetof(struct A5, m2), 1);
-	dcStructField(st, 'p', offsetof(struct A5, m3), 1);
-	dcStructField(st, 'i', offsetof(struct A5, m4), 1);
-	dcStructField(st, 'c', offsetof(struct A5, m5), 1);
-	dcStructField(st, 'c', offsetof(struct A5, m6), 1);
-	dcStructField(st, 'j', offsetof(struct A5, m7), 1);
-	dcStructField(st, 'p', offsetof(struct A5, m8), 1);
-	dcStructField(st, 'f', offsetof(struct A5, m9), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA5() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(10, sizeof(struct A5), DC_TRUE);
+		dcStructField(st, 'd', offsetof(struct A5, m0), 1);
+		dcStructField(st, 'i', offsetof(struct A5, m1), 1);
+		dcStructField(st, 'j', offsetof(struct A5, m2), 1);
+		dcStructField(st, 'p', offsetof(struct A5, m3), 1);
+		dcStructField(st, 'i', offsetof(struct A5, m4), 1);
+		dcStructField(st, 'c', offsetof(struct A5, m5), 1);
+		dcStructField(st, 'c', offsetof(struct A5, m6), 1);
+		dcStructField(st, 'j', offsetof(struct A5, m7), 1);
+		dcStructField(st, 'p', offsetof(struct A5, m8), 1);
+		dcStructField(st, 'f', offsetof(struct A5, m9), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {lcpfcflpsiilfsjp} */
 struct A6 { l m0; c m1; p m2; f m3; c m4; f m5; l m6; p m7; s m8; i m9; i m10; l m11; f m12; s m13; j m14; p m15; };
 void f_cpA6(struct A6 *x, const struct A6 *y) { x->m0 = y->m0; x->m1 = y->m1; x->m2 = y->m2; x->m3 = y->m3; x->m4 = y->m4; x->m5 = y->m5; x->m6 = y->m6; x->m7 = y->m7; x->m8 = y->m8; x->m9 = y->m9; x->m10 = y->m10; x->m11 = y->m11; x->m12 = y->m12; x->m13 = y->m13; x->m14 = y->m14; x->m15 = y->m15; };
 int f_cmpA6(const struct A6 *x, const struct A6 *y) { return x->m0 == y->m0 && x->m1 == y->m1 && x->m2 == y->m2 && x->m3 == y->m3 && x->m4 == y->m4 && x->m5 == y->m5 && x->m6 == y->m6 && x->m7 == y->m7 && x->m8 == y->m8 && x->m9 == y->m9 && x->m10 == y->m10 && x->m11 == y->m11 && x->m12 == y->m12 && x->m13 == y->m13 && x->m14 == y->m14 && x->m15 == y->m15; };
-DCstruct* f_newdcstA6() {
-	DCstruct* st = dcNewStruct(16, sizeof(struct A6), 0, 1);
-	dcStructField(st, 'l', offsetof(struct A6, m0), 1);
-	dcStructField(st, 'c', offsetof(struct A6, m1), 1);
-	dcStructField(st, 'p', offsetof(struct A6, m2), 1);
-	dcStructField(st, 'f', offsetof(struct A6, m3), 1);
-	dcStructField(st, 'c', offsetof(struct A6, m4), 1);
-	dcStructField(st, 'f', offsetof(struct A6, m5), 1);
-	dcStructField(st, 'l', offsetof(struct A6, m6), 1);
-	dcStructField(st, 'p', offsetof(struct A6, m7), 1);
-	dcStructField(st, 's', offsetof(struct A6, m8), 1);
-	dcStructField(st, 'i', offsetof(struct A6, m9), 1);
-	dcStructField(st, 'i', offsetof(struct A6, m10), 1);
-	dcStructField(st, 'l', offsetof(struct A6, m11), 1);
-	dcStructField(st, 'f', offsetof(struct A6, m12), 1);
-	dcStructField(st, 's', offsetof(struct A6, m13), 1);
-	dcStructField(st, 'j', offsetof(struct A6, m14), 1);
-	dcStructField(st, 'p', offsetof(struct A6, m15), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA6() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(16, sizeof(struct A6), DC_TRUE);
+		dcStructField(st, 'l', offsetof(struct A6, m0), 1);
+		dcStructField(st, 'c', offsetof(struct A6, m1), 1);
+		dcStructField(st, 'p', offsetof(struct A6, m2), 1);
+		dcStructField(st, 'f', offsetof(struct A6, m3), 1);
+		dcStructField(st, 'c', offsetof(struct A6, m4), 1);
+		dcStructField(st, 'f', offsetof(struct A6, m5), 1);
+		dcStructField(st, 'l', offsetof(struct A6, m6), 1);
+		dcStructField(st, 'p', offsetof(struct A6, m7), 1);
+		dcStructField(st, 's', offsetof(struct A6, m8), 1);
+		dcStructField(st, 'i', offsetof(struct A6, m9), 1);
+		dcStructField(st, 'i', offsetof(struct A6, m10), 1);
+		dcStructField(st, 'l', offsetof(struct A6, m11), 1);
+		dcStructField(st, 'f', offsetof(struct A6, m12), 1);
+		dcStructField(st, 's', offsetof(struct A6, m13), 1);
+		dcStructField(st, 'j', offsetof(struct A6, m14), 1);
+		dcStructField(st, 'p', offsetof(struct A6, m15), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {jdcfcsdjjlcdjlipfji} */
 struct A7 { j m0; d m1; c m2; f m3; c m4; s m5; d m6; j m7; j m8; l m9; c m10; d m11; j m12; l m13; i m14; p m15; f m16; j m17; i m18; };
 void f_cpA7(struct A7 *x, const struct A7 *y) { x->m0 = y->m0; x->m1 = y->m1; x->m2 = y->m2; x->m3 = y->m3; x->m4 = y->m4; x->m5 = y->m5; x->m6 = y->m6; x->m7 = y->m7; x->m8 = y->m8; x->m9 = y->m9; x->m10 = y->m10; x->m11 = y->m11; x->m12 = y->m12; x->m13 = y->m13; x->m14 = y->m14; x->m15 = y->m15; x->m16 = y->m16; x->m17 = y->m17; x->m18 = y->m18; };
 int f_cmpA7(const struct A7 *x, const struct A7 *y) { return x->m0 == y->m0 && x->m1 == y->m1 && x->m2 == y->m2 && x->m3 == y->m3 && x->m4 == y->m4 && x->m5 == y->m5 && x->m6 == y->m6 && x->m7 == y->m7 && x->m8 == y->m8 && x->m9 == y->m9 && x->m10 == y->m10 && x->m11 == y->m11 && x->m12 == y->m12 && x->m13 == y->m13 && x->m14 == y->m14 && x->m15 == y->m15 && x->m16 == y->m16 && x->m17 == y->m17 && x->m18 == y->m18; };
-DCstruct* f_newdcstA7() {
-	DCstruct* st = dcNewStruct(19, sizeof(struct A7), 0, 1);
-	dcStructField(st, 'j', offsetof(struct A7, m0), 1);
-	dcStructField(st, 'd', offsetof(struct A7, m1), 1);
-	dcStructField(st, 'c', offsetof(struct A7, m2), 1);
-	dcStructField(st, 'f', offsetof(struct A7, m3), 1);
-	dcStructField(st, 'c', offsetof(struct A7, m4), 1);
-	dcStructField(st, 's', offsetof(struct A7, m5), 1);
-	dcStructField(st, 'd', offsetof(struct A7, m6), 1);
-	dcStructField(st, 'j', offsetof(struct A7, m7), 1);
-	dcStructField(st, 'j', offsetof(struct A7, m8), 1);
-	dcStructField(st, 'l', offsetof(struct A7, m9), 1);
-	dcStructField(st, 'c', offsetof(struct A7, m10), 1);
-	dcStructField(st, 'd', offsetof(struct A7, m11), 1);
-	dcStructField(st, 'j', offsetof(struct A7, m12), 1);
-	dcStructField(st, 'l', offsetof(struct A7, m13), 1);
-	dcStructField(st, 'i', offsetof(struct A7, m14), 1);
-	dcStructField(st, 'p', offsetof(struct A7, m15), 1);
-	dcStructField(st, 'f', offsetof(struct A7, m16), 1);
-	dcStructField(st, 'j', offsetof(struct A7, m17), 1);
-	dcStructField(st, 'i', offsetof(struct A7, m18), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA7() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(19, sizeof(struct A7), DC_TRUE);
+		dcStructField(st, 'j', offsetof(struct A7, m0), 1);
+		dcStructField(st, 'd', offsetof(struct A7, m1), 1);
+		dcStructField(st, 'c', offsetof(struct A7, m2), 1);
+		dcStructField(st, 'f', offsetof(struct A7, m3), 1);
+		dcStructField(st, 'c', offsetof(struct A7, m4), 1);
+		dcStructField(st, 's', offsetof(struct A7, m5), 1);
+		dcStructField(st, 'd', offsetof(struct A7, m6), 1);
+		dcStructField(st, 'j', offsetof(struct A7, m7), 1);
+		dcStructField(st, 'j', offsetof(struct A7, m8), 1);
+		dcStructField(st, 'l', offsetof(struct A7, m9), 1);
+		dcStructField(st, 'c', offsetof(struct A7, m10), 1);
+		dcStructField(st, 'd', offsetof(struct A7, m11), 1);
+		dcStructField(st, 'j', offsetof(struct A7, m12), 1);
+		dcStructField(st, 'l', offsetof(struct A7, m13), 1);
+		dcStructField(st, 'i', offsetof(struct A7, m14), 1);
+		dcStructField(st, 'p', offsetof(struct A7, m15), 1);
+		dcStructField(st, 'f', offsetof(struct A7, m16), 1);
+		dcStructField(st, 'j', offsetof(struct A7, m17), 1);
+		dcStructField(st, 'i', offsetof(struct A7, m18), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {jjlff{jdcfcsdjjlcdjlipfji}csijld} */
 struct A8 { j m0; j m1; l m2; f m3; f m4; struct A7 m5; c m6; s m7; i m8; j m9; l m10; d m11; };
 void f_cpA8(struct A8 *x, const struct A8 *y) { x->m0 = y->m0; x->m1 = y->m1; x->m2 = y->m2; x->m3 = y->m3; x->m4 = y->m4; f_cpA7(&x->m5, &y->m5); x->m6 = y->m6; x->m7 = y->m7; x->m8 = y->m8; x->m9 = y->m9; x->m10 = y->m10; x->m11 = y->m11; };
 int f_cmpA8(const struct A8 *x, const struct A8 *y) { return x->m0 == y->m0 && x->m1 == y->m1 && x->m2 == y->m2 && x->m3 == y->m3 && x->m4 == y->m4 && f_cmpA7(&x->m5, &y->m5) && x->m6 == y->m6 && x->m7 == y->m7 && x->m8 == y->m8 && x->m9 == y->m9 && x->m10 == y->m10 && x->m11 == y->m11; };
-DCstruct* f_newdcstA8() {
-	DCstruct* st = dcNewStruct(12, sizeof(struct A8), 0, 1);
-	dcStructField(st, 'j', offsetof(struct A8, m0), 1);
-	dcStructField(st, 'j', offsetof(struct A8, m1), 1);
-	dcStructField(st, 'l', offsetof(struct A8, m2), 1);
-	dcStructField(st, 'f', offsetof(struct A8, m3), 1);
-	dcStructField(st, 'f', offsetof(struct A8, m4), 1);
-	dcStructField(st, DC_SIGCHAR_STRUCT, offsetof(struct A8, m5), 1, f_newdcstA7());
-	dcStructField(st, 'c', offsetof(struct A8, m6), 1);
-	dcStructField(st, 's', offsetof(struct A8, m7), 1);
-	dcStructField(st, 'i', offsetof(struct A8, m8), 1);
-	dcStructField(st, 'j', offsetof(struct A8, m9), 1);
-	dcStructField(st, 'l', offsetof(struct A8, m10), 1);
-	dcStructField(st, 'd', offsetof(struct A8, m11), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA8() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(12, sizeof(struct A8), DC_TRUE);
+		dcStructField(st, 'j', offsetof(struct A8, m0), 1);
+		dcStructField(st, 'j', offsetof(struct A8, m1), 1);
+		dcStructField(st, 'l', offsetof(struct A8, m2), 1);
+		dcStructField(st, 'f', offsetof(struct A8, m3), 1);
+		dcStructField(st, 'f', offsetof(struct A8, m4), 1);
+		dcStructField(st, DC_SIGCHAR_STRUCT, offsetof(struct A8, m5), 1, f_touchdcstA7());
+		dcStructField(st, 'c', offsetof(struct A8, m6), 1);
+		dcStructField(st, 's', offsetof(struct A8, m7), 1);
+		dcStructField(st, 'i', offsetof(struct A8, m8), 1);
+		dcStructField(st, 'j', offsetof(struct A8, m9), 1);
+		dcStructField(st, 'l', offsetof(struct A8, m10), 1);
+		dcStructField(st, 'd', offsetof(struct A8, m11), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {c} */
 struct A9 { c m0; };
 void f_cpA9(struct A9 *x, const struct A9 *y) { x->m0 = y->m0; };
 int f_cmpA9(const struct A9 *x, const struct A9 *y) { return x->m0 == y->m0; };
-DCstruct* f_newdcstA9() {
-	DCstruct* st = dcNewStruct(1, sizeof(struct A9), 0, 1);
-	dcStructField(st, 'c', offsetof(struct A9, m0), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA9() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(1, sizeof(struct A9), DC_TRUE);
+		dcStructField(st, 'c', offsetof(struct A9, m0), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {cjilpcp} */
 struct A10 { c m0; j m1; i m2; l m3; p m4; c m5; p m6; };
 void f_cpA10(struct A10 *x, const struct A10 *y) { x->m0 = y->m0; x->m1 = y->m1; x->m2 = y->m2; x->m3 = y->m3; x->m4 = y->m4; x->m5 = y->m5; x->m6 = y->m6; };
 int f_cmpA10(const struct A10 *x, const struct A10 *y) { return x->m0 == y->m0 && x->m1 == y->m1 && x->m2 == y->m2 && x->m3 == y->m3 && x->m4 == y->m4 && x->m5 == y->m5 && x->m6 == y->m6; };
-DCstruct* f_newdcstA10() {
-	DCstruct* st = dcNewStruct(7, sizeof(struct A10), 0, 1);
-	dcStructField(st, 'c', offsetof(struct A10, m0), 1);
-	dcStructField(st, 'j', offsetof(struct A10, m1), 1);
-	dcStructField(st, 'i', offsetof(struct A10, m2), 1);
-	dcStructField(st, 'l', offsetof(struct A10, m3), 1);
-	dcStructField(st, 'p', offsetof(struct A10, m4), 1);
-	dcStructField(st, 'c', offsetof(struct A10, m5), 1);
-	dcStructField(st, 'p', offsetof(struct A10, m6), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA10() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(7, sizeof(struct A10), DC_TRUE);
+		dcStructField(st, 'c', offsetof(struct A10, m0), 1);
+		dcStructField(st, 'j', offsetof(struct A10, m1), 1);
+		dcStructField(st, 'i', offsetof(struct A10, m2), 1);
+		dcStructField(st, 'l', offsetof(struct A10, m3), 1);
+		dcStructField(st, 'p', offsetof(struct A10, m4), 1);
+		dcStructField(st, 'c', offsetof(struct A10, m5), 1);
+		dcStructField(st, 'p', offsetof(struct A10, m6), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {ddd} */
 struct A11 { d m0; d m1; d m2; };
 void f_cpA11(struct A11 *x, const struct A11 *y) { x->m0 = y->m0; x->m1 = y->m1; x->m2 = y->m2; };
 int f_cmpA11(const struct A11 *x, const struct A11 *y) { return x->m0 == y->m0 && x->m1 == y->m1 && x->m2 == y->m2; };
-DCstruct* f_newdcstA11() {
-	DCstruct* st = dcNewStruct(3, sizeof(struct A11), 0, 1);
-	dcStructField(st, 'd', offsetof(struct A11, m0), 1);
-	dcStructField(st, 'd', offsetof(struct A11, m1), 1);
-	dcStructField(st, 'd', offsetof(struct A11, m2), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA11() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(3, sizeof(struct A11), DC_TRUE);
+		dcStructField(st, 'd', offsetof(struct A11, m0), 1);
+		dcStructField(st, 'd', offsetof(struct A11, m1), 1);
+		dcStructField(st, 'd', offsetof(struct A11, m2), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {dd} */
 struct A12 { d m0; d m1; };
 void f_cpA12(struct A12 *x, const struct A12 *y) { x->m0 = y->m0; x->m1 = y->m1; };
 int f_cmpA12(const struct A12 *x, const struct A12 *y) { return x->m0 == y->m0 && x->m1 == y->m1; };
-DCstruct* f_newdcstA12() {
-	DCstruct* st = dcNewStruct(2, sizeof(struct A12), 0, 1);
-	dcStructField(st, 'd', offsetof(struct A12, m0), 1);
-	dcStructField(st, 'd', offsetof(struct A12, m1), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA12() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(2, sizeof(struct A12), DC_TRUE);
+		dcStructField(st, 'd', offsetof(struct A12, m0), 1);
+		dcStructField(st, 'd', offsetof(struct A12, m1), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {ii} */
 struct A13 { i m0; i m1; };
 void f_cpA13(struct A13 *x, const struct A13 *y) { x->m0 = y->m0; x->m1 = y->m1; };
 int f_cmpA13(const struct A13 *x, const struct A13 *y) { return x->m0 == y->m0 && x->m1 == y->m1; };
-DCstruct* f_newdcstA13() {
-	DCstruct* st = dcNewStruct(2, sizeof(struct A13), 0, 1);
-	dcStructField(st, 'i', offsetof(struct A13, m0), 1);
-	dcStructField(st, 'i', offsetof(struct A13, m1), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA13() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(2, sizeof(struct A13), DC_TRUE);
+		dcStructField(st, 'i', offsetof(struct A13, m0), 1);
+		dcStructField(st, 'i', offsetof(struct A13, m1), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {ici} */
 struct A14 { i m0; c m1; i m2; };
 void f_cpA14(struct A14 *x, const struct A14 *y) { x->m0 = y->m0; x->m1 = y->m1; x->m2 = y->m2; };
 int f_cmpA14(const struct A14 *x, const struct A14 *y) { return x->m0 == y->m0 && x->m1 == y->m1 && x->m2 == y->m2; };
-DCstruct* f_newdcstA14() {
-	DCstruct* st = dcNewStruct(3, sizeof(struct A14), 0, 1);
-	dcStructField(st, 'i', offsetof(struct A14, m0), 1);
-	dcStructField(st, 'c', offsetof(struct A14, m1), 1);
-	dcStructField(st, 'i', offsetof(struct A14, m2), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA14() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(3, sizeof(struct A14), DC_TRUE);
+		dcStructField(st, 'i', offsetof(struct A14, m0), 1);
+		dcStructField(st, 'c', offsetof(struct A14, m1), 1);
+		dcStructField(st, 'i', offsetof(struct A14, m2), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {il} */
 struct A15 { i m0; l m1; };
 void f_cpA15(struct A15 *x, const struct A15 *y) { x->m0 = y->m0; x->m1 = y->m1; };
 int f_cmpA15(const struct A15 *x, const struct A15 *y) { return x->m0 == y->m0 && x->m1 == y->m1; };
-DCstruct* f_newdcstA15() {
-	DCstruct* st = dcNewStruct(2, sizeof(struct A15), 0, 1);
-	dcStructField(st, 'i', offsetof(struct A15, m0), 1);
-	dcStructField(st, 'l', offsetof(struct A15, m1), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA15() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(2, sizeof(struct A15), DC_TRUE);
+		dcStructField(st, 'i', offsetof(struct A15, m0), 1);
+		dcStructField(st, 'l', offsetof(struct A15, m1), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {li} */
 struct A16 { l m0; i m1; };
 void f_cpA16(struct A16 *x, const struct A16 *y) { x->m0 = y->m0; x->m1 = y->m1; };
 int f_cmpA16(const struct A16 *x, const struct A16 *y) { return x->m0 == y->m0 && x->m1 == y->m1; };
-DCstruct* f_newdcstA16() {
-	DCstruct* st = dcNewStruct(2, sizeof(struct A16), 0, 1);
-	dcStructField(st, 'l', offsetof(struct A16, m0), 1);
-	dcStructField(st, 'i', offsetof(struct A16, m1), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA16() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(2, sizeof(struct A16), DC_TRUE);
+		dcStructField(st, 'l', offsetof(struct A16, m0), 1);
+		dcStructField(st, 'i', offsetof(struct A16, m1), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {ps} */
 struct A17 { p m0; s m1; };
 void f_cpA17(struct A17 *x, const struct A17 *y) { x->m0 = y->m0; x->m1 = y->m1; };
 int f_cmpA17(const struct A17 *x, const struct A17 *y) { return x->m0 == y->m0 && x->m1 == y->m1; };
-DCstruct* f_newdcstA17() {
-	DCstruct* st = dcNewStruct(2, sizeof(struct A17), 0, 1);
-	dcStructField(st, 'p', offsetof(struct A17, m0), 1);
-	dcStructField(st, 's', offsetof(struct A17, m1), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA17() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(2, sizeof(struct A17), DC_TRUE);
+		dcStructField(st, 'p', offsetof(struct A17, m0), 1);
+		dcStructField(st, 's', offsetof(struct A17, m1), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {iii} */
 struct A18 { i m0; i m1; i m2; };
 void f_cpA18(struct A18 *x, const struct A18 *y) { x->m0 = y->m0; x->m1 = y->m1; x->m2 = y->m2; };
 int f_cmpA18(const struct A18 *x, const struct A18 *y) { return x->m0 == y->m0 && x->m1 == y->m1 && x->m2 == y->m2; };
-DCstruct* f_newdcstA18() {
-	DCstruct* st = dcNewStruct(3, sizeof(struct A18), 0, 1);
-	dcStructField(st, 'i', offsetof(struct A18, m0), 1);
-	dcStructField(st, 'i', offsetof(struct A18, m1), 1);
-	dcStructField(st, 'i', offsetof(struct A18, m2), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA18() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(3, sizeof(struct A18), DC_TRUE);
+		dcStructField(st, 'i', offsetof(struct A18, m0), 1);
+		dcStructField(st, 'i', offsetof(struct A18, m1), 1);
+		dcStructField(st, 'i', offsetof(struct A18, m2), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* {iiii} */
 struct A19 { i m0; i m1; i m2; i m3; };
 void f_cpA19(struct A19 *x, const struct A19 *y) { x->m0 = y->m0; x->m1 = y->m1; x->m2 = y->m2; x->m3 = y->m3; };
 int f_cmpA19(const struct A19 *x, const struct A19 *y) { return x->m0 == y->m0 && x->m1 == y->m1 && x->m2 == y->m2 && x->m3 == y->m3; };
-DCstruct* f_newdcstA19() {
-	DCstruct* st = dcNewStruct(4, sizeof(struct A19), 0, 1);
-	dcStructField(st, 'i', offsetof(struct A19, m0), 1);
-	dcStructField(st, 'i', offsetof(struct A19, m1), 1);
-	dcStructField(st, 'i', offsetof(struct A19, m2), 1);
-	dcStructField(st, 'i', offsetof(struct A19, m3), 1);
-	dcCloseStruct(st);
+DCstruct* f_touchdcstA19() {
+	static DCstruct* st = NULL;
+	if(!st) {
+		st = dcNewStruct(4, sizeof(struct A19), DC_TRUE);
+		dcStructField(st, 'i', offsetof(struct A19, m0), 1);
+		dcStructField(st, 'i', offsetof(struct A19, m1), 1);
+		dcStructField(st, 'i', offsetof(struct A19, m2), 1);
+		dcStructField(st, 'i', offsetof(struct A19, m3), 1);
+		dcCloseStruct(st);
+	}
 	return st;
 };
 /* 0:pscd{}pclc{i}scli */ p f0(s a1,c a2,d a3,struct A1 a4,p a5,c a6,l a7,c a8,struct A2 a9,s a10,c a11,l a12,i a13){V_s[1]=a1;V_c[2]=a2;V_d[3]=a3;f_cpA1(V_a[4],&a4);V_p[5]=a5;V_c[6]=a6;V_l[7]=a7;V_c[8]=a8;f_cpA2(V_a[9],&a9);V_s[10]=a10;V_c[11]=a11;V_l[12]=a12;V_i[13]=a13;ret_p(13)}
@@ -369,6 +426,7 @@
 /* 94:f{iii}ijf */ f f94(struct A18 a1,i a2,j a3,f a4){f_cpA18(V_a[1],&a1);V_i[2]=a2;V_j[3]=a3;V_f[4]=a4;ret_f(4)}
 /* 95:f{iiii}ijf */ f f95(struct A19 a1,i a2,j a3,f a4){f_cpA19(V_a[1],&a1);V_i[2]=a2;V_j[3]=a3;V_f[4]=a4;ret_f(4)}
 /* 96:ss{ii}ijf */ s f96(s a1,struct A13 a2,i a3,j a4,f a5){V_s[1]=a1;f_cpA13(V_a[2],&a2);V_i[3]=a3;V_j[4]=a4;V_f[5]=a5;ret_s(5)}
+/* 97:{ii}ijf */ struct A13 f97(i a1,j a2,f a3){V_i[1]=a1;V_j[2]=a2;V_f[3]=a3;ret_a(3,struct A13)}
 funptr G_funtab[] = {
 	(funptr)&f0,
 	(funptr)&f1,
@@ -467,6 +525,7 @@
 	(funptr)&f94,
 	(funptr)&f95,
 	(funptr)&f96,
+	(funptr)&f97,
 };
 char const * G_sigtab[] = {
 	"pscd{}pclc{i}scli",
@@ -566,6 +625,7 @@
 	"f{iii}ijf",
 	"f{iiii}ijf",
 	"ss{ii}ijf",
+	"{ii}ijf",
 };
 const char* G_agg_sigs[]  = {
 	"{}",
@@ -609,26 +669,26 @@
 	sizeof(struct A18),
 	sizeof(struct A19)
 };
-funptr G_agg_newdcstfuncs[] = {
-	(funptr)&f_newdcstA1,
-	(funptr)&f_newdcstA2,
-	(funptr)&f_newdcstA3,
-	(funptr)&f_newdcstA4,
-	(funptr)&f_newdcstA5,
-	(funptr)&f_newdcstA6,
-	(funptr)&f_newdcstA7,
-	(funptr)&f_newdcstA8,
-	(funptr)&f_newdcstA9,
-	(funptr)&f_newdcstA10,
-	(funptr)&f_newdcstA11,
-	(funptr)&f_newdcstA12,
-	(funptr)&f_newdcstA13,
-	(funptr)&f_newdcstA14,
-	(funptr)&f_newdcstA15,
-	(funptr)&f_newdcstA16,
-	(funptr)&f_newdcstA17,
-	(funptr)&f_newdcstA18,
-	(funptr)&f_newdcstA19
+funptr G_agg_touchdcstfuncs[] = {
+	(funptr)&f_touchdcstA1,
+	(funptr)&f_touchdcstA2,
+	(funptr)&f_touchdcstA3,
+	(funptr)&f_touchdcstA4,
+	(funptr)&f_touchdcstA5,
+	(funptr)&f_touchdcstA6,
+	(funptr)&f_touchdcstA7,
+	(funptr)&f_touchdcstA8,
+	(funptr)&f_touchdcstA9,
+	(funptr)&f_touchdcstA10,
+	(funptr)&f_touchdcstA11,
+	(funptr)&f_touchdcstA12,
+	(funptr)&f_touchdcstA13,
+	(funptr)&f_touchdcstA14,
+	(funptr)&f_touchdcstA15,
+	(funptr)&f_touchdcstA16,
+	(funptr)&f_touchdcstA17,
+	(funptr)&f_touchdcstA18,
+	(funptr)&f_touchdcstA19
 };
 funptr G_agg_cmpfuncs[] = {
 	(funptr)&f_cmpA1,
--- a/test/suite_aggrs/design.txt	Wed Jan 26 13:26:39 2022 +0100
+++ b/test/suite_aggrs/design.txt	Wed Jan 26 13:37:19 2022 +0100
@@ -95,3 +95,4 @@
 f{iii}ijf
 f{iiii}ijf
 ss{ii}ijf
+{ii}ijf
--- a/test/suite_aggrs/globals.c	Wed Jan 26 13:26:39 2022 +0100
+++ b/test/suite_aggrs/globals.c	Wed Jan 26 13:37:19 2022 +0100
@@ -42,7 +42,7 @@
   return s;
 }
 
-void init_K()
+void init_test_data()
 {
   int i;
   int maxaggrsize = calc_max_aggr_size();
@@ -50,7 +50,6 @@
 DEF_TYPES
 #undef X
 
-
   for(i=0;i<G_maxargs+1;++i) {
     K_c[i] = (char)      (((rand_d()-0.5)*2) * (1<<7));
     K_s[i] = (short)     (((rand_d()-0.5)*2) * (1<<(sizeof(short)*8-1)));
@@ -59,7 +58,7 @@
     K_l[i] = (long long) (((rand_d()-0.5)*2) * (1LL<<(sizeof(long long)*8-2)));
     K_p[i] = (void*)     (long) (((rand_d()-0.5)*2) * (1LL<<(sizeof(void*)*8-1)));
     K_f[i] = (float)     (rand_d() * FLT_MAX);
-    K_d[i] = (double)    (((rand_d()-0.5)*2) * 1.7976931348623157E+308/*__DBL_MAX__*/);	/* Plan9 doesn't know the macro. */
+    K_d[i] = (double)    (((rand_d()-0.5)*2) * 1.7976931348623157E+308/*__DBL_MAX__*/); /* Plan9 doesn't know the macro. */
     K_a[i] = malloc(maxaggrsize); rand_mem(K_a[i], maxaggrsize);
   }
 }
@@ -72,7 +71,7 @@
   int i;
   for(i=0;i<G_maxargs+1;++i) {
     if(aggr_init)
-	  free(V_a[i]);
+      free(V_a[i]);
 #define X(CH,T) V_##CH[i] = (T) 0;
 DEF_TYPES
 #undef X
@@ -81,3 +80,16 @@
   aggr_init = 1;
 }
 
+void deinit_test_data()
+{
+  int i;
+  for(i=0;i<G_maxargs+1;++i) {
+    free(V_a[i]);
+    free(K_a[i]);
+  }
+
+#define X(CH,T) free(V_##CH); free(K_##CH);
+DEF_TYPES
+#undef X
+}
+
--- a/test/suite_aggrs/globals.h	Wed Jan 26 13:26:39 2022 +0100
+++ b/test/suite_aggrs/globals.h	Wed Jan 26 13:37:19 2022 +0100
@@ -38,11 +38,11 @@
 extern int          G_maxargs;
 extern char const * G_agg_sigs[];
 extern int          G_agg_sizes[];
-extern funptr       G_agg_newdcstfuncs[];
+extern funptr       G_agg_touchdcstfuncs[];
 extern funptr       G_agg_cmpfuncs[];
 extern int          G_naggs;
 
-void init_K();
-void init_T();
+void init_test_data();
+void deinit_test_data();
 void clear_V();
 
--- a/test/suite_aggrs/main.c	Wed Jan 26 13:26:39 2022 +0100
+++ b/test/suite_aggrs/main.c	Wed Jan 26 13:37:19 2022 +0100
@@ -30,7 +30,7 @@
 #include "../common/platformInit.c" /* Impl. for functions only used in this translation unit */
 
 
-void* G_callvm;
+static void* G_callvm;
 
 
 static int find_agg_idx(int* len, const char* sig)
@@ -70,9 +70,9 @@
     rtype = *sig;
     sig += len;
 
-	rtype_st_cmp = G_agg_cmpfuncs[i];
-    rtype_st = ((DCstruct*(*)())G_agg_newdcstfuncs[i])();
-    dcBeginCallStruct(p, rtype_st, DC_FALSE);
+    rtype_st_cmp = G_agg_cmpfuncs[i];
+    rtype_st = ((DCstruct*(*)())G_agg_touchdcstfuncs[i])();
+    dcBeginCallStruct(p, rtype_st);
   }
   else
     rtype = *sig++;
@@ -98,7 +98,7 @@
           printf("unknown sig at '%s' ;", sig);
           return 0;
         }
-        DCstruct *st = ((DCstruct*(*)())G_agg_newdcstfuncs[i])();
+        DCstruct *st = ((DCstruct*(*)())G_agg_touchdcstfuncs[i])();
         dcArgStruct(p, st, K_a[pos]);
         sig += len-1; /* advance to next arg char */
         break;
@@ -120,9 +120,9 @@
     case 'f': s = (dcCallFloat   (p,t) == K_f[pos]) ; break;
     case 'd': s = (dcCallDouble  (p,t) == K_d[pos]) ; break;
     case '{': {
-      s = ((int(*)())rtype_st_cmp)(dcCallStruct(p,t,rtype_st, V_a[pos]), K_a[pos]);
-	  break;
-	}
+      s = ((int(*)(const void*,const void*))rtype_st_cmp)(dcCallStruct(p,t,rtype_st, V_a[pos]), K_a[pos]);
+      break;
+    }
     default: printf("unknown rtype '%c'", rtype); return 0;
   }
 
@@ -145,7 +145,7 @@
         /* no check: guaranteed to exist, or invoke func would've exited when passing args, above */
         int len;
         int i = find_agg_idx(&len, sig);
-        s = ((int(*)())G_agg_cmpfuncs[i])(V_a[pos], K_a[pos]);
+        s = ((int(*)(const void*,const void*))G_agg_cmpfuncs[i])(V_a[pos], K_a[pos]);
         if (!s) printf("'{':%d:  *%p != *%p ; ", pos, V_a[pos], K_a[pos]);
         sig += len-1; /* advance to next arg char */
         break;
@@ -187,14 +187,23 @@
 
 int main(int argc, char* argv[])
 {
-  int total;
+  int total, i;
 
   dcTest_initPlatform();
 
-  init_K(G_maxargs);
+  init_test_data(G_maxargs);
   G_callvm = (DCCallVM*) dcNewCallVM(32768);
+
   dcReset(G_callvm);
   total = run_all();
+
+  /* free all DCstructs created on the fly */
+  for(i=0; i<G_naggs; ++i)
+    dcFreeStruct(((DCstruct*(*)())G_agg_touchdcstfuncs[i])());
+
+  dcFree(G_callvm);
+  deinit_test_data(G_maxargs);
+
   printf("result: call_aggrs: %d\n", total);
 
   dcTest_deInitPlatform();
--- a/test/suite_aggrs/mk-cases.lua	Wed Jan 26 13:26:39 2022 +0100
+++ b/test/suite_aggrs/mk-cases.lua	Wed Jan 26 13:37:19 2022 +0100
@@ -161,15 +161,15 @@
     end
 
     -- convenient dcnewstruct helper funcs
-    io.write('DCstruct* f_newdcst'..v[2]..'() {\n\tDCstruct* st = dcNewStruct('..(#v[1]>>1)..', sizeof('..st..'), 0, 1);\n\t')
+    io.write('DCstruct* f_touchdcst'..v[2]..'() {\n\tstatic DCstruct* st = NULL;\n\tif(!st) {\n\t\tst = dcNewStruct('..(#v[1]>>1)..', sizeof('..st..'), DC_TRUE);\n\t\t')
     for i = 1, #v[1], 2 do
       if string.match(v[1][i], '^struct') then
-	    io.write('dcStructField(st, DC_SIGCHAR_STRUCT, offsetof('..st..', '..v[1][i+1]..'), 1, f_newdcst'..v[1][i]:sub(8)..'());\n\t')
+	    io.write('dcStructField(st, DC_SIGCHAR_STRUCT, offsetof('..st..', '..v[1][i+1]..'), 1, f_touchdcst'..v[1][i]:sub(8)..'());\n\t\t')
 	  else
-        io.write("dcStructField(st, '"..v[1][i].."', offsetof("..st..', '..v[1][i+1]..'), 1);\n\t')
+        io.write("dcStructField(st, '"..v[1][i].."', offsetof("..st..', '..v[1][i+1]..'), 1);\n\t\t')
 	  end
     end
-    io.write("dcCloseStruct(st);\n\treturn st;\n};\n")
+    io.write("dcCloseStruct(st);\n\t}\n\treturn st;\n};\n")
   end
 
   -- make table.concat work
@@ -182,7 +182,7 @@
   io.write(mksigtab(sigtab))
   io.write('const char* G_agg_sigs[]  = {\n\t"'..table.concat(agg_sigs, '",\n\t"')..'"\n};\n')
   io.write('int G_agg_sizes[] = {\n\t'..table.concat(agg_sizes, ',\n\t')..'\n};\n')
-  io.write('funptr G_agg_newdcstfuncs[] = {'..string.sub(table.concat(agg_names, ',\n\t(funptr)&f_newdcst'),2)..'\n};\n')
+  io.write('funptr G_agg_touchdcstfuncs[] = {'..string.sub(table.concat(agg_names, ',\n\t(funptr)&f_touchdcst'),2)..'\n};\n')
   io.write('funptr G_agg_cmpfuncs[] = {'..string.sub(table.concat(agg_names, ',\n\t(funptr)&f_cmp'),2)..'\n};\n')
   io.write("int G_maxargs = "..maxargs..";\n")
 end
--- a/test/suite_aggrs/rand-sig.lua	Wed Jan 26 13:26:39 2022 +0100
+++ b/test/suite_aggrs/rand-sig.lua	Wed Jan 26 13:37:19 2022 +0100
@@ -3,7 +3,6 @@
 -- assure aggr chars are present in pairs (can be weighted, though), to avoid
 -- inf loops
 if string.match(types,'{') and not string.match(types,'}') then types = types..'}' end
--- @@@ unions, arrays
 
 rtypes   = "v"..types
 
@@ -41,6 +40,7 @@
 
 math.randomseed(seed)
 local id
+local uniq_sigs = { }
 for i = 1, ncases do
   local nargs = math.random(minargs,maxargs)
   local l = ''
@@ -51,9 +51,10 @@
       id = math.random(#types)
       sig[#sig+1] = mktype(types:sub(id,id), 0, math.random(maxaggrdepth)) -- random depth avoids excessive nesting
     end
-	l = table.concat(sig)
-    -- reject sigs without any aggregate, as this is about aggrs after all
-  until string.match(l, '{') ~= nil
+    l = table.concat(sig)
+    -- reject dupes and sigs without any aggregate, as this is about aggrs after all
+  until string.match(l, '{') ~= nil and uniq_sigs[l] == nil
+  uniq_sigs[l] = 1
   io.write(l.."\n")
 end