11644Smckusick /* Copyright (c) 1979 Regents of the University of California */ 21644Smckusick 3*36533Smckusick static char sccsid[] = "@(#)CTTOT.c 1.5 01/09/89"; 41644Smckusick 52999Smckusic #include "whoami.h" 61644Smckusick #include "h00vars.h" 71644Smckusick 81644Smckusick long _mask[] = { 92999Smckusic # ifdef DEC11 101644Smckusick 0xffffffff , 0xfffffffe , 0xfffffffc , 0xfffffff8 , 111644Smckusick 0xfffffff0 , 0xffffffe0 , 0xffffffc0 , 0xffffff80 , 121644Smckusick 0xffffff00 , 0xfffffe00 , 0xfffffc00 , 0xfffff800 , 131644Smckusick 0xfffff000 , 0xffffe000 , 0xffffc000 , 0xffff8000 , 141644Smckusick 0xffff0000 , 0xfffe0000 , 0xfffc0000 , 0xfff80000 , 151644Smckusick 0xfff00000 , 0xffe00000 , 0xffc00000 , 0xff800000 , 161644Smckusick 0xff000000 , 0xfe000000 , 0xfc000000 , 0xf8000000 , 171644Smckusick 0xf0000000 , 0xe0000000 , 0xc0000000 , 0x80000000 , 181644Smckusick 0x00000000 192999Smckusic # else 202999Smckusic 0xffffffff , 0xfeffffff , 0xfcffffff , 0xf8ffffff , 212999Smckusic 0xf0ffffff , 0xe0ffffff , 0xc0ffffff , 0x80ffffff , 222999Smckusic 0x00ffffff , 0x00feffff , 0x00fcffff , 0x00f8ffff , 232999Smckusic 0x00f0ffff , 0x00e0ffff , 0x00c0ffff , 0x0080ffff , 242999Smckusic 0x0000ffff , 0x0000feff , 0x0000fcff , 0x0000f8ff , 252999Smckusic 0x0000f0ff , 0x0000e0ff , 0x0000c0ff , 0x000080ff , 262999Smckusic 0x000000ff , 0x000000fe , 0x000000fc , 0x000000f8 , 272999Smckusic 0x000000f0 , 0x000000e0 , 0x000000c0 , 0x00000080 , 282999Smckusic 0x00000000 292999Smckusic # endif DEC11 302999Smckusic }; 311644Smckusick /* 32*36533Smckusick * Constant set constructors. 33*36533Smckusick * 34*36533Smckusick * CTTOT is called from compiled Pascal. It takes the list of ranges 35*36533Smckusick * and single elements on the stack, varargs style. 36*36533Smckusick * 37*36533Smckusick * CTTOTA is called from the px interpreter. It takes a pointer to the 38*36533Smckusick * list of ranges and single elements. 39*36533Smckusick * 40*36533Smckusick * This was easier than changing the compiler to pass a pointer into 41*36533Smckusick * its own partially-constructed stack, while working to make px portable. 421644Smckusick */ 431644Smckusick 44*36533Smckusick long *CTTOTA(); 45*36533Smckusick 461644Smckusick long * 47*36533Smckusick CTTOT(result, lwrbnd, uprbnd, paircnt, singcnt, data) 481644Smckusick 49*36533Smckusick long *result; /* pointer to final set */ 502999Smckusic long lwrbnd; /* lower bound of set */ 512999Smckusic long uprbnd; /* upper - lower of set */ 522999Smckusic long paircnt; /* number of pairs to construct */ 532999Smckusic long singcnt; /* number of singles to construct */ 542999Smckusic long data; /* paircnt plus singcnt sets of data */ 551644Smckusick { 56*36533Smckusick return CTTOTA(result, lwrbnd, uprbnd, paircnt, singcnt, &data); 57*36533Smckusick } 58*36533Smckusick 59*36533Smckusick long * 60*36533Smckusick CTTOTA(result, lwrbnd, uprbnd, paircnt, singcnt, dataptr) 61*36533Smckusick 62*36533Smckusick register long *result; /* pointer to final set */ 63*36533Smckusick long lwrbnd; /* lower bound of set */ 64*36533Smckusick long uprbnd; /* upper - lower of set */ 65*36533Smckusick long paircnt; /* number of pairs to construct */ 66*36533Smckusick long singcnt; /* number of singles to construct */ 67*36533Smckusick register long *dataptr; /* ->paircnt plus singcnt data values */ 68*36533Smckusick { 692999Smckusic int lowerbnd = lwrbnd; 702999Smckusic int upperbnd = uprbnd; 712999Smckusic register long *lp; 722999Smckusic register char *cp; 732999Smckusic register long temp; 742999Smckusic long *limit; 752999Smckusic int lower; 762999Smckusic int lowerdiv; 772999Smckusic int lowermod; 782999Smckusic int upper; 791644Smckusick int upperdiv; 801644Smckusick int uppermod; 812999Smckusic int cnt; 821644Smckusick 832999Smckusic limit = &result[(upperbnd + 1 + BITSPERLONG - 1) >> LG2BITSLONG]; 841644Smckusick for (lp = result; lp < limit; ) 851644Smckusick *lp++ = 0; 861644Smckusick for (cnt = 0; cnt < paircnt; cnt++) { 871644Smckusick upper = *dataptr++ - lowerbnd; 881644Smckusick if (upper < 0 || upper > upperbnd) { 893856Smckusic ERROR("Range upper bound of %D out of set bounds\n", 903856Smckusic *--dataptr); 911644Smckusick } 921644Smckusick lower = *dataptr++ - lowerbnd; 931644Smckusick if (lower < 0 || lower > upperbnd) { 943856Smckusic ERROR("Range lower bound of %D out of set bounds\n", 953856Smckusic *--dataptr); 961644Smckusick } 971644Smckusick if (lower > upper) { 981644Smckusick continue; 991644Smckusick } 1002999Smckusic lowerdiv = lower >> LG2BITSLONG; 1012999Smckusic lowermod = lower & MSKBITSLONG; 1022999Smckusic upperdiv = upper >> LG2BITSLONG; 1032999Smckusic uppermod = upper & MSKBITSLONG; 1041644Smckusick temp = _mask [lowermod]; 1051644Smckusick if ( lowerdiv == upperdiv ) { 1061644Smckusick temp &= ~_mask[ uppermod + 1 ]; 1071644Smckusick } 1081644Smckusick result[ lowerdiv ] |= temp; 1091644Smckusick limit = &result[ upperdiv-1 ]; 1101644Smckusick for ( lp = &result[ lowerdiv+1 ] ; lp <= limit ; lp++ ) { 1111644Smckusick *lp |= ~0; 1121644Smckusick } 1131644Smckusick if ( lowerdiv != upperdiv ) { 1141644Smckusick result[ upperdiv ] |= ~_mask[ uppermod + 1 ]; 1151644Smckusick } 1161644Smckusick } 1172999Smckusic for (cnt = 0, cp = (char *)result; cnt < singcnt; cnt++) { 1181644Smckusick lower = *dataptr++ - lowerbnd; 1191644Smckusick if (lower < 0 || lower > upperbnd) { 1203856Smckusic ERROR("Value of %D out of set bounds\n", *--dataptr); 1211644Smckusick } 1222999Smckusic cp[ lower >> LG2BITSBYTE ] |= (1 << (lower & MSKBITSBYTE)); 1231644Smckusick } 1241644Smckusick return(result); 1251644Smckusick } 126