+ long *result; /* pointer to final set */
+ int lowerbnd; /* lower bound of set */
+ int upperbnd; /* upper - lower of set */
+ int paircnt; /* number of pairs to construct */
+ int singcnt; /* number of singles to construct */
+ int data; /* paircnt plus singcnt sets of data */
+{
+ register int lower;
+ register int lowerdiv;
+ register int lowermod;
+ register int upper;
+ int upperdiv;
+ int uppermod;
+ register int *dataptr;
+ register long *lp;
+ long *limit;
+ long temp;
+ long cnt;
+
+ limit = &result[(upperbnd + 1 + BITSPERLONG - 1) / BITSPERLONG];
+ for (lp = result; lp < limit; )
+ *lp++ = 0;
+ dataptr = &data;
+ for (cnt = 0; cnt < paircnt; cnt++) {
+ lower = *dataptr++ - lowerbnd;
+ if (lower < 0 || lower > upperbnd) {
+ error(ECTLWR);
+ return;
+ }
+ upper = *dataptr++ - lowerbnd;
+ if (upper < 0 || upper > upperbnd) {
+ error(ECTUPR);
+ return;
+ }
+ if (lower > upper) {
+ continue;
+ }
+ lowerdiv = lower / BITSPERLONG;
+ lowermod = lower % BITSPERLONG;
+ upperdiv = upper / BITSPERLONG;
+ uppermod = upper % BITSPERLONG;
+ temp = _mask [lowermod];
+ if ( lowerdiv == upperdiv ) {
+ temp &= ~_mask[ uppermod + 1 ];
+ }
+ result[ lowerdiv ] |= temp;
+ limit = &result[ upperdiv-1 ];
+ for ( lp = &result[ lowerdiv+1 ] ; lp <= limit ; lp++ ) {
+ *lp |= ~0;
+ }
+ if ( lowerdiv != upperdiv ) {
+ result[ upperdiv ] |= ~_mask[ uppermod + 1 ];
+ }
+ }
+ for (cnt = 0; cnt < singcnt; cnt++) {
+ lower = *dataptr++ - lowerbnd;
+ if (lower < 0 || lower > upperbnd) {
+ error(ECTSNG);
+ return;
+ }
+ lowerdiv = lower / BITSPERLONG;
+ lowermod = lower % BITSPERLONG;
+ result[ lowerdiv ] |= ( 1 << lowermod );
+ }
+ return(result);
+}
+\f
+inct(element, paircnt, singcnt, data)