home *** CD-ROM | disk | FTP | other *** search
/ PC Media 7 / PC MEDIA CD07.iso / share / prog / tidy642 / tidy.for < prev    next >
Encoding:
Text File  |  1994-05-22  |  164.7 KB  |  5,497 lines

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