C C C S Y M S R T C C SYMBOL TABLE SORT ROUTINE C C THIS ROUTINE IS CALLED BEFORE PASS 2 TO SORT THE USERS SYMBOL TABLE C INTO ASCENDING ORDER. THIS IS DONE TO SPEED SYMBOL TABLE SEARCHES C DURING PASS 2 AND ALSO TO PREPARE THE SYMBOL TABLE FOR OUTPUT AFTER C THE ASSEMBLY. AN EXCHANGE SORT TECHNIQUE ( ALSO CALLED A BUBBLE OR C SINKING SORT ) IS USED. THE ALGORITHM FOR THE SORT IS AS FOLLOWS: C C A1: COMPARE THE FIRST AND SECOND ENTRIES. IF OUT OF ORDER THEN C EXCHANGE THE 2 ENTRIES. C A2: COMPARE THE SECOND AND THIRD ENTRIES. IF OUT OF ORDER THEN C EXCHANGE THE 2 ENTRIES. C A3: CONTINUE COMPARING PAIRS, AND EXCHANGING IF NECESSARY UNTIL C ALL ENTRIES HAVE BEEN CHECKED. C A4: THIS PROCEDURE WILL MOVE THE LARGEST ENTRY TO THE BOTTOM OF C THE TABLE SO SET THE BOTTOM INDEX TO 1 LESS AND GO TO STEP C A1. WHEN THE BOTTOM INDEX IS EQUAL TO THE FIRST THE SORT IS C FINISHED. C C NOTE: C THE ABOVE ALGORITHM IS INEFFICIENT SINCE N PASSES (N = NUMBER OF C ITEMS IN THE TABLE ) WILL BE MADE EVEN IF THE FILE IS ALREADY IN C SORTED ORDER. TO IMPROVE THE ALGORITHM A SWITCH IS RESET AT THE C BEGINNING OF EACH PASS. IF AN EXCHANGE IS MADE THE SWITCH IS SET C AT THE END OF EACH PASS THE SWITCH IS CHECKED, IF IT IS SET THEN C AT LEAST ONE EXCHANGE WAS MADE SO ANOTHER PASS IS REQUIRED. IF C THE SWITCH IS STILL RESET AT THE END OF A PASS THEN NO EXCHANGES C WHERE MADE AND THE FILE IS IN SORTED ORDER. C C IF A PAIR OF SYMBOL TABLE ENTRIES ARE EXCHANGED THEIR VALUES AND C FLAGS MUST ALSO BE EXCHANGED. C C THE CALLING SEQUENCE IS: C C CALL SYMSRT C C THE ROUTINE WILL SORT THE INTEGER ARRAY SYMTAB INTO ASCENDING ORDER C EACH ENTRY IN SYMTAB IS 16 BYTES IN LENGTH. THE CORRESPONDING SYMBOL C VALUE AND FLAGS ( THE INTEGER ARRAYS SYMVAL AND SYMFLG RESPECTIVLY) C ARE ALSO EXCHANGED WHEN SYMTAB ENTRIES ARE EXCHANGED. THESE 3 ARRAYS C ARE IN THE LABELED COMMON BLOCK USRSYM . C C SUBROUTINE SYMSRT INCLUDE 'IODEVS.CMN' COMMON /USRSYM/ SYMTAB, SYMVAL, SYMFLG, SYMNUM,SYMMAX INTEGER SYMFLG(1000), SYMNUM,SYMMAX INTEGER*4 SYMVAL(1000), ITEMP2 BYTE SYMTAB(16,1000) , ITEMP IF ( SYMNUM .LE. 1 ) RETURN !NO USE SORTING 1 SYMBOL LIMUP = SYMNUM - 1 D WRITE (5,1) LIMUP D 1 FORMAT (' SYMSRT START, ',I6,' POSSIBLE PASSES') 10 CONTINUE !LOOP FOR N PASSES THROUGH TAB. IFIRST = 0 ISWTCH = 0 DO 100 K = 1, LIMUP !LOOP FOR 1 PASS THROUGH TABLE IFIRST = IFIRST + 1 ISECND = IFIRST + 1 DO 20 I = 1,16 !COMPARE TO IF ( SYMTAB(I,IFIRST) .LT. SYMTAB(I,ISECND) ) GO TO 100 IF ( SYMTAB(I,IFIRST) .GT. SYMTAB(I,ISECND) ) GO TO 25 20 CONTINUE ! .LE. GO TO 100 25 CONTINUE ! .GT. DO 30 I = 1,16 !SO SWAP ITEMS ITEMP = SYMTAB(I,IFIRST) SYMTAB(I,IFIRST) = SYMTAB(I,ISECND) SYMTAB(I,ISECND) = ITEMP 30 CONTINUE ITEMP2 = SYMVAL(IFIRST) !SWAP SYMBOLS VALUES SYMVAL(IFIRST) = SYMVAL(ISECND) SYMVAL(ISECND) = ITEMP2 ITEMP3 = SYMFLG(IFIRST) !SWAP SYMBOLS FLAGS SYMFLG(IFIRST) = SYMFLG(ISECND) SYMFLG(ISECND) = ITEMP3 ISWTCH = -1 100 CONTINUE LIMUP = LIMUP - 1 IF ( ISWTCH .EQ. 0 ) GO TO 200 !? NO SWAPS MADE ? IF ( LIMUP .LT. 1 ) GO TO 200 !? ENOUGH PASSES DONE? C C NO C GO TO 10 200 CONTINUE IF (XRFUNT.LE.0) GO TO 210 DO 205 I=1,SYMNUM 205 WRITE (XRFUNT'I) 0,0 NEXTRC = SYMNUM+1 210 CONTINUE D WRITE (5,2) LIMUP D 2 FORMAT (' SYMSRT ENDS WITH ',I6,' PASSES LEFT') RETURN END