140864Sbostic /*-
2*62092Sbostic * Copyright (c) 1979, 1993
3*62092Sbostic * The Regents of the University of California. All rights reserved.
440864Sbostic *
540864Sbostic * %sccs.include.redist.c%
640864Sbostic */
71644Smckusick
840864Sbostic #ifndef lint
9*62092Sbostic static char sccsid[] = "@(#)CTTOT.c 8.1 (Berkeley) 06/06/93";
1040864Sbostic #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 *
CTTOT(result,lwrbnd,uprbnd,paircnt,singcnt,data)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 *
CTTOTA(result,lwrbnd,uprbnd,paircnt,singcnt,dataptr)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