xref: /csrg-svn/usr.bin/pascal/libpc/CTTOT.c (revision 3856)
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