11669Smckusick /* Copyright (c) 1979 Regents of the University of California */ 21669Smckusick 3*3868Smckusic static char sccsid[] = "@(#)PACK.c 1.3 06/10/81"; 41669Smckusick 51669Smckusick 61669Smckusick /* 71669Smckusick * pack(a,i,z) 81669Smckusick * 91669Smckusick * with: a: array[m..n] of t 101669Smckusick * z: packed array[u..v] of t 111669Smckusick * 121669Smckusick * semantics: for j := u to v do 131669Smckusick * z[j] := a[j-u+i]; 141669Smckusick * 151669Smckusick * need to check: 161669Smckusick * 1. i >= m 171669Smckusick * 2. i+(v-u) <= n (i.e. i-m <= (n-m)-(v-u)) 181669Smckusick * 191669Smckusick * on stack: lv(z), lv(a), rv(i) (len 4) 201669Smckusick * 211669Smckusick * move w(t)*(v-u+1) bytes from lv(a)+w(t)*(i-m) to lv(z) 221669Smckusick */ 231669Smckusick 241669Smckusick PACK(i, a, z, size_a, lb_a, ub_a, size_z) 251669Smckusick 263015Smckusic long i; /* subscript into a to begin packing */ 271669Smckusick char *a; /* pointer to structure a */ 281669Smckusick char *z; /* pointer to structure z */ 293015Smckusic long size_a; /* sizeof(a_type) */ 303015Smckusic long lb_a; /* lower bound of structure a */ 313015Smckusic long ub_a; /* (upper bound of a) - (lb_a + sizeof(z_type)) */ 323015Smckusic long size_z; /* sizeof(z_type) */ 331669Smckusick { 341669Smckusick int subscr; 351669Smckusick register char *cp; 361669Smckusick register char *zp = z; 371669Smckusick register char *limit; 381669Smckusick 391669Smckusick subscr = i - lb_a; 401669Smckusick if (subscr < 0 || subscr > ub_a) { 41*3868Smckusic ERROR("i = %D: Bad i to pack(a,i,z)\n", i); 421669Smckusick return; 431669Smckusick } 441669Smckusick cp = &a[subscr * size_a]; 451669Smckusick limit = cp + size_z; 461669Smckusick do { 471669Smckusick *zp++ = *cp++; 481669Smckusick } while (cp < limit); 491669Smckusick } 50