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