home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / fortran / tidy64.zip / TIDY.FOR < prev    next >
Text File  |  1994-02-05  |  167KB  |  5,433 lines

  1.       PROGRAM TIDY
  2. C
  3. C     ==================================================================
  4. C     *                                                                *
  5. C     *                    * * *   T I D Y   * * *                     *
  6. C     *                                                                *
  7. C     *      A FORTRAN PROGRAM TO RENUMBER AND OTHERWISE CLEAN UP      *
  8. C     *             OLD AND TIRED FORTRAN SOURCE PROGRAMS.             *
  9. C     *                                                                *
  10. C     *                   IN ADDITION TO RENUMBERING,                  *
  11. C     *             TIDY PROVIDES A LIMITED SET OF FORTRAN             *
  12. C     *                          DIAGNOSTICS.                          *
  13. C     *                                                                *
  14. C     *                 ANSI FORTRAN  (ANSI X3.9-1978)                 *
  15. C     *                                                                *
  16. C     *                                                                *
  17. C     *       CONVERTED TO IBM (RYAN-McFARLAND) PROFESSIONAL FORTRAN   *
  18. C     *       BY AL STANGENBERGER, DEPT. OF FORESTRY, U.C. BERKELEY    *
  19. C     *                                                                *
  20. C     ==================================================================
  21. C
  22. C      Copyright (C) 1989, The Regents of the University of California
  23. C                          All Rights Reserved
  24. C
  25. C      THE REGENTS OF THE UNIVERSITY OF CALIFORNIA MAKE NO REPRESENTA-
  26. C      TION OR WARRANTIES WITH RESPECT TO THE CONTENTS HEREOF AND
  27. C      SPECIFICALLY DISCLAIM ANY IMPLIED WARRANTIES OF MERCHANTABILITY
  28. C      OR FITNESS FOR ANY PARTICULAR PURPOSE.
  29. C
  30. C      Further, the Regents of the University of California reserve the
  31. C      right to revise this software and/or documentation and to make
  32. C      changes from time to time in the content hereof without obliga-
  33. C      tion of the Regents of the University of California to notify
  34. C      any person of such revision or change.
  35. C
  36. C      PERMISSION TO COPY AND DISTRIBUTE THIS PROGRAM, AND TO MAKE
  37. C      DERIVATIVE WORKS HEREFROM, IS GRANTED PROVIDED THAT THIS COPY-
  38. C      RIGHT NOTICE IS RETAINED IN ALL SOURCE CODE AND USER MANUALS.
  39. C
  40. C     ==================================================================
  41. C     *                                                                *
  42. C     *                   **************************                   *
  43. C     *                  *         PROGRAM          *                  *
  44. C     *                 *     AND SUBROUTINES BY     *                 *
  45. C     *                *        HARRY M MURPHY        *                *
  46. C     *               *  AIR FORCE WEAPONS LABORATORY  *               *
  47. C     *                *   KIRTLAND AIR FORCE BASE    *                *
  48. C     *                 *         NEW MEXICO         *                 *
  49. C     *                  *         1 9 6 6          *                  *
  50. C     *                   **************************                   *
  51. C     *                                                                *
  52. C     *       TIDY ACCEPTS ASA FORTRAN WITH 19 CONTINUATION CARDS      *
  53. C     *     AS WELL AS SOME IBM AND CDC DIALECT FORTRAN STATEMENTS     *
  54. C     *                                                                *
  55. C     *       THIS VERSION MODIFIED FOR USE AT LRL BERKELEY BY         *
  56. C     *       GERRY TOOL (1967). (STILL CDC/6600)                      *
  57. C     *                                                                *
  58. C     *      THIS PROGRAM HAS BEEN REVISED FOR IBM 360/67 BY ALICE     *
  59. C     *      V BARLOW, NASA AMES, SUMMER 1972                          *
  60. C     *                                                                *
  61. C     *       ADDITIONS AND REWORKING BY ROGER CHAFFEE, LRL BERKELEY   *
  62. C     *       AND SLAC COMPUTATIONS RESEARCH GROUP, 1968-1982          *
  63. C     ==================================================================
  64. C
  65. C
  66. C  INPUT/OUTPUT
  67. C     FUNCTION          FORTRAN UNIT   CURRENT VALUE
  68. C      CONSOLE OUTPUT     STDERR            0
  69. C      CONSOLE INPUT      STDIN             0  (5 for UNIX systems)
  70. C      CONTROL CARD       USRFIL            3
  71. C      INPUT              INFILE            4
  72. C      LIST OUTPUT        OUTFIL            6
  73. C      CARD OUTPUT        PUNFIL            8
  74. C      SCRATCH(NORMAL)    SCFIL1            1
  75. C      SCRATCH(FORMATS)   SCFIL2            2
  76. C      SCRATCH(COMMENTS)  SCFIL3            9
  77. C
  78. C     *****************************************************************
  79. C     I N S T A L L A T I O N   N O T E S
  80. C
  81. C     1.  INCLUDE statements are used to incorporate common block
  82. C         definitions into most subroutines.  Check syntax as these
  83. C         statements are system-dependent.
  84. C
  85. C     2.  CHARACTER SET SPECIFICITY -
  86. C         The code for horizontal tab differs in EBCDIC and ASCII.
  87. C         This value is set (KTAB) in this routine. Fix as needed.
  88. C
  89. C     3.  Interactive file opening:  Subroutine PCTIDY interactively
  90. C         opens all data and scratch files by calling subroutine OPFIL.
  91. C         This routine was written for the IBM (Ryan-McFarland)
  92. C         Professional Fortran compiler, and may not work with other
  93. C         compilers (it does work with f77 on 4.3 BSD UNIX).
  94. C
  95. C         Subroutine OPFIL uses function DOSDEV to determine if a file
  96. C         name is that of a MS-DOS reserved device.  Non MS-DOS systems
  97. C         should delete the call to DOSDEV in subroutine OPFIL.
  98. C
  99. C         The entire interactive part of the program can be deleted
  100. C         if not appropriate for your operating system.
  101. C         Delete the call to PCTIDY below, and also delete subroutines
  102. C         PCTIDY, OPFIL, and DOSDEV.
  103. C
  104. C         Aside from these factors, the rest of the program is
  105. C         fairly standard Fortran-77.
  106. C
  107. C
  108. C     NOTES:
  109. C
  110. C     IN SUBROUTINE HOLSCN, HOLLERITH CHARACTERS ARE CHANGED
  111. C     SO THEY WON-T BE RECOGNIZED BY ANY OTHER TEST BY
  112. C     CHANGING SECOND CHARACTER TO '@'
  113. C
  114. C     SUBROUTINES HOLSCN AND CONTRL INVOKE FUNCTION KUPPER TO CONVERT
  115. C     LOWER-CASE ALPHABETIC CHARACTERS TO UPPER CASE (EXCEPT FOR
  116. C     HOLLERITH STRINGS).
  117. C
  118. C     THE CHARACTER $ IS TREATED AS AN ALPHA IN IBM FORTRAN.
  119. C     THE DATA STATEMENT FOR THE SPECIAL CHARACTERS, KSPK, HAS
  120. C     BEEN CHANGED SO THAT $ IS NOT RECOGNIZED AS A SPECIAL
  121. C     CHARACTER.  THIS DATA STATEMENT SHOULD BE CHANGED BACK
  122. C     ON NON-IBM SYSTEMS.
  123. C
  124. C     SUBROUTINE REDSTR IS SET UP TO ACCOMMODATE AN APPARENT BUG
  125. C     IN THE RYAN-MCFARLAND PROFESSIONAL FORTRAN COMPILER, THAT
  126. C     UNFORMATTED SEQUENTIAL RECORDS SEEM TO BE LIMITED TO 1024 BYTES.
  127. C     SINCE EACH RECORD HAS A 4-BYTE HEADER AND TRAILER, WRITES 508
  128. C     CHARACTER*2 ELEMENTS, OR 254 INTEGER*4 PER RECORD.  THIS MAY
  129. C     VARY FOR OTHER COMPILERS.
  130. C
  131. C
  132. C  INTERNAL FLAGS (JUST A LIST.  WHERE ELSE TO PUT IT...)
  133. C     MANSI =  0 FLAG ALL NON-ANSI (FORTRAN-77) STATEMENTS
  134. C           =  1 DO NOT FLAG NON-ANSI STATEMENTS
  135. C     MP2   =  1 DO PASS2
  136. C           =  0 NO PASS 2
  137. C     MCOL  = -1 COLLECT FORMAT STATEMENTS AT END
  138. C           =  0 LEAVE THEM IN PLACE
  139. C     MILDO = -1 IF DO-TERMINATOR ALLOWED BUT NON-STANDARD
  140. C           =  0 IF DO-TERMINATOR ALLOWED
  141. C           = +1 IF DO-TERMINATOR FORBIDDEN
  142. C     MCONT =  0 REMOVE CONTINUE CARDS AND DOUBLE BRANCHES
  143. C           =  1 LEAVE THEM
  144. C     MTRAN = -1 CURRENT CARD IS AN UNCONDITIONAL BRANCH
  145. C           =  0 CURRENT CARD NOT NECESSARILY A BRANCH
  146. C     NTRAN =    SAME AS MTRAN, BUT REFERS TO PREVIOUS CARD
  147. C     MLGC  = -1 NORMAL STATEMENT
  148. C           =  0 STATEMENT IS CONTROLLED BY A LOGICAL IF
  149. C     MRIT  =  N LEFT ADJUST TO COLUMN N
  150. C           = -N RIGHT ADJUST TO COLUMN N
  151. C     MDEB  =  0 *NODEBUG
  152. C           =  1 *DEBUG
  153. C     KD15  =    STATEMENT INCREMENT (*STAT=...)
  154. C     KB15  =    STATEMENT BASE (*BASE=...)
  155. C     MPUN  =  0 NO PUNCH OUTPUT
  156. C           =  1 MAKE PUNCH OUTPUT
  157. C     KPUN       SAVES *CARD/*NOCARD (1/0) FOR MPUN VALUE
  158. C     MLIST = -1 (*LIST) LIST PASS 1
  159. C           =  0 (*NOLIST) DONT
  160. C     KPRIN =  1 (*LIST=2) LIST PASS 2
  161. C           =  0 (*NOLIST=2) DONT
  162. C     MPRIN =    KPRIN AT START OF ROUTINE. MAY CHANGE IF ERROR
  163. C                  AT START OF PASS1.
  164. C     KOUNT      COUNTS CARDS IN FOR CURRENT ROUTINE.
  165. C     IQUIT =  0 UNTIL INPUT ENDFILE IS FOUND IN READER.
  166. C           =  1 THEREAFTER
  167. C     MSTOP =  0 NORMALLY
  168. C           = -1 FOR *STOP CARD FOUND--TIME TO FINISH UP
  169. C           =  1 FOR STOP NOW.
  170. C
  171. C
  172. C     ******************************************************************
  173. C
  174.       INCLUDE 'TIDY.INC'
  175.       INCLUDE 'UNITS.INC'
  176.       LOGICAL DOUSER,SCDISK
  177.       COMMON/TDYVER/VERNUM
  178.       CHARACTER*30 VERNUM
  179. C
  180.       DOUSER=.TRUE.
  181. C
  182. C     SCDISK .TRUE. ALLOWS USER TO SPECIFY DISK TO HOLD SCRATCH FILES.
  183. C          FOR UNIX SYSTEMS, SHOULD SET TO .FALSE.
  184.       SCDISK=.TRUE.
  185. C
  186. C     VALUE FOR TAB AS ASCII
  187.       KTAB = KBL
  188.       KTAB(1:1)=CHAR(9)
  189. C     VALUE FOR TAB AS EBCDIC
  190. C     KTAB(1:1)=CHAR(5)
  191. C
  192. C     FOR NON-INTERACTIVE USE, DELETE CALL TO PCTIDY
  193.       CALL PCTIDY (DOUSER,SCDISK)
  194. C
  195. C     INITIALIZE PROGRAM
  196.       CALL INITDY
  197. C     ADJUST ROUTINE NUMBER - PASS1 WILL INCREMENT IT.
  198.       NROUT = NROUT-1
  199. C
  200. C     PROCESS USER CONTROL CARD FILE.
  201.       IF (DOUSER) CALL USRCON
  202. C
  203.       CALL READER
  204.  10   CALL PASS1
  205.       IF (MSTOP.NE.0) THEN
  206.          IF (MSTOP.GT.0) GO TO 20
  207.          IF (KOUNT.LE.0) GO TO 20
  208.       ENDIF
  209.       CALL EDIT
  210.       IF (MP2.EQ.0) GO TO 10
  211.       IF (MREF.NE.0) CALL RDIR
  212.       CALL PASS2
  213.       IF (IQUIT.NE.0) GO TO 20
  214.       IF (MSTOP.EQ.0) GO TO 10
  215. C                            ALL DONE
  216.  20   CALL IOSY11
  217.       CALL IOSY21
  218.       IF (NMSG.GT.0) THEN
  219.             WRITE (OUTFIL,60) NMSG
  220.       ELSE
  221.             WRITE (OUTFIL,70)
  222.       ENDIF
  223.       WRITE (OUTFIL,80) NPUN, VERNUM
  224.       LEVEL = LERR
  225.       IF (LEVEL.GE.2) STOP 8
  226.       IF (LEVEL.EQ.1) STOP 4
  227.       IF (MDEB.EQ.0) THEN
  228.            CLOSE (SCFIL1,STATUS='DELETE')
  229.            CLOSE (SCFIL2,STATUS='DELETE')
  230.       END IF
  231.       STOP
  232. C
  233.  60   FORMAT ( '0W A R N I N G .',I5,  ' DIAGNOSTIC MESSAGES HAVE BEEN G
  234.      1ENERATED IN THIS TIDY RUN.')
  235.  70   FORMAT (  '0NO DIAGNOSTIC MESSAGES WERE GENERATED DURING THIS TIDY
  236.      1 RUN.')
  237.  80   FORMAT ('0',I5, ' CARDS WERE PUNCHED.'/  '0',A/'1')
  238.       END
  239.       BLOCK DATA MISDAT
  240. C
  241. C     THIS BLOCK DATA CONTAINS MISCELLANEOUS DATA STATEMENTS FOR TIDY.
  242. C
  243. C     VERSION 6.2 MODIFICATION -----------------------------------------
  244. C     VARIABLES WHICH ARE CONTROLLED BY SUBROUTINE CONTRL ARE SET IN
  245. C     SUBROUTINE INITDY.
  246. C
  247.       INCLUDE 'TIDY.INC'
  248.       INCLUDE 'UNITS.INC'
  249.       COMMON/TDYVER/VERNUM
  250.       CHARACTER*30 VERNUM
  251. C
  252. C     /ALPHA/
  253.       DATA KBL,KDIG/' ','0','1','2','3','4','5','6','7','8','9'/
  254.       DATA KABC/'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
  255.      1'O','P','Q','R','S','T','U','V','W','X','Y','Z'/
  256.       DATA KSPK/'=', ',', '(', '/', ')', '+', '-', '*', '.', 'X$', '-',
  257.      1'''', '&', '$'/
  258. C  $ IN ABOVE STATEMENT REPLACED BY X$, SINCE $ IS NOT SPECIAL
  259. C  CHARACTER IN IBM 360/370 FORTRAN.
  260.       DATA KBL2, KLR2, KLP2, KRP2, KERM/' *', '$$', '((', '))', ' $'/
  261.       DATA KAMPR /'& '/, KAT /' @'/, KAPSTR/'''@'/
  262. C
  263. C     /MISCAL/
  264.       DATA KEND /'D' ,'N' ,'E'/
  265. C
  266. C
  267. C     /MISC/
  268. C     LOGICAL UNIT ASSIGNMENTS
  269.       DATA INFILE /4/
  270.       DATA OUTFIL /6/
  271.       DATA PUNFIL /8/
  272.       DATA STDERR /0/
  273.       DATA STDIN  /5/
  274.       DATA SCFIL1 /1/
  275.       DATA SCFIL2 /2/
  276.       DATA SCFIL3 /9/
  277.       DATA USRFIL /3/
  278. C
  279.       DATA IQUIT /0/
  280.       DATA KOUNT /0/
  281.       DATA LERR /0/
  282.       DATA LINE /1/
  283.       DATA MDEB /0/
  284.       DATA MSTOP /0/
  285.       DATA MXREF /256/
  286.       DATA MXRGHT /65/
  287.       DATA NMSG /0/
  288.       DATA NPAGE /0/
  289.       DATA NPUN /0/
  290. C
  291. C     VERSION STRING
  292.       DATA VERNUM/'TIDY VER.  6.4  -  FEB 94 ' /
  293.       END
  294.       SUBROUTINE PCTIDY (DOUSER,SCDISK)
  295. C
  296. C     INTERACTIVE FILE DEFINITION ROUTINE FOR TIDY
  297. C
  298.       INCLUDE 'TIDY.INC'
  299.       INCLUDE 'UNITS.INC'
  300.       COMMON/TDYVER/VERNUM
  301.       CHARACTER*30 VERNUM
  302.       CHARACTER DRIVE
  303.       CHARACTER RESP(80)
  304.       CHARACTER*64 FILNM1, FILNM2, FILNM3
  305.       INTEGER DOSDEV, OPFIL
  306.       LOGICAL DOUSER, SCDISK
  307. C
  308.       WRITE (STDERR,25) VERNUM
  309. C
  310.  10   WRITE (STDERR,30)
  311.       READ (STDIN,40) RESP
  312.       I=0
  313.  20   I=I+1
  314.       IF (I.GT.80) GO TO 10
  315.       IF (RESP(I).EQ.' ') GO TO 20
  316.       IF (RESP(I).EQ.'Y'.OR.RESP(I).EQ.'y') THEN
  317.            DOUSER=.TRUE.
  318.       ELSE IF (RESP(I).EQ.'N'.OR.RESP(I).EQ.'n') THEN
  319.            DOUSER=.FALSE.
  320.       ELSE
  321.            GO TO 10
  322.       ENDIF
  323. C
  324. C     OPEN CONTROL FILE
  325.       IF (DOUSER) THEN
  326.            FILNM1=' '
  327.            IOPFL =  OPFIL (USRFIL,FILNM1,0,-1,'control card',LNG)
  328.            ISCONS=DOSDEV(FILNM1)
  329.       END IF
  330. C
  331. C     DEFINE SOURCE, LISTING, AND OUTPUT FILES.
  332.       FILNM1=' '
  333.       IOPFL =  OPFIL (INFILE,FILNM1,0,-1,'source',LNG)
  334.       FILNM1=' '
  335.       IOPFL =  OPFIL (OUTFIL,FILNM1,0,1,'listing',LNG)
  336.       FILNM1=' '
  337.       IOPFL =  OPFIL (PUNFIL,FILNM1,0,1,'punched output',LNG)
  338.       FILNM1=' '
  339. C
  340. C     FOR PC'S, ALLOW USER TO SPECIFY DISK FOR SCRATCH FILES.
  341.       IF (SCDISK) THEN
  342.            WRITE (STDERR,50)
  343.            READ (STDIN,40) DRIVE
  344.            FILNM1=DRIVE//':SCFIL1.TDY'
  345.            FILNM2=DRIVE//':SCFIL2.TDY'
  346.            FILNM3=DRIVE//':SCFIL3.TDY'
  347.       ELSE
  348.            FILNM1='SCFIL1.TDY'
  349.            FILNM2='SCFIL2.TDY'
  350.            FILNM3='SCFIL3.TDY'
  351.       END IF
  352. C
  353. C     OPEN SCRATCH FILES
  354.       IOPFL =  OPFIL (SCFIL1,FILNM1,-1,2,'SCRATCH',LNG)
  355.       IOPFL =  OPFIL (SCFIL2,FILNM2,-1,2,'SCRATCH',LNG)
  356. C     future addition for handling comments in continued statements.
  357. C     IOPFL =  OPFIL (SCFIL3,FILNM3,-1,2,'SCRATCH',LNG)
  358. C
  359. C     PROMPT USER FOR CONTROL CARDS IF CONSOLE INPUT.
  360.       IF (ISCONS.EQ.2) WRITE (STDERR,60)
  361. C
  362.       RETURN
  363. C
  364.  25   FORMAT (1X,A)
  365.  30   FORMAT (' Do you have a CONTROL CARD file? (y-n) ')
  366.  40   FORMAT (80A1)
  367.  50   FORMAT (' ENTER DISK TO USE FOR TEMPORARY FILES: ')
  368.  60   FORMAT (' Enter TIDY control cards.  Type CTRL-Z to stop.')
  369.       END
  370.       SUBROUTINE CONTRL
  371.       PARAMETER (NKTRL=40)
  372. C
  373. C     THIS SUBROUTINE EXECUTES THE TIDY CONTROL STATEMENTS.
  374. C     ALL TIDY CONTROL STATEMENTS MUST HAVE AN * PUNCHED IN COLUMN 1.
  375. C
  376. C     1   BASE   NOBASE   KB15
  377. C     2   IDIN   ======   KD79
  378. C     3   IDST   ======   KD79
  379. C     4   ROUT   ======   NROUT
  380. C     5   STAT   ======   KD15
  381. C     6   CARD   NOCARD   MPUN
  382. C     7   COLL   NOCOLL   MCOL
  383. C     8   COMM   NOCOMM   MCOM
  384. C     9   EXEM   NOEXEM   MEX
  385. C     10  LABE   NOLABE   MLBL
  386. C     11  LAST   ======   MSTOP
  387. C     12  LIST   NOLIST   MLIST
  388. C     13  NEWR   ======   NROUT
  389. C     14  REFE   NOREFE   MREF
  390. C     15  SKIP   ======   MSKP
  391. C     16  STOP   ======   MSTOP
  392. C     17  SERI   NOSERI   MSER  <0 USE KOL73...=0 USE BLANKS >0 SERIAL
  393. C     18  RIGH   ======   MRIT
  394. C     19  LEFT   ======   MRIT
  395. C     20  COLU   NOCOLU   JUST
  396. C     21  INDE   NOINDE   INDENT
  397. C     22  DEBU   NODEBU   MDEB
  398. C     23  CONT   NOCONT   MCONT
  399. C     24  END    ======   SAME AS STOP
  400. C     25  ANSI   NOANSI   MANSI
  401. C     26  FEND   NOFEND   NFEND
  402. C     27  CCHR   ======   KCTCTL
  403. C     28  HTRA   ======   KHTRAN
  404. C     29  DTRA   NODTRA   KDTRAN
  405. C     30  DEL1   ======   KDEL1
  406. C     31  DEL2   ======   KDEL2
  407. C     32  ARET   ======   KALMRK
  408. C     33  ARTR   NOARTR   KALTRN
  409. C     34  BLAN   NOBLAN   KBKCOK (INCLUDE BLANK LINES IN DECK)
  410. C     35  FSPL   NOFSPL   KFSPL  (SPLIT STRINGS IN INDENTED FMTS)
  411. C     36  HLOG   NOHLOG   KHLOG  (LOG TRANSLATED H-FIELDS TO LISTING)
  412. C     37  CASE   NOCASE   MCASE  (TRANSLATE NON-STRINGS TO UPPER CASE)
  413. C     38  UCAS   ======   MCASE  (TRANSLATE NON-STRINGS TO UPPER CASE)
  414. C     39  LCAS   ======   MCASE  (TRANSLATE NON-STRINGS TO LOWER CASE)
  415. C     40  ENDO   NOENDO   MNDOO  (RETAIN END-DO STATEMENTS)
  416. C
  417.       INCLUDE 'TIDY.INC'
  418. C
  419.       COMMON /CONTDY/ KTRL(4,NKTRL)
  420.       CHARACTER*2 KTRL
  421.       CHARACTER*2 KUPPER,IT
  422. C
  423.       I=14
  424.       ISTAR=-1
  425.       JSW=0
  426.       JL=JMAX-1
  427. C
  428. C     SCAN FOR 'NO' AT START
  429.       DO 10 JB=2,JL
  430.            IT=JINT(JB)
  431.            IF (IT.NE.KBL) THEN
  432.                 IT=KUPPER(IT)
  433.                 IF (IT.NE.KABC(I)) THEN
  434.                      JC=2
  435.                      GO TO 30
  436.                 END IF
  437.                 I=I+1
  438.                 IF (I.GT.15) GO TO 20
  439.            END IF
  440. 10    CONTINUE
  441.       ISTAR=1
  442.       RETURN
  443. C
  444. 20    JSW=1
  445.       JC=JB+1
  446. 30    DO 50 J=1,NKTRL
  447.            I=1
  448.            DO 40 JCOL=JC,JMAX
  449.                 IT=KUPPER(JINT(JCOL))
  450.                 IF (IT.EQ.KTRL(I,J)) THEN
  451.                      IF (I.GE.4) GO TO 70
  452.                      I=I+1
  453.                 ELSE
  454.                      IF (IT.NE.KBL) GO TO 50
  455.                 END IF
  456. 40         CONTINUE
  457. 50    CONTINUE
  458. 60    ISTAR=1
  459.       RETURN
  460. C
  461. C     EXECUTE CONTROL STATEMENT
  462. C
  463. 70    NREC=NREC-1
  464. C                  JSW=1 IF CARD STARTS WITH NO
  465.       IF (JSW.EQ.1) THEN
  466.            GO TO (490,60,60,60,60,120,140,210,320,410,60,520,60,450,60,
  467.      1      60,480,60,60,500,510,250,230,60,100,340,60,390,280,60,270,
  468.      2      60,80,160,360,380,190,180,170,300),J
  469.       ELSE
  470.            GO TO (520,520,520,520,520,110,130,200,310,400,420,520,430,
  471.      1      440,460,420,470,520,520,520,520,240,220,420,90,330,520,520,
  472.      2      260,520,520,520,520,150,350,370,170,170,180,290),J
  473.       END IF
  474. C
  475. C                  NOARTRAN
  476. 80    KALTRN=KBL
  477.       RETURN
  478. C                  ANSI
  479. 90    MANSI=0
  480.       RETURN
  481. C                  NOANSI
  482. 100   MANSI=1
  483.       RETURN
  484. C                  CARD
  485. 110   MPUN=-1
  486.       KPUN=-1
  487.       RETURN
  488. C                  NOCARD
  489. 120   MPUN=0
  490.       KPUN=0
  491.       RETURN
  492. C                  COLL
  493. 130   MCOL=-1
  494.       RETURN
  495. C                  NOCOLL
  496. 140   MCOL=0
  497.       RETURN
  498. C                  BLAN
  499. 150   KBKCOK=1
  500.       RETURN
  501. C                  NOBLAN
  502. 160   KBKCOK=0
  503.       RETURN
  504. C                  CASE, UCAS
  505. 170   MCASE=0
  506.       CALL KCTSET (0)
  507.       RETURN
  508. C                  LCASE
  509. 180   MCASE=0
  510.       CALL KCTSET (1)
  511.       RETURN
  512. C                  NOCASE
  513. 190   MCASE=-1
  514.       RETURN
  515. C                  COMM
  516. 200   MCOM=-1
  517.       RETURN
  518. C                  NOCOMM
  519. 210   MCOM=0
  520.       RETURN
  521. C                  CONT
  522. 220   MCONT=1
  523.       RETURN
  524. C                  NOCONT
  525. 230   MCONT=0
  526.       RETURN
  527. C                  DEBUG
  528. 240   MDEB=1
  529.       RETURN
  530. C                  NODEBUG
  531. 250   MDEB=0
  532.       RETURN
  533. C                  DTRAN
  534. 260   KDTRAN=1
  535.       RETURN
  536. C                  NODEL2 -- IMPLIES *NODTRAN
  537. 270   KDEL2='""'
  538. C                  NODTRAN
  539. 280   KDTRAN=0
  540.       RETURN
  541. C                  ENDO
  542. 290   MNDOO=1
  543.       RETURN
  544. C                  NOENDO
  545. 300   MNDOO=0
  546.       RETURN
  547. C                  EXEM
  548. 310   MEX=-1
  549.       RETURN
  550. C                  NOEXEM
  551. 320   MEX=0
  552.       RETURN
  553. C                  FEND
  554. 330   NFEND=0
  555.       RETURN
  556. C                  NOFEND
  557. 340   NFEND=1
  558.       RETURN
  559. C                  FSPL
  560. 350   KFSPL=0
  561.       RETURN
  562. C                  NOFSPL
  563. 360   KFSPL=1
  564.       RETURN
  565. C                  HLOG
  566. 370   KHLOG=0
  567.       RETURN
  568. C                  NOHLOG
  569. 380   KHLOG=1
  570.       RETURN
  571. C                  NOHTRAN
  572. 390   KHTRAN=0
  573.       RETURN
  574. C                  LABE
  575. 400   MLBL=-1
  576.       RETURN
  577. C                  NOLABE
  578. 410   MLBL=0
  579.       RETURN
  580. C                  LAST/STOP
  581. 420   MSTOP=-1
  582.       RETURN
  583. C                  NEWR
  584. 430   CALL INITDY
  585.       RETURN
  586. C                  REFE
  587. 440   MREF=-1
  588.       RETURN
  589. C                  NOREFE
  590. 450   MREF=0
  591.       RETURN
  592. C                  SKIP
  593. 460   MSKP=-1
  594.       RETURN
  595. C                  SERI
  596. 470   MSER=-1
  597.       RETURN
  598. C                  NOSERI
  599. 480   MSER=0
  600.       RETURN
  601. C                  NOBASE
  602. 490   KB15=0
  603.       RETURN
  604. C
  605. C                  NOCOLU
  606. 500   JUST=0
  607.       RETURN
  608. C
  609. C                  NOINDENT
  610. 510   INDENT=0
  611.       RETURN
  612. C
  613. C     GET NUMBER FOLLOWING (=) SIGN.
  614. C
  615. 520   JAVB=JCOL
  616.       DO 530 JCOL=JAVB,JMAX
  617.            IF (JINT(JCOL).EQ.KSPK(1)) GO TO 540
  618. 530   CONTINUE
  619.       L772=1D0
  620.       GO TO 550
  621. 540   JCOL=JCOL+1
  622.       JAVB=JCOL
  623.       CALL RSTAT
  624. 550   GO TO (560,570,570,580,630,60,60,60,60,60,60,690,60,60,60,60,60,
  625.      1670,680,640,660,60,60,60,60,60,730,650,60,730,730,730,730,60),J
  626. C                  BASE
  627. 560   KB15=IDINT(L772)
  628.       RETURN
  629. C                  IDIN/IDST
  630. 570   KD79=MAX0(IDINT(L772),1)
  631.       RETURN
  632. C                  ROUT
  633. C     USE TWO LETTERS FOR ROUTINE CODE, CONSTRUCT VALUE OF NROUT.
  634. 580   JCOL=JAVB-1
  635.       NROUT=0
  636.       DO 610 I=1,2
  637. 590        JCOL=JCOL+1
  638.            IT=KUPPER(JINT(JCOL))
  639.            IF (IT.EQ.KBL) GO TO 590
  640.            IF (IT.EQ.KERM) GO TO 620
  641.            DO 600 J=1,26
  642.                 IF (IT.NE.KABC(J)) GO TO 600
  643.                 NROUT=NROUT*26+J
  644.                 GO TO 610
  645. 600        CONTINUE
  646. 610   CONTINUE
  647. C
  648. 620   NROUT=MAX0(NROUT-1,1)
  649.       RETURN
  650. C                  STAT
  651. 630   KD15=MAX0(IDINT(L772),1)
  652.       RETURN
  653. C                  COLU
  654. 640   JUST=MAX0(IDINT(L772),7)
  655.       RETURN
  656. C                  HTRAN
  657. 650   KHTRAN=MIN0(IDINT(L772),3)
  658.       IF (KHTRAN.LT.0) KHTRAN=0
  659.       RETURN
  660. C                            INDENT
  661. 660   INDENT=MIN0(10,IDINT(L772))
  662.       RETURN
  663. C                            RIGHT
  664. 670   MRIT=MIN0(IDINT(L772),5)
  665.       IF (MRIT.EQ.1) MRIT=5
  666.       RETURN
  667. C                            LEFT
  668. 680   MRIT=MAX0(IDINT(L772),1)
  669.       IF (MRIT.GT.5) MRIT=1
  670.       mrit = -mrit
  671.       RETURN
  672. C                            LIST/NOLIST
  673. 690   IF (IDINT(L772).EQ.2) GO TO 710
  674.       IF (JSW.NE.0) GO TO 700
  675. C                            LIST
  676.       MLIST=-1
  677.       RETURN
  678. C                            NOLIST
  679. 700   MLIST=0
  680.       RETURN
  681. 710   IF (JSW.NE.0) GO TO 720
  682. C                            LIST=2.
  683.       KPRIN=1
  684.       MPRIN=1
  685.       RETURN
  686. C                            NOLIST=2.
  687. 720   MPRIN=0
  688.       KPRIN=0
  689.       RETURN
  690. C
  691. C                  CARDS USING CHARACTER ARGUMENT
  692. 730   JCOL=JAVB-1
  693. 740   JCOL=JCOL+1
  694.       IT=KUPPER(JINT(JCOL))
  695.       IF (IT.EQ.KBL) GO TO 740
  696.       IF (J.EQ.27) THEN
  697. C                            CCHR (CONTINUATION CHAR)
  698.            IF (IT.NE.KERM.AND.IT.NE.KDIG(1)) THEN
  699.                 KCTCTL=1
  700.                 KCTCHR=JINT(JCOL)
  701.                 RETURN
  702.            END IF
  703. C     NO CHARACTER SPECIFIED OR ZERO.
  704.            KCTCTL=0
  705.            KCTCHR=KSPK(10)
  706.            IF (IT.EQ.KDIG(1)) CALL DIAGNO (38)
  707.       ELSE IF (J.EQ.30) THEN
  708. C                            DEL1 (PRIMARY STRING DELIMITER)
  709.            KDEL1=KBL
  710.            KDEL1(1:1)=IT(1:1)
  711.            KAPSTR=KDEL1(1:1)//KAT(2:2)
  712.       ELSE IF (J.EQ.31) THEN
  713. C                            DEL2 (SECONDARY STRING DELIMITER)
  714.            KDEL2=KBL
  715.            KDEL2(1:1)=IT(1:1)
  716.       ELSE IF (J.EQ.32) THEN
  717. C                            ARET (ALT. RETURNS IN CALLS)
  718.            KALMRK=IT
  719.       ELSE IF (J.EQ.33) THEN
  720. C                            ARTR (TRANSLATE KALMRK TO THIS)
  721.            KALTRN=IT
  722.       END IF
  723.       RETURN
  724.       END
  725.       BLOCK DATA CTLDAT
  726. C
  727.       COMMON /CONTDY/ KTRL1,KTRL2,KTRL3,KTRL4,KTRL5,KTRL6,KTRL7,KTRL8,
  728.      1KTRL9,KTRL10,KTRL11,KTRL12,KTRL13,KTRL14,KTRL15,KTRL16,KTRL17,
  729.      2KTRL18,KTRL19,KTRL20,KTRL21,KTRL22,KTRL23,KTRL24,KTRL25,KTRL26,
  730.      3KTRL27,KTRL28,KTRL29,KTRL30,KTRL31,KTRL32,KTRL33,KTRL34,KTRL35,
  731.      4KTRL36,KTRL37,KTRL38,KTRL39,KTRL40
  732.       CHARACTER*2 KTRL1(4),KTRL2(4),KTRL3(4),KTRL4(4),KTRL5(4),KTRL6(4),
  733.      1KTRL7(4),KTRL8(4),KTRL9(4),KTRL10(4),KTRL11(4),KTRL12(4),KTRL13(4)
  734.      2,KTRL14(4),KTRL15(4),KTRL16(4),KTRL17(4),KTRL18(4),KTRL19(4),
  735.      3KTRL20(4),KTRL21(4),KTRL22(4),KTRL23(4),KTRL24(4),KTRL25(4),
  736.      4KTRL26(4),KTRL27(4),KTRL28(4),KTRL29(4),KTRL30(4),KTRL31(4),
  737.      5KTRL32(4),KTRL33(4),KTRL34(4),KTRL35(4),KTRL36(4),KTRL37(4),
  738.      6KTRL38(4),KTRL39(4),KTRL40(4)
  739. C
  740. C     /CONTDY/
  741.       DATA KTRL1/'B','A','S','E'/
  742.       DATA KTRL2/'I','D','I','N'/
  743.       DATA KTRL3/'I','D','S','T'/
  744.       DATA KTRL4/'R','O','U','T'/
  745.       DATA KTRL5/'S','T','A','T'/
  746.       DATA KTRL6/'C','A','R','D'/
  747.       DATA KTRL7/'C','O','L','L'/
  748.       DATA KTRL8/'C','O','M','M'/
  749.       DATA KTRL9/'E','X','E','M'/
  750.       DATA KTRL10/'L','A','B','E'/
  751.       DATA KTRL11/'L','A','S','T'/
  752.       DATA KTRL12/'L','I','S','T'/
  753.       DATA KTRL13/'N','E','W','R'/
  754.       DATA KTRL14/'R','E','F','E'/
  755.       DATA KTRL15/'S','K','I','P'/
  756.       DATA KTRL16/'S','T','O','P'/
  757.       DATA KTRL17/'S','E','R','I'/
  758.       DATA KTRL18/'R','I','G','H'/
  759.       DATA KTRL19/'L','E','F','T'/
  760.       DATA KTRL20/'C','O','L','U'/
  761.       DATA KTRL21/'I','N','D','E'/
  762.       DATA KTRL22/'D','E','B','U'/
  763.       DATA KTRL23/'C','O','N','T'/
  764.       DATA KTRL24/'E','N','D',' '/
  765.       DATA KTRL25/'A','N','S','I'/
  766.       DATA KTRL26/'F','E','N','D'/
  767.       DATA KTRL27/'C','C','H','R'/
  768.       DATA KTRL28/'H','T','R','A'/
  769.       DATA KTRL29/'D','T','R','A'/
  770.       DATA KTRL30/'D','E','L','1'/
  771.       DATA KTRL31/'D','E','L','2'/
  772.       DATA KTRL32/'A','R','E','T'/
  773.       DATA KTRL33/'A','R','T','R'/
  774.       DATA KTRL34/'B','L','A','N'/
  775.       DATA KTRL35/'F','S','P','L'/
  776.       DATA KTRL36/'H','L','O','G'/
  777.       DATA KTRL37/'C','A','S','E'/
  778.       DATA KTRL38/'U','C','A','S'/
  779.       DATA KTRL39/'L','C','A','S'/
  780.       DATA KTRL40/'E','N','D','O'/
  781.       END
  782.       SUBROUTINE INITDY
  783. C
  784. C     INITIALIZE TIDY -- USED AT START AND WHEN *NEWR EXECUTED.
  785. C
  786.       INCLUDE 'TIDY.INC'
  787. C
  788.       INDENT=0
  789.       JUST=7
  790.       KALMRK = '* '
  791.       KALTRN= '  '
  792.       KBKCOK=1
  793.       KBLCMT=' @'
  794.       KB15=0
  795.       KCTCHR=KSPK(10)
  796.       KCTCTL=0
  797.       KD15=10
  798.       KD79=1
  799.       KDEL1 = ''' '
  800.       KDEL2 = '""'
  801.       KDTRAN=0
  802.       KHTRAN=1
  803.       KHLOG=1
  804.       KPRIN=1
  805.       KPUN=-1
  806.       KFSPL=1
  807.       MANSI=0
  808.       MCASE=0
  809.       MCOL=0
  810.       MCOM=-1
  811.       MCONT=0
  812.       MEX=0
  813.       MLBL=0
  814.       MLIST=-1
  815.       MNDOO=0
  816.       MPRIN=1
  817.       MPUN=-1
  818.       MREF=0
  819.       MRIT=2
  820.       MSER=0
  821.       NFEND=0
  822.       NLHTRN=0
  823.       NROUT=1
  824. C     DEFAULT CASE TRANSLATION = UPPER
  825. C       CHANGE TO (1) FOR DEFAULT TRANSLATION TO LOWER-CASE
  826.       CALL KCTSET (0)
  827. C
  828.       RETURN
  829.       END
  830.       SUBROUTINE KWSCAN (JT,KSTCR)
  831.       PARAMETER (NKST=83)
  832. C
  833. C     THIS ROUTINE SCANS FOR FORTRAN KEYWORDS, SETS JT TO CORRECT
  834. C     TYPE IF FOUND, ELSE ZERO.
  835. C
  836. C     INPUT: IF JT = 0, SCANS WHOLE LIST
  837. C               JT > 0, ONLY SCANS THAT WORD.
  838. C
  839.       INCLUDE 'TIDY.INC'
  840.       INCLUDE 'UNITS.INC'
  841. C
  842.       DIMENSION KSTCR(5)
  843.       COMMON /KSTCOM/ KST(10,NKST)
  844.       CHARACTER*2 KST,WKSTR(10),KUPPER
  845.       COMMON /KSTNUM/ KSTC(6,NKST)
  846. C
  847.       IF (JT.EQ.0) THEN
  848.            NL=1
  849.            NU=NKST
  850. C     ZERO OUT KSTCR FOR NEW SCANS ONLY
  851.            DO 10 I=1,5
  852.                 KSTCR(I)=0
  853. 10         CONTINUE
  854.       ELSE
  855.            NL=JT
  856.            NU=JT
  857.       END IF
  858. C
  859. C     MAKE UPPER-CASE COPY OF 10 CHARS (MAX STRING LENGTH)
  860.       LAST=JCOL-1
  861.       DO 30 I=1,10
  862. 20         LAST=LAST+1
  863.            IF (LAST.GT.JMAX) THEN
  864.                 WKSTR(I)=KBL
  865.            ELSE
  866.                 IF (JINT(LAST).EQ.KBL) GO TO 20
  867.                 WKSTR(I)=KUPPER(JINT(LAST))
  868.            END IF
  869. 30    CONTINUE
  870.       IF (MDEB.GT.0) WRITE (OUTFIL,70) WKSTR,JT
  871. C
  872.       DO 60 IT=NL,NU
  873.            NINS=KSTC(1,IT)
  874. C
  875.            DO 40 I=1,NINS
  876.                 IF (WKSTR(I).NE.KST(I,IT)) GO TO 60
  877. 40         CONTINUE
  878.            JT=KSTC(6,IT)
  879.            DO 50 I=1,5
  880.                 KSTCR(I)=KSTC(I,IT)
  881. 50         CONTINUE
  882.            IF (MDEB.GT.0) WRITE (OUTFIL,80) KSTCR,JT
  883.            RETURN
  884. C                  LOOP FOR NEXT STATEMENT.
  885. 60    CONTINUE
  886. C
  887. C     NO MATCH.
  888.       IF (MDEB.GT.0) WRITE (OUTFIL,90)
  889.       JT=0
  890. C
  891.       RETURN
  892. C
  893. C
  894. 70    FORMAT (' KWSCAN checking ',10A1,' mode = ',I2)
  895. 80    FORMAT ('   NINS  =',I3,' KLASS  =',I3,' JTYPE =',I3/'   NANSI =',
  896.      1I3,' KSTROK =',I3,' KPOS  =',I3)
  897. 90    FORMAT ('  --- no match')
  898.       END
  899.       BLOCK DATA KSTDAT
  900. C
  901.       COMMON /KSTCOM/
  902.      1      KST1  ,KST2  ,KST3  ,KST4  ,KST5
  903.      2     ,KST6  ,KST7  ,KST8  ,KST9 ,KST10
  904.      3    ,KST11 ,KST12 ,KST13 ,KST14 ,KST15
  905.      4    ,KST16 ,KST17 ,KST18 ,KST19 ,KST20
  906.      5    ,KST21 ,KST22 ,KST23 ,KST24 ,KST25
  907.      6    ,KST26 ,KST27 ,KST28 ,KST29 ,KST30
  908.      7    ,KST31 ,KST32 ,KST33 ,KST34 ,KST35
  909.      8    ,KST36 ,KST37 ,KST38 ,KST39 ,KST40
  910.      9    ,KST41 ,KST42 ,KST43 ,KST44 ,KST45
  911.      X    ,KST46 ,KST47 ,KST48 ,KST49 ,KST50
  912.      X    ,KST51 ,KST52 ,KST53 ,KST54 ,KST55
  913.      X    ,KST56 ,KST57 ,KST58 ,KST59 ,KST60
  914.      X    ,KST61 ,KST62 ,KST63 ,KST64 ,KST65
  915.      X    ,KST66 ,KST67 ,KST68 ,KST69 ,KST70
  916.      X    ,KST71 ,KST72 ,KST73 ,KST74 ,KST75
  917.      X    ,KST76 ,KST77 ,KST78 ,KST79 ,KST80
  918.      X    ,KST81 ,KST82 ,KST83
  919. C
  920. C
  921.       CHARACTER*2 KST1 (10),KST2 (10),KST3 (10),KST4 (10),KST5 (10)
  922.       CHARACTER*2 KST6 (10),KST7 (10),KST8 (10),KST9 (10),KST10(10)
  923.       CHARACTER*2 KST11(10),KST12(10),KST13(10),KST14(10),KST15(10)
  924.       CHARACTER*2 KST16(10),KST17(10),KST18(10),KST19(10),KST20(10)
  925.       CHARACTER*2 KST21(10),KST22(10),KST23(10),KST24(10),KST25(10)
  926.       CHARACTER*2 KST26(10),KST27(10),KST28(10),KST29(10),KST30(10)
  927.       CHARACTER*2 KST31(10),KST32(10),KST33(10),KST34(10),KST35(10)
  928.       CHARACTER*2 KST36(10),KST37(10),KST38(10),KST39(10),KST40(10)
  929.       CHARACTER*2 KST41(10),KST42(10),KST43(10),KST44(10),KST45(10)
  930.       CHARACTER*2 KST46(10),KST47(10),KST48(10),KST49(10),KST50(10)
  931.       CHARACTER*2 KST51(10),KST52(10),KST53(10),KST54(10),KST55(10)
  932.       CHARACTER*2 KST56(10),KST57(10),KST58(10),KST59(10),KST60(10)
  933.       CHARACTER*2 KST61(10),KST62(10),KST63(10),KST64(10),KST65(10)
  934.       CHARACTER*2 KST66(10),KST67(10),KST68(10),KST69(10),KST70(10)
  935.       CHARACTER*2 KST71(10),KST72(10),KST73(10),KST74(10),KST75(10)
  936.       CHARACTER*2 KST76(10),KST77(10),KST78(10),KST79(10),KST80(10)
  937.       CHARACTER*2 KST81(10),KST82(10),KST83(10)
  938. C
  939.       COMMON /KSTNUM/
  940.      1     KSTC1  ,KSTC2  ,KSTC3  ,KSTC4  ,KSTC5
  941.      2    ,KSTC6  ,KSTC7  ,KSTC8  ,KSTC9  ,KSTC10
  942.      3    ,KSTC11 ,KSTC12 ,KSTC13 ,KSTC14 ,KSTC15
  943.      4    ,KSTC16 ,KSTC17 ,KSTC18 ,KSTC19 ,KSTC20
  944.      5    ,KSTC21 ,KSTC22 ,KSTC23 ,KSTC24 ,KSTC25
  945.      6    ,KSTC26 ,KSTC27 ,KSTC28 ,KSTC29 ,KSTC30
  946.      7    ,KSTC31 ,KSTC32 ,KSTC33 ,KSTC34 ,KSTC35
  947.      8    ,KSTC36 ,KSTC37 ,KSTC38 ,KSTC39 ,KSTC40
  948.      9    ,KSTC41 ,KSTC42 ,KSTC43 ,KSTC44 ,KSTC45
  949.      X    ,KSTC46 ,KSTC47 ,KSTC48 ,KSTC49 ,KSTC50
  950.      X    ,KSTC51 ,KSTC52 ,KSTC53 ,KSTC54 ,KSTC55
  951.      X    ,KSTC56 ,KSTC57 ,KSTC58 ,KSTC59 ,KSTC60
  952.      X    ,KSTC61 ,KSTC62 ,KSTC63 ,KSTC64 ,KSTC65
  953.      X    ,KSTC66 ,KSTC67 ,KSTC68 ,KSTC69 ,KSTC70
  954.      X    ,KSTC71 ,KSTC72 ,KSTC73 ,KSTC74 ,KSTC75
  955.      X    ,KSTC76 ,KSTC77 ,KSTC78 ,KSTC79 ,KSTC80
  956.      X    ,KSTC81 ,KSTC82 ,KSTC83
  957.       DIMENSION KSTC1 (6),KSTC2 (6),KSTC3 (6),KSTC4 (6),KSTC5 (6)
  958.       DIMENSION KSTC6 (6),KSTC7 (6),KSTC8 (6),KSTC9 (6),KSTC10(6)
  959.       DIMENSION KSTC11(6),KSTC12(6),KSTC13(6),KSTC14(6),KSTC15(6)
  960.       DIMENSION KSTC16(6),KSTC17(6),KSTC18(6),KSTC19(6),KSTC20(6)
  961.       DIMENSION KSTC21(6),KSTC22(6),KSTC23(6),KSTC24(6),KSTC25(6)
  962.       DIMENSION KSTC26(6),KSTC27(6),KSTC28(6),KSTC29(6),KSTC30(6)
  963.       DIMENSION KSTC31(6),KSTC32(6),KSTC33(6),KSTC34(6),KSTC35(6)
  964.       DIMENSION KSTC36(6),KSTC37(6),KSTC38(6),KSTC39(6),KSTC40(6)
  965.       DIMENSION KSTC41(6),KSTC42(6),KSTC43(6),KSTC44(6),KSTC45(6)
  966.       DIMENSION KSTC46(6),KSTC47(6),KSTC48(6),KSTC49(6),KSTC50(6)
  967.       DIMENSION KSTC51(6),KSTC52(6),KSTC53(6),KSTC54(6),KSTC55(6)
  968.       DIMENSION KSTC56(6),KSTC57(6),KSTC58(6),KSTC59(6),KSTC60(6)
  969.       DIMENSION KSTC61(6),KSTC62(6),KSTC63(6),KSTC64(6),KSTC65(6)
  970.       DIMENSION KSTC66(6),KSTC67(6),KSTC68(6),KSTC69(6),KSTC70(6)
  971.       DIMENSION KSTC71(6),KSTC72(6),KSTC73(6),KSTC74(6),KSTC75(6)
  972.       DIMENSION KSTC76(6),KSTC77(6),KSTC78(6),KSTC79(6),KSTC80(6)
  973.       DIMENSION KSTC81(6),KSTC82(6),KSTC83(6)
  974. C
  975. C     /KST/
  976.       DATA KST 1/'A','C','C','E','P','T',' ',' ',' ',' '/
  977.       DATA KST 2/'A','S','C','E','N','T',' ',' ',' ',' '/
  978.       DATA KST 3/'A','S','S','I','G','N',' ',' ',' ',' '/
  979.       DATA KST 4/'B','A','C','K','S','P','A','C','E','('/
  980.       DATA KST 5/'B','L','O','C','K','D','A','T','A',' '/
  981.       DATA KST 6/'B','U','F','F','E','R','I','N','(',' '/
  982.       DATA KST 7/'B','U','F','F','E','R','O','U','T','('/
  983.       DATA KST 8/'C','A','L','L',' ',' ',' ',' ',' ',' '/
  984.       DATA KST 9/'C','H','A','R','A','C','T','E','R',' '/
  985.       DATA KST10/'C','O','M','M','O','N',' ',' ',' ',' '/
  986.       DATA KST11/'C','O','M','P','L','E','X',' ',' ',' '/
  987.       DATA KST12/'C','O','N','T','I','N','U','E',' ',' '/
  988.       DATA KST13/'D','A','T','A',' ',' ',' ',' ',' ',' '/
  989.       DATA KST14/'D','E','C','O','D','E','(',' ',' ',' '/
  990.       DATA KST15/'D','I','M','E','N','S','I','O','N',' '/
  991.       DATA KST16/'D','O','U','B','L','E','P','R','E','C'/
  992.       DATA KST17/'D','O','U','B','L','E',' ',' ',' ',' '/
  993.       DATA KST18/'E','N','C','O','D','E','(',' ',' ',' '/
  994.       DATA KST19/'E','N','D','F','I','L','E','(',' ',' '/
  995.       DATA KST20/'E','N','D','I','F',' ',' ',' ',' ',' '/
  996.       DATA KST21/'E','N','D','F','I','L','E',' ',' ',' '/
  997.       DATA KST22/'E','N','T','R','Y',' ',' ',' ',' ',' '/
  998.       DATA KST23/'E','Q','U','I','V','A','L','E','N','C'/
  999.       DATA KST24/'E','X','T','E','R','N','A','L',' ',' '/
  1000.       DATA KST25/'F','I','N','I','S',' ',' ',' ',' ',' '/
  1001.       DATA KST26/'F','O','R','M','A','T','(',' ',' ',' '/
  1002.       DATA KST27/'F','O','R','T','R','A','N',' ',' ',' '/
  1003.       DATA KST28/'I','F','(','U','N','I','T',',',' ',' '/
  1004.       DATA KST29/'F','U','N','C','T','I','O','N',' ',' '/
  1005.       DATA KST30/'G','O','T','O','(',' ',' ',' ',' ',' '/
  1006.       DATA KST31/'G','O','T','O',' ',' ',' ',' ',' ',' '/
  1007.       DATA KST32/'I','F','A','C','C','U','M','U','L','A'/
  1008.       DATA KST33/'I','F','Q','U','O','T','I','E','N','T'/
  1009.       DATA KST34/'I','F','(','D','I','V','I','D','E','C'/
  1010.       DATA KST35/'I','F','(','E','N','D','F','I','L','E'/
  1011.       DATA KST36/'I','F','(','S','E','N','S','E','L','I'/
  1012.       DATA KST37/'I','F','(','S','E','N','S','E','S','W'/
  1013.       DATA KST38/'I','F','(',' ',' ',' ',' ',' ',' ',' '/
  1014.       DATA KST39/'I','N','T','E','G','E','R',' ',' ',' '/
  1015.       DATA KST40/'L','O','G','I','C','A','L',' ',' ',' '/
  1016.       DATA KST41/'M','A','C','H','I','N','E',' ',' ',' '/
  1017.       DATA KST42/'N','A','M','E','L','I','S','T',' ',' '/
  1018.       DATA KST43/'P','A','U','S','E',' ',' ',' ',' ',' '/
  1019.       DATA KST44/'P','R','I','N','T',' ',' ',' ',' ',' '/
  1020.       DATA KST45/'P','R','O','G','R','A','M',' ',' ',' '/
  1021.       DATA KST46/'P','U','N','C','H',' ',' ',' ',' ',' '/
  1022.       DATA KST47/'R','E','A','D','I','N','P','U','T','T'/
  1023.       DATA KST48/'R','E','A','D','T','A','P','E',' ',' '/
  1024.       DATA KST49/'R','E','A','D','(',' ',' ',' ',' ',' '/
  1025.       DATA KST50/'R','E','A','D',' ',' ',' ',' ',' ',' '/
  1026.       DATA KST51/'R','E','A','L',' ',' ',' ',' ',' ',' '/
  1027.       DATA KST52/'R','E','T','U','R','N',' ',' ',' ',' '/
  1028.       DATA KST53/'R','E','W','I','N','D','(',' ',' ',' '/
  1029.       DATA KST54/'S','E','G','M','E','N','T',' ',' ',' '/
  1030.       DATA KST55/'S','E','N','S','E','L','I','G','H','T'/
  1031.       DATA KST56/'S','T','O','P',' ',' ',' ',' ',' ',' '/
  1032.       DATA KST57/'S','U','B','R','O','U','T','I','N','E'/
  1033.       DATA KST58/'T','Y','P','E',' ',' ',' ',' ',' ',' '/
  1034.       DATA KST59/'W','R','I','T','E','O','U','T','P','U'/
  1035.       DATA KST60/'W','R','I','T','E','T','A','P','E',' '/
  1036.       DATA KST61/'W','R','I','T','E','(',' ',' ',' ',' '/
  1037.       DATA KST62/'O','V','E','R','L','A','Y',' ',' ',' '/
  1038.       DATA KST63/'I','D','E','N','T',' ',' ',' ',' ',' '/
  1039.       DATA KST64/'F','R','E','Q','U','E','N','C','Y',' '/
  1040.       DATA KST65/'I','M','P','L','I','C','I','T',' ',' '/
  1041.       DATA KST66/'L','E','V','E','L',' ',' ',' ',' ',' '/
  1042.       DATA KST67/'E','L','S','E','I','F',' ',' ',' ',' '/
  1043.       DATA KST68/'E','L','S','E',' ',' ',' ',' ',' ',' '/
  1044.       DATA KST69/'T','H','E','N',' ',' ',' ',' ',' ',' '/
  1045.       DATA KST70/'C','L','O','S','E','(',' ',' ',' ',' '/
  1046.       DATA KST71/'I','N','C','L','U','D','E',' ',' ',' '/
  1047.       DATA KST72/'I','N','Q','U','I','R','E','(',' ',' '/
  1048.       DATA KST73/'I','N','T','R','I','N','S','I','C',' '/
  1049.       DATA KST74/'O','P','E','N','(',' ',' ',' ',' ',' '/
  1050.       DATA KST75/'P','A','R','A','M','E','T','E','R',' '/
  1051.       DATA KST76/'S','A','V','E',' ',' ',' ',' ',' ',' '/
  1052.       DATA KST77/'B','A','C','K','S','P','A','C','E',' '/
  1053.       DATA KST78/'E','N','D','D','O',' ',' ',' ',' ',' '/
  1054.       DATA KST79/'R','E','W','I','N','D',' ',' ',' ',' '/
  1055.       DATA KST80/'C','L','O','S','E',' ',' ',' ',' ',' '/
  1056.       DATA KST81/'E','N','D',' ',' ',' ',' ',' ',' ',' '/
  1057.       DATA KST82/'D','O','W','H','I','L','E','(',' ',' '/
  1058.       DATA KST83/'R','E','P','E','A','T',' ',' ',' ',' '/
  1059. C
  1060. C     /KSTNUM/
  1061. C     ********* NOTE - KPOS IS ADDED TO INSULATE PASS1 FROM ADDITIONS
  1062. C     TO ABOVE TABLE.  WHEN ADDING NEW STATEMENTS, SET KPOS TO THE
  1063. C     NEW VALUE OF NKST RATHER THAN THE ORDINAL POSITION OF THE NEW
  1064. C     ADDITION TO THE TABLE.
  1065. C      (NOTE WHEN ADDING - SIMILAR STRINGS MUST BE IN DESCENDING ORDER
  1066. C       BY LENGTH, I.E. END MUST FOLLOW ENDIF)
  1067. C     WARNING - DO NOT MOVE LINES 69 OR 82 WITHOUT ALTERING PASS1 -
  1068. C               THERE ARE EXPLICIT REFERENCES TO THESE LINES.
  1069. C
  1070. C                KLASS  DESCRIPTION
  1071. C                  0.   CONTROL CARD
  1072. C                  1.   COMMENT
  1073. C                  2.   HEADER
  1074. C                  3.   NO STATEMENT NO ALLOWED (NON-EXECTUABLE)
  1075. C                  4.   CONTINUE
  1076. C                  5.   FORMAT STATEMENT.
  1077. C                  6.   STATEMENT NO. ALLOWED, NO REFERENCES
  1078. C                  7.   REFERENCES PRESENT, STATEMENT NO. ALLOWED.
  1079. C                  8.   END
  1080. C                  9.   INTRODUCTORY
  1081. C                  10.  DO
  1082. C                  11.  ELSE,ENDIF,ELSEIF, UNRECOGNIZED
  1083. C                       (TRANSFER CAN GET HERE REGARDLESS OF LABEL)
  1084. C
  1085. C     KLASS 0.   CONTROL CARD
  1086. C             RESERVED FOR FUTURE DEVELOPMENT.
  1087. C
  1088. C
  1089. C                   NINS  KLASS  JTYPE NANSI   KSTROK     KPOS
  1090.       DATA KSTC 1 /    6,     7,    33,    1,       0,        1/
  1091.       DATA KSTC 2 /    6,     2,    1 ,    1,       0,        2/
  1092.       DATA KSTC 3 /    6,     7,    2 ,    0,       0,        3/
  1093.       DATA KSTC 4 /   10,     7,    47,    0,       0,        4/
  1094.       DATA KSTC 5 /    9,     2,    4 ,    0,       0,        5/
  1095.       DATA KSTC 6 /    9,     6,    5 ,    1,       0,        6/
  1096.       DATA KSTC 7 /   10,     6,    5 ,    1,       0,        7/
  1097.       DATA KSTC 8 /    4,     7,    6 ,    0,       1,        8/
  1098.       DATA KSTC 9 /    9,     3,    46,    0,       0,        9/
  1099.       DATA KSTC10 /    6,     3,    7 ,    0,       0,       10/
  1100.       DATA KSTC11 /    7,     3,    46,    0,       0,       11/
  1101.       DATA KSTC12 /    8,     4,    8 ,    0,       0,       12/
  1102.       DATA KSTC13 /    4,     3,    9 ,    0,       1,       13/
  1103.       DATA KSTC14 /    7,     7,    10,    1,       0,       14/
  1104.       DATA KSTC15 /    9,     3,    11,    0,       0,       15/
  1105.       DATA KSTC16 /   10,     3,    12,    0,       0,       16/
  1106.       DATA KSTC17 /    6,     3,    13,    0,       0,       17/
  1107.       DATA KSTC18 /    7,     7,    10,    1,       0,       18/
  1108.       DATA KSTC19 /    8,     7,    47,    0,       0,       19/
  1109.       DATA KSTC20 /    5,    11,    48,    0,       0,       20/
  1110.       DATA KSTC21 /    7,     6,    15,    0,       0,       21/
  1111.       DATA KSTC22 /    5,    11,    3 ,    0,       0,       22/
  1112.       DATA KSTC23 /   10,     3,    17,    0,       0,       23/
  1113.       DATA KSTC24 /    8,     3,    3 ,    0,       0,       24/
  1114.       DATA KSTC25 /    5,     3,    18,    1,       0,       25/
  1115.       DATA KSTC26 /    7,     5,    19,    0,       1,       26/
  1116.       DATA KSTC27 /    7,     2,    20,    1,       0,       27/
  1117.       DATA KSTC28 /    8,     7,    42,    1,       1,       28/
  1118.       DATA KSTC29 /    8,     2,    35,    0,       0,       29/
  1119.       DATA KSTC30 /    5,     7,    23,    0,       0,       30/
  1120.       DATA KSTC31 /    4,     7,    24,    0,       0,       31/
  1121.       DATA KSTC32 /   10,     7,    25,    1,       1,       32/
  1122.       DATA KSTC33 /   10,     7,    26,    1,       1,       33/
  1123.       DATA KSTC34 /   10,     7,    27,    1,       1,       34/
  1124.       DATA KSTC35 /   10,     7,    28,    1,       1,       35/
  1125.       DATA KSTC36 /   10,     7,    29,    1,       1,       36/
  1126.       DATA KSTC37 /   10,     7,    30,    1,       1,       37/
  1127.       DATA KSTC38 /    3,     7,    31,    0,       1,       38/
  1128.       DATA KSTC39 /    7,     3,    46,    0,       0,       39/
  1129.       DATA KSTC40 /    7,     3,    46,    0,       0,       40/
  1130.       DATA KSTC41 /    7,     2,    1 ,    1,       0,       41/
  1131.       DATA KSTC42 /    8,     3,    32,    1,       0,       42/
  1132.       DATA KSTC43 /    5,     6,    3 ,    0,       1,       43/
  1133.       DATA KSTC44 /    5,     7,    33,    0,       1,       44/
  1134.       DATA KSTC45 /    7,     2,    35,    0,       0,       45/
  1135.       DATA KSTC46 /    5,     7,    33,    1,       1,       46/
  1136.       DATA KSTC47 /   10,     7,    36,    0,       0,       47/
  1137.       DATA KSTC48 /    8,     6,    37,    0,       0,       48/
  1138.       DATA KSTC49 /    5,     7,    38,    0,       1,       49/
  1139.       DATA KSTC50 /    4,     7,    33,    0,       1,       50/
  1140.       DATA KSTC51 /    4,     3,    46,    0,       0,       51/
  1141.       DATA KSTC52 /    6,     6,    39,    0,       0,       52/
  1142.       DATA KSTC53 /    7,     7,    47,    0,       0,       53/
  1143.       DATA KSTC54 /    7,     9,    34,    1,       0,       54/
  1144.       DATA KSTC55 /   10,     6,    40,    1,       0,       55/
  1145.       DATA KSTC56 /    4,     6,    41,    0,       1,       56/
  1146.       DATA KSTC57 /   10,     2,    35,    0,       0,       57/
  1147.       DATA KSTC58 /    4,     7,    33,    1,       0,       58/
  1148.       DATA KSTC59 /   10,     7,    44,    0,       1,       59/
  1149.       DATA KSTC60 /    9,     6,    45,    0,       1,       60/
  1150.       DATA KSTC61 /    6,     7,    38,    0,       1,       61/
  1151.       DATA KSTC62 /    7,     9,    34,    1,       0,       62/
  1152.       DATA KSTC63 /    5,     9,    22,    1,       0,       63/
  1153.       DATA KSTC64 /    9,     3,    21,    1,       0,       64/
  1154.       DATA KSTC65 /    8,     3,    3 ,    0,       0,       65/
  1155.       DATA KSTC66 /    5,     3,    3 ,    1,       0,       66/
  1156.       DATA KSTC67 /    6,    11,    43,    0,       1,       67/
  1157.       DATA KSTC68 /    4,    11,    49,    0,       0,       68/
  1158.       DATA KSTC69 /    4,    11,     3,    0,       0,       69/
  1159.       DATA KSTC70 /    6,     7,    47,    0,       0,       70/
  1160.       DATA KSTC71 /    7,     3,    3 ,    1,       1,       71/
  1161.       DATA KSTC72 /    8,     7,    47,    0,       1,       72/
  1162.       DATA KSTC73 /    9,     3,    3 ,    0,       0,       73/
  1163.       DATA KSTC74 /    5,     7,    47,    0,       1,       74/
  1164.       DATA KSTC75 /    9,     3,    3 ,    0,       1,       75/
  1165.       DATA KSTC76 /    4,     3,    3 ,    0,       0,       76/
  1166.       DATA KSTC77 /    9,     6,    3 ,    0,       0,       77/
  1167.       DATA KSTC78 /    5,     7,    50,    1,       1,       81/
  1168.       DATA KSTC79 /    6,     6,    3 ,    0,       0,       79/
  1169.       DATA KSTC80 /    5,     6,    3 ,    0,       0,       80/
  1170.       DATA KSTC81 /    3,     8,    16,    0,       0,       78/
  1171.       DATA KSTC82 /    8,    11,    51,    1,       0,       82/
  1172.       DATA KSTC83 /    6,     7,    50,    1,       1,       83/
  1173. C                   NINS  KLASS  JTYPE NANSI   KSTROK     KPOS
  1174.       END
  1175.       LOGICAL FUNCTION BAKSCN (C1,C2)
  1176. C
  1177. C     SCANS A STRING BACKWARD FROM CURRENT POSITION FOR C1 AND C2
  1178.       CHARACTER*2 C1, C2, JT, KUPPER, JNT
  1179.       INCLUDE 'TIDY.INC'
  1180.       IP = JCOL
  1181. C     FIRST BACK TO LCPY
  1182.     5 IF (JINT(IP).NE.LCPY) THEN
  1183.            IP = IP-1
  1184.            GO TO 5
  1185.       END IF
  1186. C
  1187. C     NOW SCAN FOR C1, C2
  1188.       JT = C1
  1189.       I = 1
  1190.    15 IP = IP-1
  1191.       JNT=KUPPER(JINT(IP))
  1192.       IF (JNT.EQ.KBL) GO TO 15
  1193.       IF (JNT.NE.JT) THEN
  1194.            BAKSCN = .FALSE.
  1195.            RETURN
  1196.       ENDIF
  1197.       IF (I.EQ.1) THEN
  1198.            JT = C2
  1199.            I = 2
  1200.            GO TO 15
  1201.       ENDIF
  1202.       BAKSCN = .TRUE.
  1203.       RETURN
  1204.       END
  1205.       SUBROUTINE COPY (N)
  1206. C
  1207. C     COPY NON-BLANK CHARACTERS FROM JINT TO IOUT.
  1208. C
  1209. C                        ===   ON ENTRY   ===
  1210. C     N .LT. 0 COPIES UNTIL PARENTHESIS COUNT IS ZERO.
  1211. C     N .EQ. 0 COPIES ALL REMAINING NON-BLANK DATA FROM JINT TO IOUT.
  1212. C     N .GT. 0 COPIES N NON-BLANK DATA FROM JINT TO IOUT.
  1213. C     THE FIRST ITEM INSPECTED IS JINT(JCOL).
  1214. C     THE FIRST ITEM STORED GOES TO IOUT(ICOL+1).
  1215. C
  1216. C                        ===   ON EXIT   ===
  1217. C     THE LAST ITEM INSPECTED WAS JINT(JCOL-1).
  1218. C     THE LAST ITEM STORED WENT TO IOUT(ICOL) AND IS IN LCPY.
  1219. C
  1220. C     MEOF .LT. 0  FOR NORMAL EXIT.
  1221. C     MEOF .EQ. 0  FOR KERM FOUND WHILE COPYING  ALL REMAINING DATA,
  1222. C                  OR FOR KERM FOUND BEFORE LEFT PARENTHESIS.
  1223. C     MEOF .GT. 0  FOR MISSING RIGHT PARENTHESIS, OR FOR MEOF =0 ON
  1224. C                  ENTRY TO COPY.
  1225. C
  1226.       INCLUDE 'TIDY.INC'
  1227.       CHARACTER*2 JT
  1228.       NT=N
  1229.       IF (MEOF.LT.0) GO TO 20
  1230.  10   MEOF=1
  1231.       LCPY=KERM
  1232.       RETURN
  1233. C
  1234.  20   IF (JCOL.GT.JMAX) GO TO 10
  1235. C
  1236.       IF (NT) 100,40,70
  1237. C
  1238. C     COPY ALL REMAINING NON-BLANK CHARACTERS.
  1239. C
  1240.  30   JCOL=JCOL+1
  1241.  40   JT=JINT(JCOL)
  1242.       IF (JT.NE.KBL) THEN
  1243.            ICOL=ICOL+1
  1244.            IOUT(ICOL)=JT
  1245.       END IF
  1246.       IF (JT.NE.KERM) GO TO 30
  1247.  50   LCPY=KERM
  1248.       ICOL=ICOL-1
  1249.       MEOF=0
  1250.       RETURN
  1251. C
  1252. C     COPY --N-- NON-BLANK CHARACTERS.
  1253. C
  1254.  60   JCOL=JCOL+1
  1255.  70   JT=JINT(JCOL)
  1256.       IF (JT.NE.KBL) THEN
  1257.            ICOL=ICOL+1
  1258.            IOUT(ICOL)=JT
  1259.            NT=NT-1
  1260.            IF (NT.EQ.0) GO TO 80
  1261.            IF (JT.EQ.KERM) GO TO 50
  1262.       END IF
  1263.       GO TO 60
  1264.  80   JCOL=JCOL+1
  1265.       LCPY=JT
  1266.       RETURN
  1267. C
  1268. C     COPY TO PARENTHESIS COUNT OF ZERO.
  1269. C     LOOK FOR LEFT PARENTHESIS.
  1270. C
  1271.  90   JCOL=JCOL+1
  1272.  100  JT=JINT(JCOL)
  1273.       IF (JT.NE.KBL) THEN
  1274.            ICOL=ICOL+1
  1275.            IOUT(ICOL)=JT
  1276.            LCPY=JT
  1277.            IF (JT.EQ.KSPK(3)) GO TO 110
  1278.            IF (JT.EQ.KSPK(5)) GO TO 140
  1279.            IF (JT.EQ.KERM) GO TO 50
  1280.       END IF
  1281.       GO TO 90
  1282. C
  1283. C     HAVE LEFT PARENTHESIS, LOOK FOR PARENTHESIS COUNT OF ZERO.
  1284. C
  1285.  110  NPAR=1
  1286.  120  JCOL=JCOL+1
  1287.       JT=JINT(JCOL)
  1288.       IF (JT.NE.KBL) THEN
  1289.            ICOL=ICOL+1
  1290.            IOUT(ICOL)=JT
  1291.            LCPY=JT
  1292.            IF (JT.NE.KSPK(3)) THEN
  1293.                 IF (JT.NE.KSPK(5)) THEN
  1294.                       IF (JT.NE.KERM) GO TO 120
  1295.                       CALL DIAGNO (2)
  1296.                       LCPY=KERM
  1297.                       GO TO 150
  1298.                 ENDIF
  1299.                 NPAR=NPAR-1
  1300.                 IF (NPAR) 140,80,120
  1301.            END IF
  1302.            NPAR=NPAR+1
  1303.       END IF
  1304.       GO TO 120
  1305.  140  CALL DIAGNO (3)
  1306.  150  MEOF=1
  1307.       JCOL=JCOL+1
  1308.       RETURN
  1309.       END
  1310.       SUBROUTINE CPYSTR (IPT,STR)
  1311.       INCLUDE 'TIDY.INC'
  1312.       CHARACTER*2 KCTRAN
  1313.       CHARACTER*(*) STR
  1314.       IP=IPT
  1315.       DO 10 I=1,LEN(STR)
  1316.            IOUT(IP)=STR(I:I)
  1317.            IF (MCASE.EQ.0) IOUT(IP)=KCTRAN(IOUT(IP))
  1318.            IP=IP+1
  1319.  10   CONTINUE
  1320.       RETURN
  1321.       END
  1322.       SUBROUTINE DIAGNO (N)
  1323.       PARAMETER (MXMSG=43)
  1324. C
  1325. C     THIS ROUTINE WRITES THE GENERAL DIAGNOSTICS FOR TIDY.
  1326. C
  1327.       DIMENSION LV(MXMSG)
  1328.       INCLUDE 'TIDY.INC'
  1329.       INCLUDE 'UNITS.INC'
  1330. C     ***                                                            ***
  1331. C      1 THE ABOVE STATEMENT IS ILLEGAL AND HAS BEEN DELETED.
  1332. C      2 THE ABOVE STATEMENT HAS A MISSING RIGHT PARENTHESIS.
  1333. C      3 THE ABOVE STATEMENT HAS AN EXCESS RIGHT PARENTHESIS.
  1334. C      4 THE ABOVE STATEMENT INCORRECTLY TERMINATES A DO LOOP.
  1335. C      5 THE ABOVE STATEMENT CANNOT BE REACHED BY THE PROGRAM.
  1336. C      6 STATEMENT NUMBER TABLE FULL.  RENUMBER PASS DELETED.
  1337. C      7 REFERENCE NUMBER TABLE FULL.  RENUMBER PASS DELETED.
  1338. C      8 THE ABOVE STATEMENT IS OBSOLETE AND IS DELETED.
  1339. C      9 ABOVE STATEMENT HAS AN ILLEGAL FIRST SPECIAL CHARACTER.
  1340. C     10 ILLEGAL DATA, FUNCTION, OR SUBROUTINE STATEMENT.
  1341. C     11 THE ABOVE COMMON OR DATA STATEMENT IS MISSING A (/).
  1342. C     12 THE ABOVE CONTINUE STATEMENT IS REDUNDANT AND IS DELETED.
  1343. C     13 THE ABOVE DIMENSION STATEMENT IS NOT COMPLETE.
  1344. C     14 W A R N I N G .  STATEMENT SHOULD BE FIRST IN ROUTINE.
  1345. C     15 THE ABOVE DO STATEMENT HAS AN INVALID TERMINAL STATEMENT.
  1346. C     16 W A R N I N G .  UNSATISFIED DO LOOPS.
  1347. C     17 UNNUMBERED OR INVALID FORMAT STATEMENT DELETED.
  1348. C     18 WARNING.  ABOVE STATEMENT IS POOR PROGRAMMING PRACTICE.
  1349. C     19 ABOVE GO TO STATEMENT IS ILLEGAL.
  1350. C     20 ILLEGAL ARITHMETIC IF STATEMENT.   IF (ARITH) 1,2,3
  1351. C     21 ABOVE NAMELIST STATEMENT MISSING (/).
  1352. C     22 ILLEGAL READ, WRITE , OR PUNCH STATEMENT.
  1353. C     23 ILLEGAL READ (12) LIST, OR WRITE (12) LIST, STATEMENT.
  1354. C     24 DO LOOP TABLE FULL.  RENUMBER PASS DELETED.
  1355. C     25 W A R N I N G .   COMMA FOLLOWING X INSERTED IN ABOVE FORMAT.
  1356. C     26 TIDY CANNOT PROCESS THIS CLASS OF PROGRAM.  (COPY EXECUTED.)
  1357. C     27 WARNING.  ABOVE DO-LOOP TERMINUS PREVIOUSLY REFERENCED.
  1358. C     28 WARNING.  TIDY MAY HAVE CHANGED CARD 2 OF THIS ROUTINE
  1359. C     29 W A R N I N G .   END CARD INSERTED.
  1360. C     30 THE ABOVE STATEMENT IS TRANSMITTED WITHOUT PROCESSING
  1361. C     31 ILLEGAL CLOSE, INQUIRE, OR OPEN STATEMENT
  1362. C     32 W A R N I N G .   UNBALANCED ELSE/ELSEIF/ENDIF STATEENT
  1363. C     33 W A R N I N G .   UNSATISFIED IF BLOCKS.
  1364. C     34 W A R N I N G .   ABOVE STATEMENT NOT ANSI FORTRAN 77
  1365. C     35 TOO MANY REFERENCES IN ABOVE. RENUMBER PASS DELETED.
  1366. C     36 W A R N I N G .   NON-ANSI (L OR R) HOLLERITH SPEC.
  1367. C     37 ABOVE STATEMENT HAS MORE THAN 19 CONTINUATION LINES.
  1368. C     38 CCHR CARD IGNORED:   CANNOT USE ZERO.
  1369. C     39 >>> HOLLERITH CONSTANT CONVERTED <<<
  1370. C     40 W A R N I N G.   *PRECISION ON NUMERIC/LOGICAL VARS NOT ANSI
  1371. C     41 W A R N I N G.    VARIABLE NAME LONGER THAN 6 CHARACTERS
  1372. C     42 W A R N I N G.    INITIALIZED TYPE DECLARATIONS NOT ANSI
  1373. C     43 MORE <END DO> THAN <DO> STATEMENTS
  1374. C
  1375.       CHARACTER*60 ERMSG (MXMSG)
  1376.       DATA (ERMSG(I),I=1,15)/
  1377.      1'THE ABOVE STATEMENT IS ILLEGAL AND HAS BEEN DELETED.',
  1378.      1'THE ABOVE STATEMENT HAS A MISSING RIGHT PARENTHESIS.',
  1379.      1'THE ABOVE STATEMENT HAS AN EXCESS RIGHT PARENTHESIS.',
  1380.      1'THE ABOVE STATEMENT INCORRECTLY TERMINATES A DO LOOP.',
  1381.      1'THE ABOVE STATEMENT CANNOT BE REACHED BY THE PROGRAM.',
  1382.      1'STATEMENT NUMBER TABLE FULL.  RENUMBER PASS DELETED.',
  1383.      1'REFERENCE NUMBER TABLE FULL.  RENUMBER PASS DELETED.',
  1384.      1'THE ABOVE STATEMENT IS OBSOLETE AND IS DELETED.',
  1385.      1'ABOVE STATEMENT HAS AN ILLEGAL FIRST SPECIAL CHARACTER.',
  1386.      1'ILLEGAL DATA, FUNCTION, OR SUBROUTINE STATEMENT.',
  1387.      1'THE ABOVE COMMON OR DATA STATEMENT IS MISSING A (/).',
  1388.      1'THE ABOVE CONTINUE STATEMENT IS REDUNDANT AND IS DELETED.',
  1389.      1'THE ABOVE DIMENSION STATEMENT IS NOT COMPLETE.',
  1390.      1'W A R N I N G .  STATEMENT SHOULD BE FIRST IN ROUTINE.',
  1391.      1'THE ABOVE DO STATEMENT HAS AN INVALID TERMINAL STATEMENT.'/
  1392.       DATA (ERMSG(I),I=16,30)/
  1393.      1'W A R N I N G .  UNSATISFIED DO LOOPS.',
  1394.      1'UNNUMBERED OR INVALID FORMAT STATEMENT DELETED.',
  1395.      1'WARNING.  ABOVE STATEMENT IS POOR PROGRAMMING PRACTICE.',
  1396.      1'ABOVE GO TO STATEMENT IS ILLEGAL.',
  1397.      1'ILLEGAL ARITHMETIC IF STATEMENT.   IF (ARITH) 1,2,3',
  1398.      1'ABOVE NAMELIST STATEMENT MISSING (/).',
  1399.      1'ILLEGAL READ, WRITE , OR PUNCH STATEMENT.',
  1400.      1'ILLEGAL READ (12) LIST, OR WRITE (12) LIST, STATEMENT.',
  1401.      1'DO LOOP TABLE FULL.  RENUMBER PASS DELETED.',
  1402.      1'W A R N I N G .  COMMA INSERTED FOLLOWING X IN ABOVE FORMAT.',
  1403.      1'TIDY CANNOT PROCESS THIS CLASS OF PROGRAM.  (COPY EXECUTED.)',
  1404.      1'WARNING.  ABOVE DO-LOOP TERMINUS PREVIOUSLY REFERENCED.',
  1405.      1'WARNING.  TIDY MAY HAVE CHANGED CARD 2 OF THIS ROUTINE',
  1406.      1'W A R N I N G .  END CARD INSERTED.',
  1407.      1'THE ABOVE STATEMENT IS TRANSMITTED WITHOUT PROCESSING.'/
  1408.       DATA (ERMSG(I),I=31,MXMSG)/
  1409.      1'ILLEGAL CLOSE, INQUIRE, OR OPEN STATEMENT',
  1410.      1'W A R N I N G .   UNBALANCED ELSE/ELSEIF/ENDIF STATEMENT',
  1411.      1'W A R N I N G .   UNSATISFIED IF BLOCKS.',
  1412.      1'W A R N I N G .   ABOVE STATEMENT NOT ANSI FORTRAN 77.',
  1413.      1'TOO MANY REFERENCES IN ABOVE. RENUMBER PASS DELETED.',
  1414.      1'W A R N I N G .   NON-ANSI (L OR R) HOLLERITH SPEC.',
  1415.      1'ABOVE STATEMENT HAS MORE THAN 19 CONTINUATION LINES.',
  1416.      1'CCHR CARD IGNORED:   CANNOT USE ZERO.',
  1417.      1'>>> HOLLERITH CONSTANT CONVERTED <<<',
  1418.      1'W A R N I N G. *n PRECISION ON NUMERIC/LOGICAL VARS NOT ANSI',
  1419.      1'W A R N I N G.    VARIABLE NAME LONGER THAN 6 CHARACTERS',
  1420.      1'W A R N I N G.    INITIALIZED TYPE DECLARATIONS NOT ANSI',
  1421.      1'MORE <END DO> THAN <DO> STATEMENTS'/
  1422.  
  1423. C
  1424. C     LV=0 - TIDY USER WARNING - CAUSES NORMAL TERMINATION
  1425. C        1 - MINOR FORTRAN ERROR - STOP 4
  1426. C        2 - MAJOR FORTRAN ERROR - STOP 8
  1427.       DATA LV /2,2,2,2,1 ,2,2,2,2,2 ,2,1,2,1,2 ,2,1,1,2,2
  1428.      1        ,2,2,2,2,0 ,0,0,1,1,1 ,2,1,2,0,2 ,0,2,0,0,0
  1429.      2        ,0,0,2/
  1430. C
  1431.       J=N
  1432.       IF (J.LE.0.OR.J.GT.MXMSG) J=1
  1433.       NMSG=NMSG+1
  1434.       IF (LERR.LT.LV(J)) LERR=LV(J)
  1435.       IF (MLIST.EQ.-1) GO TO 10
  1436.          CALL PAGE ((JMAX-7)/66+4)
  1437.          WRITE (OUTFIL,320) (JINT(I),I=1,JMAX)
  1438.          GO TO 20
  1439.  10   CALL PAGE (1)
  1440.  20   WRITE (OUTFIL,340) NMSG, ERMSG(J)
  1441. C
  1442.       IF (MLIST.NE.-1) WRITE (OUTFIL,330) NREC,KBUFF
  1443.       RETURN
  1444. C
  1445. C
  1446.  320  FORMAT (7X,72A1,19(/12X,'X',66A1))
  1447.  330  FORMAT (1X,I4,2X,80A1,/'0')
  1448.  340  FORMAT (' ******(',I3,') ***',A60,'******',20X,'**********')
  1449.       END
  1450.       SUBROUTINE DLIST (MERR)
  1451. C
  1452. C     THIS SUBROUTINE UPDATES THE DEFINED STATEMENT NUMBER LIST, LDEF,
  1453. C     BY ADDING THE STATEMENT NUMBER IN L15, IF IT IS UNIQUE.
  1454. C              RETURNS MERR = 0 IF LABEL IS OK.
  1455. C                            -1 IF ERROR
  1456. C                       POSSIBLE ERRORS--
  1457. C                            ILLEGAL DO-LOOP NEST
  1458. C                            DUPLICATE STATEMENT NUMBER
  1459. C                            STATEMENT NUMBER TABLE FULL
  1460. C
  1461.       INCLUDE 'TIDY.INC'
  1462.       INCLUDE 'UNITS.INC'
  1463.       MERR=0
  1464.       DATA JTYPP/0/
  1465.       IF (KLASS.LT.4) THEN
  1466.            JTYPP=JTYPE
  1467.            RETURN
  1468.       END IF
  1469. C
  1470. C     CHECK FOR FORMAT STATEMENT, WHICH IS LABELED BUT CAN'T HAVE
  1471. C      FALL-THRU
  1472.       IF (KLASS.EQ.5) THEN
  1473. C          PROCESS FORMAT STATEMENT
  1474. C           SCAN FOR DUPLICATE STATEMENT NUMBER
  1475.            IF (NDEF.GT.0) THEN
  1476.                 DO 10 I=1,NDEF
  1477.                      IF (IABS(LDEF(I)).EQ.L15) GO TO 60
  1478. 10              CONTINUE
  1479.            END IF
  1480. C
  1481. C          PUT L15 INTO LDEF LIST AFTER LAST NON-NEGATIVE ENTRY
  1482.            IF (NDEF.GE.1500) GO TO 70
  1483.            I=NDEF
  1484.            NDEF=NDEF+1
  1485. 20         IF (I.EQ.0.OR.LDEF(I).GE.0) THEN
  1486.                 LDEF(I+1)=L15
  1487.                 LOCDEF(I+1)=NREC
  1488.                 GO TO 90
  1489.            END IF
  1490.            LDEF(I+1)=LDEF(I)
  1491.            LOCDEF(I+1)=LOCDEF(I)
  1492.            I=I-1
  1493.            GO TO 20
  1494.       END IF
  1495. C
  1496. C     EXECUTABLE STATEMENT (OR END)
  1497.       IF (L15.EQ.0) THEN
  1498. C          UNLABELLED. IS THERE A FALL-THRU...
  1499.            IF (L25.EQ.0) THEN
  1500. C
  1501. C               UNLABELLED STATEMENT. ERROR IF IT FOLLOWS TRANSFER
  1502. C                (EXCEPT COMPUTED GO TO)
  1503.                 IF (NTRAN.NE.0.AND.JTYPP.NE.23) CALL DIAGNO (5)
  1504.            ELSE
  1505. C               THERE IS A FALL-THRU LABEL. USE IT.
  1506.                 L15=L25
  1507.                 L25=0
  1508.                 LDEF(NDEF)=IABS(LDEF(NDEF))
  1509.            END IF
  1510.            GO TO 90
  1511.       END IF
  1512. C               LABELLED. SCRATCH FALL-THRU LABEL
  1513.       L25=0
  1514. C
  1515. C     SCAN FOR DUPLICATE STATEMENT NUMBERS.
  1516. C
  1517.       IF (NDEF.GT.0) THEN
  1518.            DO 30 I=1,NDEF
  1519.                 IF (IABS(LDEF(I)).EQ.L15) GO TO 60
  1520. 30         CONTINUE
  1521.       END IF
  1522. C
  1523.       IF (NDEF.GE.1500) GO TO 70
  1524.       NDEF=NDEF+1
  1525.       LDEF(NDEF)=L15
  1526.       LOCDEF(NDEF)=NREC
  1527. C
  1528. C     SCAN FOR POSSIBLE DO-LOOP TERMINATIONS.
  1529. C
  1530.       IF (NDOS.LE.0) GO TO 90
  1531.       DO 50 I=1,NDOS
  1532.            IF (LDOS(I).EQ.L15) THEN
  1533. C                            ITS IN THE LIST
  1534.                 IF (I.NE.NDOS) THEN
  1535. C                            ILLEGAL DO-LOOP NEST
  1536.                      NMSG=NMSG+1
  1537.                      CALL PAGE (1)
  1538.                      WRITE (OUTFIL,100) NMSG,I,NDOS
  1539. C
  1540. C     COMPRESS DO-LOOP TERMINAL LIST AFTER DELETIONS.
  1541. C
  1542.                      NDOS=NDOS-1
  1543.                      DO 40 J=I,NDOS
  1544.                           LDOS(J)=LDOS(J+1)
  1545. 40                   CONTINUE
  1546.                      GO TO 80
  1547.                 END IF
  1548. C                            LAST ONE IN LIST. REMOVE IT
  1549.                 NDOS=NDOS-1
  1550.                 IF (MILDO.NE.0) CALL DIAGNO (4)
  1551.                 GO TO 90
  1552.            END IF
  1553. 50    CONTINUE
  1554.       GO TO 90
  1555. C
  1556. C     ERROR DIAGNOSTICS.
  1557. C
  1558. C                            DUPLICATE STATEMENT NUMBER
  1559. 60    NMSG=NMSG+1
  1560.       CALL PAGE (1)
  1561.       WRITE (OUTFIL,110) NMSG,L15,LOCDEF(I)
  1562.       GO TO 80
  1563. C                            NUMBER TABLE FULL
  1564. 70    CALL DIAGNO (6)
  1565.       NDEF=-1
  1566.       MP2=0
  1567. C                            ERROR EXIT
  1568. 80    MPUN=0
  1569.       MERR=-1
  1570. C                            EXIT
  1571. 90    MILDO=0
  1572.       NXEQ=NXEQ+1
  1573.       JTYPP=JTYPE
  1574.       RETURN
  1575. C
  1576. C
  1577. 100   FORMAT (' ****  (',I3,') *** DO LOOP LEVEL',I2,' TERMINATES WHILE
  1578.      1LEVEL',I2,' IS IN EFFECT.     ***')
  1579. 110   FORMAT (' ****  (',I3,') *** STATEMENT NUMBER',I6,' DUPLICATES THE
  1580.      1 NUMBER AT',I4,'.',8X,'***')
  1581.       END
  1582.       INTEGER FUNCTION DOSDEV(FILEID)
  1583.       CHARACTER FILEID*(*)
  1584. C
  1585. C     RETURNS .TRUE. IF ARGUMENT IS A DOS-RESERVED NAME.
  1586. C     (SO OPFIL WON'T COMPLAIN ABOUT IT EXISTING)
  1587. C
  1588.       CHARACTER*2 KUPPER, IT
  1589.       CHARACTER*4 DEVID(9)
  1590.       DATA DEVID/'PRN','CON','NUL','AUX','LPT1','LPT2','LPT3','COM1','CO
  1591.      1M2'/, IT/'  '/
  1592. C
  1593. C     CONVERT FILEID TO UPPER CASE, FIND END OF STRING.
  1594.       LENPAT=LEN(FILEID)
  1595.       DO 10 I=1,LENPAT
  1596.            IF (FILEID(I:I).EQ.' ') THEN
  1597.                 LENPAT=I-1
  1598.                 GO TO 20
  1599.            END IF
  1600.            IT(1:1)=FILEID(I:I)
  1601.            IT=KUPPER(IT)
  1602.            FILEID(I:I)=IT(1:1)
  1603.  10   CONTINUE
  1604. C
  1605. C     BE SURE NO LEADING BLANKS.
  1606.  20   ISTRT=1
  1607.       DO 30 I=1,LENPAT
  1608.            IF (FILEID(I:I).NE.' ') GO TO 40
  1609.            ISTRT=ISTRT+1
  1610.            LENPAT=LENPAT-1
  1611.  30   CONTINUE
  1612. C
  1613. C     COMPARE ARG TO LIST OF RESERVED DEVICES.
  1614.  40   LENRES=3
  1615.       KEND=ISTRT+LENRES-1
  1616.       DO 50 I=1,9
  1617.            IF (FILEID(ISTRT:KEND).EQ.DEVID(I)(1:LENRES).AND.LENPAT.EQ.LE
  1618.      1NRES) THEN
  1619.                 DOSDEV=I
  1620.                 RETURN
  1621.            END IF
  1622.            IF (I.EQ.4) THEN
  1623.                 KEND=KEND+1
  1624.                 LENRES=4
  1625.            END IF
  1626.  50   CONTINUE
  1627.       DOSDEV=0
  1628.       RETURN
  1629.       END
  1630.       SUBROUTINE EDIT
  1631. C
  1632. C     THIS SUBROUTINE EDITS THE DEFINED AND THE REFERENCED STATEMENT
  1633. C     NUMBER LIST.
  1634. C
  1635. C     ON ENTRY, LDEF(I) CONTAINS THE STATEMENT LABELS, IN THE
  1636. C     ORDER IN WHICH THEY WERE USED.  THE LABELS OF CONTINUE
  1637. C     STATEMENTS WHICH WERE NOT PASSED ON ARE NEGATIVE.
  1638. C     LOCDEF(I) CONTAINS THE CARD NUMBER (NREC) OF THE LINE
  1639. C     IDENTIFIED BY THAT LABEL.  EXCEPTION FOR DOUBLE BRANCHES--
  1640. C     IF LDEF(I)=0, THEN THE STATEMENT WITH THE LABEL LDEF(I-1)
  1641. C     WAS A GOTO.  THE TARGET LABEL IS IN LOCDEF(I).
  1642. C
  1643. C     (1)     DEFINED STATEMENTS THAT ARE NOT REFERENCED ARE DELETED.
  1644. C     (2)     THE NEW STATEMENT NUMBERS ARE GENERATED
  1645. C     (3)     A STATEMENT NUMBER WHICH IS NEGATIVE IN THE LDEF
  1646. C             LIST IS ASSIGNED A NEW STATEMENT NUMBER THE SAME
  1647. C             AS THE NEXT POSITIVE LABEL IN THE LDEF LIST
  1648. C     (4)     A LABEL FOLLOWED BY A ZERO IN THE LDEF LIST IS
  1649. C             ASSIGNED A NEW STATEMENT NUMBER THE SAME AS THE
  1650. C             STATEMENT NUMBER ASSIGNED TO THE LABEL GIVEN IN
  1651. C             THE LOCREF ARRAY.  (FOR DOUBLE BRANCHES)
  1652. C     (5)     PSEUDO-STATEMENT NUMBERS OUTSIDE THE RANGE OF RENUMBERED
  1653. C             DEFINED STATEMENT NUMBERS ARE GENERATED FOR EACH
  1654. C             REFERENCED STATEMENT WHICH IS NOT DEFINED.
  1655. C
  1656.       INCLUDE 'TIDY.INC'
  1657.       INCLUDE 'UNITS.INC'
  1658.       IF (NREF.LE.0) NDEF=0
  1659.       IF (NDEF.LE.0) RETURN
  1660. C
  1661.       IF (MDEB.NE.0) THEN
  1662.            WRITE (OUTFIL,140) NDEF,NREF
  1663.            WRITE (OUTFIL,150) (LDEF(I),I=1,NDEF)
  1664.            WRITE (OUTFIL,160) (NEWNUM(I),I=1,NDEF)
  1665.            WRITE (OUTFIL,170) (LOCDEF(I),I=1,NDEF)
  1666.            WRITE (OUTFIL,180) (LREF(I),I=1,NREF)
  1667.       END IF
  1668. C
  1669. C     SET UP NEWNUM SO THAT IF LDEF(I) NEEDS A NEW NUMBER,
  1670. C     NEWNUM(I)=0. IF LDEF(I) WILL REFERENCE LDEF(J), THEN
  1671. C     NEWNUM(I)=-LDEF(J).  REMOVE ENTRIES WITH LDEF(I)=0
  1672. C
  1673.       IT=0
  1674.       DO 20 I=1,NDEF
  1675.            IF (LDEF(I).GT.0) THEN
  1676. C                            POSITIVE IS NORMAL
  1677.                 IT=IT+1
  1678.                 NEWNUM(IT)=0
  1679.                 LDEF(IT)=LDEF(I)
  1680.            ELSE IF (LDEF(I).EQ.0) THEN
  1681. C                            ZERO MEANS LAST WAS A BRANCH
  1682.                 NEWNUM(IT)=-LOCDEF(I)
  1683.                 GO TO 20
  1684.            ELSE
  1685. C                            NEGATIVE MEANS CONTINUE. LOOK AHEAD
  1686.                 J=I
  1687.  10             J=J+1
  1688.                 IF (LDEF(J).LT.0.OR.LOCDEF(J).LT.0) GO TO 10
  1689. C                            CHECK FOR A FORMAT STATEMENT
  1690.                 IT=IT+1
  1691.                 NEWNUM(IT)=-LDEF(J)
  1692.                 IF (LDEF(J).EQ.0) NEWNUM(IT)=-IABS(LDEF(J-1))
  1693.                 LDEF(IT)=IABS(LDEF(I))
  1694.            END IF
  1695.            LOCDEF(IT)=IABS(LOCDEF(I))
  1696.  20   CONTINUE
  1697.       NDEF=IT
  1698. C
  1699.       IF (MDEB.NE.0) THEN
  1700.            WRITE (OUTFIL,150) (LDEF(I),I=1,NDEF)
  1701.            WRITE (OUTFIL,160) (NEWNUM(I),I=1,NDEF)
  1702.            WRITE (OUTFIL,170) (LOCDEF(I),I=1,NDEF)
  1703.            WRITE (OUTFIL,180) (LREF(I),I=1,NREF)
  1704.       END IF
  1705. C
  1706. C     LDEF NOW CONTAINS DEFINED STATEMENT NUMBERS. LOCDEF(I)
  1707. C     HAS LINE NUMBER OF LDEF(I).  NEWNUM(I) HAS ZERO IF LDEF(I)
  1708. C     WILL NEED A NEW NUMBER, AND -NNN IF REFERENCES TO LDEF(I)
  1709. C     SHOULD BE CHANGED TO REFERENCES TO NNN.
  1710. C
  1711. C     FOR EACH LREF, SCAN LDEF FOR CHAINS.  BE SURE
  1712. C     TARGETS OF GOTOS ARE REFERENCED ALSO.
  1713. C
  1714.       IT=NREF
  1715.       DO 50 I=1,IT
  1716.            I1=LREF(I)
  1717. C                            GET REFERENCE IN LDEF
  1718.            DO 40 IC=1,50
  1719.                 DO 30 J=1,NDEF
  1720.                      IF (I1.EQ.LDEF(J)) THEN
  1721. C                               NEXT LINK IN CHAIN
  1722.                           I1=IABS(NEWNUM(J))
  1723.                           IF (I1.EQ.0) GO TO 50
  1724.                           L772=I1
  1725. C                            ADD TARGET TO REF LIST
  1726.                           CALL RLIST
  1727.                           GO TO 50
  1728.                      END IF
  1729.  30             CONTINUE
  1730. C                               NOT DEFINED
  1731.                 GO TO 50
  1732.  40        CONTINUE
  1733.  50   CONTINUE
  1734. C
  1735.       IF (MDEB.NE.0) THEN
  1736.            WRITE (OUTFIL,150) (LDEF(I),I=1,NDEF)
  1737.            WRITE (OUTFIL,160) (NEWNUM(I),I=1,NDEF)
  1738.            WRITE (OUTFIL,170) (LOCDEF(I),I=1,NDEF)
  1739.            WRITE (OUTFIL,180) (LREF(I),I=1,NREF)
  1740.       END IF
  1741. C
  1742. C     SCAN DEFINED LIST FOR REFERENCES.  DELETE NON-REFERENCED
  1743. C     DEFINED STATEMENT NUMBERS.
  1744. C
  1745.       IT=0
  1746.       NNUM=0
  1747.       DO 70 I=1,NDEF
  1748.            DO 60 J=1,NREF
  1749.                 IF (LDEF(I).EQ.LREF(J)) THEN
  1750.                      IF (NEWNUM(I).EQ.0) THEN
  1751. C                            MAKE NEW NUMBER
  1752.                           NNUM=NNUM+1
  1753.                           NEWNUM(I)=KD15*NNUM+KB15
  1754.                      END IF
  1755.                      IT=IT+1
  1756.                      LDEF(IT)=LDEF(I)
  1757.                      NEWNUM(IT)=NEWNUM(I)
  1758.                      LOCDEF(IT)=LOCDEF(I)
  1759.                      GO TO 70
  1760.                 END IF
  1761.  60        CONTINUE
  1762. C                            NOT REFERENCED
  1763.  70   CONTINUE
  1764.       NDEF=IT
  1765. C
  1766.       IF (MDEB.NE.0) THEN
  1767.            WRITE (OUTFIL,150) (LDEF(I),I=1,NDEF)
  1768.            WRITE (OUTFIL,160) (NEWNUM(I),I=1,NDEF)
  1769.            WRITE (OUTFIL,170) (LOCDEF(I),I=1,NDEF)
  1770.            WRITE (OUTFIL,180) (LREF(I),I=1,NREF)
  1771.       END IF
  1772. C
  1773. C     SCAN LDEF FOR INDIRECT REFERENCES AND REPLACE THEM
  1774. C
  1775.       IT=0
  1776.       DO 110 I=1,NDEF
  1777.            DO 90 IC=1,10
  1778.                 IF (NEWNUM(I).GT.0) GO TO 110
  1779.                 I1=IABS(NEWNUM(I))
  1780.                 DO 80 J=1,NDEF
  1781.                      IF (LDEF(J).EQ.I1) THEN
  1782.                           NEWNUM(I)=NEWNUM(J)
  1783.                           GO TO 90
  1784.                      END IF
  1785.  80             CONTINUE
  1786.                 STOP 45
  1787.  90        CONTINUE
  1788. C                            LOOP OF GOTO-S. BREAK IT
  1789.            IF (IT.NE.0) GO TO 100
  1790.            IT=1
  1791.            CALL PAGE (-20)
  1792.            CALL PAGE (1)
  1793.            WRITE (OUTFIL,220)
  1794.            WRITE (OUTFIL,210)
  1795.  100       NNUM=NNUM+1
  1796.            NEWNUM(I)=KD15*NNUM+KB15
  1797.            NMSG=NMSG+1
  1798.            CALL PAGE (1)
  1799.            WRITE (OUTFIL,190) NMSG,I1,NEWNUM(I)
  1800.  110  CONTINUE
  1801. C
  1802. C     SCAN REFERENCED STATEMENT LIST FOR MISSING DEFINITIONS.
  1803. C
  1804.       IT=0
  1805.       DO 130 I=1,NREF
  1806.            DO 120 J=1,NDEF
  1807.                 IF (LREF(I).EQ.LDEF(J)) GO TO 130
  1808.  120       CONTINUE
  1809. C
  1810. C     ADD PSEUDO-STATEMENT NUMBER.
  1811. C
  1812.            LERR=2
  1813.            IF (IT.LE.0) THEN
  1814.                 IT=1
  1815.                 CALL PAGE (-20)
  1816.                 CALL PAGE (4)
  1817.                 WRITE (OUTFIL,200)
  1818.                 WRITE (OUTFIL,210)
  1819.            END IF
  1820.            NDEF=NDEF+1
  1821.            IF (NDEF.GT.1500) THEN
  1822.                 CALL DIAGNO (6)
  1823.                 NDEF=-1
  1824.                 MP2=0
  1825.                 RETURN
  1826.            END IF
  1827.            LDEF(NDEF)=LREF(I)
  1828.            LOCDEF(NDEF)=0
  1829.            NEWNUM(NDEF)=NDEF*KD15+KB15
  1830.            NMSG=NMSG+1
  1831.            CALL PAGE (1)
  1832.            WRITE (OUTFIL,190) NMSG,LREF(I),NEWNUM(NDEF)
  1833.  130  CONTINUE
  1834.       RETURN
  1835. C
  1836. C
  1837.  140  FORMAT ('0FOLLOWING *DEBUG OUTPUT FROM SUBR EDIT'/' NDEF = ',I7,'
  1838.      1 NREF = ',I7)
  1839.  150  FORMAT (' LDEF  ',9I7)
  1840.  160  FORMAT (' NEWNUM',9I7)
  1841.  170  FORMAT (' LOCDEF',9I7)
  1842.  180  FORMAT (' LREF  ',9I7)
  1843.  190  FORMAT (7X,'(',I3,') *** STATEMENT NUMBER',I7,' IS ASSIGNED NUMBER
  1844.      1',I7,'.',13X,'***')
  1845.  200  FORMAT ('0',12X,'*** THE FOLLOWING REFERENCED STATEMENTS ARE NOT D
  1846.      1EFINED')
  1847.  210  FORMAT (13X,'*** PSEUDO-STATEMENT NUMBERS HAVE BEEN ASSIGNED.'/' '
  1848.      1)
  1849.  220  FORMAT ('0',12X,'*** THE FOLLOWING STATEMENTS ARE IN ENDLESS CHAIN
  1850.      1S OF GOTO''S.')
  1851.       END
  1852.       SUBROUTINE HEADER
  1853. C
  1854. C                  THIS ROUTINE CENTERS JOB HEADINGS
  1855. C
  1856.       INCLUDE 'TIDY.INC'
  1857.       CHARACTER*2 KUPPER
  1858.       IF (IPASS.EQ.1) THEN
  1859.            DO 10 I=1,72
  1860.                 JOB(I)=JINT(I)
  1861.  10        CONTINUE
  1862.       else
  1863. C
  1864.       DO 20 I=1,80
  1865.            JOB(I)=IOUT(I)
  1866.  20   CONTINUE
  1867. C
  1868.       IF (MSER.LT.0) THEN
  1869. C
  1870. C     SET UP COLUMNS 73-75 BASED ON *LABE OPTION
  1871.            IF (MLBL.EQ.0) THEN
  1872. C     USE *ROUT VALUE
  1873.                 I=(NROUT-1)/26
  1874.                 J=NROUT-I*26
  1875.                 IF (I.EQ.0) THEN
  1876.                      KOL73(3)=KBL
  1877.                      KOL73(2)=KABC(J)
  1878.                 ELSE
  1879.                      KOL73(2)=KABC(I)
  1880.                      KOL73(3)=KABC(J)
  1881.                 END IF
  1882. C
  1883.                 KOL73(1)=KBL
  1884.            ELSE
  1885. C
  1886. C     COPY PROGRAM/SUBROUTINE/FUNCTION CARD SERIAL INFORMATION
  1887.                 DO 30 I=1,3
  1888.                      KOL73(I)=KUPPER(SERIAL(I))
  1889.  30             CONTINUE
  1890.            END IF
  1891.       END IF
  1892.       END IF
  1893. C
  1894.  40   DO 50 I=73,80
  1895.            JOB(I)=KBL
  1896.  50   CONTINUE
  1897. C
  1898. C          COMPRESS STATEMENT BY ELIMINATING MULTIPLE BLANKS
  1899. C
  1900.       J=1
  1901.       K=0
  1902.       DO 80 I=1,80
  1903.            IF (JOB(I).EQ.KBL) THEN
  1904.                 IF (K.EQ.1) GO TO 80
  1905.                 K=1
  1906.            ELSE
  1907.                 K=0
  1908.            END IF
  1909.            JOB(J)=JOB(I)
  1910.            J=J+1
  1911.  80   CONTINUE
  1912.       DO 90 I=J,80
  1913.            JOB(I)=KBL
  1914.  90   CONTINUE
  1915. C
  1916. C                           CENTER HEADING
  1917. C
  1918.       IB=(80-J)/2
  1919.  100  I=J+IB
  1920.       JOB(I)=JOB(J)
  1921.       J=J-1
  1922.       IF (J.GT.0) GO TO 100
  1923. C
  1924. C                   ELIMINATE REMAINING NON-BLANKS
  1925. C
  1926.       IB=I-1
  1927.       DO 110 I=1,IB
  1928.            JOB(I)=KBL
  1929.  110  CONTINUE
  1930.       RETURN
  1931.       END
  1932.       SUBROUTINE HOLSCN (LTYPE,LSSCN,LNSTR)
  1933. C     THIS SUBROUTINE SCANS ALL FORTRAN CARDS FOR FIELDS OF HOLLERITH-
  1934. C     TYPE CONSTANTS.  IN THESE FIELDS,
  1935. C     CHARACTERS ARE REPLACED WITH EQUIVALENT CHARACTERS WHICH WILL NOT
  1936. C     BE TREATED BY ANALYSIS ROUTINES.
  1937. C     THE SEARCH IS MADE BY CHECKING FOR PATTERNS -SNNNL-, WHERE S IS A
  1938. C     SPECIAL CHARACTER, NNN IS A DECIMAL NUMBER, AND L IS THE LETTER H,
  1939. C     L, OR R.  IN ADDITION, FOR FORMAT STATEMENTS ONLY, IT ACCEPTS THE
  1940. C     PATTERN SNNNXNNNL, THE RESULT OF A MISSING -,- AFTER X.
  1941. C
  1942.       INCLUDE 'TIDY.INC'
  1943.       INCLUDE 'UNITS.INC'
  1944.       CHARACTER*2 IT,KPARAM,KUPPER,KCTRAN
  1945.       LOGICAL LHTRN,ISDEL
  1946. C
  1947.       JCOL=6
  1948.       LNSTR=0
  1949.       LNTMP=0
  1950.       NLHTRN=0
  1951. C     IF FORMAT STATEMENT, SKIP FIRST 7 NON-BLANK CHARACTERS
  1952.       IF (LTYPE.EQ.26) THEN
  1953.            DO 20 N=1,7
  1954. 10              JCOL=JCOL+1
  1955.                 IF (JINT(JCOL).EQ.KBL) GO TO 10
  1956.                 IF (MCASE.EQ.0) JINT(JCOL)=KCTRAN(JINT(JCOL))
  1957. 20         CONTINUE
  1958.            GO TO 130
  1959.       END IF
  1960. C
  1961. C                  *****************************************
  1962. C                  *                                       *
  1963. C                  *    PROCESS NON-FORMAT STATEMENTS.     *
  1964. C                  *                                       *
  1965. C                  *****************************************
  1966. C
  1967.       LFIR=6
  1968.       IFIR=14
  1969. C                            SET FLAG FOR NON-FORMAT
  1970.       IGOOF=-1
  1971. C                   LOOK FOR SPECIAL CHARACTERS.
  1972. 30    I=JCOL
  1973.       DO 60 JCOL=I,JMAX
  1974.            IT=JINT(JCOL)
  1975.            ISDEL=.FALSE.
  1976. C          (CHECK FOR SPL CHAR BEFORE DELIMS SINCE NEED J TO SET IFIR.)
  1977. C
  1978. C     =    ,    (    /    )    +    -    *    .    $    -    '    & NONE
  1979. C     1    2    3    4    5    6    7    8    9    10   11   12   13  14
  1980. C
  1981.            DO 50 J=1,13
  1982.                 IF (IT.EQ.KSPK(J)) THEN
  1983. C                   FOUND ONE.  IS IT THE FIRST...
  1984.                      IF (IFIR.EQ.14) THEN
  1985. C                   YES
  1986.                           IFIR=J
  1987.                           LFIR=JCOL
  1988. C     QUIT IF THIS STATEMENT TYPE DOESN'T ALLOW STRINGS.  JUST NEEDED
  1989. C     IFIR AND LFIR POINTERS.
  1990.                           IF (LSSCN.EQ.0.AND.LTYPE.NE.0)
  1991.      1                     THEN
  1992.                                if (mcase.eq.0) then
  1993.                                     DO 40 I=JCOL,JMAX
  1994.                                          JINT(I)=KCTRAN(JINT(I))
  1995. 40                                  CONTINUE
  1996.                                 endif
  1997.                                IF (MDEB.GT.0) WRITE (OUTFIL,320) IFIR,
  1998.      1                          LFIR
  1999.                                RETURN
  2000.                           END IF
  2001.                      END IF
  2002.                      ISDEL=IT.EQ.KDEL1.OR.IT.EQ.KDEL2
  2003.                      IF (ISDEL) GO TO 180
  2004.                      GO TO 70
  2005.                 END IF
  2006. 50         CONTINUE
  2007. C     (DELIMS MAY NOT BE SPECIAL CHARACTER, CHECK TO BE SURE)
  2008.            ISDEL=IT.EQ.KDEL1.OR.IT.EQ.KDEL2
  2009.            IF (ISDEL) GO TO 180
  2010.            IF (MCASE.EQ.0) JINT(JCOL)=KCTRAN(IT)
  2011. 60    CONTINUE
  2012.       GO TO 310
  2013. C                   LOOK FOR FOLLOWING NUMBER.
  2014. 70    IF (JCOL.EQ.JMAX) GO TO 310
  2015.       JCOL=JCOL+1
  2016.       CALL RSTAT
  2017. C                   REPEAT IF NO NUMBER.
  2018.       IF (L772.EQ.0) GO TO 30
  2019. C     MAKE IT UPPER CASE
  2020.       IF (MCASE.EQ.0) JINT(JCOL)=KCTRAN(JINT(JCOL))
  2021.       IT=KUPPER(JINT(JCOL))
  2022. C                  IS IT -H-,-L-, OR -R-
  2023.       IF (IT.EQ.KABC(8)) THEN
  2024.            LHTRN=MOD(KHTRAN,2).EQ.0
  2025.       ELSE IF (IT.EQ.KABC(12).OR.IT.EQ.KABC(18)) THEN
  2026.            LHTRN=KHTRAN.LT.2
  2027. C     COMPLAIN ABOUT L OR R IF ANSI FLAG SET.
  2028.            IF (MANSI.EQ.0) CALL DIAGNO (36)
  2029.       ELSE
  2030.            GO TO 30
  2031.       END IF
  2032. C                  MARK AS PART OF STRING (FOR INDENTING)
  2033.       IF (LHTRN) JINT(JCOL)(2:2)=KAT(2:2)
  2034. C
  2035. C     ALSO MARK THE NUMBERS.
  2036.       KTMP=L772
  2037.       I=JCOL
  2038. 80    I=I-1
  2039.       IF (JINT(I).EQ.KBL) GO TO 80
  2040.       IF (LHTRN) JINT(I)(2:2)=KAT(2:2)
  2041.       KTMP=KTMP/10
  2042.       IF (KTMP.GT.0) GO TO 80
  2043.       IP=I
  2044. C                  FIND LIMITS OF HOLLERITH FIELD.
  2045.       I=JCOL+1
  2046.       JCOL=JCOL+L772
  2047. C                   L772 IS THE LENGTH OF THE FIELD, AS FOUND BY RSTAT
  2048. C                  CHECK FOR CASE OF HOLLERITH BLANKS SPILLING OFF
  2049. C                  END OF CARD. E.G. I=6HXXXXX
  2050.       IF (JCOL.LE.JMAX) GO TO 90
  2051. C                  REPLACE CURRENT END CARD MARK.
  2052.       JINT(JMAX+1)=KBL
  2053. C                   AND SET NEW ONE
  2054.       JMAX=JCOL
  2055.       JINT(JMAX+1)=KERM
  2056. C                  CHANGE ALL CHARACTERS IN HOLLERITH FIELD.
  2057. 90    DO 100 J=I,JCOL
  2058.            JINT(J)(2:2)=KAT(2:2)
  2059. 100   CONTINUE
  2060.       IF (.NOT.LHTRN) THEN
  2061. C
  2062. C     TURN THIS ON IF WANT LOGGING OF H TRANSLATIONS IN FORMATS
  2063.            IF (KHLOG.EQ.0) NLHTRN=NLHTRN+1
  2064. C
  2065. C     IF TRANSLATING H-FIELDS, COPY STRING AND DUPLICATE APOSTROPHES.
  2066.            LNTMP=MAX0(IDINT(L772),LNTMP)
  2067.            JINT(IP)=KAPSTR
  2068.            IP=IP+1
  2069.            J=I
  2070. 110        JINT(IP)=JINT(J)
  2071.            IF (JINT(J).EQ.KAPSTR) THEN
  2072.                 IP=IP+1
  2073.                 IF (IP.GE.J) CALL MOVSTR (J)
  2074.                 JINT(IP)=KAPSTR
  2075.            END IF
  2076.            J=J+1
  2077.            IP=IP+1
  2078.            IF (J.LE.JCOL) GO TO 110
  2079.            JINT(IP)=KAPSTR
  2080. 120        IP=IP+1
  2081.            IF (IP.LE.JCOL) THEN
  2082.                 JINT(IP)=KBL
  2083.                 GO TO 120
  2084.            END IF
  2085.       END IF
  2086.       GO TO 30
  2087. C
  2088. C                  **********************************
  2089. C                  *                                *
  2090. C                  *   PROCESS FORMAT STATEMENTS.   *
  2091. C                  *                                *
  2092. C                  **********************************
  2093. C
  2094. 130   IGOOF=0
  2095.       IFIR=3
  2096.       LFIR=JCOL
  2097.       GO TO 170
  2098. C
  2099. C                  LOOK FOR SPECIAL CHARACTER
  2100. 140   IF (JCOL.GT.JMAX) GO TO 310
  2101.       I=JCOL
  2102.       DO 160 JCOL=I,JMAX
  2103.            IT=JINT(JCOL)
  2104.            ISDEL=IT.EQ.KDEL1.OR.IT.EQ.KDEL2
  2105.            IF (ISDEL) GO TO 180
  2106.            DO 150 J=1,12
  2107.                 IF (IT.EQ.KSPK(J)) GO TO 220
  2108. 150        CONTINUE
  2109.            IF (MCASE.EQ.0) JINT(JCOL)=KCTRAN(IT)
  2110. 160   CONTINUE
  2111.       GO TO 310
  2112. C
  2113. C                  SKIP IF NOT * OR '
  2114. 170   IF (JINT(JCOL).NE.KDEL1.AND.JINT(JCOL).NE.KDEL2) GO TO 220
  2115. C                  CHANGE ALL CHARACTERS BETWEEN *S OR 'S
  2116. 180   KPARAM=JINT(JCOL)
  2117. C                  MARK AS PART OF STRING (FOR INDENTING)
  2118.       JINT(JCOL)(2:2)=KAT(2:2)
  2119.       IP=JCOL
  2120. C
  2121. 190   IF (JCOL.EQ.JMAX) GO TO 310
  2122.       JCOL=JCOL+1
  2123.       IT=JINT(JCOL)
  2124.       JINT(JCOL)(2:2)=KAT(2:2)
  2125.       IF (IT.EQ.KPARAM) THEN
  2126.            IF (JINT(JCOL+1).NE.KPARAM) GO TO 200
  2127. C     THIS IS A LITERAL -- NOT TERMINAL DELIMITER
  2128.            JCOL=JCOL+1
  2129.            JINT(JCOL)(2:2)=KAT(2:2)
  2130.       END IF
  2131.       GO TO 190
  2132. C                            ALL CHANGED, CHANGE DELIMS IF DESIRED.
  2133. 200   IF (KDTRAN.EQ.1.AND.KPARAM.NE.KDEL1) THEN
  2134.            JINT(IP)=KAPSTR
  2135.            JINT(JCOL)=KAPSTR
  2136.            J=IP
  2137. 210        J=J+1
  2138.            IF (J.LT.JCOL) THEN
  2139.                 IF (JINT(J).EQ.KAPSTR) THEN
  2140. C     DUPLICATE LITERAL VERSION OF DELIMITER
  2141.                      CALL MOVSTR (J)
  2142.                      JINT(J)=KAPSTR
  2143.                 END IF
  2144.                 GO TO 210
  2145.            END IF
  2146.       END IF
  2147.       IF (IGOOF.EQ.-1) GO TO 70
  2148. C                  LOOK FOR FOLLOWING NUMBER
  2149. 220   IF (JCOL.EQ.JMAX) GO TO 310
  2150.       JCOL=JCOL+1
  2151.       CALL RSTAT
  2152. C                  IF NOT A NUMBER, START AGAIN
  2153.       IF (L772.EQ.0) GO TO 140
  2154. C                  NUMBER FOUND. LOOK AT NEXT CHARACTER.
  2155.       IF (MCASE.EQ.0) JINT(JCOL)=KCTRAN(JINT(JCOL))
  2156.       IT=KUPPER(JINT(JCOL))
  2157. C                  IS IT -H-
  2158.       IF (IT.EQ.KABC(8)) THEN
  2159.            LHTRN=MOD(KHTRAN,2).EQ.0
  2160.            GO TO 250
  2161. C                  MAYBE L OR R
  2162.       ELSE IF (IT.EQ.KABC(12).OR.IT.EQ.KABC(18)) THEN
  2163.            LHTRN=KHTRAN.LT.2
  2164.            IF (MANSI.EQ.0) CALL DIAGNO (36)
  2165.            GO TO 250
  2166.       END IF
  2167. C                  IF NOT -X-, START AGAIN.
  2168.       IF (IT.NE.KABC(24)) GO TO 140
  2169. C                  X FOUND.  LOOK AT NEXT.
  2170. 230   IF (JCOL.EQ.JMAX) GO TO 310
  2171.       JCOL=JCOL+1
  2172.       IF (JINT(JCOL).EQ.KBL) GO TO 230
  2173.       IF (MCASE.EQ.0) JINT(JCOL)=KCTRAN(JINT(JCOL))
  2174.       IT=KUPPER(JINT(JCOL))
  2175. C                  IS IT -*-
  2176.       IF (IT.EQ.KDEL1.OR.IT.EQ.KDEL2) GO TO 170
  2177. C                  IS IT -)- OR -,-
  2178.       IF (IT.EQ.KSPK(2)) GO TO 220
  2179.       IF (IT.EQ.KSPK(5)) GO TO 220
  2180. C
  2181. C     INSERT A COMMA
  2182.       DO 240 J=JMAX,JCOL,-1
  2183.            JINT(J+1)=JINT(J)
  2184. 240   CONTINUE
  2185.       JINT(JCOL)=KSPK(2)
  2186.       JMAX=JMAX+1
  2187.       JINT(JMAX+1)=KERM
  2188.       CALL DIAGNO (25)
  2189.       IGOOF=1
  2190.       GO TO 220
  2191. C
  2192. C                  HOLLERITH FOUND.   FIND LIMITS OF FIELD.
  2193. 250   IF (LHTRN) JINT(JCOL)(2:2)=KAT(2:2)
  2194. C
  2195. C     ALSO MARK THE NUMBERS.
  2196.       J=L772
  2197.       I=JCOL
  2198. 260   I=I-1
  2199.       IF (JINT(I).EQ.KBL) GO TO 260
  2200.       IF (LHTRN) JINT(I)(2:2)=KAT(2:2)
  2201.       J=J/10
  2202.       IF (J.GT.0) GO TO 260
  2203. C
  2204.       IP=I
  2205.       I=JCOL+1
  2206.       JCOL=JCOL+L772
  2207.       IF (JCOL.LE.JMAX) GO TO 270
  2208.       JINT(JMAX+1)=KBL
  2209.       JMAX=JCOL
  2210.       JINT(JMAX+1)=KERM
  2211. 270   DO 280 J=I,JCOL
  2212.            JINT(J)(2:2)=KAT(2:2)
  2213. 280   CONTINUE
  2214.       IF (.NOT.LHTRN) THEN
  2215. C
  2216. C     IF TRANSLATING H-FIELDS, COPY STRING AND DUPLICATE APOSTROPHES.
  2217.            IF (KHLOG.EQ.0) NLHTRN=NLHTRN+1
  2218.            JINT(IP)=KAPSTR
  2219.            IP=IP+1
  2220.            J=I
  2221. 290        JINT(IP)=JINT(J)
  2222.            IF (JINT(J).EQ.KAPSTR) THEN
  2223.                 IP=IP+1
  2224.                 IF (IP.GE.J) CALL MOVSTR (J)
  2225.                 JINT(IP)=KAPSTR
  2226.            END IF
  2227.            J=J+1
  2228.            IP=IP+1
  2229.            IF (J.LE.JCOL) GO TO 290
  2230.            JINT(IP)=KAPSTR
  2231. 300        IP=IP+1
  2232.            IF (IP.LE.JCOL) THEN
  2233.                 JINT(IP)=KBL
  2234.                 GO TO 300
  2235.            END IF
  2236.       END IF
  2237.       GO TO 220
  2238. C
  2239. 310   IF (LNTMP.GT.0) LNSTR=LNTMP
  2240.       IF (NLHTRN.GT.0) THEN
  2241.            IF (LTYPE.NE.26) CALL DIAGNO (39)
  2242.            NLHTRN=0
  2243.       END IF
  2244.       IF (MDEB.GT.0) WRITE (OUTFIL,320) IFIR,LFIR
  2245.       RETURN
  2246.  320  FORMAT (' HOLSCN: IFIR = ',I2,' AT COL ',I4)
  2247.       END
  2248.       SUBROUTINE IOSYS1 (OP,KV,SER,LIST)
  2249. C
  2250. C     OP CODES PERMITTED.
  2251. C     1         2         3         4
  2252. C     ERASE     REWIND    WRITE     READ
  2253. C
  2254.       INCLUDE 'TIDY.INC'
  2255.       INCLUDE 'UNITS.INC'
  2256.       INTEGER OP,KV(8)
  2257.       CHARACTER*2 SER(8),LIST(1)
  2258. C
  2259.       GO TO (10,20,30,40),OP
  2260. C
  2261. C     ERASE
  2262. C
  2263.       ENTRY IOSY11
  2264. 10    IF (MDEB.NE.0) WRITE (0,60)
  2265.       REWIND SCFIL1
  2266.       RETURN
  2267. C
  2268. C     REWIND
  2269. C
  2270.       ENTRY IOSY12
  2271. 20    IF (MDEB.NE.0) WRITE (0,70)
  2272.       REWIND SCFIL1
  2273.       RETURN
  2274. C
  2275. C     WRITE
  2276. C
  2277. 30    WRITE (SCFIL1) KV,SER
  2278.       IF (MDEB.NE.0) WRITE (0,80) KV
  2279.       CALL REDSTR (SCFIL1,LIST,KV(4),IOUTN,KV(6),1)
  2280.       GO TO 50
  2281. C
  2282. C     READ
  2283. C
  2284. 40    READ (SCFIL1) KV,SER
  2285.       IF (MDEB.NE.0) WRITE (0,90) KV
  2286.       CALL REDSTR (SCFIL1,LIST,KV(4),IOUTN,KV(6),2)
  2287. C                            NORMAL EXIT
  2288. 50    RETURN
  2289. C
  2290. 60    FORMAT (' rewinding 1 - IOSY11')
  2291. 70    FORMAT (' rewinding 1 - IOSY12')
  2292. 80    FORMAT (' write: ',8I9)
  2293. 90    FORMAT (' read: ',8I9)
  2294.       END
  2295.       SUBROUTINE IOSYS2 (OP,KV,SER,LIST)
  2296. C
  2297. C     OP CODES PERMITTED.
  2298. C     1         2         3         4
  2299. C     ERASE     REWIND    WRITE     READ
  2300. C
  2301.       INCLUDE 'TIDY.INC'
  2302.       INCLUDE 'UNITS.INC'
  2303.       INTEGER OP, KV(8)
  2304.       CHARACTER*2 SER(8), LIST(1)
  2305. C
  2306.       GO TO (10,20,50,80),OP
  2307. C
  2308. C     ERASE
  2309. C
  2310.       ENTRY IOSY21
  2311.  10   REWIND SCFIL2
  2312.       RETURN
  2313. C
  2314. C     REWIND
  2315. C
  2316.       ENTRY IOSY22
  2317.  20   REWIND SCFIL2
  2318.       RETURN
  2319. C
  2320. C     WRITE
  2321. C
  2322.  50   WRITE (SCFIL2) KV, SER
  2323.       CALL REDSTR (SCFIL2, LIST, KV(4),IOUTN,KV(6),1)
  2324.       GO TO 120
  2325. C
  2326. C     READ
  2327. C
  2328.  80   READ (SCFIL2) KV, SER
  2329.       CALL REDSTR (SCFIL2, LIST, KV(4),IOUTN,KV(6),2)
  2330. C                            NORMAL EXIT
  2331.  120  RETURN
  2332.       END
  2333.       SUBROUTINE JTYP19 (JRTCOD)
  2334. C                  ***** JTYPE = 19
  2335. C     FORMAT (
  2336.       INCLUDE 'TIDY.INC'
  2337. C     ERROR IF NO STATEMENT NUMBER OR FIRST SPECIAL CHAR NOT (
  2338.       IF (L15.EQ.0.OR.JINT(JMAX).NE.KSPK(5)) THEN
  2339.            JRTCOD=1
  2340.            RETURN
  2341.       END IF
  2342.       IF (MEX.EQ.0) THEN
  2343.            IF (MCOL.EQ.-1) THEN
  2344. C          IF COLLECTING FORMATS, START THEM IN COLUMN 7 (OR JUST).
  2345.                 ICOL=6
  2346.                 IF (JUST.GT.0) ICOL=JUST-1
  2347.            END IF
  2348.            CALL COPY (6)
  2349. C                            COPY REST OF CARD
  2350.            IF (MCOL.EQ.0) THEN
  2351.                 JRTCOD=3
  2352.                 RETURN
  2353.            END IF
  2354. C                            ONTO UNIT 2
  2355.            ICOL=ICOL+1
  2356.            CALL COPY (0)
  2357.            IMAX=ICOL
  2358.            JTYPE=NREC
  2359.            CALL IOSYS2 (3,KILI,SERIAL,IOUT)
  2360.            NRT2=NRT2+1
  2361.            NBLC=NBCOLD
  2362.       ELSE
  2363. C     EXEMPT FLAG IS ON - TRANSFER TO TAPE1 OR TAPE2 WITHOUT REMOVING
  2364. C     ANY BLANKS.
  2365.            IF (MCOL.NE.0) THEN
  2366.                 ITYPE=NREC
  2367.                 CALL IOSYS2 (3,KILI,SERIAL,JINT)
  2368.                 NRT2=NRT2+1
  2369.                 NBLC=NBCOLD
  2370.            ELSE
  2371.                 CALL DLIST (MERR)
  2372.                 IF (MERR.EQ.0) THEN
  2373.                      CALL IOSYS1 (3,KILI,SERIAL,JINT)
  2374.                      NRT1=NRT1+1
  2375.                 END IF
  2376.            END IF
  2377.       END IF
  2378.       JRTCOD=2
  2379.       RETURN
  2380.       END
  2381.       SUBROUTINE JTYP31(JRTCOD)
  2382. C
  2383. C                  ***** JTYPE = 31
  2384. C     IF (ARITHMETIC) 1,2,3   OR   IF (LOGICAL) STATEMENT.
  2385. C
  2386.       INCLUDE 'TIDY.INC'
  2387.       CHARACTER*2 JT
  2388.       COMMON /PS1SUB/ KSTC(5), NIFBLK
  2389. C
  2390.       CALL COPY (2)
  2391.       ICOL=ICOL+1
  2392. C                  COPY UNTIL CLOSED PARENTHESES
  2393.       CALL COPY (-1)
  2394.       IF (MEOF.GE.0) GO TO 80
  2395.       ICOL=ICOL+1
  2396.       CALL RSTAT
  2397.       IF (L772.NE.0) THEN
  2398. C
  2399. C     STATEMENT IS    IF (ARITHMETIC) 1,2,3
  2400. C
  2401.            NCOM=0
  2402.            MILDO=-1
  2403.            CALL DLIST (MERR)
  2404.            IF (MERR.NE.0) GO TO 80
  2405. 10         IOUT(ICOL+1)=KLR2
  2406.            ICOL=ICOL+1
  2407.            IF (NXRF.GT.MXREF) THEN
  2408.                 CALL DIAGNO (35)
  2409.                 MP2=0
  2410.                 JRTCOD=2
  2411.                 RETURN
  2412.            END IF
  2413.            IOUTN(NXRF)=L772
  2414.            NXRF=NXRF+1
  2415.            CALL RLIST
  2416.            CALL COPY (1)
  2417.            IF (LCPY.EQ.KSPK(2)) THEN
  2418.                 NCOM=NCOM+1
  2419.                 IF (NCOM.GT.3) GO TO 80
  2420.                 IF (NCOM.EQ.3) CALL DIAGNO (18)
  2421.                 CALL RSTAT
  2422.                 IF (L772.EQ.0) GO TO 80
  2423.                 GO TO 10
  2424.            END IF
  2425.            IF (LCPY.NE.KERM) GO TO 80
  2426.            IF (NCOM.LE.0) GO TO 80
  2427.            IF (NCOM.EQ.1) CALL DIAGNO (18)
  2428.            MTRAN=MLGC
  2429.            JRTCOD=3
  2430.            RETURN
  2431.       END IF
  2432. C
  2433. C     STATEMENT IS   IF (LOGICAL) STATEMENT
  2434. C
  2435.       MLGC=0
  2436. C
  2437. C        CHECK FOR 'IF () THEN' UNLESS IT IS  ELSEIF () THEN
  2438.       IF (JTYPE.EQ.43) GO TO 40
  2439.       I=69
  2440.       CALL KWSCAN (I,KSTC)
  2441.       IF (I.NE.69) GO TO 40
  2442.       CALL COPY (4)
  2443. C        LOOP TO CHECK REST FOR BLANKS.
  2444.       DO 20 I=JCOL,JMAX
  2445.            IF (JINT(I).EQ.KERM) GO TO 30
  2446.            IF (JINT(I).NE.KBL) GO TO 40
  2447. 20    CONTINUE
  2448. 30    NIFBLK=NIFBLK+1
  2449.       JRTCOD=4
  2450.       RETURN
  2451. C
  2452. C                   LOOK FOR FIRST SPECIAL CHARACTER.
  2453. 40    DO 60 LFIR=JCOL,JMAX
  2454.            JT=JINT(LFIR)
  2455.            DO 50 IFIR=1,11
  2456.                 IF (JT.EQ.KSPK(IFIR)) GO TO 70
  2457. 50         CONTINUE
  2458. 60    CONTINUE
  2459.       LFIR=6
  2460.       IFIR=14
  2461. 70    JRTCOD=5
  2462.       RETURN
  2463. C
  2464. 80    JRTCOD=1
  2465.       RETURN
  2466. C
  2467.       END
  2468.       SUBROUTINE JTYP33 (JRTCOD)
  2469. C
  2470. C     PROCESS TYPE 33 CARDS - AGS 23 DEC 1993
  2471. C
  2472. C     JRTCOD IS RETURN CODE - USE COMPUTED GOTO TO BRANCH TO PROPER
  2473. C      PLACE IN PASS1.
  2474. C
  2475.       INCLUDE 'TIDY.INC'
  2476. C
  2477. C                  ***** JTYPE = 33
  2478. C     PRINT, TYPE, WRITE, PUNCH, READ, ACCEPT.
  2479. C
  2480.       CALL COPY (NINS)
  2481.       ICOL=ICOL+1
  2482.       CALL RSTAT
  2483.       IF (L772.NE.0) GO TO 20
  2484. C
  2485. C     HAVE WRITE  FMT,LIST
  2486. C
  2487. C            , AS IN PRINT IFT,XXX
  2488.       IF (IFIR.NE.2) THEN
  2489. C            *, AS IN PRINT *,XXX
  2490.            IF (IFIR.EQ.8.OR.IFIR.EQ.12.OR.IFIR.EQ.14) THEN
  2491.                 JRTCOD=1
  2492.            ELSE
  2493.                 JRTCOD=2
  2494.            END IF
  2495.            RETURN
  2496.       END IF
  2497. C
  2498.    10 CALL COPY (1)
  2499.       IF (LCPY.EQ.KSPK(2)) THEN
  2500.            JRTCOD=3
  2501.            RETURN
  2502.       END IF
  2503.       IF (MEOF.LT.0) GO TO 10
  2504.       JRTCOD=2
  2505.       RETURN
  2506. C
  2507. C     HAVE WRITE  12345 LIST
  2508. C
  2509.    20 CALL RLIST
  2510.       IOUT(ICOL+1)=KLR2
  2511.       ICOL=ICOL+1
  2512.       IF (NXRF.GT.MXREF) THEN
  2513.            JRTCOD=4
  2514.            RETURN
  2515.       END IF
  2516.       IOUTN(NXRF)=L772
  2517.       NXRF=NXRF+1
  2518.       IF (IFIR.EQ.2) GO TO 10
  2519.       IF (JMAX.GT.JCOL) THEN
  2520.            JRTCOD=2
  2521.       ELSE
  2522.            IMAX=ICOL
  2523.            JRTCOD=5
  2524.       END IF
  2525.       RETURN
  2526.       END
  2527.       CHARACTER*2 FUNCTION KCTRAN(C)
  2528. C
  2529. C     CONVERTS ALL LETTERS TO A SINGLE CASE, SELECTED BY USER'S CALL TO
  2530. C      SUBROUTINE KCTSET.
  2531. C     PORTABLE VERSION - NOT ASCII/EBCDIC DEPENDENT.
  2532. C     AGS 12 OCT 93
  2533. C
  2534. C
  2535.       CHARACTER CT
  2536.       CHARACTER*2 C
  2537. C     COMMON BLOCK FOR CHARACTER TRANSLATION TABLES
  2538.       COMMON /CTRAN/ LININ,LINOUT
  2539.       CHARACTER*26 LININ,LINOUT
  2540.       SAVE
  2541. C
  2542. C     FIND POSITION OF CHARACTER IN INPUT-CASE ALPHABET
  2543.       CT=C(1:1)
  2544.       J=INDEX(LININ,CT)
  2545. C
  2546. C     IF FOUND, RETURN OUTPUT-CASE EQUIVALENT, OTHERWISE ORIGINAL CHAR.
  2547.       IF (J.GT.0) THEN
  2548.            KCTRAN=LINOUT(J:J)
  2549.       ELSE
  2550.            KCTRAN=C
  2551.       END IF
  2552. C
  2553.       RETURN
  2554.       END
  2555.       SUBROUTINE KCTSET (IP)
  2556. C
  2557. C     SET CHARACTER TRANSLATION TABLE FOR KCTRAN:
  2558. C     IP = 0 - LOWER TO UPPER
  2559. C     IP = 1 - UPPER TO LOWER
  2560. C
  2561. C     COMMON BLOCK FOR CHARACTER TRANSLATION TABLES
  2562.       COMMON /CTRAN/ LININ,LINOUT
  2563.       CHARACTER*26 LININ,LINOUT
  2564.       CHARACTER*26 CTBL(0:1)
  2565.       SAVE
  2566.       DATA CTBL/'abcdefghijklmnopqrstuvwxyz',
  2567.      1          'ABCDEFGHIJKLMNOPQRSTUVWXYZ'/
  2568. C
  2569. C     ASSIGN INPUT AND OUTPUT ALPHABETS BASED ON VALUE OF IP.
  2570.       LININ=CTBL(IP)
  2571.       LINOUT=CTBL(1-IP)
  2572. C
  2573.       RETURN
  2574.       END
  2575.       CHARACTER*2 FUNCTION KHIDE (C)
  2576.       CHARACTER*2 C
  2577.       CHARACTER*2 KBL
  2578.       DATA KBL/' @'/
  2579. C
  2580. C     CONVERT CHARACTERS IN HOLSCN STRINGS TO SPECIAL FORM
  2581. C      (UNLESS ALREADY SET TO INDICATE EMBEDDED COMMENT STATEMENT)
  2582. C      SO THAT BLANKS WILL NOT BE REMOVED FROM STRINGS.
  2583. C
  2584.       IF (C(2:2).EQ.' ') THEN
  2585.            KHIDE=KBL
  2586.            KHIDE(1:1)=C(1:1)
  2587.       ELSE
  2588.            KHIDE=C
  2589.       END IF
  2590.       RETURN
  2591.       END
  2592.       SUBROUTINE KIMPAK
  2593. C
  2594. C     THIS ROUTINE PACKS SUPER-CARD IMAGES FROM IOUT(I) INTO KIM(I,J).
  2595. C
  2596.       INCLUDE 'TIDY.INC'
  2597.       LOGICAL CONIND,SPLSTR
  2598. C
  2599.       CONIND=.TRUE.
  2600.       SPLSTR=.FALSE.
  2601. C
  2602.  10   J=0
  2603. C
  2604.  20   J=J+1
  2605.       IF (KLASS.LT.2) THEN
  2606.            K7=0
  2607.            JL=1
  2608.            JR=72
  2609.            GO TO 90
  2610.       END IF
  2611. C
  2612. C     INDENTING COULD MAKE CARD OVERFLOW CONTINUATIONS, IF SO, REPACK.
  2613.       IF (J.GT.20) THEN
  2614.            IF (.NOT.CONIND) THEN
  2615.                 CALL DIAGNO (37)
  2616.                 J=20
  2617.                 GO TO 120
  2618.            END IF
  2619.            CONIND=.FALSE.
  2620.            JL=7
  2621.            JR=72
  2622.            GO TO 10
  2623.       END IF
  2624. C
  2625. C     PREPARE COLUMNS 1-6 OF FIRST CARD.
  2626.       IF (CONIND) THEN
  2627.            IF (J.EQ.1) THEN
  2628.                 K7=ICOLSV
  2629.                 DO 30 I=1,6
  2630.                      KIM(I,1)=IOUT(I)
  2631.  30             CONTINUE
  2632.            ELSE
  2633. C     BLANK COLUMN 1-5
  2634.                 DO 40 I=1,5
  2635.                      KIM(I,J)=KBL
  2636.  40             CONTINUE
  2637. C     COLUMN 6 - NUMBER SERIALLY UNLESS CCHR SET OTHERWISE.
  2638.                 IF (KCTCTL.EQ.0) THEN
  2639.                      IF (J.LT.11) THEN
  2640.                           KIM(6,J)=KDIG(J)
  2641.                      ELSE
  2642.                           KIM(6,J)=KSPK(10)
  2643.                      END IF
  2644.                 ELSE
  2645.                      KIM(6,J)=KCTCHR
  2646.                 END IF
  2647.            END IF
  2648. C
  2649. C     SET LEFT EDGE OF TEXT
  2650. C      (USE COL 7 IF EXEMPT, NON-INDENTED, OR IF PART OF STRING
  2651.            IF (MEX.LT.0.OR.ICOLSV.EQ.6.OR.(IOUT(K7)(2:2).EQ.KAT(2:2).
  2652.      1      AND.IOUT(K7+1)(2:2).EQ.KAT(2:2))) THEN
  2653.                 JL=7
  2654.            ELSE
  2655.                 JL=ICOLSV
  2656.                 IF (J.GT.1) JL=JL+1
  2657.                 DO 50 I=7,JL
  2658.                      KIM(I,J)=KBL
  2659.  50             CONTINUE
  2660.                 JL=JL+1
  2661.            END IF
  2662. C
  2663. C     SET RIGHT EDGE OF TEXT
  2664. C     FIRST GET RIGHT-MOST POTENTIAL CHAR IN STRING (KRR)
  2665.            JR=72
  2666.            KRR=K7+JR-JL+1
  2667.            IF (KRR.GT.IMAX) THEN
  2668. C     IF PAST END OF STATEMENT, STOP AT END.
  2669.                 JR=JL+IMAX-K7-1
  2670.                 GO TO 90
  2671.            END IF
  2672. C
  2673. C     NOW CHECK IF WE CAN BREAK IT HERE.
  2674. C     BREAK IF PART OF A STRING. KIMPAK PROTECTS DELIMETERS ALSO.
  2675.  60        IF (IOUT(KRR)(2:2).EQ.KAT(2:2)) THEN
  2676. C
  2677. C     FORMAT STATEMENTS - MAY HAVE PROBLEMS WITH QUOTES AT END.
  2678.                 IF (KLASS.EQ.5) THEN
  2679. C          DON'T SPLIT IF TURNED OFF OR AT TOP INDENT LEVEL.
  2680.                      IF (KFSPL.EQ.1.OR.ICOLSV.EQ.6) GO TO 90
  2681. C          IF NEXT CHAR NOT IN STRING, BREAK IS FINE.
  2682.                      IF (IOUT(KRR+1)(2:2).NE.KAT(2:2)) GO TO 90
  2683. C
  2684. C          COLUMN 72 NOT A QUOTE, CAN SPLIT ON COL 71
  2685.                      IF (IOUT(KRR).NE.KAPSTR) THEN
  2686. C          INSERT ',' IN STRING
  2687.                           JR=JR-1
  2688.                           SPLSTR=.TRUE.
  2689.                      ELSE
  2690. C          COLUMN 72 QUOTE WITHIN A STRING, BACKTRACK.
  2691.                           KRR=KRR-1
  2692.                           JR=JR-1
  2693.                           IF (JR.GT.JL) GO TO 60
  2694.                      END IF
  2695. C     END FORMAT STRING BREAKER
  2696.                 END IF
  2697.                 GO TO 90
  2698.            END IF
  2699. C
  2700. C     BREAK IF IT IS A BLANK (NOT IN STRING)
  2701.            IF (IOUT(KRR).EQ.KBL) GO TO 90
  2702. C
  2703. C     GO BACK IF LEFT PARENTHESIS
  2704.  70        IF (IOUT(KRR).EQ.KSPK(3)) THEN
  2705.                 KRR=KRR-1
  2706.                 JR=JR-1
  2707.                 GO TO 70
  2708.            END IF
  2709. C
  2710. C     BREAK FOR SPECIAL CHARACTERS (EXCEPT DECIMAL POINTS)
  2711.            DO 80 I=1,14
  2712.                 IF (IOUT(KRR).EQ.KSPK(I).AND.I.NE.9) GO TO 90
  2713.  80        CONTINUE
  2714. C
  2715. C     OTHERWISE BACK UP ONE, TRY AGAIN.
  2716.            KRR=KRR-1
  2717.            JR=JR-1
  2718.            IF (JR.GT.JL) GO TO 60
  2719. C
  2720. C     IF GO ALL THE WAY BACK, FORCE IT TO 72
  2721.            JR=72
  2722.       END IF
  2723. C
  2724. C     COPY THE TEXT
  2725.  90   DO 100 I=JL,JR
  2726.            K7=K7+1
  2727.            IF (K7.LE.IMAX) THEN
  2728.                 KIM(I,J)=IOUT(K7)
  2729.            ELSE
  2730.                 KIM(I,J)=KBL
  2731.            END IF
  2732.  100  CONTINUE
  2733. C
  2734. C     STRING SPLITTER
  2735.       IF (SPLSTR) THEN
  2736.            KIM(JR+1,J)=KAPSTR
  2737.            IOUT(K7-1)=KSPK(2)
  2738.            IOUT(K7)=KAPSTR
  2739.            K7=K7-2
  2740.            JR=JR+1
  2741.            SPLSTR=.FALSE.
  2742.       END IF
  2743. C
  2744. C     SCRUB GARBAGE OFF END IF SHORTER THAN 72
  2745.       IF (JR.LT.72) THEN
  2746.            DO 110 I=JR+1,72
  2747.                 KIM(I,J)=KBL
  2748.  110       CONTINUE
  2749.       END IF
  2750. C
  2751. C     DO ANOTHER CONTINUATION IF NECESSARY.
  2752.       IF (K7.LT.IMAX) GO TO 20
  2753. C
  2754.  120  NCD=J
  2755.       RETURN
  2756.       END
  2757.       CHARACTER*2 FUNCTION KUPPER(C)
  2758. C
  2759. C     CONVERTS LOWER-CASE LETTERS TO UPPER-CASE. PORTABLE VERSION.
  2760. C     AGS 23 APR 93
  2761. C
  2762.       CHARACTER CT
  2763.       CHARACTER*2 C
  2764.       CHARACTER*26 LC,UC
  2765.       SAVE
  2766.       DATA LC/'abcdefghijklmnopqrstuvwxyz'/
  2767.       DATA UC/'ABCDEFGHIJKLMNOPQRSTUVWXYZ'/
  2768. C
  2769. C     FIND POSITION OF CHARACTER IN LOWER-CASE ALPHABET
  2770.       CT=C(1:1)
  2771.       J=INDEX(LC,CT)
  2772. C
  2773. C     IF FOUND, RETURN UPPER-CASE EQUIVALENT, OTHERWISE ORIGINAL CHAR.
  2774.       IF (J.GT.0) THEN
  2775.            KUPPER=UC(J:J)
  2776.       ELSE
  2777.            KUPPER=C
  2778.       END IF
  2779. C
  2780.       RETURN
  2781.       END
  2782.       SUBROUTINE MOVSTR (J)
  2783.       INCLUDE 'TIDY.INC'
  2784. C
  2785. C     ADDS 1 BYTE TO STRING BY SHIFTING UNPROCESSED CHARS RIGHT.
  2786. C     USED BY HOLSCN WHEN REPLICATING APOSTROPHES
  2787. C
  2788.       DO 10 I=JMAX,J,-1
  2789.            JINT(I+1)=JINT(I)
  2790.  10   CONTINUE
  2791.       JMAX=JMAX+1
  2792.       JINT(JMAX+1)=KERM
  2793.       J=J+1
  2794.       JCOL = JCOL+1
  2795.       RETURN
  2796.       END
  2797.       SUBROUTINE NOPRO
  2798. C
  2799. C     THIS SUBROUTINE EXECUTES A HIGH-SPEED SEARCH FOR AN END STATEMENT.
  2800. C     IF MP2 IS ON, CARD IMAGES ARE WRITTEN ON TAPE 1 FOR USE BY PASS2.
  2801. C     NO INTERNAL PROCESSING IS DONE ON THE STATEMENTS.
  2802. C
  2803.       INCLUDE 'TIDY.INC'
  2804. C     SET INITIAL VALUES.
  2805. C
  2806.       CALL IOSY11
  2807.       CALL IOSY21
  2808.       NRT2=0
  2809.       NDEF=0
  2810.       KLASS=1
  2811.       ITYPE=0
  2812.       L15=0
  2813.       IF (MP2.NE.0) THEN
  2814. C
  2815. C     WRITE OUT STATEMENT CURRENTLY IN JINT.
  2816. C
  2817.            IMAX=JMAX
  2818.            KLASS=2
  2819.            CALL IOSYS1 (3,KILI,SERIAL,JINT)
  2820.            NRT1=1
  2821.            KLASS=3
  2822.            IF (JMAX.GT.72) CALL DIAGNO (28)
  2823.       END IF
  2824.       GO TO 20
  2825. C
  2826. C     READ AND COPY CARD IMAGES BY WAY OF KBUFF.
  2827. C
  2828.  10   CALL READER
  2829.  20   NREC=NREC+1
  2830. C
  2831. C     LOOK FOR LAST NON-BLANK CHARACTER ON CARD.
  2832. C
  2833.       I=72
  2834.  30   IF (KBUFF(I).EQ.KBL) THEN
  2835.            I=I-1
  2836.            IF (I.GT.7) GO TO 30
  2837.       END IF
  2838.       IMAX=I
  2839. C
  2840. C     LOOK FOR END STATEMENT IN INPUT BUFFER KBUFF
  2841. C
  2842.       J=3
  2843.       DO 40 I=7,IMAX
  2844.            K=I
  2845.            IF (KBUFF(I).NE.KBL) THEN
  2846.                 IF (KBUFF(I).NE.KEND(J)) GO TO 50
  2847.                 J=J-1
  2848.                 IF (J.EQ.0) THEN
  2849. C     FOUND AN END CARD IF NEXT CHAR IS BLANK.
  2850.                      IF (KBUFF(K+1).EQ.KBL) KLASS=8
  2851.                      GO TO 50
  2852.                 END IF
  2853.            END IF
  2854.  40   CONTINUE
  2855. C
  2856. C
  2857. C     WRITE OUT CARD IMAGE FOR PASS2.
  2858. C
  2859.  50   IF (MP2.NE.0) THEN
  2860.            CALL IOSYS1 (3,KILI,SERIAL,KBUFF)
  2861.            NRT1=NRT1+1
  2862.       END IF
  2863. C
  2864. C     GET NEXT RECORD UNLESS END CARD OR EOF
  2865.       IF (IQUIT.NE.1.AND.KLASS.NE.8) GO TO 10
  2866. C
  2867. C     CLOSE FILE
  2868.       IF (MP2.NE.0) CALL IOSY12
  2869. C
  2870. C     LOAD BUFFER, KBUFF, BEFORE EXITING.
  2871. C
  2872.       IF (IQUIT.EQ.0) CALL READER
  2873.       RETURN
  2874.       END
  2875.       INTEGER FUNCTION OPFIL(KUNIT,FNAME,KTYPE,KNOUT,EXPRES,LENGTH)
  2876. C-------------------------------------------------------------------------
  2877. C---- THIS IS THE OPEN FILE FUNCTION BY W.J. MEERSCHAERT & P.J. DAUGHERTY
  2878. C---- JULY 25, 1986
  2879. C---- DUMMY PARAMETERS ARE AS FOLLOWS:
  2880. C
  2881. C    IUNIT....UNIT NUMBER OF THE FILE TO BE OPENED, PREFERRABLY > 20
  2882. C    FNAME....NAME OF FILE TO BE OPENED, IF SCRATCH, IT IS IGNORED,
  2883. C                IF MISSING, IT IS PROMPTED FOR
  2884. C    ITYPE....TYPE OF FILE TO BE OPENED, AS FOLLOWS:
  2885. C            >0   RECL FOR A DIRECT ACCESS UNFORMATTED FILE
  2886. C            >100000 DIRECT ACCESS FORMATTED FILE RECL=MOD(ITYPE,100000)
  2887. C             0   FORMATTED SEQUENTIAL FILE
  2888. C            <0   UNFORMATTED SEQUENTIAL FILE
  2889. C    INOUT....SPECIFIES WHAT THE FILE IS FOR:
  2890. C            -2   INPUT FILE, IF NOT EXIST, EXIT WITH ERROR CODE
  2891. C            -1   INPUT FILE, IF NOT EXIST, PROMPT USER FOR NEW NAME
  2892. C             0   SCRATCH FILE
  2893. C             1   OUTPUT FILE, IF EXIST, PROMPT USER FOR ACTION
  2894. C             2   OUTPUT FILE, IF EXIST, OVERWRITE AUTOMATICALLY
  2895. C             3   OUTPUT FILE, IF EXIST, APPEND AUTOMATICALLY
  2896. C             4   OUTPUT FILE, IF EXIST, EXIT WITH ERROR CODE
  2897. C    EXPRES...EXPRESSION FOR PROMPTING USER FOR FILENAME
  2898. C    LENGTH...NUMBER OF LINES IN OLD PART OF APPENDED FILE
  2899. C
  2900. C OPFIL RETURNS THE FOLLOWING:
  2901. C    0......ALL IS WELL
  2902. C    >0.....COMPILER OR SYSTEM ERROR MESSAGE ON OPEN STATEMENT
  2903. C    1......USER EOF ON A READ PROMPT (I.E., ABORT OPEN)
  2904. C    2......ERROR CODE BASED ON INOUT, FILE M=NOT OPENED
  2905. C
  2906. C-------------------------------------------------------------------------
  2907.       CHARACTER FNAME*(*),EXPRES*(*),ANS
  2908.       INTEGER DOSDEV
  2909.       LOGICAL EXST,FILOPN
  2910.       INCLUDE 'UNITS.INC'
  2911. C
  2912. C---- REASSIGN INTEGER DUMMY VARIABLES
  2913. C
  2914.       IUNIT=KUNIT
  2915.       ITYPE=KTYPE
  2916.       INOUT=KNOUT
  2917.       LENGTH=0
  2918. C
  2919. C---- OPEN SCRATCH FILE
  2920. C
  2921.       IF (INOUT.EQ.0) THEN
  2922.            IF (ITYPE) 10,20,30
  2923.  10        OPEN (IUNIT,STATUS='SCRATCH',FORM='UNFORMATTED',ACCESS='SEQUE
  2924.      1NTIAL',IOSTAT=OPFIL)
  2925.            RETURN
  2926.  20        OPEN (IUNIT,STATUS='SCRATCH',FORM='FORMATTED',ACCESS='SEQUENT
  2927.      1IAL',IOSTAT=OPFIL)
  2928.            RETURN
  2929.  30        IF (ITYPE.GT.100000) THEN
  2930.                 ITYPE=MOD(ITYPE,100000)
  2931.                 OPEN (IUNIT,ACCESS='DIRECT',STATUS='SCRATCH',RECL=ITYPE,
  2932.      1FORM='FORMATTED',IOSTAT=OPFIL)
  2933.            ELSE
  2934.                 OPEN (IUNIT,ACCESS='DIRECT',STATUS='SCRATCH',RECL=ITYPE,
  2935.      1FORM='UNFORMATTED',IOSTAT=OPFIL)
  2936.            END IF
  2937.            RETURN
  2938.       END IF
  2939. C
  2940. C---- CHECK FOR LOGIC OF ARGUMENTS AND FILE PROPERTIES
  2941. C
  2942.  40   IF (FNAME.EQ.' '.AND.INOUT.NE.2) THEN
  2943.            WRITE (STDERR,190) EXPRES
  2944.            READ (STDIN,200,END=170) FNAME
  2945.            IF (FNAME(1:1).EQ.'?') THEN
  2946.                 PAUSE 'Type DIR to see a list of files'
  2947.                 FNAME=' '
  2948.                 GO TO 40
  2949.            ELSE IF (FNAME(1:1).EQ.'>'.AND.FNAME(2:2).NE.'>') THEN
  2950.                 IF (INOUT.GT.0) INOUT=2
  2951.                 FNAME=FNAME(2:)
  2952.            ELSE IF (FNAME(1:2).EQ.'>>') THEN
  2953.                 IF (INOUT.GT.0) INOUT=3
  2954.                 FNAME=FNAME(3:)
  2955.            ELSE
  2956.                 IF (INOUT.GT.0) INOUT=1
  2957.            END IF
  2958.       END IF
  2959. C
  2960. C---- GET EXST AND FILOPN
  2961. C
  2962.       INQUIRE (FILE=FNAME,EXIST=EXST,OPENED=FILOPN)
  2963. C
  2964. C     DON'T OPEN SAME FILE TWICE.
  2965.       IF (FILOPN) THEN
  2966.            WRITE (STDERR,210) FNAME
  2967.            FNAME=' '
  2968.            GO TO 40
  2969.       END IF
  2970. C
  2971. C---- INPUT FILE
  2972. C
  2973.       IF (.NOT.EXST.AND.INOUT.LT.0) THEN
  2974.            IF (INOUT.EQ.-1) THEN
  2975.                 WRITE (STDERR,220) FNAME
  2976.                 FNAME=' '
  2977.                 GO TO 40
  2978.            ELSE IF (INOUT.EQ.-2) THEN
  2979.                 GO TO 180
  2980.            END IF
  2981. C
  2982. C---- OUTPUT FILE
  2983. C
  2984.       ELSE IF (EXST.AND.INOUT.EQ.1) THEN
  2985. C
  2986.            ISDEV = 0
  2987. C
  2988. C     DOS DEVICES ARE OK IF THEY EXIST
  2989.            ISDEV =  DOSDEV(FNAME)
  2990.            IF (ISDEV.GT.0) THEN
  2991.                 INOUT=2
  2992.                 GO TO 60
  2993.            END IF
  2994. C
  2995. C     OTHERWISE ASK USER WHAT TO DO.
  2996.  50        WRITE (STDERR,230) EXPRES,FNAME
  2997.            READ (STDIN,240,END=170) ANS
  2998.            IF (ANS.EQ.'o'.OR.ANS.EQ.'O') THEN
  2999.                 INOUT=2
  3000.            ELSE IF (ANS.EQ.'a'.OR.ANS.EQ.'A') THEN
  3001.                 INOUT=3
  3002.            ELSE IF (ANS.EQ.'n'.OR.ANS.EQ.'N') THEN
  3003.                 FNAME=' '
  3004.                 GO TO 40
  3005.            ELSE
  3006.                 GO TO 50
  3007.            END IF
  3008.       ELSE IF (EXST.AND.INOUT.EQ.4) THEN
  3009.            OPFIL=2
  3010.            RETURN
  3011.       END IF
  3012. C
  3013. C---- OPEN FILE
  3014. C
  3015.  60   IF (ITYPE) 70,80,90
  3016.  70   OPEN (IUNIT,FILE=FNAME,STATUS='UNKNOWN',FORM='UNFORMATTED',ACCESS=
  3017.      1'SEQUENTIAL',IOSTAT=OPFIL)
  3018.       GO TO 100
  3019.  80   OPEN (IUNIT,FILE=FNAME,STATUS='UNKNOWN',FORM='FORMATTED',ACCESS='S
  3020.      1EQUENTIAL',IOSTAT=OPFIL)
  3021.       GO TO 100
  3022.  90   IF (ITYPE.GT.100000) THEN
  3023.            ITYPE=MOD(ITYPE,100000)
  3024.            OPEN (IUNIT,FILE=FNAME,STATUS='UNKNOWN',FORM='FORMATTED',ACCE
  3025.      1SS='DIRECT',RECL=ITYPE,IOSTAT=OPFIL)
  3026.       ELSE
  3027.            OPEN (IUNIT,FILE=FNAME,STATUS='UNKNOWN',FORM='UNFORMATTED',AC
  3028.      1CESS='DIRECT',RECL=ITYPE,IOSTAT=OPFIL)
  3029.       END IF
  3030.       RETURN
  3031.  100  REWIND IUNIT
  3032. C
  3033. C---- APPEND IF REQUESTED
  3034. C
  3035.       IF (INOUT.EQ.3) THEN
  3036.            IF (ITYPE) 110,120,120
  3037.  110       READ (IUNIT,END=130)
  3038.            LENGTH=LENGTH+1
  3039.            GO TO 110
  3040.  120       READ (IUNIT,240,END=130) ANS
  3041.            LENGTH=LENGTH+1
  3042.            GO TO 120
  3043.  130       REWIND IUNIT
  3044.            DO 160 N=1,LENGTH
  3045.                 IF (ITYPE) 140,150,150
  3046.  140            READ (IUNIT)
  3047.                 GO TO 160
  3048.  150            READ (IUNIT,240) ANS
  3049.  160       CONTINUE
  3050.            END FILE IUNIT
  3051.            BACKSPACE (IUNIT)
  3052.       END IF
  3053. C
  3054. C---- ALL DONE
  3055. C
  3056.       RETURN
  3057.  170  OPFIL=1
  3058.       RETURN
  3059.  180  OPFIL=2
  3060.       RETURN
  3061. C
  3062. C
  3063.  190  FORMAT (/T3,'Open the ',A,' file'/T3,'Enter a file name here: ')
  3064.  200  FORMAT (A)
  3065.  210  FORMAT (/T3,'File already open: ',A)
  3066.  220  FORMAT (/T3,'File not found: ',A)
  3067.  230  FORMAT (/T3,A,' file exists: ',A/T5,'[O]verwrite'/T5,'[A]ppend'
  3068.      1/T5,'[N]ew file spec'/T3,'Enter here: ')
  3069.  240  FORMAT (A1)
  3070.       END
  3071.       SUBROUTINE PAGE (N)
  3072. C     THIS SUBROUTINE DOES THE GENERAL PAGE COUNTING FOR TIDY WHILE
  3073. C     LIMITING THE OUTPUT TO MAXLIN LINES PER PAGE.
  3074. C          N>0 -- I WILL WRITE N LINES.  START A NEW PAGE IF NECESSARY.
  3075. C          N=0 -- START A NEW PAGE.
  3076. C          N<0 -- START A NEW PAGE IF .LT. -N LINES ARE LEFT.
  3077.       INCLUDE 'TIDY.INC'
  3078.       INCLUDE 'UNITS.INC'
  3079.       DATA MAXLIN/56/
  3080.       IF (N.LT.0) THEN
  3081. C                            CONDITIONAL EJECT (NO LINES WRITTEN)
  3082.            IF ((LINE-N).LE.MAXLIN) RETURN
  3083.       ELSE IF (N.GT.0) THEN
  3084.            LINE=LINE+N
  3085.            IF (LINE.LE.MAXLIN) RETURN
  3086.       END IF
  3087. C                            MAKE NEW PAGE
  3088.       IF (LINE.NE.0) THEN
  3089.            LINE=0
  3090.            IF (N.GT.0) LINE=N
  3091.            NPAGE=NPAGE+1
  3092.            MPAGE=MPAGE+1
  3093.            WRITE (OUTFIL,10) NROUT,IPASS,MPAGE,NPAGE,JOB
  3094.       END IF
  3095.       RETURN
  3096.  10   FORMAT (/'1',6X,'* T I D Y *          ROUTINE',I4,4X,'PASS',I2,2X,
  3097.      1'PAGE',I3,21X,'PAGE',I4/7X,80A1/1X)
  3098.       END
  3099.       SUBROUTINE PASS1
  3100. C     THIS ROUTINE COLLECTS STATEMENT NUMBERS, MAKES DIAGNOSTIC COMMENTS
  3101. C     AND SETS UP THE FORTRAN STATEMENTS IN A FORM SUITABLE FOR PASS2.
  3102.       INTEGER JTMP(8)
  3103.       INCLUDE 'TIDY.INC'
  3104.       INCLUDE 'UNITS.INC'
  3105.       CHARACTER*2 JNT,JT,ICH,KUPPER,PRVCPY
  3106.       COMMON /PS1SUB/ KSTC(5),NIFBLK
  3107.       DIMENSION KCNDO(1500)
  3108.       LOGICAL BAKSCN
  3109. C     A    B    C    D    E    F    G    H    I    J    K    L    M
  3110. C     1    2    3    4    5    6    7    8    9    10   11   12   13
  3111. C     N    O    P    Q    R    S    T    U    V    W    X    Y    Z
  3112. C     14   15   16   17   18   19   20   21   22   23   24   25   26
  3113. C     =    ,    (    /    )    +    -    *    .    $    -    '    & NONE
  3114. C     1    2    3    4    5    6    7    8    9    10   11   12   13  14
  3115. C     SET UP INITIAL CONDITIONS.
  3116. C     REWIND TAPE FILES 1 AND 2.
  3117.    10 CALL IOSY11
  3118.       CALL IOSY21
  3119.       DO 20 I=1,10
  3120.            LDOS(I)=0
  3121.    20 CONTINUE
  3122.       IMAX=1326
  3123.       IPASS=1
  3124.       ICOL=0
  3125.       KOUNT=0
  3126.       MP2=1
  3127.       NBLC=2
  3128.       MPUN=KPUN
  3129.       MPRIN=KPRIN
  3130.       NROUT=NROUT+1
  3131.       NRT1=0
  3132.       NRT2=0
  3133.       MILDO=0
  3134.       MLGC=-1
  3135.       MSKP=0
  3136.       MPAGE=0
  3137.       MTRAN=0
  3138.       NDEF=0
  3139.       NDOS=0
  3140.       NFORT=0
  3141.       NREC=0
  3142.       NREF=0
  3143.       L25=0
  3144.       NTRAN=0
  3145.       NXEQ=0
  3146.       NIFBLK=0
  3147.       KENDDO=100000
  3148.       KCNDP=0
  3149.       GO TO 50
  3150. C                  ILLEGAL FIRST CHARACTER.
  3151.    30 JGOOF=9
  3152. C                  WRITE DIAGNOSTIC
  3153.    40 CALL DIAGNO (JGOOF)
  3154. C                  GET NEW CARD.
  3155. C     (UNLESS EOF ALREADY)
  3156.    50 IF (IQUIT.NE.0) GO TO 890
  3157.       CALL SKARD
  3158.       NXRF=1
  3159.       IF (IMAX.LT.ICOL) IMAX=ICOL
  3160.       DO 60 I=1,IMAX
  3161.            IOUT(I)=KBL
  3162.    60 CONTINUE
  3163.       IMAX=0
  3164. C     LOOK FOR * IN COLUMN 1
  3165.       IF (JINT(1).EQ.KSPK(8)) THEN
  3166.            CALL CONTRL
  3167.            IF (ISTAR.LT.0) THEN
  3168. C                  CONTROL CARD FOUND AND EXECUTED.
  3169.                 IF (MSTOP.NE.0) THEN
  3170. C                            *STOP CARD FOUND. QUIT IF FIRST OF ROUTINE
  3171.                      IF (NFORT.LE.0) THEN
  3172.                           MP2=0
  3173.                           RETURN
  3174.                      ELSE
  3175. C                            OTHERWISE BUILD AN END CARD
  3176.                           GO TO 850
  3177.                      END IF
  3178.                 END IF
  3179.                 IF (MSKP.EQ.0) GO TO 50
  3180.                 MP2=0
  3181.                 CALL NOPRO
  3182.                 GO TO 10
  3183. C                  CONTROL CARD FOR DELAYED EXECUTION. SAVE FOR PASS 2.
  3184.            ELSE IF (ISTAR.EQ.0) THEN
  3185.                 KLASS=0
  3186.                 GO TO 120
  3187.            ELSE
  3188. C                  * IN COL 1. NOT A CONTROL CARD.  PUT OUT LITERALLY
  3189. C                  UNLESS * IN COL 2. ALSO.
  3190.                 IF (JINT(2).EQ.KSPK(8)) GO TO 50
  3191.                 GO TO 110
  3192.            END IF
  3193.       END IF
  3194. C     *STOP COMMAND EXIT.
  3195. C     NO * IN COLUMN 1, LOOK FOR C, D, I, F, ., OR $. (UPPER CASE)
  3196.       IF (JINT(1).EQ.KBL) GO TO 150
  3197.       JNT=KUPPER(JINT(1))
  3198. C     COMMENT CARD
  3199.       IF (JNT.EQ.KABC(3)) THEN
  3200.            IF (MCOM.EQ.0) GO TO 50
  3201.            IF (MCOM.GT.0) THEN
  3202. C                  CHECK COL 2-6. DELETE *, SKIP ON ANYTHING ELSE.
  3203.                 DO 80 JCOL=2,6
  3204.                      IF (JINT(JCOL).NE.KBL) THEN
  3205.                           IF (JINT(JCOL).EQ.KSPK(8)) THEN
  3206. C     NON-BLANK IN STATEMENT FIELD.
  3207.                                ICOL=6
  3208.                                DO 70 I=JCOL,JMAX
  3209.                                     ICOL=ICOL+1
  3210.                                     IOUT(ICOL)=JINT(I)
  3211.    70                          CONTINUE
  3212.                                IOUT(1)=KABC(3)
  3213.                                IF (ICOL.GT.72) ICOL=72
  3214.                                IMAX=ICOL
  3215.                                KLASS=1
  3216.                                JTYPE=0
  3217.                                L15=0
  3218.                                CALL IOSYS1 (3,KILI,SERIAL,IOUT)
  3219.                                NRT1=NRT1+1
  3220.                                GO TO 50
  3221.                           END IF
  3222.                           JINT(JCOL)=KBL
  3223.                      END IF
  3224.    80           CONTINUE
  3225.            END IF
  3226. C     LOOK FOR BLANK COMMENT
  3227.            DO 90 JCOL=2,JMAX
  3228.                 IF (JINT(JCOL).NE.KBL) GO TO 140
  3229.    90      CONTINUE
  3230. C     BLANK COMMENT. TEST IF TWO PREVIOUS CARDS WERE BLANK
  3231.            NBLC=NBLC+1
  3232.            IF (NBLC.GT.2) GO TO 50
  3233.            JINT(1)=KABC(3)
  3234.            JMAX=7
  3235.            GO TO 110
  3236.       END IF
  3237. C     A BLANK LINE PRESERVED AS A COMMENT WITH NON-PRINTING FIRST CHAR
  3238. C      (SET IN SUBROUTINE READER IF *NOSTRIP OPTION TURNED ON)
  3239.       IF (JINT(1).EQ.KBLCMT) GO TO 140
  3240.       IF (JNT.EQ.KABC(4).OR.JNT.EQ.KABC(9).OR.JNT.EQ.KABC(6)) THEN
  3241.            CALL DIAGNO (8)
  3242.            GO TO 50
  3243.       END IF
  3244. C     LOOK FOR ANY SPECIAL CHARACTER IN COLUMN 1
  3245.       DO 100 I=1,14
  3246.            IF (JNT.EQ.KSPK(I)) THEN
  3247. C     SPECIAL CHAR IN COL 1.  GIVE MSG AND TREAT AS COMMENT
  3248.                 CALL DIAGNO (30)
  3249.                 GO TO 110
  3250.            END IF
  3251.   100 CONTINUE
  3252.       GO TO 150
  3253. C     COMMENT CARD.  DO WE SAVE THEM...
  3254.   110 KLASS=1
  3255.   120 JTYPE=0
  3256. C     WRITE STATEMENT IMAGE ON TAPE 1 FOR PASS 2.
  3257.   130 L15=0
  3258.       IMAX=JMAX
  3259.       CALL IOSYS1 (3,KILI,SERIAL,JINT)
  3260.       NRT1=NRT1+1
  3261.       GO TO 50
  3262. C     NON-BLANK COMMENT.
  3263.   140 NBLC=0
  3264.       IF (JMAX.GT.72) JMAX=72
  3265.       GO TO 110
  3266. C               ===============================================
  3267. C               *                                             *
  3268. C               *      START PROCESSING OF FORTRAN CARDS      *
  3269. C               *                                             *
  3270. C               ===============================================
  3271.   150 IF (JMAX.LT.8) GO TO 40
  3272.       NFORT=NFORT+1
  3273. C     CLASSIFY STATEMENT, THEN CHECK AND CHANGE HOLLERITH FIELDS
  3274. C       (DO UNCLASSIFIED (REPLACEMENT, ETC) STATEMENTS, AND ALSO
  3275. C       THOSE IN WHICH STRINGS ARE LEGAL PARTS.
  3276.       ITYPE=0
  3277.       JCOL=6
  3278.       CALL KWSCAN (ITYPE,KSTC)
  3279.       MPASS1=1
  3280.       I=KSTC(5)
  3281.       KLASS=KSTC(2)
  3282.       NINS=KSTC(1)
  3283.       CALL HOLSCN (ITYPE,I,LNGST)
  3284. C                  CLEAR FLAGS
  3285.       MLGC=-1
  3286.       NTRAN=MTRAN
  3287.       MTRAN=0
  3288.       MEOF=-1
  3289.       JGOOF=1
  3290. C                  CLEAR STATEMENT AND REFERENCE NUMBERS
  3291.       L15=0
  3292.       L772=0
  3293. C                  CLEAR BLANK COMMENT COUNTER
  3294.       NBCOLD=NBLC
  3295.       NBLC=0
  3296. C                  SET POSITION COUNTERS.
  3297.       JCOL=7
  3298.       IF (JUST.EQ.0) THEN
  3299. C                            NO COLUMN SHIFT
  3300.            ICOL=6
  3301.   160      IF (JINT(JCOL).NE.KBL) GO TO 170
  3302.            JCOL=JCOL+1
  3303.            ICOL=ICOL+1
  3304.            GO TO 160
  3305.       END IF
  3306. C                            COLUMN=SOMETHING
  3307.       ICOL=JUST-1
  3308. C                            ADD INDENT
  3309.   170 ICOL=ICOL+INDENT*(NDOS+NIFBLK)
  3310.       ICOL=MIN0(ICOL,MXRGHT)
  3311. C                            REMEMBER THE STARTING COLUMN
  3312.       ICOLSV=ICOL
  3313. C                  ANALYSIS OF LOGICAL IF RE-ENTERS HERE.
  3314. C                  SELECT NEXT COURSE ON BASIS OF FIRST SPECIAL CH.
  3315. C             =   ,   (   /  )  +  -  *   .  $  -  '  &  NONE
  3316.   180 GO TO (230,340,190,390,30,30,30,390,30,30,30,390,30,390),IFIR
  3317. C                  FIRST IS (.  LOOK FOR )
  3318.   190 NPAR=0
  3319.       DO 200 NF=LFIR,JMAX
  3320.            IF (JINT(NF).EQ.KSPK(5)) NPAR=NPAR-1
  3321.            IF (JINT(NF).EQ.KSPK(3)) NPAR=NPAR+1
  3322.            IF (NPAR.EQ.0) GO TO 210
  3323.   200 CONTINUE
  3324. C                            MISSING )
  3325.       JGOOF=2
  3326.       GO TO 40
  3327. C                  THIS IS THE END OF THE FIRST STACK OF PARENS.
  3328. C                  SKIP BLANKS.
  3329. C                  FIRST LOOK FOR DO WHILE STATEMENT
  3330.   210 IF (KLASS.EQ.3) GO TO 390
  3331.       KJ=82
  3332.       CALL KWSCAN (KJ,KSTC)
  3333.       IF (KJ.EQ.82) GO TO 1580
  3334.   220 NF=NF+1
  3335.       IF (NF.GE.JMAX) GO TO 390
  3336.       IF (JINT(NF).EQ.KBL) GO TO 220
  3337. C                  CHARACTER REPLACEMENT STATEMENTS CAN HAVE 2 SETS OF
  3338. C                  PARENS BEFORE =.
  3339.       IF (JINT(NF).EQ.KSPK(3)) THEN
  3340.            LFIR=NF
  3341.            GO TO 190
  3342.       END IF
  3343.       IF (JINT(NF).EQ.KSPK(1)) THEN
  3344. C           IF NEXT CHARACTER IS = PROCESS AS ARITHMETIC REPLACEMENT.
  3345.            LQUAL=NF
  3346.            GO TO 310
  3347.       ELSE
  3348. C           OTHERWISE, PROCESS AS FORTRAN STATEMENT
  3349.            GO TO 390
  3350.       END IF
  3351. C                  FIRST SPECIAL CH. IS =.
  3352.   230 LQUAL=LFIR
  3353. C                  IS IT A DO STATEMENT.  IF NOT, GO TO ARITHMETIC PROC.
  3354. C                  LOOK FOR -D- -O-
  3355.       ICH=KABC(4)
  3356.       DO 240 J=7,JMAX
  3357.            JNT=KUPPER(JINT(J))
  3358.            IF (JNT.EQ.KBL) GO TO 240
  3359.            IF (JNT.NE.ICH) GO TO 310
  3360.            IF (ICH.EQ.KABC(15)) GO TO 250
  3361.            ICH=KABC(15)
  3362.   240 CONTINUE
  3363.       GO TO 310
  3364. C                  FOUND -D- -O- NOW LOOK FOR COMMAS.  ALLOW EXACTLY 1
  3365. C                  OR 2 COMMAS OUTSIDE OF PARENTHESES, 1 EQUALS.
  3366. C                  CERTAIN SPECIAL CHARACTERS NOT ALLOWED.
  3367.   250 NCOMA=0
  3368.       NLPS=0
  3369.       JJ=LQUAL+1
  3370.       DO 300 J=JJ,JMAX
  3371.            JNT=JINT(J)
  3372.            DO 260 I=1,14
  3373.                 IF (JNT.EQ.KSPK(I)) GO TO (310,290,270,300,280,300,300,
  3374.      1           300,300,310,300,310,310,310),I
  3375.   260      CONTINUE
  3376.            GO TO 300
  3377. C     COUNT LEFT PARENTHESES
  3378.   270      NLPS=NLPS+1
  3379.            GO TO 300
  3380. C     COUNT RIGHT PARENTHESES
  3381.   280      NLPS=NLPS-1
  3382.            GO TO 300
  3383. C     A COMMA. DISREGARD IF INSIDE PARENTHESES, ABORT SCAN IF UNBALANCED
  3384.   290      IF (NLPS.LT.0) THEN
  3385.                 GO TO 310
  3386.            ELSE IF (NLPS.EQ.0) THEN
  3387.                 IF (NCOMA.GT.1) GO TO 310
  3388.                 NCOMA=NCOMA+1
  3389.            END IF
  3390.   300 CONTINUE
  3391.       IF (NCOMA.EQ.0) GO TO 310
  3392. C                  O.K.  THIS IS A DO STATEMENT.
  3393.       KLASS=10
  3394.       JTYPE=14
  3395.       GO TO 420
  3396. C              =================================================
  3397. C              *                                               *
  3398. C              *   START PROCESSING OF ARITHMETIC STATEMENT.   *
  3399. C              *                                               *
  3400. C              =================================================
  3401.   310 KLASS=6
  3402.       JTYPE=0
  3403. C     IF IN ANSI MODE, CHECK LENGTH OF VARIABLE ON LEFT
  3404.       IF (MANSI.EQ.0) THEN
  3405.            IF (IFIR.EQ.1.OR.IFIR.EQ.3) THEN
  3406.                 LNGVR=0
  3407.                 DO 320 J=JCOL,LFIR-1
  3408.                      IF (JINT(J).NE.KBL) LNGVR=LNGVR+1
  3409.   320           CONTINUE
  3410.                 IF (LNGVR.GT.6) CALL DIAGNO (41)
  3411.            END IF
  3412.       END IF
  3413.   330 CALL COPY (-1)
  3414.       IF (MEOF.LT.0) THEN
  3415.            GO TO 330
  3416.       ELSE IF (MEOF.GT.0.OR.LCPY.EQ.KERM) THEN
  3417.            IF (MLGC.NE.0) THEN
  3418.                 JCOL=1
  3419.                 CALL RSTAT
  3420.                 L15=L772
  3421.            END IF
  3422.            GO TO 490
  3423.       ELSE
  3424.            ICOL=ICOL+1
  3425.            MEOF=-1
  3426.            GO TO 330
  3427.       END IF
  3428. C     DO STATEMENTS WITH COMMA BEFORE INDEX VARIABLE
  3429.   
  3430. C                  IS IT A DO STATEMENT.  IF NOT, GO TO ARITHMETIC PROC.
  3431. C                  LOOK FOR -D- -O-
  3432. C                  (UNLESS STATEMENT IS CLASSIFIED)
  3433.   340 IF (KLASS.EQ.0) THEN
  3434.            ICH=KABC(4)
  3435.            DO 350 J=JCOL,JMAX
  3436.                 JNT=KUPPER(JINT(J))
  3437.                 IF (JNT.EQ.KBL) GO TO 350
  3438.                 IF (JNT.NE.ICH) GO TO 390
  3439.                 IF (ICH.EQ.KABC(15)) THEN
  3440.                      JCOLD=JCOL
  3441.                      JCOL=J+1
  3442.                      GO TO 360
  3443.                 END IF
  3444.                 ICH=KABC(15)
  3445.   350      CONTINUE
  3446.            GO TO 390
  3447. C          CHECK FOR STATEMENT NUMBER, NEXT NON-BLANK SHOULD BE THE COMM
  3448.   360      CALL RSTAT
  3449.            IF (L772.NE.0.AND.LFIR.EQ.JCOL) THEN
  3450. C          NOW CHECK FOR VARIABLE FOLLOWED BY EQUAL SIGN.  IF FOUND, CHA
  3451. C           COMMA TO BLANK AND USE POSITION OF = AS LQUAL, PROCESS AS DO
  3452.                 JCOL=JCOL+1
  3453.                 DO 380 J=JCOL,JMAX
  3454.                      JNT=JINT(J)
  3455.                      DO 370 I=1,13
  3456.                           IF (JNT.EQ.KSPK(I)) THEN
  3457.                                JCOL=JCOLD
  3458.                                IF (I.EQ.1) THEN
  3459.                                     IFIR=I
  3460.                                     JINT(LFIR)=KBL
  3461.                                     LFIR=J
  3462.                                     LQUAL=LFIR
  3463.                                     GO TO 250
  3464.                                END IF
  3465.                                GO TO 390
  3466.                           END IF
  3467.   370                CONTINUE
  3468.   380           CONTINUE
  3469.            END IF
  3470.       END IF
  3471. C              ========================================
  3472. C              *                                      *
  3473. C              *     END OF ARITHMETIC PROCESSING     *
  3474. C              *  START FORTRAN STATEMENT PROCESSING  *
  3475. C              *                                      *
  3476. C              ========================================
  3477. C                  CHECK EVERY LISTED STATEMENT TYPE.
  3478.   390 IF (MPASS1.GT.1) THEN
  3479. C     MUST RE-CHECK REST OF IF-STATEMENTS
  3480.            ITYPE=0
  3481.            CALL KWSCAN (ITYPE,KSTC)
  3482.            IF (ITYPE.EQ.0) GO TO 480
  3483.       END IF
  3484.       NINS=KSTC(1)
  3485.       MPASS1=MPASS1+1
  3486. C                  FOUND IT.
  3487.       IF (ITYPE.NE.0) THEN
  3488.            KLASS=KSTC(2)
  3489.            JTYPE=KSTC(3)
  3490.            IF (IFIR.NE.12) THEN
  3491. C     COMPLAIN IF NON-ANSI STATEMENT.
  3492.                 IF (MANSI.EQ.0.AND.KSTC(4).EQ.1) CALL DIAGNO (34)
  3493.                 IF (MLGC.NE.0) GO TO 400
  3494. C                            FOLLOWS LOGICAL IF OR IS FUNCTION DECL.
  3495.                 IF (KLASS.EQ.3.OR.KLASS.EQ.4.OR.KLASS.EQ.6.OR.KLASS.EQ.7
  3496.      1           .OR.KLASS.EQ.11) GO TO 450
  3497.                 GO TO 40
  3498.            ELSE
  3499. C        COMPLAIN IF FIRST SPECIAL CHAR ' AND NOT INCLUDE OR PRINT
  3500.                 IF (ITYPE.NE.71.AND.ITYPE.NE.43.AND.ITYPE.NE.44) GO TO
  3501.      1           30
  3502.            END IF
  3503.       ELSE
  3504. C                  NOT IN TABLE.  PASS IT WITHOUT PROCESSING.
  3505.            CALL DIAGNO (30)
  3506.            KLASS=11
  3507.            JTYPE=0
  3508.       END IF
  3509. C                  THIS IS A FORTRAN STATEMENT.
  3510. C                  SET IMAX IN CASE THIS STATEMENT IS PUT OUT DIRECTLY.
  3511.   400 IMAX=JMAX
  3512. C                  CHECK FOR EXEMPT STATEMENT.
  3513.       IF (KLASS.EQ.3) THEN
  3514.            DO 410 J=1,6
  3515.                 JINT(J)=KBL
  3516.   410      CONTINUE
  3517.            IF (MEX.EQ.0) GO TO 450
  3518. C                  THIS IS A NON-EXECUTABLE (KLASS 3.) FORTRAN STATEMENT
  3519. C                  AND THE EXEMPT FLAG IS SET.  SO PUT IT OUT DIRECTLY.
  3520.            GO TO 130
  3521.       END IF
  3522. C                  GET STATEMENT NUMBER UNLESS FOLLOWING LOGICAL IF.
  3523.       IF (MLGC.EQ.0) GO TO 450
  3524.   420 DO 440 I=1,5
  3525.            IF (JINT(I).NE.KBL) THEN
  3526.                 DO 430 J=1,10
  3527.                      IF (JINT(I).EQ.KDIG(J)) THEN
  3528.                           L15=L15*10+J-1
  3529.                           GO TO 440
  3530.                      END IF
  3531.   430           CONTINUE
  3532.                 GO TO 450
  3533.            END IF
  3534.   440 CONTINUE
  3535. C        IF THIS IS A WEIRD CARD, ALLOW A TRANSFER TO IT
  3536.   450 IF (KLASS.EQ.11) NTRAN=0
  3537. C     GO TO INDIVIDUAL STATEMENT PROCESSING BY JTYPE.
  3538.       I=JTYPE+1
  3539.       GO TO (520,550,580,590,600,610,620,650,680,720,730,750,770,780,
  3540.      1790,840,850,930,950,960,970,990,560,1000,1020,1070,1090,1100,1110,
  3541.      21140,1150,1170,1180,1190,1200,1210,1230,1320,1360,1410,1420,1430,
  3542.      31440,1160,1220,1310,1460,1540,1550,1560,1570,1580,460),I
  3543. C     ==================================================================
  3544. C     *                                                                *
  3545. C     *  AT THIS POINT, COMMENTS AND ARITHMETIC STATEMENTS HAVE BEEN   *
  3546. C     *  PROCESSED.  THE STATEMENTS HAVE BEEN CLASSIFIED AS ITYPE AND  *
  3547. C     *  KLASS.  THE LAST SYMBOL USED IN SCANNING THE FORTRAN STATE-   *
  3548. C     *  MENT IS KST(NINS,ITYPE), AND WAS FOUND AT JINT(LAST).  THE    *
  3549. C     *  FIRST SPECIAL CHARACTER, IF ANY, IS KSPK(IFIR), LOCATED AT    *
  3550. C     *  JINT(LFIR).  IF A STATEMENT                                   *
  3551. C     *  NUMBER IS PERMITTED, IT IS IN L15.  IF NOT, L15=0.            *
  3552. C     *  JCOL IS ON THE CURRENT CHARACTER IN THE INPUT STRING (THE     *
  3553. C     *  FIRST, UNLESS FOLLOWING A LOGICAL IF).  ICOL IS ON THE MOST   *
  3554. C     *  RECENT CHARACTER TO BE PUT INTO THE OUTPUT STRING (E.G. 6.)   *
  3555. C     *                                                                *
  3556. C     ==================================================================
  3557. C                  ILLEGAL JTYPE
  3558.   460 WRITE (OUTFIL,1620) JTYPE
  3559.       STOP 126
  3560. C                  COPY REST OF CARD.
  3561.   470 ICOL=ICOL+1
  3562.   480 CALL COPY (0)
  3563.       IF (KLASS.LT.4) GO TO 500
  3564. C                  DLIST HANDLES THE STATEMENT NUMBER.
  3565.   490 CALL DLIST (MERR)
  3566.       IF (MERR.NE.0) GO TO 50
  3567.   500 IMAX=ICOL
  3568. C                  WRITE STATEMENT IMAGE ON TAPE1 FOR PASS 2.
  3569.   510 CALL IOSYS1 (3,KILI,SERIAL,IOUT)
  3570.       NRT1=NRT1+1
  3571.       GO TO 50
  3572. C                  ***** JTYPE = 0
  3573. C     UNRECOGNIZED FORTRAN CARD
  3574. C                  COPY IT, INCLUDING BLANKS
  3575.   520 DO 530 I=JCOL,1600
  3576.            ICOL=ICOL+1
  3577.            IOUT(ICOL)=JINT(I)
  3578.            IF (IOUT(ICOL).EQ.KERM) GO TO 540
  3579.   530 CONTINUE
  3580.       I=1600
  3581.   540 JCOL=I
  3582.       LCPY=KERM
  3583.       ICOL=ICOL-1
  3584.       MEOF=0
  3585.       GO TO 490
  3586. C                  ***** JTYPE = 1
  3587. C     ASCENT,MACHINE.
  3588.   550 I=0
  3589.       GO TO 570
  3590. C                  ***** JTYPE = 22
  3591. C     IDENT
  3592.   560 MP2=1
  3593. C            (MUST BE THE FIRST CARD OF THIS PASS.)
  3594.   570 IF (NFORT.NE.1) CALL DIAGNO (14)
  3595.       CALL DIAGNO (26)
  3596.       CALL NOPRO
  3597.       CALL HEADER
  3598.       RETURN
  3599. C                  ***** JTYPE = 2
  3600. C     ASSIGN
  3601.   580 CALL COPY (6)
  3602.       CALL RSTAT
  3603.       CALL RLIST
  3604.       IOUT(ICOL+2)=KLR2
  3605.       IF (NXRF.GT.MXREF) GO TO 1600
  3606.       IOUTN(NXRF)=L772
  3607.       NXRF=NXRF+1
  3608.       ICOL=ICOL+3
  3609.       CALL COPY (2)
  3610.       IF (MEOF.LT.0) GO TO 470
  3611.       GO TO 40
  3612. C                  ***** JTYPE = 3
  3613. C     BACKSPACE, EXTERNAL, IMPLICIT, PAUSE.
  3614.   590 CALL COPY (NINS)
  3615. C     FINISH AN IMPLICIT STATEMENT
  3616.       IF (ITYPE.EQ.65) THEN
  3617.            ICOL=ICOL+1
  3618.            GO TO 390
  3619.       END IF
  3620.       GO TO 470
  3621. C                  ***** JTYPE = 4
  3622. C      BLOCK DATA
  3623.   600 IF (NFORT.NE.1) GO TO 40
  3624.       CALL COPY (5)
  3625.       ICOL=ICOL+1
  3626.       CALL COPY (4)
  3627.       GO TO 470
  3628. C                  ***** JTYPE = 5
  3629. C     BUFFER IN (I,P) (A,B) /// BUFFER OUT (I,P) (A,B)
  3630.   610 CALL COPY (6)
  3631.       ICOL=ICOL+1
  3632. C                  NINS IS 9 FOR BUFFERIN, 10 FOR BUFFEROUT
  3633.       CALL COPY (NINS-7)
  3634.       ICOL=ICOL+1
  3635.       CALL COPY (-1)
  3636.       ICOL=ICOL+1
  3637.       CALL COPY (-1)
  3638.       IF (MEOF.LT.0.AND.JCOL.GT.JMAX) GO TO 490
  3639.       GO TO 40
  3640. C                  ***** JTYPE = 6
  3641. C     CALL   (FUNCTION,SUBROUTINE)
  3642.   620 JGOOF=10
  3643.       CALL COPY (4)
  3644.       ICOL=ICOL+1
  3645.       IF (IFIR.NE.3) GO TO 480
  3646.   630 CALL COPY (1)
  3647.       IF (LCPY.NE.KSPK(3)) THEN
  3648.            IF (MEOF.LT.0) GO TO 630
  3649.            GO TO 40
  3650.       END IF
  3651.       IOUT(ICOL)=KBL2
  3652.       JCOL=JCOL-1
  3653.   640 PRVCPY=LCPY
  3654.       CALL COPY (1)
  3655.       IF (MEOF.LT.0) THEN
  3656.            IF (LCPY.EQ.KALMRK) THEN
  3657. C     ALTERNATE RETURNS MUST BE PRECEDED BY , OR (
  3658.                 IF (PRVCPY.NE.KSPK(2).AND.PRVCPY.NE.KSPK(3)) GO TO 640
  3659. C                            ARGUMENT IS *STATEMENT NUMBER
  3660. C     TRANSLATE ALTERNATE RETURN CODE IF DESIRED.
  3661.                 IF (KALTRN.NE.KBL) IOUT(ICOL)=KALTRN
  3662.                 CALL RSTAT
  3663. C     NO NUMBER LEGAL ONLY FOR FUNCTIONS AND SUBROUTINES.
  3664.                 IF (L772.EQ.0) THEN
  3665.                      IF (ITYPE.EQ.29.OR.ITYPE.EQ.57) GO TO 640
  3666.                      GO TO 40
  3667.                 END IF
  3668.                 ICOL=ICOL+1
  3669.                 IOUT(ICOL)=KLR2
  3670.                 IF (NXRF.GT.MXREF) GO TO 1600
  3671.                 IOUTN(NXRF)=L772
  3672.                 NXRF=NXRF+1
  3673.                 CALL RLIST
  3674.            END IF
  3675.            GO TO 640
  3676.       END IF
  3677.       IMAX=ICOL
  3678.       IF (NPAR.EQ.0) GO TO 490
  3679.       GO TO 40
  3680. C                  ***** JTYPE = 7
  3681. C      COMMON
  3682.   650 CALL COPY (6)
  3683.       ICOL=ICOL+1
  3684. C          J COUNTS SLASHES
  3685.       J=-2
  3686.       IF (IFIR.NE.4) GO TO 480
  3687.   660 IF (J.EQ.0) GO TO 470
  3688.       J=J+1
  3689.   670 CALL COPY (1)
  3690.       IF (LCPY.EQ.KSPK(4)) GO TO 660
  3691.       IF (MEOF.LT.0) GO TO 670
  3692.       CALL DIAGNO (11)
  3693.       GO TO 510
  3694. C                  ***** JTYPE = 8
  3695. C     CONTINUE
  3696.   680 JGOOF=12
  3697.       IF (L15.EQ.0) GO TO 40
  3698.       IF (MLGC.EQ.0) THEN
  3699.            DO 690 I=7,ICOL
  3700.                 IOUT(I)=KBL
  3701.   690      CONTINUE
  3702.            ICOL=ICOLSV
  3703.            MLGC=-1
  3704.       END IF
  3705.       IF (MCONT.EQ.0) THEN
  3706. C                            IS THIS A DO-LOOP TERMINATOR...
  3707.            IF (NDOS.GT.0) THEN
  3708.                 DO 700 I=1,NDOS
  3709.                      IF (L15.EQ.LDOS(I)) GO TO 710
  3710.   700           CONTINUE
  3711.            END IF
  3712. C                            COPY THE CARD
  3713.            CALL COPY (8)
  3714. C                            PROCESS STATEMENT NUMBER
  3715.            CALL DLIST (MERR)
  3716. C                            SET A FLAG
  3717.            LDEF(NDEF)=-LDEF(NDEF)
  3718.            L25=L15
  3719. C                            TAKE TRANSFER STATUS OF LAST CARD
  3720.            MTRAN=NTRAN
  3721. C                            DONT SAVE STATEMENT FOR PASS2
  3722.            GO TO 50
  3723.       END IF
  3724. C                            THIS CONTINUE STATEMENT IS TO BE RETAINED
  3725.   710 IF (NDOS.NE.0) THEN
  3726. C                            IT TERMINATES THIS DO-LOOP. INDENT
  3727. C                            ONE LESS LEVEL
  3728.            IF (L15.EQ.LDOS(NDOS).AND.MLGC.NE.0) THEN
  3729.                 ICOL=ICOL-INDENT
  3730.                 ICOLSV=ICOL
  3731.            END IF
  3732.       END IF
  3733.       CALL COPY (8)
  3734.       GO TO 490
  3735. C                  ***** JTYPE = 9
  3736. C     DATA
  3737.   720 CALL COPY (4)
  3738.       ICOL=ICOL+1
  3739.       IF (IFIR.NE.4) GO TO 480
  3740.       IF (JINT(JMAX).NE.KSPK(4).OR.LFIR.GE.JMAX) CALL DIAGNO (11)
  3741.       GO TO 480
  3742. C                  ***** JTYPE = 10
  3743. C     DECODE (C,N,V) LIST  ///  ENCODE (C,N,V) LIST
  3744.   730 JGOOF=23
  3745.       CALL COPY (6)
  3746.       ICOL=ICOL+1
  3747.       CALL COPY (1)
  3748.   740 CALL COPY (1)
  3749.       IF (LCPY.NE.KSPK(2)) THEN
  3750.            IF (MEOF.LT.0) GO TO 740
  3751.            GO TO 40
  3752.       END IF
  3753.       CALL RSTAT
  3754.       IF (L772.EQ.0) GO TO 1380
  3755.       ICOL=ICOL+1
  3756.       IOUT(ICOL)=KLR2
  3757.       IF (NXRF.GT.MXREF) GO TO 1600
  3758.       IOUTN(NXRF)=L772
  3759.       NXRF=NXRF+1
  3760.       CALL RLIST
  3761.       GO TO 1380
  3762. C                  ***** JTYPE = 11
  3763. C     DIMENSION
  3764.   750 JGOOF=13
  3765.       CALL COPY (9)
  3766.       ICOL=ICOL+1
  3767.       NPAR=-1
  3768.       DO 760 I=JCOL,JMAX
  3769.            CALL COPY (1)
  3770.            IF (NPAR.LT.0) THEN
  3771.                 IF (LCPY.EQ.KSPK(3)) NPAR=NPAR+1
  3772.            ELSE IF (NPAR.EQ.0) THEN
  3773.                 IF (LCPY.EQ.KSPK(5)) NPAR=NPAR+1
  3774.            ELSE
  3775.                 IF (LCPY.NE.KSPK(2)) GO TO 760
  3776.                 ICOL=ICOL+1
  3777.                 NPAR=-1
  3778.            END IF
  3779.   760 CONTINUE
  3780.       IF (NPAR.GT.0) GO TO 500
  3781.       GO TO 40
  3782. C                  ***** JTYPE = 12
  3783. C     DOUBLE PRECISION
  3784.   770 CALL COPY (6)
  3785.       ICOL=ICOL+1
  3786.       CALL COPY (9)
  3787.       ICOL=ICOL+1
  3788.       GO TO 390
  3789. C                  ***** JTYPE = 13
  3790. C     DOUBLE, (CONVERT TO DOUBLE PRECISION).
  3791.   780 CALL COPY (6)
  3792.       ICOL=ICOL+2
  3793.       CALL CPYSTR (ICOL,'PRECISION')
  3794.       ICOL=ICOL+9
  3795.       GO TO 480
  3796. C                  ***** JTYPE = 14
  3797. C     DO STATEMENT
  3798.   790 MILDO=1
  3799.       CALL COPY (2)
  3800.       CALL RSTAT
  3801. C     IF NO STATEMENT, GIVE IT IMPOSSIBLE (FROM CARDS) NUMBER
  3802. C     KCNDO IS STACK OF CURRENTLY-OPEN ENDDO LOOPS
  3803.       IF (L772.EQ.0) THEN
  3804. C          JUMP IF CONVERSION TO F-77 LOOP NOT DESIRED.
  3805.            IF (MNDOO.NE.0) GO TO 1590
  3806.            L772=KENDDO
  3807.            KCNDP=KCNDP+1
  3808.            KCNDO(KCNDP)=KENDDO
  3809.            KENDDO=KENDDO+1
  3810.       END IF
  3811. C     BE SURE IT DOESN'T REFERENCE BACKWARD IN PROGRAM.
  3812.       IF (NDEF.GT.0) THEN
  3813.            DO 800 I=1,NDEF
  3814.                 IF (IABS(LDEF(I)).EQ.L772) THEN
  3815.                      JGOOF=15
  3816.                      GO TO 40
  3817.                 END IF
  3818.   800      CONTINUE
  3819.       END IF
  3820. C     ADD STATEMENT NUMBER TO DO-LIST.
  3821.       IF (NDOS.LT.0) STOP 30
  3822.       IF (NDOS.GT.0) THEN
  3823.            IF (LDOS(NDOS).EQ.L772) GO TO 830
  3824.            IF (NDOS.GT.1) THEN
  3825.                 DO 810 I=2,NDOS
  3826.                      IF (LDOS(I-1).EQ.L772) THEN
  3827.                           JGOOF=15
  3828.                           GO TO 40
  3829.                      END IF
  3830.   810           CONTINUE
  3831.                 IF (NDOS.GE.10) THEN
  3832.                      JGOOF=24
  3833.                      MPUN=0
  3834.                      MP2=0
  3835.                      GO TO 40
  3836.                 END IF
  3837.            END IF
  3838.       END IF
  3839.       NDOS=NDOS+1
  3840.       LDOS(NDOS)=L772
  3841.       IF (NREF.GT.0) THEN
  3842.            DO 820 I=1,NREF
  3843.                 IF (LREF(I).EQ.L772) THEN
  3844.                      CALL DIAGNO (27)
  3845.                      GO TO 830
  3846.                 END IF
  3847.   820      CONTINUE
  3848.       END IF
  3849.   830 CALL RLIST
  3850.       IOUT(ICOL+2)=KLR2
  3851.       IF (NXRF.GT.MXREF) GO TO 1600
  3852.       IOUTN(NXRF)=L772
  3853.       NXRF=NXRF+1
  3854.       ICOL=ICOL+3
  3855.       GO TO 480
  3856. C     END DO-LOOP STATEMENT PROCESSING.
  3857. C                  ***** JTYPE = 15
  3858. C     END FILE
  3859.   840 IF (IFIR.NE.14) GO TO 30
  3860.       CALL COPY (3)
  3861.       ICOL=ICOL+1
  3862.       CALL COPY (4)
  3863.       GO TO 470
  3864. C                  ***** JTYPE = 16
  3865. C     END STATEMENT.
  3866. C                   IS THERE A STATEMENT NUMBER TO USE?
  3867.   850 IF (L15.EQ.0.AND.L25.EQ.0) GO TO 870
  3868. C                   YES. MAKE A CONTINUE CARD FOR IT TO FALL TO.
  3869.       ICOL=7
  3870.       CALL CPYSTR (ICOL,'CONTINUE')
  3871.       MILDO=0
  3872.       CALL DLIST (MERR)
  3873.       IF (MERR.NE.0) GO TO 860
  3874.       JTMP(1)=4
  3875.       JTMP(2)=8
  3876.       JTMP(3)=L15
  3877.       JTMP(4)=14
  3878.       JTMP(5)=MTRAN
  3879.       JTMP(6)=NXRF
  3880.       JTMP(7)=MEX
  3881.       JTMP(8)=ICOLSV
  3882.       CALL IOSYS1 (3,JTMP,JINT(6),IOUT)
  3883.       NRT1=NRT1+1
  3884.   860 L15=0
  3885.   870 IF (NIFBLK.GT.0) CALL DIAGNO (33)
  3886.       IF (NDOS.NE.0) THEN
  3887.            CALL DIAGNO (16)
  3888.            CALL PAGE (1)
  3889.            WRITE (OUTFIL,1610) (LDOS(I),I=1,NDOS)
  3890. C                   DOES THIS STATEMENT HAVE A NUMBER....
  3891.       END IF
  3892.       IF (L15.EQ.0) GO TO 890
  3893. C                   YES.  IS IT REFERENCED....
  3894. C                   NO.  IGNORE THE NUMBER.
  3895.       IF (NREF.LE.0) GO TO 890
  3896. C                   YES.
  3897.       DO 880 I=1,NREF
  3898.            IF (LREF(I).EQ.L15) THEN
  3899.                 CALL DIAGNO (18)
  3900. C                           GENERATE NEW STOP COMMAND.
  3901.                 CALL CPYSTR (7,'STOP')
  3902.                 MILDO=-1
  3903.                 CALL DLIST (MERR)
  3904.                 IF (MERR.NE.0) GO TO 890
  3905.                 JTMP(1)=6
  3906.                 JTMP(2)=55
  3907.                 JTMP(3)=L15
  3908.                 JTMP(4)=10
  3909.                 JTMP(5)=MTRAN
  3910.                 JTMP(6)=NXRF
  3911.                 JTMP(7)=MEX
  3912.                 JTMP(8)=ICOLSV
  3913.                 CALL IOSYS1 (3,JTMP,JINT(6),IOUT)
  3914.                 NRT1=NRT1+1
  3915.                 GO TO 890
  3916.            END IF
  3917.   880 CONTINUE
  3918. C                       PROCESS FORMATS ON TAPE 2
  3919.   890 IF (NRT2.GT.0) THEN
  3920.            CALL IOSY22
  3921. C                                  INSERT BLANK COMMENT CARD.
  3922.            IF (NBLC.EQ.0) THEN
  3923.                 IOUT(1)=KABC(3)
  3924.                 DO 900 I=2,7
  3925.                      IOUT(I)=KBL
  3926.   900           CONTINUE
  3927.                 KLASS=1
  3928.                 ITYPE=0
  3929.                 L15=0
  3930.                 IMAX=7
  3931.                 CALL IOSYS1 (3,KILI,SERIAL,IOUT)
  3932.                 NRT1=NRT1+1
  3933.            END IF
  3934. C                                TRANSFER FORMAT STATEMENTS
  3935.   910      CALL IOSYS2 (4,KILI,SERIAL,IOUT)
  3936.            NRT2=NRT2-1
  3937.            ICOLSV=6
  3938.            NREC=JTYPE
  3939.            MILDO=1
  3940.            CALL DLIST (MERR)
  3941.            IF (MERR.EQ.0) THEN
  3942.                 CALL IOSYS1 (3,KILI,SERIAL,IOUT)
  3943.                 NRT1=NRT1+1
  3944.            END IF
  3945.            IF (NRT2.GT.0) GO TO 910
  3946.            CALL IOSY21
  3947.       END IF
  3948. C                                      MAKE END STATEMENT
  3949.       IF (NFEND.EQ.0.AND.NFORT.GT.0) THEN
  3950.            DO 920 I=1,6
  3951.                 IOUT(I)=KBL
  3952.   920      CONTINUE
  3953.            CALL CPYSTR (7,'END')
  3954.            KLASS=8
  3955.            ITYPE=20
  3956.            L15=0
  3957.            IMAX=9
  3958.            CALL IOSYS1 (3,KILI,SERIAL,IOUT)
  3959.            NRT1=NRT1+1
  3960.       END IF
  3961.       CALL IOSY12
  3962.       RETURN
  3963. C                 ==================================
  3964. C                 *   PASS1 NORMALLY EXITS HERE.   *
  3965. C                 ==================================
  3966. C                  ***** JTYPE = 17
  3967. C     EQUIVALENCE
  3968.   930 CALL COPY (10)
  3969.   940 CALL COPY (1)
  3970.       ICOL=ICOL+1
  3971.       CALL COPY (-1)
  3972.       IF (MEOF.LT.0) GO TO 940
  3973.       GO TO 500
  3974. C                  ***** JTYPE = 18
  3975. C     FINIS.
  3976.   950 MSTOP=-1
  3977.       RETURN
  3978. C                  ***** JTYPE = 19
  3979. C     FORMAT (
  3980.   960 JGOOF=17
  3981.       CALL JTYP19 (JRTCOD)
  3982.       GO TO (40,50,470),JRTCOD
  3983. C                  ***** JTYPE = 20
  3984. C     FORTRAN,ETC
  3985.   970 DO 980 I=7,JMAX
  3986.            IOUT(I)=JINT(I)
  3987.   980 CONTINUE
  3988.       IMAX=JMAX
  3989.       GO TO 510
  3990. C                  ***** JTYPE = 21
  3991. C     FREQUENCY
  3992.   990 JGOOF=8
  3993.       GO TO 40
  3994. C                  ***** JTYPE = 23
  3995. C     GO TO (***,***),N
  3996.  1000 JGOOF=19
  3997.       CALL COPY (2)
  3998.       ICOL=ICOL+1
  3999.       CALL COPY (2)
  4000.       ICOL=ICOL+1
  4001.       CALL COPY (1)
  4002.       MILDO=1
  4003.       MTRAN=MLGC
  4004. C     PROCESS --GO TO LIST--.
  4005.  1010 ICOL=ICOL+1
  4006.       IOUT(ICOL)=KLR2
  4007.       CALL RSTAT
  4008.       IF (L772.EQ.0) GO TO 40
  4009.       IF (NXRF.GT.MXREF) GO TO 1600
  4010.       IOUTN(NXRF)=L772
  4011.       NXRF=NXRF+1
  4012.       CALL RLIST
  4013.       CALL COPY (1)
  4014.       IF (LCPY.EQ.KSPK(2)) GO TO 1010
  4015.       IF (LCPY.NE.KSPK(5)) GO TO 40
  4016.       CALL COPY (1)
  4017.       IF (LCPY.NE.KSPK(2)) THEN
  4018.            IOUT(ICOL+2)=IOUT(ICOL)
  4019.            IOUT(ICOL)=KSPK(2)
  4020.            ICOL=ICOL+2
  4021.       END IF
  4022.       GO TO 480
  4023. C                  ***** JTYPE = 24
  4024. C     GO TO ****
  4025.  1020 JGOOF=19
  4026.       MILDO=-1
  4027.       CALL COPY (2)
  4028.       ICOL=ICOL+1
  4029.       CALL COPY (2)
  4030.       ICOL=ICOL+1
  4031.       CALL RSTAT
  4032. C     TEST REF STATEMENT FOR GO TO N OR GO TO N, (LIST)
  4033.       IF (L772.EQ.0) GO TO 1040
  4034. C     STATEMENT IS --GO TO 12345--.
  4035.       IF (L15.EQ.0.AND.L25.EQ.0) GO TO 1030
  4036.       IF (MLGC.EQ.0) GO TO 1030
  4037. C     LABELLED GOTO STATEMENT.
  4038.       IF (MCONT.EQ.0) THEN
  4039.            CALL DLIST (MERR)
  4040.            IF (MERR.NE.0) GO TO 40
  4041. C          SET UP REFERENCE TRANSLATION
  4042.            IF (NDEF.LT.1500) THEN
  4043.                 NDEF=NDEF+1
  4044.                 LDEF(NDEF)=0
  4045.                 LOCDEF(NDEF)=L772
  4046.                 L15=0
  4047. C               IF NO WAY TO GET HERE, DELETE IT
  4048.                 IF (NTRAN.NE.0) GO TO 50
  4049.            END IF
  4050.       ELSE
  4051.            CALL DIAGNO (18)
  4052.       END IF
  4053.  1030 MTRAN=MLGC
  4054.       IOUT(ICOL+1)=KLR2
  4055.       ICOL=ICOL+1
  4056.       IF (NXRF.GT.MXREF) GO TO 1600
  4057.       IOUTN(NXRF)=L772
  4058.       NXRF=NXRF+1
  4059.       CALL RLIST
  4060.       GO TO 490
  4061. C     GO TO N OR GO TO N,LIST
  4062.  1040 MTRAN=MLGC
  4063.       IF (IFIR.NE.2) THEN
  4064. C          STATEMENT IS --GO TO N--.
  4065.            IF (IFIR.EQ.14) GO TO 480
  4066.            GO TO 40
  4067.       END IF
  4068. C     GO TO N,(LIST)
  4069.  1050 CALL COPY (1)
  4070.       IF (LCPY.NE.KSPK(2)) GO TO 1050
  4071.       ICOL=ICOL+1
  4072.       CALL COPY (1)
  4073.       IF (LCPY.NE.KSPK(3)) GO TO 40
  4074.  1060 CALL RSTAT
  4075.       IF (L772.EQ.0) GO TO 40
  4076.       IOUT(ICOL+1)=KLR2
  4077.       ICOL=ICOL+1
  4078.       IF (NXRF.GT.MXREF) GO TO 1600
  4079.       IOUTN(NXRF)=L772
  4080.       NXRF=NXRF+1
  4081.       CALL RLIST
  4082.       CALL COPY (1)
  4083.       IF (LCPY.EQ.KSPK(2)) GO TO 1060
  4084.       IF (LCPY.EQ.KSPK(5)) GO TO 490
  4085.       GO TO 40
  4086. C                  ***** JTYPE = 25
  4087. C     IF ACCUMULATOR OVERFLOW (QUOTIENT, DIVIDE CHECK, END FILE, SENSE)
  4088.  1070 CALL COPY (2)
  4089.       ICOL=ICOL+1
  4090.       CALL COPY (11)
  4091.       ICOL=ICOL+1
  4092.       CALL COPY (8)
  4093. C     PROCESS TWO-WAY TRANSFER.
  4094.  1080 ICOL=ICOL+1
  4095.       JGOOF=20
  4096.       MILDO=-1
  4097.       IOUT(ICOL)=KLR2
  4098.       CALL RSTAT
  4099.       IF (L772.EQ.0) GO TO 40
  4100.       IF (NXRF.GT.MXREF) GO TO 1600
  4101.       IOUTN(NXRF)=L772
  4102.       NXRF=NXRF+1
  4103.       CALL RLIST
  4104.       CALL COPY (1)
  4105.       IF (LCPY.NE.KSPK(2)) GO TO 40
  4106.       CALL RSTAT
  4107.       IF (L772.EQ.0) GO TO 40
  4108.       GO TO 1030
  4109. C                  ***** JTYPE = 26
  4110. C     IF QUOTIENT OVERFLOW
  4111.  1090 CALL COPY (2)
  4112.       ICOL=ICOL+1
  4113.       CALL COPY (8)
  4114.       ICOL=ICOL+1
  4115.       CALL COPY (8)
  4116.       GO TO 1080
  4117. C                  ***** JTYPE = 27
  4118. C     IF(DIVIDE CHECK)
  4119.  1100 CALL COPY (2)
  4120.       ICOL=ICOL+1
  4121.       CALL COPY (7)
  4122.       ICOL=ICOL+1
  4123.       CALL COPY (6)
  4124.       GO TO 1080
  4125. C                  ***** JTYPE = 28
  4126. C     IF(END FILE  I)
  4127.  1110 CALL COPY (2)
  4128.       ICOL=ICOL+1
  4129.       CALL COPY (8)
  4130.       ICOL=ICOL+1
  4131.       DO 1120 I=JCOL,JMAX
  4132.            IF (JINT(I).EQ.KSPK(5)) GO TO 1130
  4133.  1120 CONTINUE
  4134.       JGOOF=20
  4135.       GO TO 40
  4136.  1130 CALL COPY (1)
  4137.       IF (LCPY.EQ.KSPK(5)) GO TO 1080
  4138.       GO TO 1130
  4139. C                  ***** JTYPE = 29
  4140. C     IF(SENSE LIGHT 5) 1,2
  4141.  1140 JGOOF=20
  4142.       CALL COPY (2)
  4143.       ICOL=ICOL+1
  4144.       CALL COPY (6)
  4145.       ICOL=ICOL+1
  4146.       CALL COPY (5)
  4147.       ICOL=ICOL+1
  4148.       CALL COPY (2)
  4149.       IF (LCPY.EQ.KSPK(5)) GO TO 1080
  4150.       GO TO 40
  4151. C                  ***** JTYPE = 30
  4152. C     IF(SENSE SWITCH 5) 1,2
  4153.  1150 CALL COPY (2)
  4154.       ICOL=ICOL+1
  4155.       CALL COPY (6)
  4156.       ICOL=ICOL+1
  4157.       CALL COPY (6)
  4158.       ICOL=ICOL+1
  4159.       CALL COPY (2)
  4160.       JGOOF=20
  4161.       IF (LCPY.EQ.KSPK(5)) GO TO 1080
  4162.       GO TO 40
  4163. C                  ***** JTYPE = 43
  4164. C     ELSEIF
  4165.  1160 IF (NIFBLK.LE.0) THEN
  4166.            IOUT(1)=KABC(3)
  4167.            CALL DIAGNO (32)
  4168.       ELSE
  4169.            ICOL=ICOL-INDENT
  4170.            ICOLSV=ICOL
  4171.       END IF
  4172.       CALL COPY (4)
  4173.       ICOL=ICOL+1
  4174. C          FALL THRU TO IF
  4175. C                  ***** JTYPE = 31
  4176. C     IF (ARITHMETIC) 1,2,3   OR   IF (LOGICAL) STATEMENT.
  4177.  1170 JGOOF=20
  4178.       CALL JTYP31 (JRTCOD)
  4179.       GO TO (40,50,500,490,180),JRTCOD
  4180. C                  ***** JTYPE = 32
  4181. C     NAMELIST
  4182.  1180 JGOOF=21
  4183.       CALL COPY (8)
  4184.       ICOL=ICOL+1
  4185.       J=-1
  4186.       IF (IFIR.EQ.4) GO TO 660
  4187.       GO TO 40
  4188. C                  ***** JTYPE = 33
  4189. C     PRINT, TYPE, WRITE, PUNCH, READ, ACCEPT.
  4190.  1190 JGOOF=22
  4191.       CALL JTYP33 (JRTCOD)
  4192.       GO TO (480,40,470,1600,490),JRTCOD
  4193. C                  ***** JTYPE = 34
  4194. C     SEGMENT,OVERLAY
  4195.  1200 NFORT=NFORT-1
  4196.       IF (NFORT.NE.0) CALL DIAGNO (14)
  4197.       CALL COPY (NINS)
  4198.       CALL HEADER
  4199.       IF (IFIR.EQ.3) GO TO 630
  4200.       GO TO 40
  4201. C                  ***** JTYPE = 35
  4202. C     PROGRAM, SUBROUTINE, FUNCTION.
  4203.  1210 IF (NFORT.NE.1) CALL DIAGNO (14)
  4204.       CALL COPY (NINS)
  4205.       CALL HEADER
  4206.       ICOL=ICOL+1
  4207.       IF (IFIR.EQ.3) GO TO 630
  4208.       GO TO 480
  4209. C                  ***** JTYPE = 44
  4210. C     WRITE OUTPUT TAPE
  4211.  1220 CALL COPY (1)
  4212. C                  ***** JTYPE = 36
  4213. C     READ INPUT TAPE
  4214.  1230 CALL COPY (4)
  4215. C                  CONVERT TO CORRESPONDING READ/WRITE(I,N)LIST
  4216.       JGOOF=22
  4217.       ICOL=ICOL+2
  4218.       IOUT(ICOL)=KSPK(3)
  4219.       JCOL=JCOL+1
  4220. C                  SKIP TO CHARACTER E
  4221.       DO 1240 JAVB=JCOL,JMAX
  4222.            JNT=KUPPER(JINT(JAVB-1))
  4223.            IF (JNT.EQ.KABC(5)) GO TO 1250
  4224.  1240 CONTINUE
  4225. C                  COPY UNTIL COMMA
  4226.  1250 JCOL=JAVB
  4227.  1260 CALL COPY (1)
  4228.       IF (MEOF.GE.0) GO TO 40
  4229.       IF (LCPY.NE.KSPK(2)) GO TO 1260
  4230. C                  PROCESS STATEMENT NUMBER
  4231.       CALL RSTAT
  4232.       IF (L772.NE.0) GO TO 1300
  4233. C                  VARIABLE FORMAT--NO REFERENCE
  4234.       KLASS=6
  4235.  1270 CALL COPY (1)
  4236. C                  LOOK FOR COMMA
  4237.       IF (LCPY.EQ.KSPK(2)) GO TO 1290
  4238.       IF (MEOF.LT.0) GO TO 1270
  4239. C                  NO COMMA. END WITH )
  4240.  1280 ICOL=ICOL+1
  4241.       IOUT(ICOL)=KSPK(5)
  4242.       IMAX=ICOL
  4243.       GO TO 490
  4244. C                  REPLACE , BY ) AND GO PROCESS LIST
  4245.  1290 IOUT(ICOL)=KSPK(5)
  4246.       ICOL=ICOL+1
  4247.       GO TO 480
  4248.  1300 IOUT(ICOL+1)=KLR2
  4249.       ICOL=ICOL+1
  4250.       IF (NXRF.GT.MXREF) GO TO 1600
  4251.       IOUTN(NXRF)=L772
  4252.       NXRF=NXRF+1
  4253.       CALL RLIST
  4254.       CALL COPY (1)
  4255.       IF (LCPY.EQ.KSPK(2)) GO TO 1290
  4256.       IF (LCPY.EQ.KERM) GO TO 1280
  4257.       GO TO 40
  4258. C                  ***** JTYPE = 45
  4259. C     WRITE TAPE
  4260.  1310 CALL COPY (1)
  4261. C                  ***** JTYPE = 37
  4262. C     READ TAPE
  4263.  1320 CALL COPY (4)
  4264.       JCOL=LAST+1
  4265.       ICOL=ICOL+2
  4266.       IOUT(ICOL)=KSPK(3)
  4267. C                  SKIP TO CHARACTER E
  4268.       DO 1330 JAVB=JCOL,JMAX
  4269.            IF (KUPPER(JINT(JAVB-1)).EQ.KABC(5)) GO TO 1340
  4270.  1330 CONTINUE
  4271. C                  COPY UNTIL COMMA
  4272.  1340 JCOL=JAVB
  4273.  1350 CALL COPY (1)
  4274.       IF (LCPY.NE.KSPK(2)) GO TO 1350
  4275.       IOUT(ICOL)=KSPK(5)
  4276.       GO TO 470
  4277. C                  ***** JTYPE = 38
  4278. C     READ ( AND WRITE (
  4279.  1360 JGOOF=23
  4280.  1370 CALL COPY (NINS-1)
  4281.       ICOL=ICOL+1
  4282.       NLPS=-1
  4283.  1380 CALL COPY (1)
  4284.       IF (MEOF.GE.0) GO TO 40
  4285. C     LEFT PAREN MEANS START OF AN INTERNAL READ/WRITE SUBSCRIPT
  4286.       IF (LCPY.EQ.KSPK(3)) THEN
  4287.            NLPS=NLPS+1
  4288.            GO TO 1380
  4289.       END IF
  4290. C     RIGHT PAREN - COPY REST OF CARD UNLESS CLOSING SUBSCRIPT
  4291.       IF (LCPY.EQ.KSPK(5)) THEN
  4292.            IF (NLPS.LE.0) GO TO 470
  4293.            NLPS=NLPS-1
  4294.            GO TO 1380
  4295.       END IF
  4296. C     COMMA - NUMBER WILL FOLLOW UNLESS INTERNAL WRITE SUBSCRIPT
  4297.       IF (LCPY.EQ.KSPK(2)) THEN
  4298.            IF (NLPS.EQ.0) GO TO 1400
  4299.            GO TO 1380
  4300.       END IF
  4301. C     ACCEPT ANYTHING BUT = SIGN.
  4302.       IF (LCPY.NE.KSPK(1)) GO TO 1380
  4303. C     LAST CHARACTER WAS =.  CHECK KEYWORD FOR NUMBER FOLLOWING.
  4304. C      (SKIP FMT AND END FOR TYPE 47)
  4305.       IF (JTYPE.EQ.47) GO TO 1390
  4306. C     FMT
  4307.       IF (BAKSCN(KABC(20),KABC(13))) GO TO 1400
  4308. C     END
  4309.       IF (BAKSCN(KABC(4),KABC(14))) GO TO 1400
  4310. C     ERR
  4311.  1390 IF (.NOT.BAKSCN(KABC(18),KABC(18))) GO TO 1380
  4312. C     GET STATEMENT NUMBER
  4313.  1400 CALL RSTAT
  4314.       IF (L772.EQ.0) GO TO 1380
  4315.       IOUT(ICOL+1)=KLR2
  4316.       ICOL=ICOL+1
  4317.       IF (NXRF.GT.MXREF) GO TO 1600
  4318.       IOUTN(NXRF)=L772
  4319.       NXRF=NXRF+1
  4320.       CALL RLIST
  4321.       GO TO 1380
  4322. C                  ***** JTYPE = 39
  4323. C     RETURN
  4324.  1410 CALL COPY (6)
  4325.       MTRAN=MLGC
  4326.       GO TO 470
  4327. C                  ***** JTYPE = 40
  4328. C     SENSE LIGHT
  4329.  1420 CALL COPY (5)
  4330.       ICOL=ICOL+1
  4331.       CALL COPY (5)
  4332.       GO TO 470
  4333. C                  ***** JTYPE = 41
  4334. C     STOP
  4335.  1430 CALL COPY (4)
  4336.       MILDO=-1
  4337.       MTRAN=MLGC
  4338.       GO TO 470
  4339. C                  ***** JTYPE = 42
  4340. C     IF (UNIT,N) L1,L2,L3,L4
  4341.  1440 CALL COPY (2)
  4342.       ICOL=ICOL+1
  4343.       CALL COPY (-1)
  4344.       IF (MEOF.GE.0) GO TO 40
  4345.       ICOL=ICOL+1
  4346.       MILDO=1
  4347.       CALL DLIST (MERR)
  4348.       IF (MERR.EQ.0) THEN
  4349.            DO 1450 I=1,4
  4350.                 CALL RSTAT
  4351.                 IF (L772.EQ.0) GO TO 40
  4352.                 ICOL=ICOL+1
  4353.                 IOUT(ICOL)=KLR2
  4354.                 IF (NXRF.GT.MXREF) GO TO 1600
  4355.                 IOUTN(NXRF)=L772
  4356.                 NXRF=NXRF+1
  4357.                 CALL RLIST
  4358.                 CALL COPY (1)
  4359.                 IF (LCPY.NE.KSPK(2)) THEN
  4360.                      IF (I.EQ.4.AND.LCPY.EQ.KERM) GO TO 500
  4361.                      GO TO 40
  4362.                 END IF
  4363.  1450      CONTINUE
  4364.       END IF
  4365.       GO TO 40
  4366. C                        ***** JTYPE = 46
  4367. C     COMPLEX,  INTEGER,  REAL,  LOGICAL,  CHARACTER
  4368.  1460 CALL COPY (NINS)
  4369.       KTDCL=0
  4370. C     CHECK IF HAS PRECISION
  4371.       IF (IFIR.EQ.8) THEN
  4372. C          STATEMENT IS E.G. REAL*8, I.E. WITH BYTE NUMBER
  4373. C          FIRST SWALLOW ANY BLANKS BEFORE IT.
  4374.  1470      IF (JCOL.EQ.LFIR) GO TO 1480
  4375.            IF (JINT(JCOL).NE.KBL) GO TO 470
  4376.            JCOL=JCOL+1
  4377.            GO TO 1470
  4378. C     * WAS NEXT CHARACTER. COPY IT.
  4379.  1480      CALL COPY (1)
  4380.  1490      IF (JINT(JCOL).NE.KBL) THEN
  4381. C     PROCESS  *(*)
  4382.                 IF (JINT(JCOL).EQ.KSPK(3)) THEN
  4383.                      CALL COPY (3)
  4384.                      ICOL=ICOL+1
  4385.                      GO TO 480
  4386.                 END IF
  4387.                 GO TO 1510
  4388.            END IF
  4389.            JCOL=JCOL+1
  4390.            GO TO 1490
  4391. C     GO PAST BYTE COUNT
  4392.  1500      CALL COPY (1)
  4393.  1510      DO 1520 I=1,10
  4394.                 IF (JINT(JCOL).EQ.KDIG(I)) GO TO 1500
  4395.  1520      CONTINUE
  4396. C     POSSIBLE VIOLATION OF ANSI STANDARD (REAL*8, ETC)
  4397. C      (ONLY LEGAL SIZE DECLARATION IS CHARACTER)
  4398.            IF (MANSI.EQ.0.AND.ITYPE.NE.9) KTDCL=1
  4399.       END IF
  4400. C     SEE IF IT IS A FUNCTION, IF SO ADD A SPACE AFTER
  4401.       I=29
  4402.       CALL KWSCAN (I,KSTC)
  4403.       IF (I.EQ.29) THEN
  4404.            ICOL=ICOL+1
  4405.            NINS=KSTC(1)
  4406.            CALL COPY (NINS)
  4407.            GO TO 470
  4408.       END IF
  4409.       IF (KTDCL.EQ.1) CALL DIAGNO (40)
  4410. C     LOOK FOR NON-ANSI INITIALIZED DECLARATIONS.
  4411.       IF (MANSI.EQ.0) THEN
  4412.            DO 1530 NF=LFIR,JMAX
  4413.                 IF (JINT(NF).EQ.KSPK(4)) THEN
  4414.                      CALL DIAGNO (42)
  4415.                      GO TO 470
  4416.                 END IF
  4417.  1530      CONTINUE
  4418.       END IF
  4419.       GO TO 470
  4420. C                        ***** JTYPE = 47
  4421. C     OPEN, CLOSE, INQUIRE
  4422.  1540 JGOOF=31
  4423.       GO TO 1370
  4424. C                        ***** JTYPE = 48
  4425. C     ENDIF
  4426.  1550 NIFBLK=NIFBLK-1
  4427.       IF (NIFBLK.LT.0) THEN
  4428.            NIFBLK=0
  4429.            IOUT(1)=KABC(3)
  4430.            CALL DIAGNO (32)
  4431.       ELSE
  4432.            ICOL=ICOL-INDENT
  4433.            ICOLSV=ICOL
  4434.       END IF
  4435.       CALL COPY (3)
  4436.       ICOL=ICOL+1
  4437.       CALL COPY (2)
  4438.       GO TO 500
  4439. C                        ***** JTYPE = 49
  4440. C     ELSE
  4441.  1560 IF (NIFBLK.LE.0) THEN
  4442.            IOUT(1)=KABC(3)
  4443.            CALL DIAGNO (32)
  4444.       ELSE
  4445.            ICOL=ICOL-INDENT
  4446.            ICOLSV=ICOL
  4447.       END IF
  4448.       CALL COPY (NINS)
  4449.       GO TO 500
  4450. C                        ***** JTYPE = 50
  4451. C     ENDDO, REPEAT
  4452. C       GET CURRENT END-DO NUMBER
  4453.  1570 L15=KCNDO(KCNDP)
  4454.       KCNDP=KCNDP-1
  4455.       IF (KCNDP.LT.0) CALL DIAGNO (43)
  4456.       IF (L15.GT.0) THEN
  4457. C     CONVERT TO A CONTINUE STATEMENT
  4458. C                            PROCESS STATEMENT NUMBER
  4459.            IF (NDOS.NE.0) THEN
  4460. C                            IT TERMINATES THIS DO-LOOP. INDENT
  4461. C                            ONE LESS LEVEL
  4462.                 IF (L15.EQ.LDOS(NDOS).AND.MLGC.NE.0) THEN
  4463.                      ICOL=ICOL-INDENT
  4464.                      ICOLSV=ICOL
  4465.                 END IF
  4466.            END IF
  4467.            ICOL=ICOL+1
  4468. C     CONVERT TO A CONTINUE CARD.
  4469.            CALL CPYSTR (ICOL,'CONTINUE')
  4470.            ICOL=ICOL+8
  4471.            IOUT(ICOL)=KERM
  4472.            GO TO 490
  4473.       ELSE
  4474. C     PASS A DO WHILE LOOP TERMINATOR UNALTERED (BUT PROPERLY INDENTED)
  4475.            IF (MLGC.NE.0) THEN
  4476.                 ICOL=ICOL-INDENT
  4477.                 ICOLSV=ICOL
  4478.            END IF
  4479.            NIFBLK=NIFBLK-1
  4480.            IF (ITYPE.EQ.81) THEN
  4481. C     END DO
  4482.                 CALL COPY (3)
  4483.                 ICOL=ICOL+1
  4484.                 CALL COPY (2)
  4485.            ELSE
  4486. C     REPEAT (MICROSOFT F77)
  4487.                 CALL COPY (6)
  4488.            END IF
  4489.            GO TO 500
  4490.       END IF
  4491. C                        ***** JTYPE = 51
  4492. C     DO WHILE
  4493.  1580 CALL COPY (2)
  4494.       ICOL=ICOL+1
  4495.       CALL COPY (5)
  4496. C     TREAT UNNUMBERED DO-LOOP THIS WAY IF DESIRED
  4497.  1590 ICOL=ICOL+1
  4498.       CALL COPY (0)
  4499. C     GIVE IT A NEGATIVE PSEUDO-STATEMENT NUMBER IN STACK TO PREVENT
  4500. C      CONVERSION TO CONTINUE
  4501.       KCNDP=KCNDP+1
  4502.       KCNDO(KCNDP)=-KENDDO
  4503.       KENDDO=KENDDO+1
  4504.       NIFBLK=NIFBLK+1
  4505.       GO TO 500
  4506. C     TOO MANY CROSS-REFERENCES
  4507.  1600 CALL DIAGNO (35)
  4508.       MP2=0
  4509.       GO TO 50
  4510.  1610 FORMAT (13X,'***',10I6,'***')
  4511.  1620 FORMAT ('0JTYPE =',I3,' IS ILLEGAL.  I AM CONFUSED AND CANNOT GO O
  4512.      1N.')
  4513.       END
  4514.       SUBROUTINE PASS2
  4515. C
  4516. C     THIS ROUTINE READS THE DATA GENERATED BY PASS1 AND WRITES AND
  4517. C     PUNCHES THE RENUMBERED DECK.
  4518. C     UNNUMBERED CONTINUE AND FORMAT STATEMENTS ARE DELETED WITHOUT
  4519. C     A DIAGNOSTIC.
  4520. C     UNREACHABLE STATEMENTS ARE DELETED IF *NO CONTINUES
  4521. C     IS IN EFFECT (MCONT=0)
  4522. C
  4523.       INCLUDE 'TIDY.INC'
  4524.       INCLUDE 'UNITS.INC'
  4525. C     SET UP DIMENSIONED ARRAY FOR EFFICIENT PRINTING
  4526.       CHARACTER*2 IOUT72(72),MINUS
  4527.       EQUIVALENCE (IOUT72(1),IOUT(1)), (MINUS,KSPK(7))
  4528. C        TABLE OF EXECUTABLE(1) OR NON-EXECUTABLE(0) BY KLASS
  4529.       INTEGER IEXFLG(12)
  4530. C         KLASS    0 1 2 3 4 5 6 7 8 9 1011
  4531.       DATA IEXFLG/0,0,0,0,1,0,1,1,0,1,1,1/
  4532. C
  4533.       IF (MP2.EQ.0.OR.NRT1.LE.0) RETURN
  4534. C
  4535. C     MOVE LIST OF NEW STATEMENT NUMBERS FROM TEMP STORAGE
  4536. C
  4537.       DO 10 I=1,NDEF
  4538.            LOCDEF(I)=NEWNUM(I)
  4539.  10   CONTINUE
  4540. C
  4541. C     SET INITIAL CONSTANTS.
  4542. C
  4543.       IPASS=2
  4544.       MPAGE=0
  4545.       NREC=0
  4546.       NTRAN=0
  4547.       IMAX=1326
  4548.       JTYPE=0
  4549. C
  4550.  20   IF (NRT1.EQ.0) GO TO 200
  4551.       JTYPP=JTYPE
  4552.       IOLD=IMAX
  4553.       CALL IOSYS1 (4,KILI,SERIAL,IOUT)
  4554. C                  BLANK OUT REMAINDER OF PREVIOUS CARD, IF NECESSARY.
  4555.       IF (IMAX.LT.IOLD) THEN
  4556.            INEW=IMAX+1
  4557.            DO 30 I=INEW,IOLD
  4558.                 IOUT(I)=KBL
  4559.  30        CONTINUE
  4560.       END IF
  4561. C                  LOOK FOR $  (FOR WARNING FLAG)
  4562.       IF (KLASS.GT.1) THEN
  4563.            DO 40 I=7,IMAX
  4564.                 IF (IOUT(I).EQ.KSPK(10)) THEN
  4565.                      IF (MPRIN.EQ.0) WRITE (OUTFIL,240) IOUT72
  4566.                      WRITE (OUTFIL,230)
  4567.                      GO TO 50
  4568.                 END IF
  4569.  40        CONTINUE
  4570.       END IF
  4571. C
  4572.  50   NRT1=NRT1-1
  4573.       IF (NREC.EQ.0) THEN
  4574.            CALL HEADER
  4575.            IF (MPRIN.NE.0) CALL PAGE (0)
  4576.       END IF
  4577. C
  4578.       IF (MDEB.NE.0) WRITE (OUTFIL,210) KILI,SERIAL
  4579.       I=KLASS+1
  4580. C            0   1   2   3   4   5   6   7   8   9   10  11
  4581.       GO TO (20,130,60,130,100,100,100,70,170,130,70,100),I
  4582. C                KLASS  DESCRIPTION
  4583. C                  0.   CONTROL CARD
  4584. C                  1.   COMMENT
  4585. C                  2.   HEADER
  4586. C                  3.   NO STATEMENT NO ALLOWED (NON-EXECTUABLE)
  4587. C                  4.   CONTINUE
  4588. C                  5.   FORMAT STATEMENT.
  4589. C                  6.   STATEMENT NO. ALLOWED, NO REFERENCES
  4590. C                  7.   REFERENCES PRESENT, STATEMENT NO. ALLOWED.
  4591. C                  8.   END
  4592. C                  9.   INTRODUCTORY
  4593. C                  10.  DO
  4594. C                  11.  ELSE,ENDIF,ELSEIF, UNRECOGNIZED
  4595. C                       (TRANSFER CAN GET HERE REGARDLESS OF LABEL)
  4596. C
  4597. C     KLASS 0.   CONTROL CARD
  4598. C             RESERVED FOR FUTURE DEVELOPMENT.
  4599. C
  4600.  60   IF (MPRIN.EQ.0) THEN
  4601.            CALL PAGE (2)
  4602.            IF (MPUN.NE.0) THEN
  4603.                 WRITE (OUTFIL,280) (KIM(I,1),I=1,72)
  4604.            ELSE
  4605.                 WRITE (OUTFIL,290) (KIM(I,1),I=1,72)
  4606.            END IF
  4607.       END IF
  4608.       GO TO 130
  4609. C
  4610. C     DO REFERENCES.
  4611. C
  4612.  70   DO 80 I=7,IMAX
  4613.            JINT(I)=IOUT(I)
  4614.            IOUT(I)=KBL
  4615.  80   CONTINUE
  4616.       ICOL=6
  4617.       JCOL=7
  4618.       JMAX=IMAX
  4619.       I=1
  4620. C
  4621.  90   IF (JINT(JCOL).EQ.KLR2) THEN
  4622. C     RENUMBER A REFERENCE
  4623.            L772=IOUTN(I)
  4624.            JCOL=JCOL+1
  4625.            I=I+1
  4626.            CALL RENUM
  4627.       ELSE
  4628. C     COPY A CHARACTER
  4629.            ICOL=ICOL+1
  4630.            IOUT(ICOL)=JINT(JCOL)
  4631.            JCOL=JCOL+1
  4632.       END IF
  4633.       IF (JCOL.LE.JMAX) GO TO 90
  4634.       IMAX=ICOL
  4635. C
  4636. C          DO STATEMENT NUMBER
  4637. C
  4638.  100  L772=L15
  4639.       ICOL=0
  4640.       CALL RENUM
  4641. C        PRINT ALL LABELLED STATEMENTS, ELSE, ELSEIF, ENDIF
  4642.       IF (L772.NE.0.OR.KLASS.EQ.11) GO TO 120
  4643. C                 DELETE ALL UNLABELLED CONTINUES AND FORMATS
  4644.       IF (KLASS.EQ.4.OR.KLASS.EQ.5) GO TO 110
  4645. C           PUNCH IF THERE IS A PATH TO THIS STATEMENT
  4646.       IF (NTRAN.NE.-1) GO TO 130
  4647. C                 *CONTINUE MEANS ALL OTHER KLASSES ARE OK
  4648.       IF (MCONT.NE.0) GO TO 130
  4649. C                 PUNCH NON-EXECUTABLE STATEMENTS
  4650.       IF (IEXFLG(KLASS+1).EQ.0) GO TO 130
  4651. C     ACCEPT GOTO FOLLOWING A COMPUTED GOTO
  4652.       IF (JTYPE.EQ.24 .AND. JTYPP.EQ.23) GO TO 130
  4653.  110  IF (MDEB.NE.0) WRITE (OUTFIL,220) KLASS
  4654.       GO TO 20
  4655. C
  4656. C     REMEMBER THAT THIS STATEMENT HAS A PATH TO IT
  4657. C
  4658.  120  NTRAN=0
  4659. C
  4660. C     WRITE  (PUNCH) NEW STATEMENT.
  4661. C
  4662.  130  CALL KIMPAK
  4663.       DO 160 J=1,NCD
  4664.            NREC=NREC+KD79
  4665. C
  4666. C     IF NO SERIAL, DO NOT PRINT TRAILING BLANKS.
  4667.            IF (MSER.EQ.0) THEN
  4668.                 N72=72
  4669.                 DO 140 I=72,1,-1
  4670.                      IF (KIM(I,J).NE.KBL) THEN
  4671.                           N72=I
  4672.                           GO TO 150
  4673.                      END IF
  4674.  140            CONTINUE
  4675.            END IF
  4676.  150       IF (MPRIN.NE.0) THEN
  4677.                 CALL PAGE (1)
  4678.                 IF (MSER.LT.0) THEN
  4679.                      WRITE (OUTFIL,240) (KIM(I,J),I=1,72),KOL73,NREC
  4680.                 ELSE IF (MSER.EQ.0) THEN
  4681.                      WRITE (OUTFIL,240) (KIM(I,J),I=1,N72)
  4682.                 ELSE
  4683.                      WRITE (OUTFIL,250) (KIM(I,J),I=1,72),SERIAL
  4684.                 END IF
  4685.            END IF
  4686.            IF (MPUN.NE.0) THEN
  4687.                 NPUN=NPUN+1
  4688.                 IF (MSER.LT.0) THEN
  4689.                      WRITE (PUNFIL,260) (KIM(I,J),I=1,72),KOL73,NREC
  4690.                 ELSE IF (MSER.EQ.0) THEN
  4691.                      WRITE (PUNFIL,260) (KIM(I,J),I=1,N72)
  4692.                 ELSE
  4693.                      WRITE (PUNFIL,270) (KIM(I,J),I=1,72),SERIAL
  4694.                 END IF
  4695.            END IF
  4696. C
  4697.  160  CONTINUE
  4698. C           REMENBER IF THIS IS AN UNCONDITIONAL TRANSFER
  4699.       IF (MTRAN.EQ.-1) NTRAN=-1
  4700.       GO TO 20
  4701. C
  4702. C     END STATEMENT.
  4703. C
  4704.  170  NREC=NREC+KD79
  4705. C
  4706. C     IF NO SERIAL, DO NOT PRINT TRAILING BLANKS.
  4707.       IF (MSER.EQ.0) THEN
  4708.            DO 180 I=72,1,-1
  4709.                 IF (IOUT72(I).NE.KBL) THEN
  4710.                      N72=I
  4711.                      GO TO 190
  4712.                 END IF
  4713.  180       CONTINUE
  4714.       END IF
  4715.  190  IF (MPRIN.NE.0) THEN
  4716.            CALL PAGE (1)
  4717.            IF (MSER.LT.0) THEN
  4718.                 WRITE (OUTFIL,240) IOUT72,KOL73,NREC,MINUS
  4719.            ELSE IF (MSER.EQ.0) THEN
  4720.                 WRITE (OUTFIL,240) (IOUT72(I),I=1,N72)
  4721.            ELSE
  4722.                 WRITE (OUTFIL,250) IOUT72,SERIAL
  4723.            END IF
  4724.       END IF
  4725.       IF (MPUN.NE.0) THEN
  4726.            NPUN=NPUN+1
  4727.            IF (MSER.LT.0) THEN
  4728.                 WRITE (PUNFIL,260) IOUT72,KOL73,NREC,MINUS
  4729.            ELSE IF (MSER.EQ.0) THEN
  4730.                 WRITE (PUNFIL,260) (IOUT72(I),I=1,N72)
  4731.            ELSE
  4732.                 WRITE (PUNFIL,270) IOUT72,SERIAL
  4733.            END IF
  4734.       END IF
  4735.  200  RETURN
  4736. C
  4737. C
  4738.  210  FORMAT (' KLASS',I3,' JTYPE',I3,' L15',I7,' IMAX',I4,' TRAN',I2,'
  4739.      1NXRF: ',I4/'  MEX=',I4,' ICOLSV = ',I3,' SERIAL:',8A2)
  4740.  220  FORMAT (' DELETING A KLASS=',I3,' STATEMENT')
  4741.  230  FORMAT ('+',110X,'$ $ $ $ $')
  4742.  240  FORMAT (7X,75A1,I4,A1)
  4743.  250  FORMAT (7X,80A1)
  4744.  260  FORMAT (75A1,I4,A1)
  4745.  270  FORMAT (80A1)
  4746.  280  FORMAT ('0',15X,72A1,5X,'--PUNCHED')
  4747.  290  FORMAT ('0',15X,72A1,5X,'--NOT PUNCHED')
  4748.       END
  4749.       SUBROUTINE RDIR
  4750. C
  4751. C     THIS SUBROUTINE GENERATES A REFERENCE DIRECTORY OF STATEMENT
  4752. C     NUMBERS SHOWING THE OLD STATEMENT NUMBER, ITS LOCATION IN THE
  4753. C     ROUTINE, AND THE NEW STATEMENT NUMBER GENERATED BY TIDY.
  4754. C
  4755.       INCLUDE 'TIDY.INC'
  4756.       INCLUDE 'UNITS.INC'
  4757.       DIMENSION INDEX(1000)
  4758.       IF (NDEF.LE.0) RETURN
  4759.       CALL PAGE (-(8+NDEF))
  4760.       CALL PAGE (4)
  4761.       WRITE (OUTFIL,60)
  4762.       DO 10 I=1,NDEF
  4763.            INDEX(I)=I
  4764.  10   CONTINUE
  4765. C
  4766. C     ADDRESS-SORT STATEMENT NUMBERS
  4767. C
  4768.       IF (NDEF.EQ.1) GO TO 40
  4769.       M=NDEF+1
  4770.  20   NR=0
  4771.       M=M-1
  4772.       DO 30 I=2,M
  4773.            J=INDEX(I-1)
  4774.            K=INDEX(I)
  4775.            IF (LDEF(J).EQ.LDEF(K)) THEN
  4776.                 INDEX(I-1)=K
  4777.                 INDEX(I)=J
  4778.                 NR=1
  4779.            END IF
  4780.  30   CONTINUE
  4781.       IF (NR.NE.0) GO TO 20
  4782. C
  4783. C     WRITE  DIRECTORY
  4784. C
  4785.  40   DO 50 I=1,NDEF
  4786.            NW1=NEWNUM(I)
  4787.            NO1=LDEF(I)
  4788.            LO1=LOCDEF(I)
  4789.            J=INDEX(I)
  4790.            NW2=NEWNUM(J)
  4791.            NO2=LDEF(J)
  4792.            LO2=LOCDEF(J)
  4793.            CALL PAGE (1)
  4794.            WRITE (OUTFIL,70) NW1,NO1,LO1,NO2,LO2,NW2
  4795.  50   CONTINUE
  4796.       CALL PAGE (3)
  4797.       WRITE (OUTFIL,80)
  4798.       RETURN
  4799. C
  4800.  60   FORMAT ('0',32X,'STATEMENT NUMBER DIRECTORY'/'0',22X,'NEW    OLD
  4801.      1 LOC',13X,'OLD   LOC      NEW'/1X)
  4802.  70   FORMAT (21X,I5,' = ',I6,',(',I4,').',8X,I6,',(',I4,') = ',I5,'.')
  4803.  80   FORMAT ('0',20X,'OLD STATEMENT NUMBERS NOT APPEARING IN THIS DIREC
  4804.      1TORY'/21X,'WERE NOT REFERENCED AND HENCE ARE DELETED.')
  4805.       END
  4806.       SUBROUTINE READER
  4807. C     THIS ROUTINE READS CARDS ONE BY ONE, UNTIL IT FINDS A
  4808. C     NON-BLANK ONE, THEN RETURNS.   IF IT FINDS AN END-OF-FILE, OR IF
  4809. C     IQUIT IS NON-ZERO, IT GENERATES A *STOP CARD.
  4810.       INCLUDE 'TIDY.INC'
  4811.       INCLUDE 'UNITS.INC'
  4812.       IF (IQUIT.NE.0) GO TO 30
  4813. 10    READ (INFILE,60,END=30) KBUFF
  4814. C
  4815. C     QUICK CHECK IF THERE IS SOMETHING THERE...
  4816.       IF (KBUFF(7).NE.KBL) RETURN
  4817. C
  4818. C     LOOK FOR A TOTALLY BLANK CARD.
  4819.       DO 20 I=1,72
  4820.            IF (KBUFF(I).NE.KBL) RETURN
  4821. 20    CONTINUE
  4822. C
  4823. C     BLANK CARD. IF INCLUDE FLAG IS SET, MAKE FIRST CHARACTER SPECIAL
  4824. C      CODE SO CAN BE RECOGNIZED AS A BLANK COMMENT.
  4825. C      OTHERWISE ISSUE MESSAGE AND GET NEXT CARD.
  4826.       IF (KBKCOK.EQ.1) THEN
  4827.            KBUFF(1)=KBLCMT
  4828.            KBUFF(2)=KERM
  4829.            RETURN
  4830.       ELSE
  4831.            CALL PAGE (1)
  4832.            WRITE (OUTFIL,70)
  4833.            GO TO 10
  4834.       END IF
  4835. C                            NO MORE INPUT
  4836. 30    IQUIT=1
  4837.       KBUFF(1)=KSPK(8)
  4838.       KBUFF(2)=KABC(19)
  4839.       KBUFF(3)=KABC(20)
  4840.       KBUFF(4)=KABC(15)
  4841.       KBUFF(5)=KABC(16)
  4842.       DO 40 I=6,72
  4843.            KBUFF(I)=KBL
  4844. 40    CONTINUE
  4845.       L15=0
  4846.       L25=0
  4847.       RETURN
  4848. C
  4849. C
  4850. C
  4851. 60    FORMAT (80A1)
  4852. 70    FORMAT (35X,'( B L A N K   C A R D )')
  4853.       END
  4854.       SUBROUTINE REDSTR (LU,LIST,NCHR,IRF,NR,IOP)
  4855.       CHARACTER*2 LIST(NCHR)
  4856.       DIMENSION IRF(NR)
  4857. C     WRITE OUT STRING AS SERIES OF 508-(CHAR*2) RECS
  4858. C      (APPARENTLY 1024 BYTES IS MAGIC NUMBER FOR PROFORT, AND EACH REC
  4859. C       HAS 4-BYTE HEADER AND TRAILER)
  4860.       DATA MXCHR/508/,MXINT/254/
  4861.       NL=1
  4862.       MU=MXCHR
  4863.  10   NU=MIN0(NCHR,MU)
  4864.       NB=NU-NL+1
  4865.       CALL IOSTR (LU,LIST(NL),NB,IOP)
  4866.       IF (NCHR.GT.NU) THEN
  4867.            MU=MU+MXCHR
  4868.            NL=NU+1
  4869.            GO TO 10
  4870.       END IF
  4871. C     NOW DO THE CROSS-REFERENCE TABLE (253 REFS?!)
  4872.       NL=1
  4873.       MU=MXINT
  4874.  20   NU=MIN0(NR,MU)
  4875.       NB=NU-NL+1
  4876.       CALL IONUM (LU,IRF(NL),NB,IOP)
  4877.       IF (NR.GT.NU) THEN
  4878.            MU=MU+MXINT
  4879.            NL=NU+1
  4880.            GO TO 20
  4881.       END IF
  4882.       RETURN
  4883.       END
  4884.       SUBROUTINE IOSTR (LU,LIST,NB,IOP)
  4885. C     READ OR WRITE A STRING
  4886.       CHARACTER*2 LIST(NB)
  4887.       IF (IOP.EQ.1) THEN
  4888.            WRITE (LU) LIST
  4889.       ELSE
  4890.            READ (LU) LIST
  4891.       END IF
  4892.       RETURN
  4893.       END
  4894.       SUBROUTINE IONUM (LU,IRF,NR,IOP)
  4895. C     READ OR WRITE AN INTEGER ARRAY.
  4896.       DIMENSION IRF(NR)
  4897.       IF (IOP.EQ.1) THEN
  4898.            WRITE (LU) IRF
  4899.       ELSE
  4900.            READ (LU) IRF
  4901.       END IF
  4902.       RETURN
  4903.       END
  4904.       SUBROUTINE RENUM
  4905. C
  4906. C     THIS SUBROUTINE INSPECTS THE OLD STATEMENT NUMBER IN L772 AND
  4907. C     INSERTS THE NEW NUMBER CORRESPONDING TO L772 IN IOUT STARTING AT
  4908. C     ICOL+1.  ON EXIT, L772 CONTAINS THE NEW STATEMENT NUMBER.
  4909. C
  4910.       INCLUDE 'TIDY.INC'
  4911. C
  4912. C     SEARCH DEFINED STATEMENT TABLE FOR L772.
  4913. C
  4914.       IF (NDEF.NE.0) THEN
  4915.            DO 50 II=1,NDEF
  4916.                 IF (LDEF(II).EQ.L772) THEN
  4917. C
  4918. C     ASSEMBLE NEW STATEMENT NUMBER.
  4919. C
  4920.                      I=NEWNUM(II)
  4921.                      L772=I
  4922.                      DO 10 L=1,5
  4923.                           IT=I/10
  4924.                           K=I-IT*10
  4925.                           J=L
  4926.                           NTEMP(J)=KDIG(K+1)
  4927.                           I=IT
  4928.                           IF (I.EQ.0) GO TO 20
  4929. 10                   CONTINUE
  4930.                      J=5
  4931. C
  4932. C     INSERT STATEMENT NUMBER DIGITS.
  4933. C
  4934. 20                   IF (ICOL.EQ.0) THEN
  4935. C                            COLUMNS 1-5
  4936.                           DO 30 IK=1,5
  4937.                                IOUT(IK)=KBL
  4938. 30                        CONTINUE
  4939.                           IF (MRIT.GE.0) THEN
  4940. C                            RIGHT ADJUST TO COLUMN -MRIT
  4941.                                ICOL=IDIM(MRIT,J)
  4942.                           ELSE
  4943. C                            LEFT ADJUST TO COLUMN MRIT
  4944.                                ICOL=MIN0(-MRIT,6-J)
  4945.                                ICOL=IDIM(ICOL,1)
  4946.                           END IF
  4947.                      END IF
  4948. 40                   ICOL=ICOL+1
  4949.                      IOUT(ICOL)=NTEMP(J)
  4950.                      J=J-1
  4951.                      IF (J.NE.0) GO TO 40
  4952.                      RETURN
  4953.                 END IF
  4954. 50         CONTINUE
  4955.       END IF
  4956. C
  4957. C     NOT IN STATEMENT NUMBER LIST. DELETE NUMBER.
  4958. C
  4959.       L772=0
  4960.       RETURN
  4961.       END
  4962.       SUBROUTINE RLIST
  4963. C     THIS SUBROUTINE UPDATES THE REFERENCED STATEMENT NUMBER LIST.
  4964. C     L772 CONTAINS THE REFERENCED STATEMENT NUMBER.
  4965.       INCLUDE 'TIDY.INC'
  4966.       IF (L772.EQ.0) RETURN
  4967. C                  POOR PROGRAMMING PRACTICE.
  4968.       IF (L772.EQ.L15) CALL DIAGNO (18)
  4969.       IF (NREF.LT.0) RETURN
  4970.       IF (NREF.GT.0) THEN
  4971.            DO 10 I=1,NREF
  4972.                 IF (LREF(I).EQ.L772) RETURN
  4973.  10        CONTINUE
  4974.       END IF
  4975. C     ADD REFERENCED STATEMENT TO TABLE.
  4976.       NREF=NREF+1
  4977.       IF (NREF.LE.1000) THEN
  4978.            LREF(NREF)=L772
  4979.       ELSE
  4980. C                  TABLE FULL
  4981.            CALL DIAGNO (7)
  4982.            NREF=-1
  4983.            MP2=0
  4984.       END IF
  4985.       RETURN
  4986.       END
  4987.       SUBROUTINE RSTAT
  4988. C     THIS SUBROUTINE GETS THE STATEMENT NUMBER REFERENCED AT LOCATION
  4989. C     JCOL AND PUTS IT IN L772.  JCOL IS LEFT SET AT THE LOCATION OF THE
  4990. C     NEXT SYMBOL ON JINT.
  4991.       INCLUDE 'TIDY.INC'
  4992.       L772=0
  4993.       IF (JCOL.GT.JMAX) THEN
  4994.            JCOL=JMAX
  4995.       ELSE
  4996.            I=JCOL
  4997.            DO 20 JCOL=I,JMAX
  4998. C     SKIP BLANKS
  4999.                 IF (JINT(JCOL).NE.KBL) THEN
  5000.                      DO 10 J=1,10
  5001.                           IF (JINT(JCOL).EQ.KDIG(J)) THEN
  5002. C     ADD DIGIT TO NUMBER
  5003.                                L772=L772*10+J-1
  5004.                                GO TO 20
  5005.                           END IF
  5006.  10                  CONTINUE
  5007. C     ANY OTHER NON-BLANK CHAR MEANS END OF NUMBER.
  5008.                      RETURN
  5009.                 END IF
  5010.  20        CONTINUE
  5011.            JCOL=JMAX
  5012.            LCPY=KERM
  5013.            MEOF=0
  5014.       END IF
  5015.       RETURN
  5016.       END
  5017.       SUBROUTINE SKARD
  5018. C     super-card input routine.
  5019. C     this routine reads fortran statements with up to 19 continuation
  5020. C     cards and packs the statement into the super-card --JINT--.
  5021.       INCLUDE 'TIDY.INC'
  5022.       INCLUDE 'UNITS.INC'
  5023.       LOGICAL RSHFT
  5024.       CHARACTER*2 KB1,KB6,KZERO,KC,KSTAR,KDOL,KPER,KUPPER,KB1CR1
  5025.       EQUIVALENCE (KB1,KBUFF(1)), (KB6,KBUFF(6))
  5026.       EQUIVALENCE (KZERO,KDIG(1)), (KC,KABC(3)), (KSTAR,KSPK(8)) 
  5027.       EQUIVALENCE (KDOL,KSPK(14)), (KPER,KSPK(9))
  5028.       RSHFT=.TRUE.
  5029.       K72=72
  5030. C     TEST FOR A CONTINUATION CARD - SHOULD NOT BE HERE
  5031. C      (ANSI F77 ALLOWS EMBEDDED COMMENTS IN CONTINUED STATEMENTS, SO
  5032. C       THIS PATCH SHOULD BE REMOVED IF A WAY TO DO THEM IS FOUND)
  5033.       IF (KBUFF(1).EQ.KAMPR.OR.(KBUFF(1).EQ.KBL.AND.(KBUFF(6)
  5034.      1.NE.KBL.AND.KBUFF(6).NE.KZERO))) THEN
  5035.            WRITE (OUTFIL,120)
  5036.            STOP 33
  5037.       END IF
  5038. C     SAVE FIRST CHARACTER OF CARD
  5039.       KB1CR1=KUPPER(KBUFF(1))
  5040.       JMAX=1
  5041.       DO 30 I=1,K72
  5042.            IF (KBUFF(I).EQ.KTAB) THEN
  5043.                 IF (I.LT.7.AND.RSHFT) THEN
  5044. C                  BLANK REST OF NUMBER FIELD
  5045.                      DO 10 L=JMAX,6
  5046.                           JINT(L)=KBL
  5047. 10                   CONTINUE
  5048.                      JMAX=7
  5049.                      RSHFT=.FALSE.
  5050. C     blank the serial field
  5051.                      DO 20 L=1,8
  5052.                           SERIAL(L)=KBL
  5053. 20                   CONTINUE
  5054. C     SET LINE LENGTH TO 80
  5055.                      K72=80
  5056.                      GO TO 30
  5057.                 ELSE
  5058. C     tabs past column 6 translate to spaces with f77
  5059.                      KBUFF(I)=KBL
  5060.                 END IF
  5061.            END IF
  5062.            JINT(JMAX)=KBUFF(I)
  5063.            JMAX=JMAX+1
  5064. 30    CONTINUE
  5065. C     grab existing serial number if needed.
  5066.       IF (MSER.NE.0.AND.RSHFT) THEN
  5067.            DO 40 I=1,8
  5068.                 SERIAL(I)=KBUFF(I+72)
  5069. 40         CONTINUE
  5070.       END IF
  5071. C     skip page header if not beginning.
  5072.       IF (KOUNT.LE.0) THEN
  5073.            CALL HEADER
  5074.            IF (MLIST.NE.0) CALL PAGE (0)
  5075.       END IF
  5076.       MEOF=-1
  5077.       KOUNT=KOUNT+1
  5078.       NREC=NREC+1
  5079.       IF (MLIST.NE.0) THEN
  5080.            CALL PAGE (1)
  5081.            WRITE (OUTFIL,130) NREC,KBUFF
  5082.       END IF
  5083.       NXRF=2
  5084.       J=1
  5085. C     look for continuation cards and transfer them to iout via kbuff.
  5086.       IF (IQUIT.NE.1) THEN
  5087. C     if first card was a comment, do not try to continue it...
  5088.            IF (KB1CR1.EQ.KC.OR.KB1CR1.EQ.KBLCMT.OR.KB1CR1.EQ.KSTAR.OR.KB
  5089.      1      1CR1.EQ.KDOL.OR.KB1CR1.EQ.KPER) THEN
  5090.                 CALL READER
  5091.                 GO TO 90
  5092.            END IF
  5093. C     not comment, continuations are legal.
  5094.            DO 80 J=2,20
  5095.                 CALL READER
  5096.                 IF (IQUIT.EQ.1) GO TO 90
  5097. C     ampersand means continuation.
  5098.                 IF (KB1.EQ.KAMPR) THEN
  5099.                      K7=2
  5100.                      K72=80
  5101.                      GO TO 60
  5102.                 ELSE
  5103.                      K7=7
  5104.                      K72=72
  5105.                 END IF
  5106. C     check for a tab in number field. If so, not a continuation
  5107.                 DO 50 I=1,6
  5108.                      IF (KBUFF(I).EQ.KTAB) GO TO 90
  5109. 50              CONTINUE
  5110. C     check for continuation or comments
  5111.                 KB1=KUPPER(KB1)
  5112.                 IF (KB1.EQ.KC) GO TO 90
  5113.                 IF (KB1.EQ.KBLCMT) GO TO 90
  5114.                 IF (KB1.EQ.KSTAR) GO TO 90
  5115.                 IF (KB1.EQ.KDOL) GO TO 90
  5116.                 IF (KB1.EQ.KPER) GO TO 90
  5117.                 IF (KB6.EQ.KBL) GO TO 90
  5118.                 IF (KB6.EQ.KZERO) GO TO 90
  5119. 60              DO 70 I=K7,K72
  5120.                      IF (KBUFF(I).NE.KTAB) THEN
  5121.                           JINT(JMAX)=KBUFF(I)
  5122.                      ELSE
  5123.                           JINT(JMAX)=KBL
  5124.                      END IF
  5125.                      JMAX=JMAX+1
  5126. 70              CONTINUE
  5127.                 IF (MLIST.EQ.0) GO TO 80
  5128.                 CALL PAGE (1)
  5129.                 WRITE (OUTFIL,140) KBUFF
  5130. 80         CONTINUE
  5131. C     nineteen continuation cards.  load empty buffer before exiting.
  5132.            J=21
  5133.            CALL READER
  5134.       END IF
  5135. C     locate last non-blank column in card and exit.
  5136. 90    NCD=J-1
  5137.       JMAX=JMAX-1
  5138.       DO 100 I=JMAX,1,-1
  5139.            IF (JINT(I).NE.KBL) THEN
  5140.                 JMAX=I
  5141.                 GO TO 110
  5142.            END IF
  5143. 100   CONTINUE
  5144.       JMAX=1
  5145. 110   JINT(JMAX+1)=KERM
  5146.       RETURN
  5147. 120   FORMAT (' FATAL ERROR - STATEMENT BEGINS WITH CONTINUATION LINE.'/
  5148.      1'  POSSIBLY COMMENT WITHIN CONTINUED STATEMENT.'/'  TIDY CANNOT PR
  5149.      2OCESS THESE ALTHOUGH THEY ARE LEGAL IN FORTRAN-77.')
  5150. 130   FORMAT (1X,I4,2X,80A1)
  5151. 140   FORMAT (7X,80A1)
  5152.       END
  5153.       SUBROUTINE USRCON
  5154. C
  5155. C     READS A SEPARATE FILE OF TIDY CONTROL CARDS SO USER DOES NOT
  5156. C     HAVE TO EDIT THEM INTO SOURCE FILE.
  5157. C
  5158.       INCLUDE 'TIDY.INC'
  5159.       INCLUDE 'UNITS.INC'
  5160. C
  5161.       WRITE (OUTFIL,30)
  5162. C
  5163.  10   READ (USRFIL,40,END=20) (JINT(I),I=1,75)
  5164.       WRITE (OUTFIL,50) (JINT(I),I=1,75)
  5165.       IF (JINT(1).NE.KSPK(8)) THEN
  5166.            WRITE (OUTFIL,60)
  5167.       ELSE
  5168.            JMAX=75
  5169.            CALL CONTRL
  5170.       END IF
  5171.       GO TO 10
  5172. C
  5173.  20   CLOSE (USRFIL,STATUS='KEEP')
  5174.       RETURN
  5175. C
  5176. C
  5177.  30   FORMAT ('1      ** T I D Y **  SPECIAL CONTROL CARD FILE')
  5178.  40   FORMAT (75A1)
  5179.  50   FORMAT ('0',75A1)
  5180.  60   FORMAT (' CONTROL CARDS MUST HAVE * IN COLUMN 1.')
  5181.       END
  5182.