d 	PROGRAM CROSS !! <{@}In_file {Options}
 c.		Generate a Cross Reference of FORTRAN source
,c.
c.Input:
c.	<Source .or. <@File_of_Source_names {e.g. DIR/COL=1/OUT= ...}
Xc.	RATfor i.e. RatFor Source	-- Default FORTRAN
c.					-- Default trace MAIN PROGRAM
 c.	%Name .or. ALL .or. NOTrace	-- Trace options
c.					-- Default show all tables
c.	NOIncluded_file,	NOLogical_Units,	NOSubroutines
Lc.	NOOpens,		NOCommon_blocks,	NOAlphabetize
c.					-- Default 132, NoCompress
c.	80,			REPort,			COMpress
xc.	TRIm			i.e. COMpress and TRIm tree
c.
@c.	This Outputs to FOR003.DAT the Calling - Called tree,
c. and Cross Reference tables for the files read.
c.
lc. Author:	Gary S. Lee
c. Use:		$ DO OLDCROSS !! for the Older Version of Cross
4c----------------------------------------------------------end.of.info
C
C	********************************************************
`	C	*	AUTHOR:		GARY S. LEE                    *
	C	*	LANGUAGE:	FORTRAN FOUR PLUS              *
(
C	*	COMPUTER:	DIGITAL EQUIP. CORP. VAX       *

C	*	DATE:		10-JUN-80                      *

C	********************************************************
TC
C		REVISION DATE	BY	DESCRIPTION
C		-------------	-------	-----------
C		15-JUL-80	G. LEE	FIX BUG IN UNNAMED ROUTINE SECT.
C		05-MAY-81	G/ LEE  CHANGE MAX COMM BLKS  50 => 100
Hc.		04-JUN-82	M. Liveright: In_files, Subs = 500
c.		04-JUN-82	M. Liveright: Permit <@File_list
c.		04-JUN-82	M. Liveright: Permit TRIm_tree
tC***************************************************************
C	CALLS:	ISCOMT	to DETERMINE IF A RATFOR OR FORTRAN 4+ COMMENT
<C	CALLS:	CURLEN 	to DETERMINE THE CURRENT LENGTH OF A STRING
C	CALLS:	PRECHK	to CHECK THE CHARACTERS PRECEEDING A WORD
c.	CALLS:	JJLEN	to get non-blank length of string
hc.	CALLS:	JJCMD	to get user command
c.	CALLS:	JJUPP	to uppercase a line
0C**************************************************************
C		-- SETUP --
C***************************************************************
\	PARAMETER 	 MXINP	=500	!MAX # INPUT FILES
	1		,MXFILES=100	!MAX # FILES INCLUDED
$	2		,MXFILUN=100	!MAX # FILES OPENED
	3		,MXSUBS	=500	!MAX # SUBROUTINES CALLED
	4		,MXIO	=100	!MAX # READ/WRITE LUNS
P	5		,MXCB	=100	!MAX # COMMON BLOCKS
C
	DIMENSION	 INPROG(MXINP)
|	1		,INTYPE(MXINP)
	2		,FILES (MXFILES) , XFILES (MXFILES,MXINP)
D	3		,FILUN (MXFILUN) , XFILUN (MXFILUN,MXINP)
	4		,SUBS  (MXSUBS)  , XSUBS  (MXSUBS,MXINP)
	5		,IO    (MXIO)    , XIO    (MXIO,MXINP)
p	6		,CB    (MXCB)	 , XCB	  (MXCB,MXINP)
	6		,TYPE  (11)
8	7		,LASTNS(MXINP)	! LAST ROW OF SUB USED BY PROG
C
 	CHARACTER	 INPROG*10	!10 CHARACTER ROUTINE NAMES
d	1		,INTYPE*2	!2 CHR ROUTINE TYPE MNEMONIC
	2		,FILES*25	!25 CHAR INCLUDED FILE NAME
,	3		,FILUN*30	!30 CHAR FILE//LUN OPENED
	3		,OPFIL*20	!20 CHAR OPEN FILE NAME
	3		,OPFILUN*30	!30 CHAR CURRENT FILE//LUN
X	4		,SUBS*10	!10 CHAR SUB NAME
	5		,IO*10		!10 CHAR LUN NAMES
 	6		,CB*15		!15 CHAR COMMON BLOCK NAME
	6		,XFILES*1	!1 CHAR INDICATOR
	7		,XFILUN*1	! DITTO
L	8		,XSUBS*1	! DITTO
	9		,XIO*1		! DITTO
	9		,XCB*1		!DITTO
xC
	CHARACTER	 FNAME*25	!CURRENT FILE NAME
@	1		,SNAME*10	!CURRENT SUBROUTINE NAME
	2		,ILUN*10		!LUN NAME
 	3		,KLUN*10		!LUN NAME
l 	4		,CMNBLK*15	!COMMON BLOCK NAME
 	4		,RECORD*80	!INPUT BUFFER
4!	5		,TYPE*2		!ROUTINE TYPE CODES
!	6		,WORD*25	!SEARCH BUFFER
!	7		,CMTCHR*1	!COMMENT CHARACTER
`"C
"	CHARACTER	FILAB*25	!LABEL FOR INCLUDED FILES
(#	1		,SLAB*20	!LABEL FOR SUBROUTINES
#	2		,OPLAB*20	!LABEL FOR OPEN FILES
#	3		,IOLAB*15	!IO LABEL
T$	4		,CBLAB*15	!COMMON BLOCK LABEL
$C
%	CHARACTER*11	TR(10)		!TRACE ROUTINE NAMES
%	1		,ISZ*7	!OUTPUT PAGE SIZE OPTION
%C
H&	character	PGMFILE*80
&c.
'	LOGICAL INC,OP,SUB,LUN,CBFLG,AZ, PRECHK, RAT,ISCOMT, ish
t'	LOGICAL COM		!COMPRESS TRACE FLAG
'	INTEGER		CURLEN		!FUNCTION
<(	EQUIVALENCE	(OPFILUN(1:20),OPFIL)
(	1	,	(OPFILUN(21:30),ILUN)
)	DIMENSION	IROW(MXINP),	ICOL(MXINP)
h)C
)	DATA	TYPE/'??','FU','LF','CF','RF','IF','SU','PR','BD','EL','GR'/
0*C
*	DATA FILAB	 /'INCLUDED FILE'/
*	1 ,SLAB		/'ROUTINES CALLED'/
\+	2 ,OPLAB	/'OPENED FILES'/
+	3 ,IOLAB	/'I/O LUNS'/
$,	4 ,CBLAB	/'COMMON BLOCK'/
,c.
,41	format(80a)
P-C
-C---------------------------------------------------------------
.C		-- INITIALIZE VARIABLES --
|.C---------------------------------------------------------------
.	type *,'Cross 2.1'
D/c!ml!	NPROGS	= 0			!# INPUT ROUTINES SO FAR
/c!ml!	NFILES	= 0			!# INCLUDED FILES SO FAR
0c!ml!	NFILUN	= 0			!# OPENED FILES SO FAR
p0c!ml!	NSUBS	= 0			!# SUBROUTINES CALLED SO FAR
0c!ml!	NIO	= 0			!# IO OPERATIONS SO FAR
81c!ml!	NCB	= 0			!# OF COMMOM BLOCKS SO FAR
1c!ml!	KINC = 0
 2c!ml!	KOPEN = 0
d2c!ml!	KREAD = 0
2c!ml!	KWRITE=0
,3c!ml!	KCALL = 0
3c!ml!	KPRINT = 0
3c!ml!	KTYPE = 0
X4c!ml!	KACCEPT = 0
4c!ml!	KCB	= 0			!INDEX OF WORD "COMMON" IN LINE
 5	NONAMES	= 48			!ASCII CODE FOR ZERO(UNNAMEDS)
