11644Smckusick /* Copyright (c) 1979 Regents of the University of California */ 21644Smckusick 3*3856Smckusic static char sccsid[] = "@(#)CTTOT.c 1.3 06/08/81"; 41644Smckusick 52999Smckusic #include "whoami.h" 61644Smckusick #include "h00vars.h" 71644Smckusick #include "h01errs.h" 81644Smckusick 91644Smckusick long _mask[] = { 102999Smckusic # ifdef DEC11 111644Smckusick 0xffffffff , 0xfffffffe , 0xfffffffc , 0xfffffff8 , 121644Smckusick 0xfffffff0 , 0xffffffe0 , 0xffffffc0 , 0xffffff80 , 131644Smckusick 0xffffff00 , 0xfffffe00 , 0xfffffc00 , 0xfffff800 , 141644Smckusick 0xfffff000 , 0xffffe000 , 0xffffc000 , 0xffff8000 , 151644Smckusick 0xffff0000 , 0xfffe0000 , 0xfffc0000 , 0xfff80000 , 161644Smckusick 0xfff00000 , 0xffe00000 , 0xffc00000 , 0xff800000 , 171644Smckusick 0xff000000 , 0xfe000000 , 0xfc000000 , 0xf8000000 , 181644Smckusick 0xf0000000 , 0xe0000000 , 0xc0000000 , 0x80000000 , 191644Smckusick 0x00000000 202999Smckusic # else 212999Smckusic 0xffffffff , 0xfeffffff , 0xfcffffff , 0xf8ffffff , 222999Smckusic 0xf0ffffff , 0xe0ffffff , 0xc0ffffff , 0x80ffffff , 232999Smckusic 0x00ffffff , 0x00feffff , 0x00fcffff , 0x00f8ffff , 242999Smckusic 0x00f0ffff , 0x00e0ffff , 0x00c0ffff , 0x0080ffff , 252999Smckusic 0x0000ffff , 0x0000feff , 0x0000fcff , 0x0000f8ff , 262999Smckusic 0x0000f0ff , 0x0000e0ff , 0x0000c0ff , 0x000080ff , 272999Smckusic 0x000000ff , 0x000000fe , 0x000000fc , 0x000000f8 , 282999Smckusic 0x000000f0 , 0x000000e0 , 0x000000c0 , 0x00000080 , 292999Smckusic 0x00000000 302999Smckusic # endif DEC11 312999Smckusic }; 321644Smckusick /* 331644Smckusick * Constant set constructor 341644Smckusick */ 351644Smckusick 361644Smckusick long * 372999Smckusic CTTOT(result0, lwrbnd, uprbnd, paircnt, singcnt, data) 381644Smckusick 392999Smckusic long *result0; /* pointer to final set */ 402999Smckusic long lwrbnd; /* lower bound of set */ 412999Smckusic long uprbnd; /* upper - lower of set */ 422999Smckusic long paircnt; /* number of pairs to construct */ 432999Smckusic long singcnt; /* number of singles to construct */ 442999Smckusic long data; /* paircnt plus singcnt sets of data */ 451644Smckusick { 462999Smckusic register long *result = result0; 472999Smckusic register long *dataptr = &data; 482999Smckusic int lowerbnd = lwrbnd; 492999Smckusic int upperbnd = uprbnd; 502999Smckusic register long *lp; 512999Smckusic register char *cp; 522999Smckusic register long temp; 532999Smckusic long *limit; 542999Smckusic int lower; 552999Smckusic int lowerdiv; 562999Smckusic int lowermod; 572999Smckusic int upper; 581644Smckusick int upperdiv; 591644Smckusick int uppermod; 602999Smckusic int cnt; 611644Smckusick 622999Smckusic limit = &result[(upperbnd + 1 + BITSPERLONG - 1) >> LG2BITSLONG]; 631644Smckusick for (lp = result; lp < limit; ) 641644Smckusick *lp++ = 0; 651644Smckusick for (cnt = 0; cnt < paircnt; cnt++) { 661644Smckusick upper = *dataptr++ - lowerbnd; 671644Smckusick if (upper < 0 || upper > upperbnd) { 68*3856Smckusic ERROR("Range upper bound of %D out of set bounds\n", 69*3856Smckusic *--dataptr); 701644Smckusick return; 711644Smckusick } 721644Smckusick lower = *dataptr++ - lowerbnd; 731644Smckusick if (lower < 0 || lower > upperbnd) { 74*3856Smckusic ERROR("Range lower bound of %D out of set bounds\n", 75*3856Smckusic *--dataptr); 761644Smckusick return; 771644Smckusick } 781644Smckusick if (lower > upper) { 791644Smckusick continue; 801644Smckusick } 812999Smckusic lowerdiv = lower >> LG2BITSLONG; 822999Smckusic lowermod = lower & MSKBITSLONG; 832999Smckusic upperdiv = upper >> LG2BITSLONG; 842999Smckusic uppermod = upper & MSKBITSLONG; 851644Smckusick temp = _mask [lowermod]; 861644Smckusick if ( lowerdiv == upperdiv ) { 871644Smckusick temp &= ~_mask[ uppermod + 1 ]; 881644Smckusick } 891644Smckusick result[ lowerdiv ] |= temp; 901644Smckusick limit = &result[ upperdiv-1 ]; 911644Smckusick for ( lp = &result[ lowerdiv+1 ] ; lp <= limit ; lp++ ) { 921644Smckusick *lp |= ~0; 931644Smckusick } 941644Smckusick if ( lowerdiv != upperdiv ) { 951644Smckusick result[ upperdiv ] |= ~_mask[ uppermod + 1 ]; 961644Smckusick } 971644Smckusick } 982999Smckusic for (cnt = 0, cp = (char *)result; cnt < singcnt; cnt++) { 991644Smckusick lower = *dataptr++ - lowerbnd; 1001644Smckusick if (lower < 0 || lower > upperbnd) { 101*3856Smckusic ERROR("Value of %D out of set bounds\n", *--dataptr); 1021644Smckusick return; 1031644Smckusick } 1042999Smckusic cp[ lower >> LG2BITSBYTE ] |= (1 << (lower & MSKBITSBYTE)); 1051644Smckusick } 1061644Smckusick return(result); 1071644Smckusick } 108