xref: /csrg-svn/usr.bin/pascal/libpc/PACK.c (revision 3015)
11669Smckusick /* Copyright (c) 1979 Regents of the University of California */
21669Smckusick 
3*3015Smckusic static char sccsid[] = "@(#)PACK.c 1.2 03/07/81";
41669Smckusick 
51669Smckusick #include "h01errs.h"
61669Smckusick 
71669Smckusick /*
81669Smckusick  * pack(a,i,z)
91669Smckusick  *
101669Smckusick  * with:	a: array[m..n] of t
111669Smckusick  *	z: packed array[u..v] of t
121669Smckusick  *
131669Smckusick  * semantics:	for j := u to v do
141669Smckusick  *			z[j] := a[j-u+i];
151669Smckusick  *
161669Smckusick  * need to check:
171669Smckusick  *	1. i >= m
181669Smckusick  *	2. i+(v-u) <= n		(i.e. i-m <= (n-m)-(v-u))
191669Smckusick  *
201669Smckusick  * on stack:	lv(z), lv(a), rv(i) (len 4)
211669Smckusick  *
221669Smckusick  * move w(t)*(v-u+1) bytes from lv(a)+w(t)*(i-m) to lv(z)
231669Smckusick  */
241669Smckusick 
251669Smckusick PACK(i, a, z, size_a, lb_a, ub_a, size_z)
261669Smckusick 
27*3015Smckusic 	long	i;	/* subscript into a to begin packing */
281669Smckusick 	char	*a;	/* pointer to structure a */
291669Smckusick 	char	*z;	/* pointer to structure z */
30*3015Smckusic 	long	size_a;	/* sizeof(a_type) */
31*3015Smckusic 	long	lb_a;	/* lower bound of structure a */
32*3015Smckusic 	long	ub_a;	/* (upper bound of a) - (lb_a + sizeof(z_type)) */
33*3015Smckusic 	long	size_z;	/* sizeof(z_type) */
341669Smckusick {
351669Smckusick 	int		subscr;
361669Smckusick 	register char	*cp;
371669Smckusick 	register char	*zp = z;
381669Smckusick 	register char	*limit;
391669Smckusick 
401669Smckusick 	subscr = i - lb_a;
411669Smckusick 	if (subscr < 0 || subscr > ub_a) {
421669Smckusick 		ERROR(EPACK, i);
431669Smckusick 		return;
441669Smckusick 	}
451669Smckusick 	cp = &a[subscr * size_a];
461669Smckusick 	limit = cp + size_z;
471669Smckusick 	do	{
481669Smckusick 		*zp++ = *cp++;
491669Smckusick 	} while (cp < limit);
501669Smckusick }
51