5c!ml!	DO 10 JC = 1,MXINP
5c!ml!	INPROG(JC) = ' '
L6c!ml!	LASTNS(JC) = 0			!LAST ROW USED BY THIS PROG
6c!ml!	IROW(JC) = JC			!INITIALIZE ROW ORDER
7c!ml!	DO 20 JR = 1,MXIO		!BLANK OUT XIO
x7c!ml! 20	XIO(JR,JC) = ' '
7c!ml!	DO 22 JR = 1,MXFILES
@8c!ml! 22	XFILES(JR,JC) = ' '
8c!ml!	DO 24 JR = 1,MXFILUN
9c!ml! 24	XFILUN(JR,JC) = ' '
l9c!ml!	DO 26 JR = 1,MXSUBS
9c!ml! 26	XSUBS(JR,JC) = ' '
4:c!ml!	DO 28 JR = 1,MXCB
:c!ml! 28	XCB(JR,JC) = ' '
:c!ml! 10	CONTINUE
`;	do ii=1,mxinp
;	  irow(ii) = ii
(<	enddo
<	CALL GETOPT(PGMFILE,INC,OP,SUB,LUN,CBFLG,RAT,
<	1	AZ,TR,COM,NTR,ISZ,ish)	!GET OPTIONS
T=D	type 9696, INC,OP,SUB,LUN,AZ,NTR,CBFLG,RAT,ISZ
=D9696	FORMAT(' OPTIONS CHOSEN:',4X,'INC',2X,L3,
>D	1	4X,'OP',L2,4X,'SUB',L2,4X,'LUN',L2,
>D	2	4X,'AZ',L2,3X,'NTR=',I3/' CBFLG=',L2,3X,'RAT=',L2
>D	3	,3X,'ISZ=',A)
H?D	IF (NTR .GE. 1.AND. NTR .LE. 10) type 887,(TR(KL),KL=1,NTR)
?D887	FORMAT(' TR=',<NTR>(A,2X))
@	IF (RAT) CMTCHR = '#'
t@	IF (.NOT. RAT) CMTCHR='!'
@C
<AC---------------------------------------------------------------
AC		-- READ INPUT RECORD --
BC---------------------------------------------------------------
hB	if( pgmfile(1:1).eq.'@' ) then !!Indirect file
B	  isind = 1
0C	  type 41,' <',pgmfile(1:jjlen(pgmfile)),' {Indirect}'
C	  open(unit=1,name=pgmfile(2:),type='old',err=8005,readonly)
C	  goto 1500
\D	endif
D	goto 1900
$Ec.
E1000	continue
E	type 41,' Can''t open'
PFc.
F1500	continue
G	close(unit=2)
|G	if( isind.eq.0 ) goto 2000 !!No indirect file
Gc.
DH1600	continue
H	read(1,9000,end=2000,err=8105) pgmfile
I	if( pgmfile.le.' ' .or. pgmfile(1:5).eq.'Total'
pI	1 .or. pgmfile(1:5).eq.'Direc' ) goto 1600
Ic.
8J1900	continue
J	type 41,' <',pgmfile(1:jjlen(pgmfile))
 K	OPEN (UNIT=2,NAME=PGMFILE,TYPE='OLD',ERR=1000,READONLY)
dK 100	READ(2,9000,END=1500,ERR=8105) RECORD
K	IF (RECORD .eq. ' ') GO TO 100
,L	if( ichar(record).eq.12 ) goto 100 !!Form feed
L	call jjupp(record)
L 9000	FORMAT(A)
XM	IF (RECORD(1:5) .EQ. 'C/ELT') GO TO 140
M	IF (RECORD(1:5) .EQ. 'C/GRP') GO TO 140
 N	IF (ISCOMT(RECORD,RAT)) THEN	!SKIP COMMENTS
N	  IF (SUB) CALL FCALLS(RECORD,SUBS,NSUBS,XUSBS,MXSUBS,MXINP
N	1		,RAT,LASTNS,NPROGS)		!"CALLS" ?
LO	  GO TO 100
O	ENDIF
P 140	CALL GETTYP ( RECORD , ITYPE , WORD )		!FIND ROUTINE TYPE
xP	IF (WORD .EQ. ' ') THEN				!PROCESS UNNAMED TYPES
PC
@Q	NONAMES = NONAMES + 1
Q	IF (NONAMES .EQ. 58) NONAMES = NONAMES + 7	!SKIP DEL CHRS
R	IF (NONAMES .GT. 90) GO TO 8205			!TOO MANY
lR	WORD = '~UNNAMED '//CHAR(NONAMES)	!APPEND THE CO~UNTER
R	ENDIF
4SC
SC STORE ROUTINE NAME
SC
`T 150	CONTINUE
T	NPROGS = NPROGS + 1			!INCREMENT ROUTINE CNTR
(U	type 6666, NPROGS, WORD(1:jjlen(word))
U6666	FORMAT(1X,'WORKING ON ROUTINE ',I3, ' - ',A)
U	INTYPE (NPROGS) = TYPE(ITYPE + 1)		!SAVE TYPE
TV	INPROG (NPROGS) = WORD			!SAVE NAME
V	IF (WORD(1:8) .EQ. '~UNNAMED') GO TO 350	!STILL MUST CHECK OPTINS
WC---------------------------------------------------------------
WC		-- LOOK FOR END STATEMENT --
WC---------------------------------------------------------------
HX 200	NPOS = 1
X	READ(2,9000,END=2000,ERR=8105) RECORD
Y	IF (RECORD .EQ. ' ') GO TO 200
tY	call jjupp(record)
Y	IF (ISCOMT(RECORD,RAT)) THEN	!SKIP COMMENTS
<Z	  IF (SUB) CALL FCALLS(RECORD,SUBS,NSUBS,XSUBS,MXSUBS,MXINP
Z	1		,RAT,LASTNS,NPROGS)		!"CALLS" ?
[	  GO TO 200
h[	ENDIF
[ 300	CALL GETNEXT(RECORD,NPOS,WORD,)		!SKIP IF NOT END
0\	IF (WORD .NE. 'END') GO TO 350		!SKIP IF NOT END
\		CALL GETNEXT(RECORD,NPOS,WORD,)	!CHECK FOR "END IF"
\		IF (WORD .EQ. ' ' .OR. 
\]	1	    WORD(1:1) .EQ. CMTCHR) GO TO 100	!WAS END
]C---------------------------------------------------------------
$^C		-- LOOK FOR OPTIONS --
^C---------------------------------------------------------------
^ 350	IF(INC) KINC = INDEX(RECORD,'INCLUDE')
P_	IF (KINC .NE. 0) GO TO 400	!"INCLUDE" FOUND IN LINE
_ 352	IF(CBFLG) KCB = INDEX(RECORD,'COMMON')
`	IF (KCB .NE. 0) GO TO 480	!FOUND "COMMON" IN RECORD
|` 355	IF(OP) KOPEN = INDEX(RECORD,'OPEN')
`	IF (KOPEN .NE. 0) GO TO 500	!"OPEN" FOUND IN LINE
Da 365	IF(LUN) KREAD = INDEX (RECORD,'READ')
a	IF (KREAD .NE. 0) GO TO 600	!"READ" FOUND IN LINE
b 375	IF(LUN) KWRITE = INDEX(RECORD,'WRITE')	
pb	IF (KWRITE .NE. 0)GO TO 700	!"WRITE" FOUND IN LINE
b 380	IF(LUN) KTYPE = INDEX(RECORD,'TYPE')
8c	IF(KTYPE .NE. 0) GO TO 720
c 382	IF(LUN) KACCEPT = INDEX(RECORD,'ACCEPT')
 d	IF (KACCEPT .NE. 0) GO TO 730
dd 384	IF (LUN) KPRINT = INDEX(RECORD,'PRINT')
d	IF (KPRINT .NE. 0) GO TO 740
,e 385	IF(SUB .OR. NTR .GE. 0) KCALL = INDEX(RECORD,'CALL ')
e	IF (KCALL .NE. 0) GO TO 800	!"CALL " FOUND IN LINE
e	GO TO 200
XfC---------------------------------------------------------------
fC		-- PROCESS INCLUDED FILE --
 gC---------------------------------------------------------------
g 400	CONTINUE
g	IF(.NOT. PRECHK(RECORD,KINC,RAT,.FALSE.)) GO TO 352
Lh	KCMT = INDEX(RECORD,CMTCHR)
h	IF(KCMT .NE. 0.AND. KCMT.LT.KINC) GO TO 352
i	KINC1 = KINC + 7
xi	CALL GETNEXT(RECORD,KINC1,WORD,)
i	IF (WORD(1:1) .NE. '''') GO TO 352	!"'" MUST FOLLOW
@j 	KSTART = INDEX(RECORD(KINC:72),'''')
j	KSTART = KSTART + KINC - 1
k	KEND = INDEX(RECORD(KSTART+1:72),'''')
lk	KEND = KEND + KSTART
k	NFILES = NFILES + 1
4lD	IF (NFILES .GT. MXFILES) type 2222, NFILES
lD2222	FORMAT(2X,I3,' EXCEEDS MAX NUMBER OF FILES')
l	FNAME = RECORD(KSTART:KEND)
`mC
mC SEE IF WE ALREADY HAVE THIS FILE NAME
(nC
n	IF (NFILES .EQ. 1) GO TO 415	!DONT CHECK IF THIS IS FIRST
n	DO 410 IFILE = 1,NFILES-1
To	IF (FILES(IFILE) .EQ. FNAME) THEN
o		KFILE = IFILE			!ALREADY HAVE THIS NAME
p		NFILES = NFILES - 1		!DECREMENT COUNTER
p		XFILES (KFILE,NPROGS) = 'X'	!SET INDICATOR
p		GO TO 200			!CONTINUE 
Hq	ENDIF
q 410	CONTINUE
r 415	FILES(NFILES) = FNAME			!SAVE FILE NAME
tr	XFILES(NFILES,NPROGS) = 'X'		!SET INDICATOR
r	GO TO 200				!LOOK FOR MORE OPTIONS
<sC---------------------------------------------------------------
sC		-- COMMON BLOCK --
tC --------------------------------------------------------------
ht 480	CONTINUE
t	IF (.NOT. PRECHK(RECORD,KCB,RAT,.FALSE.)) GO TO 355
0u	KPOS = KCB + 6
u	CALL GETNEXT(RECORD,KPOS,CMNBLK,)	!GET NEXT CHARACTERS
u	IF (CMNBLK .EQ. '/') THEN		!IF '/' : NAMED COMMON.
\v	  K1 = KPOS - 1				!SLASH AT KPOS - 1
v	  CALL GETDEL(RECORD,KPOS,CMNBLK)	!FIND NEXT DELIMITER
$w	  IF (CMNBLK .EQ. '/') THEN		!FOUND SECOND SLASH
w	    CMNBLK = RECORD(K1:KPOS-1)		!GET THE BLOCK NAME
w	    GO TO 482
Px	  ENDIF
x	ENDIF
y	CMNBLK = 'BLANK'			!NO SLASH, BLANK COMMON
|yC
yC SEE IF WE ALREADY HAVE THIS COMMON BLOCK NAME
DzC
z 482	CONTINUE
{	NCB = NCB + 1
p{	IF (NCB .EQ. 1) GO TO 487		!SKIP CHECK IF FIRST
{	DO 485 ICB = 1,NCB - 1
8|	IF (CB(ICB) .EQ. CMNBLK) THEN		!ALREADY HAVE
|	  XCB(ICB,NPROGS) = 'X'			!SET INDICATOR
 }	  NCB = NCB - 1				!DECR COUNTER
d}	  GO TO 200				!BRANCH & CONTINUE
}	ENDIF
,~ 485	CONTINUE
~ 487	CB(NCB) = CMNBLK			!SET NAME IN CB
~	XCB(NCB,NPROGS) = 'X'
X	GO TO 200
C---------------------------------------------------------------
 C		-- OPENED FILE --
C---------------------------------------------------------------
 500	CONTINUE
L	IF (.NOT. PRECHK(RECORD,KOPEN,RAT,.TRUE.)) GO TO 365
	KCMT = INDEX(RECORD,CMTCHR)
	IF (KCMT .NE. 0 .AND. KCMT .LT. KOPEN) GO TO 365
x	KOPEN1 = KOPEN + 4
܂	CALL GETNEXT(RECORD,KOPEN1,WORD,)
@	IF (WORD(1:1) .NE. '(') GO TO 365	!"(" MUST FOLLOW
	KUNIT = INDEX (RECORD,'UNIT')
	KEQAL = INDEX (RECORD(KUNIT:72),'=')
l	IF (KEQAL .EQ. 0 .OR .KEQAL . GT. 7) GO TO 365
Є	IF (KUNIT .EQ. 0) GO TO 365
4	KOPOS = KUNIT + KEQAL
	CALL GETNEXT(RECORD,KOPOS,ILUN,)
C
`	INAME = INDEX (RECORD(KOPEN:72),'NAME')
Ć	IF (INAME .NE. 0) THEN
(C
C GET FILE NAME
C
T		IPOS = KOPEN + INAME - 1
		IEQAL = INDEX (RECORD(IPOS:72),'=')
		IF (IEQAL .EQ. 0 .OR. IEQAL .GT. 7) THEN
			OPFIL = ' '
		ELSE 
H			IPOS = IPOS + IEQAL
	IIPOS = IPOS
	CALL GETNEXT(RECORD,IIPOS,OPFIL,)
t	IF (OPFIL(1:1) .NE. '''') THEN		!IF NAME=XXXX USE THIS
؋		LTIC = IPOS
<		ITIC = IPOS
		DO 550 IZ = IPOS,72
 550	IF(RECORD(IZ:IZ).EQ.','.OR.RECORD(IZ:IZ).EQ.')') GOTO 551
h	OPFIL = RECORD(IPOS:)	!NEVER FOUND ' OR )
̍	GO TO 505
0 551	ITIC = IZ - 1
	GO TO 553
	ENDIF
\	LTIC = INDEX(RECORD(IPOS:),'''') !NAME='XXX' 
	ITIC = INDEX(RECORD(IPOS + LTIC:),'''')
$	LTIC = LTIC + IPOS - 1
	ITIC = ITIC + LTIC
 553	OPFIL=RECORD(LTIC:ITIC)
P	IF (OPFIL(1:1) .EQ. '''') ITWO = 2
	IF (OPFIL(1:1) .NE. '''') ITWO = 1
	KTWO = ITWO
|		DO 555 KK = ITWO,20
		JJ = KK
D 555		IF(OPFIL(KK:KK) .ne. ' ') GO TO 556
 556		OPFIL(ITWO:20) = OPFIL(JJ:20)
C
p 504		CONTINUE
Ԕ		ENDIF
8	ELSE
		OPFIL = ' '
 	ENDIF
d 505	NFILUN = NFILUN + 1		!INCREMENT NUM OF OPEN FILES
ȖD	IF (NFILUN .GT. MXFILUN) type 3333, NFILUN
,D3333	FORMAT(2X,I3,' EXCEEDS MAX NUMBER OPEN FILES')
C
C SEE IF WE ALREADY HAVE THIS FILE//LUN COMBINATION
XC
	IF (NFILUN .EQ. 1) GO TO 515	!SKIP IF FIRST ONE
 	DO 510 IFILUN = 1,NFILUN - 1
	IF (FILUN(IFILUN) .EQ. OPFILUN)	THEN
		XFILUN(IFILUN,NPROGS) = 'X'	!SET INDICATOR
L		NFILUN = NFILUN - 1		!DECREMENT CNTR
		GO TO 200
	ENDIF
x 510	CONTINUE
ܛ 515	FILUN(NFILUN) = OPFILUN		!STORE FILE//LUN NAME
@	XFILUN(NFILUN,NPROGS) = 'X'	!SET INDICATOR
	GO TO 200
C---------------------------------------------------------------
lC		-- "READ" FOUND --
НC---------------------------------------------------------------
4 600	KPOS = KREAD + 4	!4 CHARACTERS IN READ
	IF (.NOT. PRECHK(RECORD,KREAD,RAT,.TRUE.)) GO TO 375
	IOFLAG = 1
`	GO TO 750
ğC---------------------------------------------------------------
(C		-- "WRITE" FOUND --
C---------------------------------------------------------------
 700	KPOS = KWRITE + 5	!5 CHARACTERS IN WRITE
T	IF (.NOT. PRECHK(RECORD,KWRITE,RAT,.TRUE.)) GO TO 385
	IOFLAG = 2
	GO TO 750
C---------------------------------------------------------------
C		-- "TYPE" FOUND --
HC---------------------------------------------------------------
 720	KPOS = KTYPE + 4
	IOFLAG = 3
t	IF (.NOT. PRECHK(RECORD,KTYPE,RAT,.TRUE.)) GO TO 382
ؤ	GO TO 745
<C---------------------------------------------------------------
C		-- "ACCEPT" FOUND --
C---------------------------------------------------------------
h 730	KPOS = KACCEPT + 6
̦	IOFLAG = 4
0	IF (.NOT. PRECHK(RECORD,KACCEPT,RAT,.TRUE.)) GO TO 384
	GO TO 745
C---------------------------------------------------------------
\C		-- "PRINT" FOUND --
C---------------------------------------------------------------
$ 740	KPOS = KPRINT + 5
	IOFLAG = 5
	IF (.NOT. PRECHK(RECORD,KPRINT,RAT,.TRUE.)) GO TO 385
PC--------------------------------------------------------------
C		-- PRINT,TYPE ACCEPT --
C--------------------------------------------------------------
| 745	CONTINUE
	KOLD = KPOS 
D	CALL GETDEL(RECORD,KPOS,WORD)
	IF (WORD .NE. ',' .AND. KOLD .NE. KPOS)
	1	GO TO (382,384,385) , (IOFLAG-2)
pC
ԭC IT WAS AN I/O FROM A PRINT, ACCEPT, OR TYPE
8C
	IF (IOFLAG .EQ. 3) KLUN = 'TYPE'
 	IF (IOFLAG .EQ. 4) KLUN = 'ACCEPT'
d	IF (IOFLAG .EQ. 5) KLUN = 'PRINT'
ȯ	GO TO 755
,C---------------------------------------------------------------
C		-- READ OR WRITE --
C---------------------------------------------------------------
X 750	JPOS = KPOS		!SAVE FOR LATER USE
	KCMT = INDEX(RECORD,CMTCHR)
 	IF (KCMT .NE. 0 .AND. KCMT .LT. KPOS) GO TO (375,385),IOFLAG
	CALL GETNEXT(RECORD,KPOS,KLUN,)
	IF (KLUN(1:1) .NE. '(') GO TO (375,385) ,IOFLAG
L	KLPAR = INDEX(RECORD(JPOS:80),'(')
	KRPAR = INDEX(RECORD(JPOS:80),')')
	KCOMMA = INDEX(RECORD(JPOS:80),',')
x	KAPOST = INDEX(RECORD(JPOS:80),'''')
ܴ	IF (KLPAR .EQ. 0 .OR. KRPAR .EQ. 0) GO TO (375,385) ,IOFLAG
@	IF (KCOMMA .EQ. 0 .AND. KAPOST .EQ. 0)GOTO (375,385),IOFLAG
	IF (KAPOST .EQ. 0) KAPOST = KCOMMA
	IF (KCOMMA .EQ. 0) KCOMMA = KAPOST
l	IDEL = MIN0(KCOMMA,KAPOST)
ж	JS = JPOS + KLPAR
4	JE = JPOS + IDEL - 2
	ILUN = RECORD(JS:JE)
	KPOS = 1
`	CALL GETNEXT(ILUN,KPOS,KLUN,)	!SQUEEZE LEADING BLANKS OUT
ĸC---------------------------------------------------------------
(C		-- GENERAL I/O --
C---------------------------------------------------------------
 755	CONTINUE
T	NIO = NIO + 1
D	IF (NIO .GT. MXIO) type 4444, NIO
D4444	FORMAT(2X,I3,' EXCEEDS MAXIMUN NUMBER OF READ/WRITES')
C
C SEE IF WE ALREADY HAVE THIS LUN
HC
	IF (NIO .EQ. 1) GO TO 761
	DO 760 IIO = 1,NIO-1
t	IF (IO(IIO) .EQ. KLUN) THEN
ؽ		KIO = IIO
<		NIO = NIO - 1
		GO TO (780,775,775,780,775) ,IOFLAG
	ENDIF
h 760	CONTINUE
̿ 761	KIO = NIO
0 	IO (KIO) = KLUN
	IF (IOFLAG .EQ. 1 .OR. IOFLAG .EQ. 4) GO TO 780
 775	IF (XIO(KIO,NPROGS) .EQ. 'R') XIO(KIO,NPROGS) = 'X'
\	IF (XIO(KIO,NPROGS) .le. ' ') XIO(KIO,NPROGS) = 'W'
	GO TO 200
$ 780	IF (XIO(KIO,NPROGS) .EQ. 'W') XIO(KIO,NPROGS) = 'X'
	IF (XIO(KIO,NPROGS) .le. ' ') XIO(KIO,NPROGS) = 'R'
	GO TO 200
PC---------------------------------------------------------------
C		-- CALLED A SUBROUTINE --
C---------------------------------------------------------------
| 800	CONTINUE
	IF (.NOT. PRECHK(RECORD,KCALL,RAT,.TRUE.)) GO TO 200	!NOT A CALL
D 	KCMT = INDEX(RECORD,CMTCHR)
	IF (KCALL .GT. KCMT .AND. KCMT .NE. 0) GO TO 200  !FALSE ALARM
	KPOS = KCALL + 4		!4 CHRS IN "CALL"
p	CALL GETNEXT(RECORD,KPOS,SNAME,1H$)	!GET SUB NAME
C
8C SEE IF WE ALREADY HAVE THIS SUBROUTINE NAME
C
 	NSUBS = NSUBS + 1
d	IF (NSUBS .EQ. 1) GO TO 815	!DONT CHECK IF THIS IS FIRST
	DO 810 ISUB = 1,NSUBS - 1
,	IF (SUBS(ISUB) .EQ. SNAME) THEN
		KSUB = ISUB
		NSUBS = NSUBS - 1
X		XSUBS(KSUB,NPROGS) = 'X'
		IF(KSUB .GT. LASTNS(NPROGS)) LASTNS(NPROGS) = KSUB
 		GO TO 200
	ENDIF
 810	CONTINUE
LD	IF (NSUBS .GT. MXSUBS) type 5555, NSUBS
D5555	FORMAT(2X,I3,'EXCEEDS MAX NUMBER OF SUBS CALED')
 815	SUBS(NSUBS) = SNAME		!SAVE SUBROUTINE NAME
x	XSUBS(NSUBS,NPROGS) = 'X'	!SET INDICATOR
		IF(NSUBS .GT. LASTNS(NPROGS)) LASTNS(NPROGS) = NSUBS
@	GO TO 200
C---------------------------------------------------------------
C		-- PRINT THE CROSS REFERENCE ARRAY --
lC---------------------------------------------------------------
 2000	CONTINUE
4C TRACE
	IF(NTR.GE.0.AND.NSUBS.GT.0) CALL TRACE(INPROG,SUBS,XSUBS,NPROGS
	1		,NSUBS,MXSUBS,INTYPE,TR,NTR,LASTNS,COM,ish)
`C SUBROUTINES
	IF(AZ.AND.NSUBS .GT. 0) CALL SORT2D(XSUBS,INPROG,SUBS,NPROGS,NSUBS
(	1			,MXSUBS,ICOL,IROW,.TRUE.,.FALSE.)
	IF(SUB.AND.NSUBS .GT. 0) CALL PRINT(INTYPE,INPROG,SUBS,XSUBS
	1		,NPROGS,NSUBS,MXSUBS,MXINP,SLAB,IROW,ISZ)
TC COMMON BLOCKS
	IF (AZ .AND. NCB .GT. 0) CALL SORT2D(XCB,INPROG,CB,NPROGS,
	1	NCB,MXCB,ICOL,IROW,.TRUE.,.FALSE.)
	IF (CBFLG .AND. NCB .GT. 0) CALL PRINT(INTYPE,INPROG,CB,XCB,
	1	NPROGS,NCB,MXCB,MXINP,CBLAB,IROW,ISZ)
HC INCLUDE FILES
	IF(AZ .AND. NFILES .GT. 0) CALL SORT2D(XFILES,INPROG,FILES
	1	,NPROGS,NFILES,MXFILES,ICOL,IROW,.TRUE.,.FALSE.)
t	IF(INC.AND.NFILES.GT.0) CALL PRINT(INTYPE,INPROG,FILES,XFILES
	1		,NPROGS,NFILES,MXFILES,MXINP,FILAB,IROW,ISZ)
<C I/O LUNS
	IF(AZ.AND.NIO .GT. 0) CALL SORT2D(XIO,INPROG,IO,NPROGS,NIO,MXIO,
	1			ICOL,IROW,.TRUE.,.FALSE.)
h	IF(LUN.AND.NIO .GT. 0) CALL PRINT(INTYPE,INPROG,IO,XIO,NPROGS,
	1		NIO,MXIO,MXINP,IOLAB,IROW,ISZ)
0C OPEN FILES
	IF(AZ.AND.NFILUN .GT. 0) CALL SORT2D(XFILUN,INPROG,FILUN,NPROGS,NFILUN
	1			,mxfilun,ICOL,IROW,.TRUE.,.FALSE.)
\	IF(OP.AND.NFILUN .GT. 0) CALL PRINT(INTYPE,INPROG,FILUN,XFILUN
	1		,NPROGS,NFILUN,MXFILUN,MXINP,OPLAB,IROW,ISZ)
$C SUMMARY
	WRITE(3,9100) 
 9100	FORMAT('1',T20,'C R O S S   R E F E R E N C E   S U M M A R Y'/
P	1T20,'---------------------------------------------'//)
	WRITE(3,9105) NPROGS
 9105	FORMAT(25X,'Input Routines',T50,I4)
|	IF( SUB ) WRITE(3,9110) NSUBS
 9110	FORMAT(25X,'Routines Referenced',T50,I4)
D	IF( CBFLG ) WRITE(3,9115) NCB
 9115	FORMAT(25X,'Common Blocks',T50,I4)
	IF( INC ) WRITE(3,9120) NFILES
p 9120	FORMAT(25X,'Included Files',T50,I4)
	IF( LUN ) WRITE(3,9130) NIO
8 9130	FORMAT(25X,'I/O Units',T50,I4)
	IF( OP  ) WRITE(3,9140) NFILUN
  9140	FORMAT(25X,'Opened Files',T50,I4)
d	STOP '--- Cross outputs to --- FOR003.dat'
C---------------------------------------------------------------
,C		-- ERROR EXITS --
C---------------------------------------------------------------
 8005	type 8006
X 8006	FORMAT('  **  ERROR OPENING INFILE - ABORTING  **')
	CALL EXIT
  8105	type 8106
 8106	FORMAT('  **  ERROR READING INFILE - ABORTING  **')
	CLOSE(UNIT=2)
L	CALL EXIT
 8205	type 8206
 8206	FORMAT('  **  TOO MANY UNNAMED FILES - ABORTING  **')
x	CLOSE(UNIT=2)
	CALL EXIT
@	END

d 	FUNCTION CURLEN( STRING )
 	integer curlen !!ML!! type of function
,C
C	THIS FUNCTION FINDS THE CURRENT LENGTH OF 'STRING'
C	     NOT COUNTING TRAILING BLANKS.
XC
C	THE VALUE OF THE FUNCTION BECOMES THE CURRENT LENGTH
 C
	CHARACTER *(*) STRING
C
L	CURLEN = LEN( STRING )
C
	DO 100 I = LEN( STRING ), 1, -1
x		IF( STRING(I:I) .NE. ' ' ) RETURN
		CURLEN = CURLEN - 1
@100	CONTINUE
C
	RETURN
l	END

d 	SUBROUTINE FCALLS(RECORD,SUBS,NSUBS,XSUBS,MXSUBS,MXINP,RAT
 	1		 ,LASTNS,NPROGS)
,C
C		SUBROUTINE SEARCHES THE INPUT LINE FOR LINE OF FORM:
C
XC	C CALLS FUNC1,FUNC2,...FUNCn
C
 C		OR, FOR RATFOR LINES
C	# CALLS FUNC1,FUNC2,...FUNCN
C
LC	AND THEN: Place FUNC1, FUNC2,... in the called routines list.
C		  ( this should help define functions called )
C===============================================================
x	CHARACTER*(*)	RECORD,SUBS(MXSUBS),XSUBS(MXSUBS,MXINP)
	CHARACTER*15	NEXT
@	DIMENSION	LASTNS(MXINP)
	LOGICAL RAT
C===============================================================
l	IF (.NOT. RAT) KSTART=INDEX(RECORD,'C') + 1
	IF (RAT) KSTART=INDEX(RECORD,'#') + 1
4C	WAS "CALLS" ON THE COMMENT LINE ?
C===============================================================
	KPOS = KSTART
`		CALL GETNEXT(RECORD,KPOS,NEXT,1H$)
		IF (NEXT .NE. 'CALLS') RETURN		!NOT A "CALLS"
(
C

C GET FUNCTION NAME

C
T 100	CONTINUE
	KOLD = KPOS
	CALL GETNEXT(RECORD,KPOS,NEXT,1H$)	!LOOK UNTIL NEXT DELMTR
	IF (NEXT(1:1) .LT. 'A' .OR. NEXT(1:1) .GT. 'Z') RETURN
C
HC SEE IF WE ALREADY HAVE THIS ROUTINE NAME
C
	NSUBS = NSUBS + 1
t	IF (NSUBS .EQ. 1) GO TO 815	!DONT CHECK IF THIS IS FIRST
	DO 810 ISUB = 1,NSUBS - 1
<	IF (SUBS(ISUB) .EQ. NEXT) THEN
		KSUB = ISUB
		NSUBS = NSUBS - 1
h		XSUBS(KSUB,NPROGS) = 'X'
		IF(KSUB .GT. LASTNS(NPROGS)) LASTNS(NPROGS) = KSUB
0		GO TO 820	!CHECK IF THERE ARE MORE ON THIS LINE
	ENDIF
 810	CONTINUE
\D	IF (NSUBS .GT. MXSUBS) type 5555, NSUBS
D5555	FORMAT(2X,I3,'EXCEEDS MAX NUMBER OF SUBS CALED')
$ 815	SUBS(NSUBS) = NEXT		!SAVE SUBROUTINE NAME
	XSUBS(NSUBS,NPROGS) = 'X'	!SET INDICATOR
		IF(NSUBS .GT. LASTNS(NPROGS)) LASTNS(NPROGS) = NSUBS
P 820	CALL GETNEXT(RECORD,KPOS,NEXT, )
	IF (NEXT .NE. ',') RETURN
	GO TO 100
|	END

d       SUBROUTINE  GETDEL ( LINE, IPOS, DEL )
 C
,C
C               THIS ROUTINE PARSES THE STRING LINE, USES BLANKS,TABS,$
C               ,!,/, =, (, ) OR COMMA AS DELIMETERS AND RETURNS NEXT
XC		DELIMITER AS DEL.
C
 C
C               LINE - THE INPUT STRING
C
LC               IPOS - THE LOCATION TO START LOOKING, SET TO THE
C                      LOCATION AFTER THE DELIMITER FOUND
C
xC               DEL - THE RETURNED DELIMITER
C
@C
      CHARACTER*(*)  LINE, DEL
C
lC               IF NOTHING THERE RETURN A BLANK
C
4      WORD = ' '
      LINELEN = LEN(LINE)
      IF ( IPOS .GT. LINELEN )  RETURN
`	C
	C               NOW FIND FIRST NON-BLANK CHARACTER
(
C

      IPOS1 = IPOS

      IPOS2 = LINELEN
T      DO 10 I = IPOS1, IPOS2
   10   IF ( ( LINE(I:I) .NE. ' ' ) .AND. 
     .       ( ICHAR(LINE(I:I)) .NE. 9 ) )  GO TO 20
      RETURN
C
HC               NOW FIND A VALID DELIMETER
C
   20 IPOS1 = I
t      DO 30 I = IPOS1, IPOS2
      IF ( ( LINE(I:I) .EQ. ' ' ) .OR.
<     .       ( ICHAR(LINE(I:I)) .EQ. 9 ) .OR.
     .       ( LINE(I:I) .EQ. '/' ) .OR.
     .       ( LINE(I:I) .EQ. '(' ) .OR.
h     .       ( LINE(I:I) .EQ. ')' ) .OR.
     .       ( LINE(I:I) .EQ. ',' ) .OR.
0     .       ( LINE(I:I) .EQ. '!' ) .OR.
     .       ( LINE(I:I) .EQ. '$' ) .OR.
     .       ( LINE(I:I) .EQ. '=' ) )  GO TO 40
\ 30	CONTINUE
C
$C               NOW SET WORD AND IPOS
C
 40	CONTINUE
P      DEL = LINE(I:I)
      IPOS = I + 1
      RETURN
|      END

d       SUBROUTINE  GETNEXT ( LINE, IPOS, NEXT ,EXCEPT )
 C
,C
C               THIS ROUTINE PARSES THE STRING LINE, USES BLANKS,
C               /, =, (, ) OR COMMA AS DELIMETERS AND RETURNS NEXT
XC               CONTIGUOUS STRING AS NEXT.
C
 C
C               LINE - THE INPUT STRING
C
LC               IPOS - THE LOCATION TO START LOOKING, SET TO THE
C                      LOCATION AFTER THE WORD FOUND
C
xC               NEXT - THE RETURNED STRING
C
@C		EXCEPT - IF PRESENT, REMOVE THIS DELIMITER FROM
C			 THE LIST OF ONES TO CHECK.  MUST BE PASSED
C			 AS A LOGICAL*1, OR 1H^, NOT AS '^', WHERE
lC			 THE ^ IS THE DELEIMTER TO BE NEGLECTED.
C
4      CHARACTER*(*)  LINE, NEXT
	BYTE EXCEPT
	LOGICAL NULL
`	C
	C               IF NOTHING THERE RETURN A BLANK
(
C

      NEXT = ' '

      LINELEN = LEN(LINE)
T      IF ( IPOS .GT. LINELEN )  RETURN
C
C               NOW FIND FIRST NON-BLANK CHARACTER
C
      IPOS1 = IPOS
H      IPOS2 = LINELEN
      DO 10 I = IPOS1, IPOS2
   10   IF ( ( LINE(I:I) .NE. ' ' ) .AND. 
t     .       ( ICHAR(LINE(I:I)) .NE. 9 ) )  GO TO 20
      RETURN
<C
C               NOW FIND A VALID DELIMETER
C
h   20 IPOS1 = I
      DO 30 I = IPOS1, IPOS2
0      IF ( ( LINE(I:I) .EQ. ' ' ) .OR.
     .       ( ICHAR(LINE(I:I)) .EQ. 9 ) .OR.
     .       ( LINE(I:I) .EQ. '/' ) .OR.
\     .       ( LINE(I:I) .EQ. '(' ) .OR.
     .       ( LINE(I:I) .EQ. ')' ) .OR.
$     .       ( LINE(I:I) .EQ. ',' ) .OR.
     .       ( LINE(I:I) .EQ. '$' ) .OR.
     .       ( LINE(I:I) .EQ. '=' ) ) THEN
P		IF(.NOT. NULL(EXCEPT)) THEN
		  IF(LINE(I:I) .EQ. CHAR(EXCEPT)) GO TO 30
		  GO TO 40	!WASNT EXCEPT CHARACTER
|		ELSE
		  GO TO 40
D		ENDIF
	ENDIF
 30	CONTINUE
p      I = IPOS2
C
8C               NOW SET NEXT AND IPOS
C
    40 IF ( I .NE. IPOS1 )  I = I - 1
d      NEXT = LINE(IPOS1:I)
      IPOS = I + 1
,      RETURN
      END

d 	SUBROUTINE GETOPT(pgmfile,INC,OP,SUB,LUN,CB,RAT
 	1	,AZ,TR,COM,NTR,isize,ish)
,c.
c!ML! Check input file
C
XC	IF ANY OF THE FOLLOWING ARE ON THE COMMAND LINE, 
C	ONLY THE INDICATED OPERATIONS ARE PERFORMED.  
 C	DEFAULT:  ALL TRUE.
C
c		pgmfile	- program file name
LC	(D)	'INC'	- SEARCH FOR ALL INCLUDED FILES
C	(D)	'LUN'	- SEARCH FOR READ/WRITE LUNS
C	(D)	'SUB'	- SUEARCH FOR SUBS CALLED
xC	(D)	'OP'	- SEARCH FOR OPEN FILES
C	(D)	'CB'	- SEARCH FOR COMMON BLOCKS
@C
C	(D)	'PR'	- ONLY MAIN PROGS ARE TRACED.
C		'%name'	- THE ROUTINE NAMED 'name' IS TRACED.
lC		'ALL'	- A FULL SUBROUTINE TRACE IS PERFORMED.
C		'NOT'	- NO TRACING IS DONE
4C
C
C	IF	'NOA'	- NO ALPHABETIZATION IS PERFORMED.
`	C			  DEFAULT IS TO ALWAYS TO ALPHEBETIZE,
	C			  REGARDLESS OF PREVIOUS OPTIONS.
(
C

C	IF	'80'	- 80 COLUMN OUTPUT

C	    (D) '132'	- 132 COLUMN OUTPUT
TC		'REPORT'- 8 1/2 BY 11 INCH, WITH ROOM FOR PUNCHED HOLES.
C		'COM'   - COMPRESS TRACE OUTPUT
C		'TRI'	- Trim the tree
C		'RAT'	- RATFOR COMMENT CHARACTER (#) RECOGNIZED,
C			  INSTEAD FO THE FORTRAN FORU PLUS (!).
HC			  ALSO, CONTINUATION CONVENTION CHANGE.
C
	character*(*) pgmfile
t	CHARACTER*11	TR(10)			!TR(10)ACE OPTION FLAG
	CHARACTER	OPTION*80, COMMAND*80
<	CHARACTER*3	VALID(4),op3
	CHARACTER*(*)	ISIZE			!OUTPUT SIZE
	LOGICAL		INC,OP,SUB,LUN,AZ,CB,RAT,COM,ish
h	DATA	VALID	/'INC','OP','LUN','SUB'/
C
0	NPC = 0					!# OF %name OPTIONS
	LPOS = 1
	inc = .true.
\	op  = .true.
	COM = .FALSE.				!NO COMPRESS DEFAULT
$	ish = .FALSE.
	lun = .true.
	sub = .true.
P	cb = .true.
	rat= .false.		!DEFAULT IS NOT RATFOR CONVENTIONS
	NTR = 0			!DEFAULT TRACE OTPION
|	AZ = .TRUE.
c.
Dc... Request next command line
c.
1000	continue
p	lpos = 1
	command = '$CROSS {?=Help} <{@}File {Opts} ?'
8	CALL JJCMD(COMMAND)
	call jjupp(command)
 c.
dc... Process a new command line
c.
, 25	IF (COMMAND(1:1) .EQ. '?') GO TO 300	!USER NEEDS HELP
	if( command.eq.' ' ) goto 300		!!Null = Help
	LOLD = LPOS
X	CALL GETWORD(COMMAND,LPOS,OPTION)
D	type 777, COMMAND,LPOS,OPTION
 D777	FORMAT(1X,A/1X,'LPOS = ',I3,10X,'OPTION = ',A)
	IF(LPOS .eq. LOLD) GO TO 9000
C
LC OPTIONS PRESENT - TRY TO MATCH WITH VALID OPTIONS
C
100	continue
xC
	LEGAL = .FALSE.		!FOUND A LEGAL OPTION YET ?
@	LPOS = 1
 110	CONTINUE
 	LOLD = LPOS
l 	CALL GETWORD(COMMAND,LPOS,OPTION)
 	call jjupp(command)
4!D	type 777, COMMAND,LPOS,OPTION
!	IF(LPOS .EQ. LOLD) GO TO 9000
!C
`"	op3 = option
"	IF (op3 .eq. 'NOI') INC = .FALSE.
(#	IF (op3 .eq. 'NOO')  OP = .FALSE.
#	IF (op3 .eq. 'NOS') SUB = .FALSE.
#	IF (op3 .eq. 'NOL') LUN = .FALSE.
T$	IF (op3 .eq. 'NOA')  AZ = .FALSE.
$	IF (op3 .eq. 'NOC') NOCB = .FALSE.
%	IF (op3 .EQ. '80')  ISIZE = '80'
%	IF (op3 .EQ. 'REP') ISIZE = 'REPORT'
%	IF (op3 .EQ. 'ALL') NTR = 99
H&	IF (op3 .EQ. 'PR')  NTR = 0
&	If (op3 .eq. 'RAT') RAT = .true.
'	if (OP3 .EQ. 'NOT') NTR = -99
t'	IF (OP3 .EQ. 'COM') COM = .TRUE.
'	if( op3 .eq. 'TRI') ish = .TRUE.
<(	IF (OPTION(1:1) .EQ. '%') THEN
(		NPC = NPC + 1
)		TR(NPC) = OPTION
h)		NTR = NPC
)	ENDIF
0*	if( option(1:1) .eq. '<' ) then
*		pgmfile = option(2:)
*	endif
\+C
+	IF(LEGAL) GO TO 110
$,		DO 120 IV = 1,4
, 		IF(OPTION .EQ. VALID(IV) .OR. NTR . NE. -99)
,	1	LEGAL = .TRUE.
P- 120	CONTINUE
-	GO TO 110
.c.
|.c... Print out the help
.c.
D/300	continue
/	type 305
0305	format(
p0	1 /,'.	<Source .or.     <@File_of_Source_File_Names'
0	1//,'.	RATfor           FORTRAN = Default -- Source_form'
81	1//,'.	                 Main    = Default -- Trace_Tree_option'
1	1 /,'.	NOTrace .or.     ALL .or.          %Routine_name'
 2	1//,'.	                 ALL     = Default -- Tables_Shown'
d2	1 /,'.	NOInclude_file,  NOLogical_units,  NOSubroutines,'
2	1 /,'.	NOOpens,         NOCommon_blocks,  NOAlphabitizing'
,3	1//,'.	                 132     = Default -- Output_format'
3	1 /,'.	80 cols  .or.    REPort_form,'
3	1 /,'.	COMpress .or.    TRIm_tree'
X4	1/
4	2 )
 5	goto 1000
5c.
5c... Error on file open
L6c.
68000	continue
7	type 8010,' Can''t open <',pgmfile(1:jjlen(pgmfile))
x78010	format( 132a )
7	goto 1000
@8c.
8c... Ready to exit
9c.
l99000	continue
9	if( pgmfile(1:1).ne.'@' ) then
4:	  open(unit=1,name=pgmfile,type='old',readonly,err=8000)
:	else
:	  open(unit=1,name=pgmfile(2:),type='old',err=8000)
`;	endif
;	close(unit=1)
(<c.
<	return
<	END

d 	SUBROUTINE GETTYP(RECORD,ITYPE,NAME)
 C
,C	RETURNS  VARIABLE ITYPE AS THE INTEGER CODE BELOW, IF THE
C	CORRESPONDING DEFINING TEXT IS THE FIRST TEXT ON THE RECORD.
C
XC	CODE		DEFINING TEXT
C	----		-------------
 C
C	ITYPE =	0 - NONE OF THE FOLLOWING FOUND.
C		1 - "FUNCTION"
LC		2 - "LOGICAL FUNCTION"
C		3 - "CHARACTER FUNCTION"
C		4 - "REAL FUNCTION"
xC		5 - "INTEGER FUNCTION"
C		6 - "SUBROUTINE"
@C		7 - "PROGRAM"
C		8 - "BLOCK DATA"
C		9 - "C/ELT"
lC	       10 - "C/GRP"
C
4C	NAME IS RETURNED AS THE NEXT "WORD" FOUND AFTER THE
C	     DEFINING TEXT IS FOUND.
C==============================================================
`	C
		CHARACTER*(*)	RECORD,NAME
(
	KPOS = 1		!FIRST POSITION ON RECORD TO SEARCH

	ITYPE = 0		!TYPE CODE FOR NOTHING FOUND

C
T	CALL GETNEXT(RECORD,KPOS,NAME,1H/)		!GET FIRST WORD
	IF (NAME .EQ. 'LOGICAL') ITYPE = 1
	IF (NAME .EQ. 'CHARACTER')	ITYPE = 2
	IF (NAME .EQ. 'REAL') 		ITYPE = 3
	IF (NAME .EQ. 'INTEGER')	ITYPE = 4
HC
	IOLD = ITYPE
	IF(ITYPE .NE. 0) CALL GETNEXT(RECORD,KPOS,NAME,)
t	IF (NAME .EQ. 'FUNCTION') ITYPE = ITYPE + 1
	IF (NAME .EQ. 'PROGRAM')  ITYPE = 7
<	IF (NAME .EQ. 'SUBROUTINE') ITYPE = 6
	IF (NAME .EQ. 'BLOCK') THEN
	   CALL GETNEXT(RECORD,KPOS,NAME,)
h	   IF (NAME .EQ. 'DATA')  ITYPE = 8
	ENDIF
0	IF (NAME .EQ. 'C/ELT')    ITYPE = 9
	IF (NAME .EQ. 'C/GRP')	  ITYPE = 10
C
\	CALL GETNEXT(RECORD,KPOS,NAME,1H$)
	IF (ITYPE .EQ. IOLD) ITYPE = 0
$	RETURN
	END

d       SUBROUTINE  GETWORD ( LINE, IPOS, WORD )
 C
,C
C               THIS ROUTINE PARSES THE STRING LINE, USES BLANKS,
C               /, =, (, ) OR COMMA AS DELIMETERS AND RETURNS NEXT
XC               CONTIGUOUS STRING AS WORD.
C
 C
C               LINE - THE INPUT STRING
C
LC               IPOS - THE LOCATION TO START LOOKING, SET TO THE
C                      LOCATION AFTER THE WORD FOUND
C
xC               WORD - THE RETURNED STRING
C
@C
      CHARACTER*(*)  LINE, WORD
C
lC               IF NOTHING THERE RETURN A BLANK
C
4      WORD = ' '
      LINELEN = LEN(LINE)
      IF ( IPOS .GT. LINELEN )  RETURN
`	C
	C               NOW FIND FIRST NON-BLANK CHARACTER
(
C

      IPOS1 = IPOS

      IPOS2 = LINELEN
T      DO 10 I = IPOS1, IPOS2
   10   IF ( ( LINE(I:I) .NE. ' ' ) .AND. 
     .       ( ICHAR(LINE(I:I)) .NE. 9 ) )  GO TO 20
      RETURN
C
HC               NOW FIND A VALID DELIMETER
C
   20 IPOS1 = I
t      DO 30 I = IPOS1, IPOS2
   30   IF ( ( LINE(I:I) .EQ. ' ' ) .OR.
<     .       ( ICHAR(LINE(I:I)) .EQ. 9 ) .OR.
     .       ( LINE(I:I) .EQ. '/' ) .OR.
     .       ( LINE(I:I) .EQ. '(' ) .OR.
h     .       ( LINE(I:I) .EQ. ')' ) .OR.
     .       ( LINE(I:I) .EQ. ',' ) .OR.
0     .       ( LINE(I:I) .EQ. '$' ) .OR.
     .       ( LINE(I:I) .EQ. '=' ) )  GO TO 40
      I = IPOS2
\C
C               NOW SET WORD AND IPOS
$C
   40 IF ( I .NE. IPOS1 )  I = I - 1
      WORD = LINE(IPOS1:I)
P      IPOS = I + 1
      RETURN
      END

d 	FUNCTION IPOP(ISTACK,IVAL,ISP)
 	logical ipop !!ML!! type
,	DIMENSION 	ISTACK(1)
	ISP = ISP - 1		!DCR STACK POINTER FOR CURRENT LOC
	IF(ISP .LE. 0) THEN
X		IPOP = .FALSE.
		RETURN
 	ELSE
		IVAL = ISTACK(ISP)
		IPOP = .TRUE.
L	ENDIF
	RETURN
	END

d 	SUBROUTINE IPUSH(ISTACK,IVAL,ISP)
 	DIMENSION ISTACK(1)
,	ISTACK(ISP) = IVAL
	ISP = ISP + 1
	RETURN
X	END

d 	FUNCTION ISCOMT(RECORD,RAT)
 	logical ISCOMT
,C
C	DETERMINES IF THIS IS A COMMENT LINE.
C
XC	RAT SHOULD BE SENT .TRUE. IF THIS IS A RATFOR SOURCE LINE,
C	AND .FALSE. IF FORTRAN FOUR PLUS.
 C
	CHARACTER*(*) RECORD
	LOGICAL RAT
LC
	MXCOL = LEN(RECORD)
	ISCOMT = .FALSE.	!UNTIL WE KNOW BETTER
x	IF (RAT) THEN
	  DO 100 ICOL = 1,MXCOL
@	  IF (RECORD(ICOL:ICOL) .NE. ' ' .AND.
	1 RECORD(ICOL:ICOL) .NE. '	') THEN
	    IF(RECORD(ICOL:ICOL) .EQ. '#') ISCOMT = .TRUE.
l	  ENDIF
 100	CONTINUE
4	RETURN
C
	ELSE
`		  IF (RECORD(1:1) .EQ. 'C' .OR.
		1 RECORD(1:1) .EQ. '!') ISCOMT = .TRUE.
(
	  RETURN

	ENDIF

	END

d 	FUNCTION NULL(IARG)
 	logical null !!ml!!type
,C
C		FORTRAN VARIABLES PASSED TO SUBROUTINES AS NULL
C		ARGUMENTS ARE GIVEN A ZERO ADDRESS BY THE 
XC		COMPILER AND LINKER, AND THEREFORE ARE UNUSABLE.
C
 C		NULL RETURNS	.TRUE.	IF THIS IS THE CASE,
C				.FALSE.	OTHERWISE.
C
L	NULL = (%LOC(IARG) .EQ. 0)
	RETURN
	END

d 	FUNCTION PRECHK(RECORD,IPOS,RAT,PFLAG)
 	logical prechk !!ML!! type
,C
C		CHECKS TO SEE IF THE FIRST NON-BLANK,NON BLANK
C		CHARACTER PREECEDING IPOS IS EITHER A ")" OR
XC		IS THE CONTINUATION CHARACTER.
C
 C	RAT SHOULD BE SENT .TRUE.  IF LINE IS A RATFOR LINE;
C			   .FALSE. IF A FORTRAN 4+ LINE
C
LC	PFLAG SHOULD BE .TRUE. IF ")" IS A LEGAL PREECEEDING CHAR;
C			.FALSE. IF NOT.  
C
x	CHARACTER*(*)	RECORD
	LOGICAL RAT,PFLAG
@C
C DETERMINE IF A RATFOR LINE
C
l	IF (RAT)  THEN
	  LAST = 1
4	  GO TO 400
	ENDIF
C
`	C FIRST, FIND THE CONTINUATION COLUMN
	C
(
	DO 100 J = 1,5

 100	IF ( RECORD(J:J) .EQ. '	') GO TO 200	!CHECK FOR TABS

	LAST = 7			!LAST COLUMN TO CHECK
T	GO TO 400
 200	IF (RECORD(J+1:J+1) .GE. '1'	!DIGIT 1 TO 9 ?
	1 .AND. RECORD(J+1:J+1) .LE. '9') THEN
		LAST = J + 2
	ELSE
H		LAST = J + 1
	ENDIF
C
tC CHECK PREECEDING CHARACTERS UNTIL NON-BLANK OR CONTINUATION COL
C
< 400	IF (IPOS .EQ. LAST) GO TO 500	!STARTS IN FIRST LEGAL COLUMN
	IF (IPOS .LT. LAST) GO TO 600	!STARTS BEFORE CONTINUATION
	DO 450 J = IPOS-1,LAST,-1
h	IF (RECORD(J:J) .NE. ' ' .AND.
	1	RECORD(J:J) .NE. '	') GO TO 460	!NON BLANK
0 450	CONTINUE
	GO TO 500				!OK
 460	IF (.NOT. PFLAG) GO TO 600		!DONT CHK ")"
\ 	IF(RECORD(J:J) .NE. ')') GO TO 600	!NOT OK
 500	PRECHK = .TRUE.
$	RETURN
 600	PRECHK = .FALSE.
	RETURN
P	END
	SUBROUTINE PRINT(TWO,TOP,SIDE,XSIDE,NTOP,NSIDE,NR,NC,SLAB
	1		,IROW,ISIZE)
|	CHARACTER*(*)	TWO(1),TOP(1),SIDE(1),XSIDE(NR,NC)
	CHARACTER	SLAB*(*)	,ISIZE*(*)
D	INTEGER 	CURLEN
	DIMENSION	IROW(NTOP)
C
p	KBLK = 5		!# PRINTS PER BLOCK
	IOFF=1		!=1 NORMALLY, 10 LEAVES ROOM FOR PUNCH HOLES
8	MARGINR = 132		!DEFAULT RIGHT MARGIN
	IF (ISIZE .EQ. '80') MARGINR = 80
 	IF (ISIZE .EQ. 'REPORT') THEN
d		MARGINR = 85
		IOFF = 10
,	ENDIF
	IBLK = KBLK*2 + 1	!# COLUMNS NEEDED PER PRINT BLOCK
	MARGINL = LEN(SIDE(1)) + 5 + IOFF
X	ML = MARGINL
	MR = MARGINR
 C
	NCOLS	= MARGINR - MARGINL + 1		!N COLS/PRINT PAGE
	MXTOPBLK = (NCOLS + 1)/IBLK		!MAX BLOCKS ACROSS TOP
L	MXTOP = MXTOPBLK * KBLK
C
	MXLINES = 42		!MAXIMUM PRINT LINES/PAGR
x	MXSIDEBLK = (MXLINES + 1)/(KBLK + 1)
	MXSIDE = MXSIDEBLK*KBLK
@C
	NTOPBLK = (NTOP-1)/KBLK + 1
 	NSIDEBLK = (NSIDE-1)/KBLK + 1
l 	NPGRT = (NTOPBLK - 1)/MXTOPBLK + 1
 	NPGDN = (NSIDEBLK - 1)/MXSIDEBLK + 1
4!C
!	DO 1000 IPGRT = 1,NPGRT			!CYCLE THRU PAGE RIGHTS
!	DO 1000 IPGDN = 1,NPGDN			!CYCLE THRU PAGE DOWNS
`"		IIS = (IPGRT-1)*MXTOP + 1	!START COL
"		IIE = IPGRT*MXTOP		!PAGE END COL
(#	IIL = NTOPBLK*KBLK			!PHYS END COL
#	IIE = MIN0(IIE,IIL)
#		NBLKS = (IIE-IIS )/KBLK + 1	!# BLOCKS NEEDED
T$		ICOLS = NBLKS*IBLK
$	MXCH = 0
%	DO 200 I = IIS,MIN0(IIE,NTOP)
% 200	MXCH = MAX0(MXCH,CURLEN(TOP(IROW(I))))
%	LENLAB = CURLEN(SLAB)
H&	WRITE(3,1001) SLAB(1:LENLAB),IPGDN,IPGRT,NPGDN,NPGRT
& 1001	FORMAT('1',T<MR-34-LENLAB>
'	1,'XREF OF ',A,' - PAGE (',I2,',',I2,') of (',I2,',',I2,')')
t'		WRITE(3,1005)' ROUTINE TYPE:',((TWO(IROW(II))(ICH:ICH),II=IIS
'	1	,IIE),ICH=1,2)
<(		WRITE(3,1005)' ROUTINE NAME:',((TOP(IROW(II))(ICH:ICH),II=IIS
(	1	,IIE),ICH=1,MXCH)
) 1005		FORMAT(<IOFF>X,A,10(T<MARGINL>,<NBLKS>(<KBLK>(1X,A1)
h)	1	,1X)/1X))
)		IRS = (IPGDN-1)*MXSIDE + 1
0*		IRE = MIN0(NSIDE,(IPGDN)*MXSIDE)
*		MXLAB = CURLEN(SLAB)
*		WRITE(3,1010) SLAB(1:MXLAB)
\+ 1010	FORMAT('+',<IOFF>X,A/<IOFF+1>X,<ML-5-IOFF>('-')/1X,T<ML-1>
+	1		,<ICOLS+1>('.'))
$,	  do ii=iis,iie
,	    do il=irs,ire
,	      if( xside(il,ii).lt.' ' ) xside(il,ii) = ' '
P-	    enddo
-	  enddo
.		WRITE(3,1015)(SIDE(IL),(XSIDE(IL,II),
|.	1			II=IIS,IIE),IL=IRS,IRE)
. 1015		FORMAT(<MXSIDEBLK>(<KBLK>(<IOFF+1>X,A,T<MARGINL-1>,'.'
D/	1		,<NBLKS>(<KBLK>(1X,A1),'.'),:/)
/	2		1X,T<MARGINL-1>,<ICOLS+1>('.')/))
0		WRITE(3,1019)
p0 1019		FORMAT(1X,T<MARGINL-1>,<ICOLS+1>('.'))
0 1020		CONTINUE
81 1000		CONTINUE
1	RETURN
 2	END

d 	SUBROUTINE SORT2D(XARRAY,ROW,COL,NR,NC,MR
 	1			,ICOL,IROW,CFLAG,RFLAG)
,C
C THE FOLLOWING PARAMETERS ARE USED TO SIZE LOCAL ARRAYS SIMILAR TO
C THOSE IN THE CALLING PROGRAM. IF THE CALLING PROG'S ARRAYS ARE LARGER
XC THAN THOSE SHOWN HERE, AN ERROR RESULTS, AND THE USER MUST RECOMPILE
C THIS SUBROUTINE WITH LARGER PARAMETERS.
 c.
c. I think that these must be bigger than any of the MX... in CROSS
c.
LC
	PARAMETER	 MROW = 500	!MAX ROW DIMENSION OF XARRAY
	1		,MCOL = 500	!MAX COL  "	"	"
x	2		,NXCH = 1	!# CHARACTERS IN XARRAY 
	3		,NCH  = 30	!# CHARS IN 1-D ARRAYS
@C
C
	CHARACTER*(*)	XARRAY(MR,1),COL(NC),ROW(NR)
l	CHARACTER*(NCH)	TEMP,TROW(MCOL)		!(NCH) FOR DEFAULT
	CHARACTER*(NXCH)	XTEMP(MROW,MCOL)	!TEMP X ARRAY
4	LOGICAL		CFLAG,RFLAG		!COL,ROW CONTROL FLAG
	DIMENSION	ICOL(NC), IROW(NR)
C
`		IF(NC .GT. MCOL) GO TO 1010
		IF(MR .GT. MROW) GO TO 1020
(
	IF(NCH .LT. LEN(COL(1))) GO TO 1030

	IF(NCH .LT. LEN(ROW(1))) GOT O 1030

	IF(NXCH.GT. LEN(XARRAY(1,1))) GO TO 1040
TC
C
	DO 10 I = 1,NC
 10	ICOL(I) = I
	DO 20 I = 1,NR
H 20	IROW(I) = I
C
C ARRANGE ACCORDING TO THE COL ARRAY. SAVE ORDER IN ICOL FOR LATER USE.
tC
	IF (NC .GT. 1) THEN
<	DO 100 I = 1,NC-1
	DO 100 I1 = I+1,NC
	  IF(COL(ICOL(I)) .LE. COL(ICOL(I1))) GO TO 100
h		ITEMP = ICOL(I)
		ICOL(I) = ICOL(I1)
0		ICOL(I1) = ITEMP
 100	CONTINUE
	ENDIF
\C
C ARRANGE ACCORDING TO THE ROW ARRAY, SAVE ORDER IN IROW FOR LATER USE.
$C
	IF (NR .GT. 1) THEN
	DO 200 I = 1,NR-1
P	DO 200 I1 = I,NR
	  IF(ROW(IROW(I)) .LE. ROW(IROW(I1))) GO TO 200
		ITEMP = IROW(I)
|		IROW(I) = IROW(I1)
		IROW(I1) = ITEMP
D 200	CONTINUE
	ENDIF
C
pC NOW ARANGE THE 2-D ARRAY ACCORDINGE TO ORDER SAVED IN ICOL AND IROW
C
8	DO 300 IR = 1,NC	!NC ACTUALLY # ROWS
	DO 300 IC = 1,NR	!NR ACTUALLY # COLS
  300	XTEMP(IR,IC) = XARRAY(ICOL(IR),IROW(IC))
dC
	DO 400 IR = 1,NC	!NC ACTUALLY # ROWS
,	DO 400 IC = 1,NR	!NR ACTUALLY # COLS
 400	XARRAY(IR,IC) = XTEMP(IR,IC)	!PUT BACK IN USERS ARRAY.
	IF(RFLAG) THEN
X	 DO 500 I = 1,NR
 500	TROW(I) = ROW(IROW(I))
 	DO 550 I = 1,NR
 550	ROW(I) = TROW(I)
	ENDIF
L	IF(CFLAG) THEN
	 DO 600 I = 1,NC
 600	TROW(I) = COL(ICOL(I))
x	DO 650 I = 1,NC
 650	COL(I) = TROW(I)
@	ENDIF
C ALL DONE
 C
l 	RETURN
 C
4!C ERROR EXITS
!C
! 1010	WRITE(5,1015) NC,MCOL
`" 1015	FORMAT(' PASSED VALUE NC=',I3,' .GT. MAXIMUM, ',I3/
"	1' ** YOU MUST INCREASE PARAMETER "MCOL" IN PRINT SUBROUTINE')
(#	GO TO 1099
# 1020	WRITE(5,1025) MR,MROW
# 1025	FORMAT(' PASSED VALUE MR=',I3,' .GT. MAXIMUM, ',I3/
T$	1' ** YOU MUXT INCREASE PARAMETER "MROW" IN PRINT SUBROUTINE')
$	GO TO 1099
% 1030	WRITE(5,1035) LEN(COL(1)),NCH
% 1035	FORMAT(' LEN OF 1-D ARRAYS=',I3,' .GT. MAXIMUM, ',I3/
%	1' *** YOU MUST INCREASE PARAMETER "NCH" IN PRINT SUBROUTINE')
H&	GO TO 1099
& 1040	WRITE(5,1045) LEN(XARRAY(1,1)),NXCH
' 1045	FORMAT(' LEN OF 2-D ARRAYS=',I3,' .GT. MAXIMUM, ',I3/
t'	1' *** YOU MUST INCREASE PARAMETER "NXCH" IN PRINT SUBROUTINE')
' 1099	CALL EXIT
<(	END

d 	SUBROUTINE TRACE(PROGS,SUBS,XSUBS,NPROGS,NSUBS,MXSUBS,ITYP
 	1		,TR,NTR,LAST,com,ish)
,	PARAMETER	MXSTACK=100	!MAXIMUM STACK LENGTH
	DIMENSION 	ISSTACK(MXSTACK), IPSTACK(MXSTACK)
	CHARACTER*(*)	PROGS(NPROGS),SUBS(NSUBS),XSUBS(MXSUBS,NPROGS)
X	CHARACTER*(*)	ITYP(NPROGS)
	CHARACTER	PLINE*132	!PRINT BUFFER
 	DIMENSION	LAST(NPROGS)	!LAST ROW IN SUBS USED BY PROGS
	CHARACTER*(*)	TR(1)		!TRACE OPTIONS
	CHARACTER	TNAME*10	!TRACE ROUTINE NAME
L	integer numlin(500)		!!Number of subroutines
	LOGICAL IPOP,com,ish
C
xC FIND LOOP PARAMETERS DEPENDING UPON TRACE OPTION
C
@	IF (NTR .LT. 0) RETURN		!NO TRACE WANTED
C
	N1=0
l	NR=0
	IPASS = 0			!PASS COUNTER
4 5	IPASS = IPASS + 1		!INCR
	IF (IPASS .GT. NTR.AND. NTR.NE. 0) RETURN	!SKIP IF GREATER THAN NEEDED
	TNAME = TR(IPASS)(2: )
`		IF (NTR .EQ. 99 .OR. NTR .EQ. 0) THEN
			N1 = 1
(
		NR = NPROGS

	ELSE IF (NTR .GE. 1 .AND. NTR .LE. 10) THEN

			DO 111 I = 1,NPROGS
T 			IF(PROGS(I) .NE. TNAME) GO TO 111
			N1 = I
			NR = I
			GO TO 130
 111			CONTINUE
H			GO TO 130
 	ENDIF
 130	IF (N1 .EQ. 0) THEN
t		WRITE(3,133) TNAME
 133		FORMAT(1X,A,' NOT FOUND IN INPUT ROUTINES')
<		RETURN
	ENDIF
C
hC START LOOP
C
0	DO 199 I=N1,NR
C
C INITIALIZE VARIABLES
\C
	ISSP	= 1		!NEXT LOCATION IN SUB STACK
$	IPSP	= 1		!NEXT LOCATION IN PROG STACK
	LEVEL 	= 1		!PRINT LEVEL
	ISUB	= 1		!START SEARCH LOC IN SUBS
P	NP = I
	IF (NTR .EQ. 0 .AND. ITYP(I) .NE. 'PR') GO TO 199
	if( ish ) then
|	  write( 3,1915 ) progs(np)
1915	  format(/'1',12x,a,$)
D	else
	  WRITE(3,15) PROGS(NP)	  !WRITE THE INITIAL PROGRAM
 15	  FORMAT(/'1',6x,A,$)
p	endif
 10	CONTINUE
8	DO 100 NS = ISUB,NSUBS	!LOOP FROM ISUB TO END OF SUBS
	IF (XSUBS(NS,NP) .gt. ' ') THEN		!FOUND A SUB CALLED
 		if( ls.ne.0 ) then
d		  if( numlin(ls).lt.0 ) numlin(ls) = -numlin(ls)
		endif
,		CALL IPUSH(ISSTACK,NS+1,ISSP)	!SAVE NEXT ISUB
		CALL IPUSH(IPSTACK,NP,IPSP)	!SAVE CURRENT IPROG
		IF (NS .LT. LAST(NP)) THEN
X		PLINE((LEVEL-1)*7+1:LEVEL*7) = '      :'
		ELSE
 		PLINE((LEVEL-1)*7+1:LEVEL*7) = '       '
		ENDIF
		LEVEL = LEVEL + 1
L	if( ish ) then			!!TRIM tree
	  if( level.eq. levlast-1 ) then
	    write(3,1925) pline(1:((level-1)*7)-1)
x1925	    format(' ',5x,' ',a,':' )
	  endif
@	  levlast = level
	  nline = nline+1
 	  if( numlin(ns).gt.0 ) then
l 	    write(3,1932) nline, pline(1:((level-1)*7)-1)
 	1	,numlin(ns)
4!	1	,subs(ns)
!1932	    format('$',i5,' ',a,':-',i3,'- ',a)
!	  else
"	    write(3,1933) nline, pline(1:((level-1)*7)-1),subs(ns)
(#1933	    format('$',i5,' ',a,':----- ',a,i5)
#	  endif
#	else if (com) then
T$		write(3,33)  pline(1:((level-1)*7)-1) ,subs(ns)
$ 33		format('$',a,':----- ',a )
%	else !!Not Compressed plot
%		WRITE(3,25) PLINE(1:((LEVEL-1)*7)-1)
%	1	,PLINE(1:((LEVEL-1)*7)-1) , SUBS(NS)
H& 25	FORMAT(1X,A,':'/'$',A,':----- ',A)
&	endif
'		ISUB = 1			!RESET STARTING POINT
t'		if( ish ) then
'			if( numlin(ns).gt. 0 ) then
<(				goto 150
(			else if( numlin(ns).eq.0 ) then
)				numlin(ns) = -nline
h)			endif
)			ls = ns
0*		endif
*		DO 50 NP = 1,NPROGS		!SEARCH PROGS FOR SUB
* 50		IF(PROGS(NP) .EQ. SUBS(NS))GOTO 10!IF FOUND, ITS NEXT
\+C
+C NOT FOUND IN INPUT LIST. PTINE A '?'
$,C
,	WRITE(3,55)
, 55	FORMAT('+ ?')
P-		GO TO 150			!IF NOT, BACK UP
-	ENDIF
. 100	CONTINUE
|. 150	IF(.NOT. IPOP(ISSTACK,ISUB,ISSP)) CONTINUE !DONT WORRY
.	IF(.NOT. IPOP(IPSTACK,NP,IPSP)) GOTO 199	!WORRY
D/	LEVEL = LEVEL - 1
/	ls = 0
0	GO TO 10				!START OVER WON PREV NP  
p0 199	CONTINUE
0C
81	IF (N1 .EQ. NR .AND. NPROGS .NE. 1) GO TO 5
1C
 2 	RETURN
d2	END
