SUBROUTINE SMERGE(NFILES,INP,NI,ISIZE,KEY,ICMP) IMPLICIT INTEGER (A-Z) C CC CC SORT-MERGE PACKAGE CC WRITTEN BY MIKE HIGGINS CC CETUS CORPORATION CC CC CC PARAMETERS: CC CC NFILES: YOU MUST SET THIS VARIABLE TO ZERO THE FIRST TIME CC THAT YOU CALL SMERGE SO HE CAN SET UP FOR SUCCESSIVE CC MERGES. (DON'T USE A LITERAL ZERO!!!!!) THE LUN OF CC THE LAST WRITTEN OUPUT FILE IS IS ALWAYS RETURNED CC IN THIS PARAMETER. THE FILE IS RETURNED REWOUND AND OPEN CC READY TO BE READ. TO KEEP YOUR DISK CLEAN, AND TO FRRE CC UP THE LUN FOR THE NEXT SMERGE, YOU SHOULD CALL DELETE CC WITH THIS LUN AS SOON AS YOU ARE DONE READING CC THE SORTED FILE. CC CC INP: THE NAME OF THE ARRAY THAT CONTAINS THE NEXT CC CORE RESIDENT BLOCK OF ELEMENTS TO BE SORTED CC CC NI: THE SIZE OF A SINGLE ELEMENT IN THE INP ARRAY CC IN WORDS. (THAT'S RIGHT, YOU MUST USE WHOLE CC WORDS!!!!) CC CC ISIZE: THE NUMBER OF ELEMENTS IN THE INP ARRAY. THESE CC TWO PARAMETERS ARE EFFECTIVELY THE DIMENSIONS CC OF THE INP ARRAY, THUSLY: INP(NI,ISIZE) CC CC KEY: THE NAME OF AN INTEGER ARRAY FOR SMERGE TO CC STORE THE SORT KEYS IN. ON RETURNING FROM CC SMERGE, THIS ARRAY WILL CONTAIN NO INFORMATION CC USEFULL TO YOU. MAKE SURE THAT KEY IS CC DIMENSIONED TO AT LEAST ISIZE WORDS. CC CC ICMP: THE NAME OF AN INTEGER FUNCTION (DECLARED CC EXTERNAL IN YOUR CALLING PROGRAMS OR ELSE!) CC THAT DOES THE COMPARING. THIS SUBROUTINE MUST CC RETURN A NEGATIVE NUMBER FOR LESS THAN, A ZERO CC FOR EQUALS, OR A POSITIVE NUMBER FOR GREATER CC THAN CC INTEGER INP(NI,ISIZE),KEY(ISIZE) CC CC SMERGE CAN ONLY SORT DATA WITH ELEMENTS OF LENGN 132 CC CHARACTERS PRESENTLY. IF YOU WISH TO INCREASE THIS, CC YOU MUST INCREASE THE DIMENTION OF INTERNAL ARRAY CC BUF. (NOTE-- BUF IS DIMENSIONED IN WORDS) CC INTEGER BUF(100) EXTERNAL ICMP CC CC SMERGE USES LUN'S SCRAT1 AND SCRAT2 FOR ALL SORTING. IF THIS IS CC NOT ACCEPTABLE, YOU CAN DEFINE THE FOLLOWING COMMONS CC IN YOUR MAIN PROGRAM AND SET THEM TO OTHER VALUES. CC NOTE THAT SMERGE ALWAYS KEEPS ONE OF THE LUNS OPEN, AND CC JUGGLES THE VALUES IN COMMON SO THAT THE CC UNUSED ONE IS ALWAYS IN SCRAT2. YOU MAY USE THIS LUN CC BETWEEN SMERGE CALLS ONLY IF YOU USE IT BY CC IT'S SYMBOLIC NAME AND MAKE SURE IT IS CLOSED BEFORE CC THE NEXT CALL TO SMERGE. CC **********IF YOU GET AN ILLEGAL LUN ERROR IN SMERGE, IT MAY CC **********BE NECC. TO CALL BATDEF() IN YOUR MAIN PROGRAM. CC **********BATDEF IS A 'BLOCK DATA SUBROGRAM' OF SORTS, AND THE CC **********CALL TO IT IS ONLY TO ASSURE THAT IT IS TASKBUILT CC **********INTO YOUR INTO YOUR PROGRAM SO THAT IT CAN DEFINE THE VALUES OF CC **********YOUR LUNS. IF YOU CALL A DATABASE ROUTINE, FOR EXAMPLE, CC **********BATDEF WILL AUTOMATICLY BE INCLUDED WITHOUT SPECIAL CALLS. CC COMMON /SCRAT1/OLDF COMMON /SCRAT2/NEWF C C RETURN IMMEDIATELY IF THERE IS NOTHING TO SORT IF (ISIZE .EQ. 0) RETURN C C INITALIZE THE KEY ARRAY, AND DO THE SORTING C DO 10 I=1,ISIZE 10 KEY(I)=I CALL KSORT(INP,NI,ISIZE,KEY,ICMP) IP=1 KY=KEY(IP) C C IF THIS IS THE FIRST CALL TO SMERGE, C JUST DUMP THE CORE ARRAY IN A SORTMERGE FILE C IF (NFILES .GT. 0) GOTO 230 DO 210 I=1,ISIZE KY=KEY(I) 210 WRITE(NEWF)(INP(J,KY),J=1,NI) GOTO 993 C C READ THE NEXT ELEMENT OFF OF THE INPUT FILE C 230 READ(OLDF,END=991)(BUF(J),J=1,NI) C C COMPARE THE INPUT FILE BUFFER WITH THE CORE C RESEDENT ELEMENT C 240 IF (ICMP(INP(1,KY),BUF) .LT. 0) GOTO 270 C C WRITE OUT THE INPUT FILE BUFFER C 260 WRITE(NEWF)(BUF(J),J=1,NI) GOTO 230 C C WRITE OUT THE ELEMENT IN CORE C 270 WRITE(NEWF)(INP(I,KY),I=1,NI) IP=IP+1 KY=KEY(IP) C C HAVE I EXAUSTED THE CORE ELEMENTS? C IF (IP .LE. ISIZE ) GOTO 240 C C YES, SO DUMP THE REST OF THE INPUT FILE ONTO C THE OUTPUT SORTMERGE FILE C 280 WRITE(NEWF)(BUF(J),J=1,NI) READ(OLDF,END=992)(BUF(J),J=1,NI) GOTO 280 C C WHEN THE INPUT FILE IS EXHAUSTED FIRST, DUMP THE C CORE RESIDENT ELEMENTS ONTO THE OUTPUT SORTMERGE FILE C 991 DO 290 I=IP,ISIZE 290 WRITE(NEWF)(INP(J,KEY(I)),J=1,NI) C C NOW CLOSE ALL THE FILES AND GENERALY CLEAN THINGS UP C BEFORE YOU RETURN C 992 CALL DELETE(OLDF) C C SWAP LUN'S FOR THE NEXT SORT C 993 REWIND NEWF NFILES=NEWF NEWF=OLDF OLDF=NFILES RETURN END