executor/src/hintemplate.h

109 lines
2.5 KiB
C

/*
* Copyright 1988, 1989, 1990 by Abacus Research and Development, Inc.
* All rights reserved.
*
* $Id: hintemplate.h 63 2004-12-24 18:19:43Z ctm $
*/
/*
* I admit this file needs some comments...
* basically I am trying to use the same code twice relatively
* efficiently, trading codesize for speed
*/
PRIVATE
DECL
{
STATEDECL
register INTEGER x, x1, x2, y;
register INTEGER *ip, *op;
register int rev;
INTEGER y0, y1;
INTEGER ends[3][100];
register INTEGER *oldinset, *oldunset, *newunset;
rev = -1;
ends[0][0] = ends[1][0] = 32767;
y1 = -32768;
SETIO; /* sets ip, op, y, npairs */
while (y1 != 32767) {
y0 = y;
/* you say you want a revolution ... */
oldinset = (INTEGER *) (ends + (++rev) % 3);
oldunset = (INTEGER *) (ends + (rev+1) % 3);
newunset = (INTEGER *) (ends + (rev+2) % 3);
/* merge oldunset and input into newunset */
if (y != 32767) {
while (NEXTPAIR) {
while (*oldunset < x)
*newunset++ = *oldunset++;
if (x < *oldunset)
*newunset++ = x;
else
oldunset++;
}
while ((*newunset++ = *oldunset++) != 32767)
;
} else
*newunset = 32767; /* letting the pipe drain */
/* inset the old unset inplace (using oldinset) */
oldinset = oldunset = (INTEGER *) (ends + (rev+1) % 3);
if (dh > 0) {
/* (+ -) (+ -) ... (+ -) */
while ((x1 = oldunset[0]) != 32767) {
if ((x1 = x1+dh) < (x2 = oldunset[1]-dh)) {
*oldinset++ = x1;
*oldinset++ = x2;
}
oldunset += 2;
}
*oldinset = 32767;
} else {
/* - (+ -) (+ -) ... (+ -) + */
/* remember that dh is negative, so +dh is -ABS(dh) */
if ((x2 = oldunset[0]) != 32767) {
*oldinset++ = x2+dh;
oldunset++;
while ((x2 = oldunset[1]) != 32767) {
if ((x1 = oldunset[0]-dh) < (x2 = x2+dh)) {
*oldinset++ = x1;
*oldinset++ = x2;
}
oldunset += 2;
}
*oldinset++ = oldunset[0]-dh;
}
*oldinset = 32767;
}
/* merge oldinset and oldunset(now inset) */
oldinset = (INTEGER *) (ends + (rev ) % 3);
oldunset = (INTEGER *) (ends + (rev+1) % 3);
while (*oldinset != 32767 || *oldunset != 32767) {
if (*oldinset < *oldunset) {
INCLXY(*oldinset, y1);
oldinset++;
} else if (*oldunset < *oldinset) {
INCLXY(*oldunset, y1);
oldunset++;
} else { /* equal, blow them both off */
oldunset++;
oldinset++;
}
}
y1 = y0;
}
UNSETIO;
}
#undef DECL
#undef STATEDECL
#undef SETIO
#undef UNSETIO
#undef NEXTPAIR
#undef INCLXY
#undef PIPEINCXY