Metropoli BBS
VIEWER: used.s MODE: TEXT (ASCII)
**********************************************************************
* 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

;

**********************************************************************









[ RETURN TO DIRECTORY ]