chiark / gitweb /
utils/macros.h: Add <ctype.h> and `foocmp' helper macros.
[mLib] / struct / t / da-test.c
1 /* -*-c-*-
2  *
3  * Test driver for darray.
4  */
5
6 #include <assert.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10
11 #include "darray.h"
12 #include "exc.h"
13 #include "macros.h"
14
15 DA_DECL(vec, int);
16
17 #ifdef notdef
18
19 static void dump(vec *v)
20 {
21   printf("# len = %lu, sz = %lu, off = %lu; push = %u, unshift = %u\n",
22          (unsigned long)v->b.len,
23          (unsigned long)v->b.sz,
24          (unsigned long)v->b.off,
25          v->b.push, v->b.unshift);
26   printf("# {");
27   if (DA_LEN(v)) {
28     size_t i;
29     printf(" %i", DA(v)[0]);
30     for (i = 1; i < DA_LEN(v); i++)
31       printf(", %i", DA(v)[i]);
32   }
33   puts(" }");
34   assert(v->b.sz + v->b.off == 128);
35 }
36
37 #endif
38
39 int main(void)
40 {
41   char buf[1024];
42   char *p;
43   vec v = DA_INIT;
44
45 /*   setvbuf(stdout, 0, _IOLBF, BUFSIZ); */
46
47   while (fgets(buf, sizeof(buf), stdin)) {
48     buf[strlen(buf) - 1] = 0;
49 /*     printf("# %s\n", buf); */
50     p = strtok(buf, " ");
51
52     TRY {
53       if (STRCMP(p, ==, "push")) {
54         int n = atoi(strtok(0, " "));
55         DA_PUSH(&v, n);
56       } else if (STRCMP(p, ==, "unshift")) {
57         int n = atoi(strtok(0, " "));
58         DA_UNSHIFT(&v, n);
59       } else if (STRCMP(p, ==, "pop")) {
60         printf("%i\n", DA_POP(&v));
61       } else if (STRCMP(p, ==, "shift")) {
62         printf("%i\n", DA_SHIFT(&v));
63       } else if (STRCMP(p, ==, "insert") ||
64                  STRCMP(p, ==, "append")) {
65         vec vv;
66         char *q = p;
67         DA_CREATE(&vv);
68 /*      putchar('#'); */
69         while ((p = strtok(0, " ")) != 0) {
70           int n = atoi(p);
71           DA_PUSH(&vv, n);
72         }
73         if (STRCMP(q, ==, "insert")) {
74           DA_SHUNT(&v, DA_LEN(&vv));
75           DA_SLIDE(&v, DA_LEN(&vv));
76           memcpy(DA(&v), DA(&vv), DA_LEN(&vv) * sizeof(int));
77         } else {
78           size_t l = DA_LEN(&v);
79           DA_ENSURE(&v, DA_LEN(&vv));
80           DA_EXTEND(&v, DA_LEN(&vv));
81           memcpy(DA(&v) + l, DA(&vv), DA_LEN(&vv) * sizeof(int));
82         }
83         DA_DESTROY(&vv);
84       } else if (STRCMP(p, ==, "delete")) {
85         int n = atoi(strtok(0, " "));
86         DA_UNSLIDE(&v, n);
87       } else if (STRCMP(p, ==, "reduce")) {
88         int n = atoi(strtok(0, " "));
89         DA_SHRINK(&v, n);
90       } else if (STRCMP(p, ==, "set")) {
91         size_t i = atoi(strtok(0, " "));
92         int n = atoi(strtok(0, " "));
93         size_t l = DA_LEN(&v);
94         DA_INCLUDE(&v, i);
95         if (i >= l) {
96           size_t j;
97           for (j = l; j < i; j++)
98             DA(&v)[j] = -1;
99         }
100         DA(&v)[i] = n;
101       } else if (STRCMP(p, ==, "get")) {
102         size_t i = atoi(strtok(0, " "));
103         if (i >= DA_LEN(&v))
104           puts("*RANGE*");
105         else
106           printf("%i\n", DA(&v)[i]);
107       } else if (STRCMP(p, ==, "first")) {
108         if (DA_LEN(&v))
109           printf("%i\n", DA_FIRST(&v));
110         else
111           puts("*RANGE*");
112       } else if (STRCMP(p, ==, "last")) {
113         if (DA_LEN(&v))
114           printf("%i\n", DA_LAST(&v));
115         else
116           puts("*RANGE*");
117       } else if (STRCMP(p, ==, "show")) {
118         if (DA_LEN(&v) == 0)
119           puts("*EMPTY*");
120         else {
121           size_t i;
122           printf("%i", DA(&v)[0]);
123           for (i = 1; i < DA_LEN(&v); i++)
124             printf(" %i", DA(&v)[i]);
125           putchar('\n');
126         }
127       } else
128         puts("*BAD*");
129     } CATCH switch (exc_type) {
130       case DAEXC_UFLOW:
131         puts("*UFLOW*");
132         break;
133       case DAEXC_OFLOW:
134         puts("*OFLOW*");
135         break;
136       case EXC_NOMEM:
137         puts("*NOMEM*");
138         break;
139       default:
140         puts("*UNKNOWN-EXCEPTION*");
141         break;
142     } END_TRY;
143 /*     dump(&v); */
144   }
145
146   DA_DESTROY(&v);
147   return (0);
148 }