1*40864Sbostic /*- 2*40864Sbostic * Copyright (c) 1979 The Regents of the University of California. 3*40864Sbostic * All rights reserved. 4*40864Sbostic * 5*40864Sbostic * %sccs.include.redist.c% 6*40864Sbostic */ 71644Smckusick 8*40864Sbostic #ifndef lint 9*40864Sbostic static char sccsid[] = "@(#)CTTOT.c 1.6 (Berkeley) 04/09/90"; 10*40864Sbostic #endif /* not lint */ 111644Smckusick 122999Smckusic #include "whoami.h" 131644Smckusick #include "h00vars.h" 141644Smckusick 151644Smckusick long _mask[] = { 162999Smckusic # ifdef DEC11 171644Smckusick 0xffffffff , 0xfffffffe , 0xfffffffc , 0xfffffff8 , 181644Smckusick 0xfffffff0 , 0xffffffe0 , 0xffffffc0 , 0xffffff80 , 191644Smckusick 0xffffff00 , 0xfffffe00 , 0xfffffc00 , 0xfffff800 , 201644Smckusick 0xfffff000 , 0xffffe000 , 0xffffc000 , 0xffff8000 , 211644Smckusick 0xffff0000 , 0xfffe0000 , 0xfffc0000 , 0xfff80000 , 221644Smckusick 0xfff00000 , 0xffe00000 , 0xffc00000 , 0xff800000 , 231644Smckusick 0xff000000 , 0xfe000000 , 0xfc000000 , 0xf8000000 , 241644Smckusick 0xf0000000 , 0xe0000000 , 0xc0000000 , 0x80000000 , 251644Smckusick 0x00000000 262999Smckusic # else 272999Smckusic 0xffffffff , 0xfeffffff , 0xfcffffff , 0xf8ffffff , 282999Smckusic 0xf0ffffff , 0xe0ffffff , 0xc0ffffff , 0x80ffffff , 292999Smckusic 0x00ffffff , 0x00feffff , 0x00fcffff , 0x00f8ffff , 302999Smckusic 0x00f0ffff , 0x00e0ffff , 0x00c0ffff , 0x0080ffff , 312999Smckusic 0x0000ffff , 0x0000feff , 0x0000fcff , 0x0000f8ff , 322999Smckusic 0x0000f0ff , 0x0000e0ff , 0x0000c0ff , 0x000080ff , 332999Smckusic 0x000000ff , 0x000000fe , 0x000000fc , 0x000000f8 , 342999Smckusic 0x000000f0 , 0x000000e0 , 0x000000c0 , 0x00000080 , 352999Smckusic 0x00000000 362999Smckusic # endif DEC11 372999Smckusic }; 381644Smckusick /* 3936533Smckusick * Constant set constructors. 4036533Smckusick * 4136533Smckusick * CTTOT is called from compiled Pascal. It takes the list of ranges 4236533Smckusick * and single elements on the stack, varargs style. 4336533Smckusick * 4436533Smckusick * CTTOTA is called from the px interpreter. It takes a pointer to the 4536533Smckusick * list of ranges and single elements. 4636533Smckusick * 4736533Smckusick * This was easier than changing the compiler to pass a pointer into 4836533Smckusick * its own partially-constructed stack, while working to make px portable. 491644Smckusick */ 501644Smckusick 5136533Smckusick long *CTTOTA(); 5236533Smckusick 531644Smckusick long * 5436533Smckusick CTTOT(result, lwrbnd, uprbnd, paircnt, singcnt, data) 551644Smckusick 5636533Smckusick long *result; /* pointer to final set */ 572999Smckusic long lwrbnd; /* lower bound of set */ 582999Smckusic long uprbnd; /* upper - lower of set */ 592999Smckusic long paircnt; /* number of pairs to construct */ 602999Smckusic long singcnt; /* number of singles to construct */ 612999Smckusic long data; /* paircnt plus singcnt sets of data */ 621644Smckusick { 6336533Smckusick return CTTOTA(result, lwrbnd, uprbnd, paircnt, singcnt, &data); 6436533Smckusick } 6536533Smckusick 6636533Smckusick long * 6736533Smckusick CTTOTA(result, lwrbnd, uprbnd, paircnt, singcnt, dataptr) 6836533Smckusick 6936533Smckusick register long *result; /* pointer to final set */ 7036533Smckusick long lwrbnd; /* lower bound of set */ 7136533Smckusick long uprbnd; /* upper - lower of set */ 7236533Smckusick long paircnt; /* number of pairs to construct */ 7336533Smckusick long singcnt; /* number of singles to construct */ 7436533Smckusick register long *dataptr; /* ->paircnt plus singcnt data values */ 7536533Smckusick { 762999Smckusic int lowerbnd = lwrbnd; 772999Smckusic int upperbnd = uprbnd; 782999Smckusic register long *lp; 792999Smckusic register char *cp; 802999Smckusic register long temp; 812999Smckusic long *limit; 822999Smckusic int lower; 832999Smckusic int lowerdiv; 842999Smckusic int lowermod; 852999Smckusic int upper; 861644Smckusick int upperdiv; 871644Smckusick int uppermod; 882999Smckusic int cnt; 891644Smckusick 902999Smckusic limit = &result[(upperbnd + 1 + BITSPERLONG - 1) >> LG2BITSLONG]; 911644Smckusick for (lp = result; lp < limit; ) 921644Smckusick *lp++ = 0; 931644Smckusick for (cnt = 0; cnt < paircnt; cnt++) { 941644Smckusick upper = *dataptr++ - lowerbnd; 951644Smckusick if (upper < 0 || upper > upperbnd) { 963856Smckusic ERROR("Range upper bound of %D out of set bounds\n", 973856Smckusic *--dataptr); 981644Smckusick } 991644Smckusick lower = *dataptr++ - lowerbnd; 1001644Smckusick if (lower < 0 || lower > upperbnd) { 1013856Smckusic ERROR("Range lower bound of %D out of set bounds\n", 1023856Smckusic *--dataptr); 1031644Smckusick } 1041644Smckusick if (lower > upper) { 1051644Smckusick continue; 1061644Smckusick } 1072999Smckusic lowerdiv = lower >> LG2BITSLONG; 1082999Smckusic lowermod = lower & MSKBITSLONG; 1092999Smckusic upperdiv = upper >> LG2BITSLONG; 1102999Smckusic uppermod = upper & MSKBITSLONG; 1111644Smckusick temp = _mask [lowermod]; 1121644Smckusick if ( lowerdiv == upperdiv ) { 1131644Smckusick temp &= ~_mask[ uppermod + 1 ]; 1141644Smckusick } 1151644Smckusick result[ lowerdiv ] |= temp; 1161644Smckusick limit = &result[ upperdiv-1 ]; 1171644Smckusick for ( lp = &result[ lowerdiv+1 ] ; lp <= limit ; lp++ ) { 1181644Smckusick *lp |= ~0; 1191644Smckusick } 1201644Smckusick if ( lowerdiv != upperdiv ) { 1211644Smckusick result[ upperdiv ] |= ~_mask[ uppermod + 1 ]; 1221644Smckusick } 1231644Smckusick } 1242999Smckusic for (cnt = 0, cp = (char *)result; cnt < singcnt; cnt++) { 1251644Smckusick lower = *dataptr++ - lowerbnd; 1261644Smckusick if (lower < 0 || lower > upperbnd) { 1273856Smckusic ERROR("Value of %D out of set bounds\n", *--dataptr); 1281644Smckusick } 1292999Smckusic cp[ lower >> LG2BITSBYTE ] |= (1 << (lower & MSKBITSBYTE)); 1301644Smckusick } 1311644Smckusick return(result); 1321644Smckusick } 133