FTN INTEGER FUNCTION CMP(LIST,ABUF,BBUF),92069-16061 REV.1912 781027 INTEGER LIST(101,6),ABUF(42),BBUF(42) C C C***************************************************************** C (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS RESERVED C NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, REPRODUCED, OR C TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH OUT THE PRIOR C WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. C****************************************************************** C C C SOURCE: 92069-18103 C RELOC: 92069-16060 C C C****************************************************************: C C C C C C C C C ABSTRACT: C C CMP COMPARES A DATA RECORD ASSOCIATED WITH THE INFORMATION IN C THE TABLE LIST. LIST IS A ARRAY IN WHICH IS THE FOLLOWING C INFORMATION, C C WORD 1 - ITEM NUMBER C WORD 2 - ITEM TYPE C WORD 3- ITEM LENGTH IN BYTE C WORD 4 - NUMBER OF ELEMENTS C WORD 5 - OFFSET IN BYTES INTO THE BUFFERS C WORD 6 - FLAG INDICATING SORT KEY C 0 IMPLIES NOT A SORT KEY C N IS THE ITEM NUMBER OF THE SORT KEY C ALL THE SORT KEYS ARE AT THE FIRST OF THE LIST-ARRAY C C C C THE FIRST ENTRY OF THE LIST ARRAY IS DIFFERENT THAN THE REST. C C WORD 1 - NUMBER OF ENTRIES IN THE ARRAY C WORD 6 - NUMBER OF SORT ITEMS C C THE LIST ARRAY IS ARRANGED FROM THE LEAST SIGNIFICANT SORT FIELD C (S[NULL]) TO THE MOST SIGNIFICANT SORT FIELD (S[5]), THEREFORE C EACH RECORD CONTAINS INFORMATION FROM THE LEAST SIGNIFICANT FIELD C TO THE MOST SIGNIFICANT FIELD, WHICH IS REALLY IN REVERSE SORT C ORDER. (THE FACT THAT THE DATA IS IN REVERSE SORT ORDER IS BECAUSE C THE LIST ARRAY IS USED WITH THE DBGET CALL.) THEREFORE, C CMP COMPARES FROM THE BOTTOM OF THE LIST ARRAY TO THE TOP. THIS C WILL ASSURE THAT THE SORT IS FROM THE MOST SIGNIFICANT FIELD TO THE C LEAST SIGNIFICANT FIELD. DO NOT GET CONFUSED BECAUSE THE RECORD C IS BEING SORT FROM RIGHT TO LEFT - HOW THE PHYSICAL RECORD IS ARRANGED C IS NOT IMPORTANT, ONLY HOW THE SORT FIELDS ARE SORTED. C C CALLING SEQUENCE: C C CALL CMP(LIST,ABUF,BBUF) C C WHERE: C C ABUF C IS A DATA BUFFER WHICH CORRESPONDS TO THE LIST ARRAY C C BBUF C IS A DATA BUFFER WHICH CORRESPONDS TO THE LIST ARRAY C C LIST C IS DESCRIBED ABOVE C C C ON EXIT: C C CMP IS LESS THAN ZERO WHEN ABUF .LT. BBUF C IS ZERO WHEN ABUF .EQ. BBUF C IS GREATER THAN WHEN ABUF .GT. BBUF C C C IF(CMP(LIST,ABUF,BBUF)) <,=,> C C C C C INTEGER L,I,IA,IB,ITEM REAL A,B INTEGER R C C C C C DATA INTGR/111B/ DATA R/122B/ C C C C C C C C C C BEGIN C DO 70 ITEM = LIST(1,6)+1,2,-1 C C GET ITEM TYPE C ITYPE = LIST(ITEM,2) C C GET BYTE OFFSET C I = LIST(ITEM,5) C C GET END OF ITEM C L = I + LIST(ITEM,3) - 1 C C PROCESS INTEGERS C IF(ITYPE .NE. INTGR) GOTO 35 I = (I+1)/2 IA=ABUF(I) IB = BBUF(I) C C THIS IS A KLUDGE BECAUSE FORTRAN CANNOT HANDLE COMPARISONS C OF VERY LARGE AND VERY SMALL INTEGERS. (IE, 100000B AND 000001B) C IF(IA) 10,20,20 10 IF(IB) 30,80,80 20 IF(IB) 90,30,30 30 IF(IA-IB) 80,70,90 C C PROCESS REALS C 35 CONTINUE IF(ITYPE .NE. R) GOTO 65 CALL SMOVE(ABUF,I,L,A,1) CALL SMOVE(BBUF,I,L,B,1) C C KLUDGE TO HANDLE REALS FOR THE SAME REASON AS ABOVE C IF(A) 40,50,50 40 IF(B) 60,80,80 50 IF(B) 90,60,60 60 IF(A-B) 80,70,90 C C PROCESS STRINGS C 65 CONTINUE IF(JSCOM(ABUF,I,L,BBUF,I,IERR)) 80,70,90 70 CONTINUE C C C EQUAL C C CMP = 0 GOTO 100 C C C LESS THAN C C 80 CONTINUE CMP = -1 GOTO 100 C C C GREATER THAN C C 90 CONTINUE CMP = 1 C C C EXIT C C 100 CONTINUE RETURN END