|
|
1.1 root 1: /*-
2: * Copyright (c) 1979 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: static char sccsid[] = "@(#)PACK.c 1.4 (Berkeley) 4/9/90";
22: #endif /* not lint */
23:
24: /*
25: * pack(a,i,z)
26: *
27: * with: a: array[m..n] of t
28: * z: packed array[u..v] of t
29: *
30: * semantics: for j := u to v do
31: * z[j] := a[j-u+i];
32: *
33: * need to check:
34: * 1. i >= m
35: * 2. i+(v-u) <= n (i.e. i-m <= (n-m)-(v-u))
36: *
37: * on stack: lv(z), lv(a), rv(i) (len 4)
38: *
39: * move w(t)*(v-u+1) bytes from lv(a)+w(t)*(i-m) to lv(z)
40: */
41:
42: PACK(i, a, z, size_a, lb_a, ub_a, size_z)
43:
44: long i; /* subscript into a to begin packing */
45: char *a; /* pointer to structure a */
46: char *z; /* pointer to structure z */
47: long size_a; /* sizeof(a_type) */
48: long lb_a; /* lower bound of structure a */
49: long ub_a; /* (upper bound of a) - (lb_a + sizeof(z_type)) */
50: long size_z; /* sizeof(z_type) */
51: {
52: int subscr;
53: register char *cp;
54: register char *zp = z;
55: register char *limit;
56:
57: subscr = i - lb_a;
58: if (subscr < 0 || subscr > ub_a) {
59: ERROR("i = %D: Bad i to pack(a,i,z)\n", i);
60: return;
61: }
62: cp = &a[subscr * size_a];
63: limit = cp + size_z;
64: do {
65: *zp++ = *cp++;
66: } while (cp < limit);
67: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.