utils/macros.h: Add <ctype.h> and `foocmp' helper macros.
[mLib] / struct / t / assoc-test.c
1 #include <assert.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 #include "assoc.h"
7 #include "atom.h"
8 #include "macros.h"
9
10 typedef struct word {
11 assoc_base _b;
12 int i;
13 } word;
14
15 static int cmp(const void *a, const void *b)
16 {
17 const word *const *v = b;
18 const word *const *w = a;
19 return (strcmp(ATOM_NAME(ASSOC_ATOM(*w)), ATOM_NAME(ASSOC_ATOM(*v))));
20 }
21
22 int main(void)
23 {
24 char buf[256];
25 char *p;
26 atom_table at;
27 assoc_table t;
28 size_t n = 0, j;
29
30 atom_createtable(&at);
31 assoc_create(&t);
32
33 while (fgets(buf, sizeof(buf), stdin)) {
34 /* printf("+++ %s", buf); */
35 buf[strlen(buf) - 1] = 0;
36 p = strtok(buf, " ");
37
38 if (STRCMP(p, ==, "set")) {
39 char *k = strtok(0, " ");
40 int i = atoi(strtok(0, " "));
41 unsigned f;
42 word *w = assoc_find(&t, atom_intern(&at, k), sizeof(word), &f);
43 w->i = i;
44 if (!f)
45 n++;
46 } else if (STRCMP(p, ==, "get")) {
47 char *k = strtok(0, " ");
48 word *w = assoc_find(&t, atom_intern(&at, k), 0, 0);
49 if (w)
50 printf("%i\n", w->i);
51 else
52 puts("*MISSING*");
53 } else if (STRCMP(p, ==, "del")) {
54 char *k = strtok(0, " ");
55 word *w = assoc_find(&t, atom_intern(&at, k), 0, 0);
56 if (w) {
57 assoc_remove(&t, w);
58 n--;
59 } else
60 puts("*MISSING*");
61 } else if (STRCMP(p, ==, "count")) {
62 printf("%lu\n", (unsigned long)n);
63 } else if (STRCMP(p, ==, "show")) {
64 assoc_iter i;
65 word *w;
66 word **v, **vv;
67
68 if (!n)
69 puts("*EMPTY*");
70 else {
71 v = malloc(n * sizeof(*v));
72 if (!v) {
73 puts("*NOMEM*");
74 continue;
75 }
76 for (vv = v, assoc_mkiter(&i, &t), j = 0;
77 (w = assoc_next(&i)) != 0;
78 vv++, j++) {
79 assert(j < n);
80 *vv = w;
81 }
82 assert(j == n);
83 qsort(v, n, sizeof(*v), cmp);
84 printf("%s:%i", ATOM_NAME(ASSOC_ATOM(*v)), (*v)->i);
85 for (vv = v + 1; --j; vv++)
86 printf(" %s:%i", ATOM_NAME(ASSOC_ATOM(*vv)), (*vv)->i);
87 free(v);
88 putchar('\n');
89 }
90 } else
91 puts("*BAD*");
92 /* printf("--- %d\n", n); */
93 }
94
95 assoc_destroy(&t);
96 atom_destroytable(&at);
97 return (0);
98 }