|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2:
3: static char sccsid[] = "@(#)PACK.c 1.1 10/29/80";
4:
5: #include "h01errs.h"
6:
7: /*
8: * pack(a,i,z)
9: *
10: * with: a: array[m..n] of t
11: * z: packed array[u..v] of t
12: *
13: * semantics: for j := u to v do
14: * z[j] := a[j-u+i];
15: *
16: * need to check:
17: * 1. i >= m
18: * 2. i+(v-u) <= n (i.e. i-m <= (n-m)-(v-u))
19: *
20: * on stack: lv(z), lv(a), rv(i) (len 4)
21: *
22: * move w(t)*(v-u+1) bytes from lv(a)+w(t)*(i-m) to lv(z)
23: */
24:
25: PACK(i, a, z, size_a, lb_a, ub_a, size_z)
26:
27: int i; /* subscript into a to begin packing */
28: char *a; /* pointer to structure a */
29: char *z; /* pointer to structure z */
30: int size_a; /* sizeof(a_type) */
31: int lb_a; /* lower bound of structure a */
32: int ub_a; /* (upper bound of a) - (lb_a + sizeof(z_type)) */
33: int size_z; /* sizeof(z_type) */
34: {
35: int subscr;
36: register char *cp;
37: register char *zp = z;
38: register char *limit;
39:
40: subscr = i - lb_a;
41: if (subscr < 0 || subscr > ub_a) {
42: ERROR(EPACK, i);
43: return;
44: }
45: cp = &a[subscr * size_a];
46: limit = cp + size_z;
47: do {
48: *zp++ = *cp++;
49: } while (cp < limit);
50: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.