xref: /csrg-svn/usr.bin/pascal/libpc/CTTOT.c (revision 1644)
1*1644Smckusick /* Copyright (c) 1979 Regents of the University of California */
2*1644Smckusick 
3*1644Smckusick static char sccsid[] = "@(#)CTTOT.c 1.1 10/30/80";
4*1644Smckusick 
5*1644Smckusick #include "h00vars.h"
6*1644Smckusick #include "h01errs.h"
7*1644Smckusick 
8*1644Smckusick long	_mask[] = {
9*1644Smckusick 		    0xffffffff , 0xfffffffe , 0xfffffffc , 0xfffffff8 ,
10*1644Smckusick 		    0xfffffff0 , 0xffffffe0 , 0xffffffc0 , 0xffffff80 ,
11*1644Smckusick 		    0xffffff00 , 0xfffffe00 , 0xfffffc00 , 0xfffff800 ,
12*1644Smckusick 		    0xfffff000 , 0xffffe000 , 0xffffc000 , 0xffff8000 ,
13*1644Smckusick 		    0xffff0000 , 0xfffe0000 , 0xfffc0000 , 0xfff80000 ,
14*1644Smckusick 		    0xfff00000 , 0xffe00000 , 0xffc00000 , 0xff800000 ,
15*1644Smckusick 		    0xff000000 , 0xfe000000 , 0xfc000000 , 0xf8000000 ,
16*1644Smckusick 		    0xf0000000 , 0xe0000000 , 0xc0000000 , 0x80000000 ,
17*1644Smckusick 		    0x00000000
18*1644Smckusick 		 };
19*1644Smckusick /*
20*1644Smckusick  * Constant set constructor
21*1644Smckusick  */
22*1644Smckusick 
23*1644Smckusick long *
24*1644Smckusick CTTOT(result, lowerbnd, upperbnd, paircnt, singcnt, data)
25*1644Smckusick 
26*1644Smckusick 	long	*result;	/* pointer to final set */
27*1644Smckusick 	int	lowerbnd;	/* lower bound of set */
28*1644Smckusick 	int	upperbnd;	/* upper - lower of set */
29*1644Smckusick 	int	paircnt;	/* number of pairs to construct */
30*1644Smckusick 	int	singcnt;	/* number of singles to construct */
31*1644Smckusick 	int	data;		/* paircnt plus singcnt sets of data */
32*1644Smckusick {
33*1644Smckusick 	register int	lower;
34*1644Smckusick 	register int	lowerdiv;
35*1644Smckusick 	register int	lowermod;
36*1644Smckusick 	register int	upper;
37*1644Smckusick 	int		upperdiv;
38*1644Smckusick 	int		uppermod;
39*1644Smckusick 	register int	*dataptr;
40*1644Smckusick 	register long	*lp;
41*1644Smckusick 	long		*limit;
42*1644Smckusick 	long		temp;
43*1644Smckusick 	long		cnt;
44*1644Smckusick 
45*1644Smckusick 	limit = &result[(upperbnd + 1 + BITSPERLONG - 1) / BITSPERLONG];
46*1644Smckusick 	for (lp = result; lp < limit; )
47*1644Smckusick 		*lp++ = 0;
48*1644Smckusick 	dataptr = &data;
49*1644Smckusick 	for (cnt = 0; cnt < paircnt; cnt++) {
50*1644Smckusick 		upper = *dataptr++ - lowerbnd;
51*1644Smckusick 		if (upper < 0 || upper > upperbnd) {
52*1644Smckusick 			ERROR(ECTUPR, *--dataptr);
53*1644Smckusick 			return;
54*1644Smckusick 		}
55*1644Smckusick 		lower = *dataptr++ - lowerbnd;
56*1644Smckusick 		if (lower < 0 || lower > upperbnd) {
57*1644Smckusick 			ERROR(ECTLWR, *--dataptr);
58*1644Smckusick 			return;
59*1644Smckusick 		}
60*1644Smckusick 		if (lower > upper) {
61*1644Smckusick 			continue;
62*1644Smckusick 		}
63*1644Smckusick 		lowerdiv = lower / BITSPERLONG;
64*1644Smckusick 		lowermod = lower % BITSPERLONG;
65*1644Smckusick 		upperdiv = upper / BITSPERLONG;
66*1644Smckusick 		uppermod = upper % BITSPERLONG;
67*1644Smckusick 		temp = _mask [lowermod];
68*1644Smckusick 		if ( lowerdiv == upperdiv ) {
69*1644Smckusick 			temp &= ~_mask[ uppermod + 1 ];
70*1644Smckusick 		}
71*1644Smckusick 		result[ lowerdiv ] |= temp;
72*1644Smckusick 		limit = &result[ upperdiv-1 ];
73*1644Smckusick 		for ( lp = &result[ lowerdiv+1 ] ; lp <= limit ; lp++ ) {
74*1644Smckusick 			*lp |= ~0;
75*1644Smckusick 		}
76*1644Smckusick 		if ( lowerdiv != upperdiv ) {
77*1644Smckusick 			result[ upperdiv ] |= ~_mask[ uppermod + 1 ];
78*1644Smckusick 		}
79*1644Smckusick 	}
80*1644Smckusick 	for (cnt = 0; cnt < singcnt; cnt++) {
81*1644Smckusick 		lower = *dataptr++ - lowerbnd;
82*1644Smckusick 		if (lower < 0 || lower > upperbnd) {
83*1644Smckusick 			ERROR(ECTSNG, *--dataptr);
84*1644Smckusick 			return;
85*1644Smckusick 		}
86*1644Smckusick 		lowerdiv = lower / BITSPERLONG;
87*1644Smckusick 		lowermod = lower % BITSPERLONG;
88*1644Smckusick 		result[ lowerdiv ] |= ( 1 << lowermod );
89*1644Smckusick 	}
90*1644Smckusick 	return(result);
91*1644Smckusick }
92