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