chiark / gitweb /
@@@ tty cleanup
[mLib] / struct / t / sym-test.c
1 #include <assert.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 #include "macros.h"
7 #include "sym.h"
8 #include "unihash.h"
9
10 typedef struct word {
11   sym_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(SYM_NAME(*w), SYM_NAME(*v)));
20 }
21
22 int main(void)
23 {
24   char buf[256];
25   char *p;
26   sym_table t;
27   size_t n = 0, j;
28
29   sym_create(&t);
30
31   while (fgets(buf, sizeof(buf), stdin)) {
32 /*     printf("+++ %s", buf); */
33     buf[strlen(buf) - 1] = 0;
34     p = strtok(buf, " ");
35
36     if (STRCMP(p, ==, "set")) {
37       char *k = strtok(0, " ");
38       int i = atoi(strtok(0, " "));
39       unsigned f;
40       word *w = sym_find(&t, k, -1, sizeof(word), &f);
41       w->i = i;
42       if (!f)
43         n++;
44     } else if (STRCMP(p, ==, "get")) {
45       char *k = strtok(0, " ");
46       word *w = sym_find(&t, k, -1, 0, 0);
47       if (w)
48         printf("%i\n", w->i);
49       else
50         puts("*MISSING*");
51     } else if (STRCMP(p, ==, "del")) {
52       char *k = strtok(0, " ");
53       word *w = sym_find(&t, k, -1, 0, 0);
54       if (w) {
55         sym_remove(&t, w);
56         n--;
57       } else
58         puts("*MISSING*");
59     } else if (STRCMP(p, ==, "count")) {
60       printf("%lu\n", (unsigned long)n);
61     } else if (STRCMP(p, ==, "seed")) {
62       char *k = strtok(0, " ");
63       unihash_setkey(&unihash_global, strtoul(k, 0, 0));
64     } else if (STRCMP(p, ==, "show")) {
65       sym_iter i;
66       word *w;
67       word **v, **vv;
68
69       if (!n)
70         puts("*EMPTY*");
71       else {
72         v = calloc(n, sizeof(*v));
73         if (!v) {
74           puts("*NOMEM*");
75           continue;
76         }
77         for (vv = v, sym_mkiter(&i, &t), j = 0;
78              (w = sym_next(&i)) != 0;
79              vv++, j++) {
80           assert(j < n);
81           *vv = w;
82         }
83         assert(j == n);
84         qsort(v, n, sizeof(*v), cmp);
85         printf("%s:%i", SYM_NAME(*v), (*v)->i);
86         for (vv = v + 1; --j; vv++)
87           printf(" %s:%i", SYM_NAME(*vv), (*vv)->i);
88         free(v);
89         putchar('\n');
90       }
91     } else
92       puts("*BAD*");
93 /*     printf("--- %d\n", n); */
94   }
95
96   sym_destroy(&t);
97   return (0);
98 }