1*1644Smckusick /* Copyright (c) 1979 Regents of the University of California */ 2*1644Smckusick 3*1644Smckusick static char sccsid[] = "@(#)CTTOT.c 1.1 10/30/80"; 4*1644Smckusick 5*1644Smckusick #include "h00vars.h" 6*1644Smckusick #include "h01errs.h" 7*1644Smckusick 8*1644Smckusick long _mask[] = { 9*1644Smckusick 0xffffffff , 0xfffffffe , 0xfffffffc , 0xfffffff8 , 10*1644Smckusick 0xfffffff0 , 0xffffffe0 , 0xffffffc0 , 0xffffff80 , 11*1644Smckusick 0xffffff00 , 0xfffffe00 , 0xfffffc00 , 0xfffff800 , 12*1644Smckusick 0xfffff000 , 0xffffe000 , 0xffffc000 , 0xffff8000 , 13*1644Smckusick 0xffff0000 , 0xfffe0000 , 0xfffc0000 , 0xfff80000 , 14*1644Smckusick 0xfff00000 , 0xffe00000 , 0xffc00000 , 0xff800000 , 15*1644Smckusick 0xff000000 , 0xfe000000 , 0xfc000000 , 0xf8000000 , 16*1644Smckusick 0xf0000000 , 0xe0000000 , 0xc0000000 , 0x80000000 , 17*1644Smckusick 0x00000000 18*1644Smckusick }; 19*1644Smckusick /* 20*1644Smckusick * Constant set constructor 21*1644Smckusick */ 22*1644Smckusick 23*1644Smckusick long * 24*1644Smckusick CTTOT(result, lowerbnd, upperbnd, paircnt, singcnt, data) 25*1644Smckusick 26*1644Smckusick long *result; /* pointer to final set */ 27*1644Smckusick int lowerbnd; /* lower bound of set */ 28*1644Smckusick int upperbnd; /* upper - lower of set */ 29*1644Smckusick int paircnt; /* number of pairs to construct */ 30*1644Smckusick int singcnt; /* number of singles to construct */ 31*1644Smckusick int data; /* paircnt plus singcnt sets of data */ 32*1644Smckusick { 33*1644Smckusick register int lower; 34*1644Smckusick register int lowerdiv; 35*1644Smckusick register int lowermod; 36*1644Smckusick register int upper; 37*1644Smckusick int upperdiv; 38*1644Smckusick int uppermod; 39*1644Smckusick register int *dataptr; 40*1644Smckusick register long *lp; 41*1644Smckusick long *limit; 42*1644Smckusick long temp; 43*1644Smckusick long cnt; 44*1644Smckusick 45*1644Smckusick limit = &result[(upperbnd + 1 + BITSPERLONG - 1) / BITSPERLONG]; 46*1644Smckusick for (lp = result; lp < limit; ) 47*1644Smckusick *lp++ = 0; 48*1644Smckusick dataptr = &data; 49*1644Smckusick for (cnt = 0; cnt < paircnt; cnt++) { 50*1644Smckusick upper = *dataptr++ - lowerbnd; 51*1644Smckusick if (upper < 0 || upper > upperbnd) { 52*1644Smckusick ERROR(ECTUPR, *--dataptr); 53*1644Smckusick return; 54*1644Smckusick } 55*1644Smckusick lower = *dataptr++ - lowerbnd; 56*1644Smckusick if (lower < 0 || lower > upperbnd) { 57*1644Smckusick ERROR(ECTLWR, *--dataptr); 58*1644Smckusick return; 59*1644Smckusick } 60*1644Smckusick if (lower > upper) { 61*1644Smckusick continue; 62*1644Smckusick } 63*1644Smckusick lowerdiv = lower / BITSPERLONG; 64*1644Smckusick lowermod = lower % BITSPERLONG; 65*1644Smckusick upperdiv = upper / BITSPERLONG; 66*1644Smckusick uppermod = upper % BITSPERLONG; 67*1644Smckusick temp = _mask [lowermod]; 68*1644Smckusick if ( lowerdiv == upperdiv ) { 69*1644Smckusick temp &= ~_mask[ uppermod + 1 ]; 70*1644Smckusick } 71*1644Smckusick result[ lowerdiv ] |= temp; 72*1644Smckusick limit = &result[ upperdiv-1 ]; 73*1644Smckusick for ( lp = &result[ lowerdiv+1 ] ; lp <= limit ; lp++ ) { 74*1644Smckusick *lp |= ~0; 75*1644Smckusick } 76*1644Smckusick if ( lowerdiv != upperdiv ) { 77*1644Smckusick result[ upperdiv ] |= ~_mask[ uppermod + 1 ]; 78*1644Smckusick } 79*1644Smckusick } 80*1644Smckusick for (cnt = 0; cnt < singcnt; cnt++) { 81*1644Smckusick lower = *dataptr++ - lowerbnd; 82*1644Smckusick if (lower < 0 || lower > upperbnd) { 83*1644Smckusick ERROR(ECTSNG, *--dataptr); 84*1644Smckusick return; 85*1644Smckusick } 86*1644Smckusick lowerdiv = lower / BITSPERLONG; 87*1644Smckusick lowermod = lower % BITSPERLONG; 88*1644Smckusick result[ lowerdiv ] |= ( 1 << lowermod ); 89*1644Smckusick } 90*1644Smckusick return(result); 91*1644Smckusick } 92