**********************************************************************
* Name: USED
* Stack: ( rrp --> { name1 { calling subroutines } name2 .. }
* Desc: Subroutine usage analyzer
* Notes: This analyzes the results from USE so that it returns
* the subroutines which call the given subroutines.
* Calls: USE
**********************************************************************
DEFINE Name@ 3GETLAM
DEFINE Name! 3PUTLAM
DEFINE List@ 2GETLAM
DEFINE Vars# 1GETLAM
DEFINE Vars#abnd 1GETABND
ASSEMBLE
CON(1) 8
RPL
xNAME USED
::
CK1
DUPTYPERRP? NcaseTYPEERR ( * Error for non rrp's for now * )
xUSE ( {use} )
DUPNULL{}? ?SEMI ( --> {} )
DUP DUPLENCOMP #2/ ( dummy {} #vars )
' NULLLAM THREE NDUPN DOBIND
Vars# ZERO_DO (DO)
List@ INDEX@ #2* #1+ NTHCOMPDROP Name!
List@ INCOMPDROP ZERO
Vars# ZERO_DO (DO)
get1 Name@
CODE ( * EQUALPOSCOMP is too slow * )
C=DAT1 A
RSTK=C ->name
D1=D1+ 5
D=D+1 A
GOSBVL =PopASavptr ->list
A=A+CON A,5
R2=A ->list[1]
C=RSTK
D=C A ->name
D0=C
GOSBVL =SKIPOB
CD0EX
C=C-D A
R1=C namesize
C=0 A
R0=C pos=0
usedloop C=R0
C=C+1 A pos++
R0=C
C=R2
D0=C ->list[pos]
A=DAT0 A
LC(5) =SEMI
?A=C A
GOYES usednone No match in list - fail
C=D A
D1=C ->name
C=R1 namesize
C=C-1 A
P=C 0 nibbles-1 to compare
CSR A
B=C A words to compare
usedtstword B=B-1 A
GOC usedtstnib
A=DAT0 W
C=DAT1 W
D0=D0+ 16
D1=D1+ 16
?A=C W
GOYES usedtstword Compare full words until done
usedcont C=R2
D0=C ->list[pos]
GOSBVL =SKIPOB
CD0EX
R2=C
GOTO usedloop
usedtstnib A=DAT0 WP
C=DAT1 WP
?A#C WP
GOYES usedcont
P= 0
GOVLNG =PUSH#LOOP Push #pos
usednone A=0 A
GOVLNG =PUSH#ALOOP
ENDCODE
#0<> ITE
#1+
:: get1 DROP ;
LOOP
{}N Name@ SWAP
LOOP
Vars#abnd #2* {}N
;
**********************************************************************