C++*********************************************************************
C
C SORTDOC                                 FILE NAMES LENGTHENED FEB 89 al
C
C **********************************************************************
C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM.   AUTHOR: J.FRANK  *
C=* Copyright (C) 1985-2005  Health Research Inc.                      *
C=*                                                                    *
C=* HEALTH RESEARCH INCORPORATED (HRI),                                *   
C=* ONE UNIVERSITY PLACE, RENSSELAER, NY 12144-3455.                   *
C=*                                                                    *
C=* Email:  spider@wadsworth.org                                       *
C=*                                                                    *
C=* This program is free software; you can redistribute it and/or      *
C=* modify it under the terms of the GNU General Public License as     *
C=* published by the Free Software Foundation; either version 2 of the *
C=* License, or (at your option) any later version.                    *
C=*                                                                    *
C=* This program is distributed in the hope that it will be useful,    *
C=* but WITHOUT ANY WARRANTY; without even the implied warranty of     *
C=* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  *
C=* General Public License for more details.                           *
C=*                                                                    *
C=* You should have received a copy of the GNU General Public License  *
C=* along with this program; if not, write to the                      *
C=* Free Software Foundation, Inc.,                                    *
C=* 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.      *
C=*                                                                    *
C **********************************************************************
C
C SORTDOC(MAXDIM)
C
C PURPOSE:              SORTS A DOC FILE,  SOLICITS DOC FILE NAME FOR
C                       INPUT AND OUTPUT
C
C PARAMETERS:           MAXDIM             UNUSED
C
C CALLS:                UNSDAL
C
C--*********************************************************************

        SUBROUTINE SORTDOC(MAXDIM)


	COMMON /UNITS/LUN,NIN,NOUT,NECHO,IFOUND,NPROC,NDAT

        CHARACTER *4     DATEXC,PRJEXC
        COMMON /MASTER1/ DATEXC,PRJEXC,CDAT,CTIM,CTIT

C	MEMORY LAYOUT
C	                     P1 = 1
C	   QBUF(P1):	P1 - P2 = P1 + MAXKEY*(NREG+1) 
C			READ IN THE DATA FROM DOC FILE
C          QBUF(P2):	P2 - P3 = P2 + MAXKEY
C			ORIGINAL KEYS OF THE SORTED COLUMN
C	   QBUF(P3):	P3 - P4 = P3 + MAXKEY
C			SORT THIS COLUMN1
C	   QBUF(P4):	P4 - P5 = P4 + MAXKEY
C			COPY THIS COLUMN2 as sorted by column1
C	   QBUF(P5):	P5 - P6 = P5 + MAXKEY
C			COPY THIS COLUMN3 as sorted by column1
C	   P6: MAX SIZE OF MEMORY NEEDED.
C
	COMMON PLIST(10),QBUF(1)

        CHARACTER *81 DOCF1
	INTEGER P1,P2,P3,P4,P5,KEY0,BIGKEY,IGOGO
        CHARACTER     NULL
	EQUIVALENCE (IGOGO,GOGO)

        DATA  NDOC/23/

	NULL=CHAR(0)
	NOPEN=0

3333	CALL FILERD(DOCF1,NLET,DATEXC,'SOURCE DOCUMENT',IRTFLG)
	IF(IRTFLG .NE. 0) GOTO 3333

3334    CALL RDPRMI(KEY1,KEY2,NOT_USED,'FIRST, LAST KEY NUMBER')
	IF(KEY1 .GT. KEY2) THEN
	   WRITE(NOUT,*) 'KEY1 ',KEY1,' GREATER THAN KEY2 ',KEY2 
	   GOTO 3334
	END IF
	
3335    CALL RDPRMI(ICOL,IDUM,NOT_USED,'COLUMN # USED FOR SORTING')

        WRITE(NOUT,100)
100     FORMAT(' THE OUTPUT DOCFILE WILL HAVE THE FORMAT:'/
     &         ' NEWKEY, 4 OLDKEY, X USED FOR SORTING,COL.2,COL.3')

	CALL RDPRMI
     &      (ICL1,ICL2,NOT_USED,'INPUT COLUMN # FOR COL.2, COL.3')
     


C	NREG: NUMBER OF COLUMNS TO BE READ FROM THE DOC FILE.
        IR1    = MAX0(ICL1,ICL2)
	NREG   = MAX0(IR1,ICOL)
	MAXKEY = KEY2
	
	P1 = 1
        P2 = P1 + MAXKEY * (NREG+1)
        P3 = P2 + MAXKEY
        P4 = P3 + MAXKEY
        P5 = P4 + MAXKEY
        P6 = P5 + MAXKEY
	IF (P6 .GT. MAXDIM) THEN
	     WRITE(NOUT,422) P6
422	     FORMAT('SORTDOC: NOT ENOUGH MEMORY. MIN NEEDED ',I10)
	     GOTO 12	
	END IF 
	
        ILINE=0 	
        DO I=KEY1,KEY2
C	  WARNING: TO SAVE MEMORY, I AM RETRIEVING ONLY
C	          THE DATA COLUMNS NEEDED.(NOT ALL OF THEM)

          CALL UNSDAL(DOCF1,NOPEN,NDOC,I,PLIST,NREG,
     &                QBUF(P1),MAXKEY,NREG+1,KEY0,LERR)
          IF (LERR .NE. 0) THEN
	     WRITE(NOUT,410) DOCF1
410          FORMAT ('SORTDOC: ERROR READING DOCUMENT FILE  ',A80)
	     GOTO 12
	  END IF
          ILINE = ILINE + 1
	  IGOGO = I
          QBUF(P2+ILINE-1) = GOGO 
          QBUF(P3+ILINE-1) = PLIST(ICOL) 
          QBUF(P4+ILINE-1) = PLIST(ICL1) 
          QBUF(P5+ILINE-1) = PLIST(ICL2)



        ENDDO

11      CLOSE(NDOC)

	CALL SORTZ(QBUF(P3),QBUF(P4),QBUF(P5),QBUF(P2),ILINE)
	
        NOPEN=0
        DO I = 1,ILINE
           PLIST(1) = I 
	   GOGO = QBUF(P2+I-1)
           PLIST(2) = IGOGO
           PLIST(3) = QBUF(P3+I-1) 
           PLIST(4) = QBUF(P4+I-1) 
           PLIST(5) = QBUF(P5+I-1) 
           CALL SAVD(NDOC,PLIST,5,IRTFLG)
           NOPEN=1
        END DO


        CALL SAVDC
12      CLOSE (NDOC)
	END

