utils/macros.h: Add <ctype.h> and `foocmp' helper macros.
[mLib] / struct / t / da-test.c
CommitLineData
d74e2a35 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"
36188114 13#include "macros.h"
d74e2a35 14
15DA_DECL(vec, int);
16
17#ifdef notdef
18
19static 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
39int 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 {
36188114 53 if (STRCMP(p, ==, "push")) {
d74e2a35 54 int n = atoi(strtok(0, " "));
55 DA_PUSH(&v, n);
36188114 56 } else if (STRCMP(p, ==, "unshift")) {
d74e2a35 57 int n = atoi(strtok(0, " "));
58 DA_UNSHIFT(&v, n);
36188114 59 } else if (STRCMP(p, ==, "pop")) {
d74e2a35 60 printf("%i\n", DA_POP(&v));
36188114 61 } else if (STRCMP(p, ==, "shift")) {
d74e2a35 62 printf("%i\n", DA_SHIFT(&v));
36188114
MW
63 } else if (STRCMP(p, ==, "insert") ||
64 STRCMP(p, ==, "append")) {
d74e2a35 65 vec vv;
66 char *q = p;
67 DA_CREATE(&vv);
d4efbcd9 68/* putchar('#'); */
d74e2a35 69 while ((p = strtok(0, " ")) != 0) {
70 int n = atoi(p);
71 DA_PUSH(&vv, n);
72 }
36188114 73 if (STRCMP(q, ==, "insert")) {
d74e2a35 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);
36188114 84 } else if (STRCMP(p, ==, "delete")) {
d74e2a35 85 int n = atoi(strtok(0, " "));
85bb21f7 86 DA_UNSLIDE(&v, n);
36188114 87 } else if (STRCMP(p, ==, "reduce")) {
d74e2a35 88 int n = atoi(strtok(0, " "));
85bb21f7 89 DA_SHRINK(&v, n);
36188114 90 } else if (STRCMP(p, ==, "set")) {
d74e2a35 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;
36188114 101 } else if (STRCMP(p, ==, "get")) {
d74e2a35 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]);
36188114 107 } else if (STRCMP(p, ==, "first")) {
7cf5c72a
MW
108 if (DA_LEN(&v))
109 printf("%i\n", DA_FIRST(&v));
110 else
111 puts("*RANGE*");
36188114 112 } else if (STRCMP(p, ==, "last")) {
7cf5c72a
MW
113 if (DA_LEN(&v))
114 printf("%i\n", DA_LAST(&v));
115 else
116 puts("*RANGE*");
36188114 117 } else if (STRCMP(p, ==, "show")) {
d74e2a35 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}