/* Copyright (C) 1995 by Thomas Glen Smith. All Rights Reserved. */
/* gradesub APL2 V1.0.0 ************************************************
* Called by both grade when rite has rank greater than 1, and *
* and recursively by itself. Returns these values according to the *
* comparison of the subarrays pointed to by a and b: *
* -1 if subarray a is less than subarray b. *
* 0 if subarray a is equal to subarray b. *
* +1 if subarray a is greater than subarray b. *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
int gradesub(rite,a,b,r)
Aplcb rite; /* Variable being sorted. */
int a; /* Index to subarray a. */
int b; /* Index to subarray b. */
int r; /* Number of items in subarray. */
{
extern double fuzz;
int *aip,*bip,i;
double *adp,*bdp,d;
switch(rite->aplflags & APL_NUMERIC) {
case APLINT:
aip = rite->aplptr.aplint + a*r;
bip = rite->aplptr.aplint + b*r;
while(r--) {
i = *aip++ - *bip++;
if (i > 0)
return(1); /* a > b */
if (i < 0)
return(-1); /* a < b */
}
break;
case APLNUMB:
adp = rite->aplptr.apldata + a*r;
bdp = rite->aplptr.apldata + b*r;
while(r--) {
d = *adp++ - *bdp++;
if (d > fuzz)
return(1); /* a > b */
if (d < -fuzz)
return(-1); /* a < b */
}
} /* End switch. */
return(0); /* Get here only if subarrays are equal. */
}