Commit | Line | Data |
---|---|---|
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 | |
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 { | |
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 | } |