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