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