Here is one I wrote a whle back, when I needed it. It currently looks for any call statements and explodes them and displays it in a tree structure.. Of course, to can be modified to suit your needs.
Regards Bjorn Program Start: PROGRAM GET.CALL * ------------------------------------------------------------------- * * AUTHOR : Bjorn Behr (BJB) * * DATE : 14/05/03 * * DESC : Program to display all Call Routines in the Requested * * : Program * * ------------------------------------------------------------------- * * No Date Who Description * * -- ---- --- ----------- * * H00 14/05/03 BJB Original Code * * =================================================================== * PROMPT "" $INCLUDE SBINCLUDE COMMON CALL SET.COMMON GOSUB Initialization GOSUB GetCalls GOSUB DisplayCalls ExitOnError: RETURN * =================================================================== * * SUBROUTINES - Start * * ------------------------------------------------------------------- * Initialization: DIM RecordArray(250) DIM OrigArray(250) DIM RowNumber(250) * Open Files OPEN "MD" TO MD ELSE STOP 201,"MD" OPEN "NOTES" TO SCalls ELSE STOP 201,"NOTES" * Variables ** Get Depth number DepthNo = 250 LOOP CRT @(-1) CRT @(10,12):"How far do you want to explode 'Calls' [1-250] : ": INPUT DepthNo IF (DepthNo = "") THEN DepthNo = 250 UNTIL (DepthNo > 0) AND (DepthNo < 251) REPEAT ** Ask if you want to see DISP's or not DispAns = "" LOOP CRT @(10,13):"Do you want to see DISP Calls [Y/N] : ": INPUT DispAns, 1 DispAns = UPCASE(DispAns) UNTIL (DispAns = "Y") OR (DispAns = "N") REPEAT ** Ask if you want to see INPX or not InpxAns = "" LOOP CRT @(10,14):"Do you want to see INPX Calls [Y/N] : ": INPUT InpxAns, 1 InpxAns = UPCASE(InpxAns) UNTIL (InpxAns = "Y") OR (InpxAns = "N") REPEAT ** Ask if you want to see Comments or not CommentAns = "" LOOP CRT @(10,15):"Do you want to see Comments [Y/N] : ": INPUT CommentAns, 1 CommentAns = UPCASE(CommentAns) UNTIL (CommentAns = "Y") OR (CommentAns = "N") DO REPEAT * ProgramArray = "" CallArray = "" Blink = " | " FileArray = "" ArrayCounter = 1 RowCounter = "" ProgramName = OCONV(@SENTENCE,"G1 1") Extras = OCONV(@SENTENCE,"G2 1") CallArray<-1> = "Call Statement Listing for ":@(-13):ProgramName:@(-14) ProgramArray<1,ArrayCounter> = ProgramName SearchString = "CALL" CRT @(-1) CRT "Selecting Records!": StringLength = LEN(SearchString) -1 LineString = "" LineLength = "" RETURN * ------------------------------------------------------------------- * * Get Calls * * ========= * * 1. Read the Program from the program file * * 2. Loop through Program looking for CALL * * 3. Place Calls into an array * * 4. Look for which file the program belongs in * * ------------------------------------------------------------------- * GetCalls: * Look for File ProgramName = ProgramArray<1,ArrayCounter> READ MDRec FROM MD,ProgramName THEN MDLine2 = MDRec<2> Delims = DCOUNT(MDLine2,"\") IF (Delims > 1) THEN ObjTable = FIELD(MDLine2,"/",2) END ELSE ObjTable = FIELD(MDLine2,"/",3) END SrcTable = ObjTable[1,LEN(ObjTable)-2] SrcTable = TRIM(SrcTable) OPEN SrcTable TO File ELSE CallArray<-1> = "!! NB !! - File ":SrcTable:" not found" ArrayCounter += -1 RETURN END END FileArray<1,ArrayCounter> = SrcTable * 1. Read File READ Rec FROM File,ProgramName ELSE CallArray<-1> = "!! NB !! :- ":ProgramName:" not a valid program in ":FileArray<1,ArrayCounter> END CRT @(0,2):@(-4):"Record Depth : ":ArrayCounter IF (ArrayCounter = 250) THEN Write CallArray ON MD,"BJORN.TEST" END RecordArray(ArrayCounter) = Rec * 2. Loop through program looking for call RowCounter<ArrayCounter> = DCOUNT(RecordArray(ArrayCounter),AM) FOR RowNumber(ArrayCounter) = 1 TO RowCounter<ArrayCounter> LineString = RecordArray(ArrayCounter)<RowNumber(ArrayCounter)> LineLength = LEN(LineString) CallFound = 0 FOR CharCounter = 1 TO (LineLength - StringLength) UNTIL (CallFound) Pos1 = CharCounter Pos2 = CharCounter + StringLength CheckString = TRIM(LineString[Pos1,Pos2]) IF CheckString = SearchString THEN * 3. Display Calls * ---->>> Original Code <<<---- * SpaceCount = (ArrayCounter - 1) * 3 * CallArray<-1> = SPACE(SpaceCount):RowNumber(ArrayCounter)"R%4":": ":TRIM(LineString[1,LineLength]) * Extract File Name And Check For DISP / INPX CheckProgram = TRIM(LineString) IF (TRIM(LineString[1,1]) # "*") THEN CheckProgram = OCONV(CheckProgram,"G1 1") END ELSE CheckProgram = OCONV(CheckProgram,"G2 1") END CheckProgram = OCONV(CheckProgram,"G(1") CheckProgram = OCONV(CheckProgram,"G;1") SaveLine = "Y" IF (CheckProgram = "DISP") AND (DispAns = "N") THEN SaveLine = "N" END IF (SaveLine = "Y") THEN IF (CheckProgram = "INPX") ANd (InpxAns = "N") THEN SaveLine = "N" END END IF (SaveLine = "Y") THEN IF (LineString[1,1] = "*") AND (CommentAns = "N") THEN SaveLine = "N" END END IF (SaveLine = "Y") THEN * ====>>> Modified Code <<<==== An attempt at lining up subrs SpaceCount = (ArrayCounter - 1) CallLine = STR(Blink, SpaceCount) CallLine := RowNumber(ArrayCounter)"R%4":": " CallLine := TRIM(LineString[1,LineLength]) CallArray<-1> = CallLine * ===<<< End of Modification >>>=== * CallFound = 1 * Check for comments IF (LineString[1,1] # "*") THEN NewProgram = TRIM(LineString) NewProgram = OCONV(NewProgram,"G1 1") NewProgram = OCONV(NewProgram,"G(1") NewProgram = OCONV(NewProgram,"G;1") ArrayCounter += 1 ProgramArray<1,ArrayCounter> = NewProgram OrigProgram = ProgramArray<1,ArrayCounter-1> IF (NewProgram # OrigProgram) AND (ArrayCounter <= DepthNo) THEN GOSUB GetCalls END ELSE ArrayCounter += -1 END END END END NEXT CharCounter NextLoop: Next RowNumber(ArrayCounter) ArrayCounter += -1 RETURN * ------------------------------------------------------------------- * * DisplayCalls * * ============ * * 1. Set Counters to 0 * * 2. Display Calls with looping functionality * * ------------------------------------------------------------------- * DisplayCalls: * 1. Set Counters RowCounter1 = 1 RowCounter2 = 0 TryNumber = 0 InputAns = "" MaxCalls = DCOUNT(CallArray,AM) LOOP IF NOT(TryNumber) THEN TryNumber = 1 RowCounter1 = 1 END ELSE CRT @(0,23):"[F]orwards, [B]ack, [T]op, [E]nd, [P]rint, [Q]uit : ": IF (Extras # "") THEN DATA Extras Extras = "" END INPUT InputAns, 1 END InputAns = UPCASE(InputAns) UNTIL (InputAns = "Q") DO BEGIN CASE CASE InputAns = "F" RowCounter1 += 20 IF (RowCounter1 > MaxCalls) THEN RowCounter1 = MaxCalls END CASE InputAns = "B" RowCounter1 += -20 IF (RowCounter1 < 1) THEN RowCounter1 = 1 END CASE InputAns = "T" RowCounter1 = 1 CASE InputAns = "E" RowCounter1 = MaxCalls CASE InputAns = "P" PRINTER ON PRINT "Call Listing for ":ProgramArray<1,1>:" - Printed by ":SB.USERCODE FOR J_MaxCalls = 2 TO MaxCalls PRINT CallArray<J_MaxCalls> NEXT J_MaxCalls PRINTER CLOSE PRINTER OFF CASE InputAns = "S" WRITE CallArray ON SCalls,ProgramArray<1,1> CASE 1 END CASE CRT @(-1) * Setup RowCounter2 RowCounter2 = RowCounter1 + 20 IF (RowCounter2 > MaxCalls) THEN RowCounter2 = MaxCalls RowCounter1 = RowCounter2 - 20 IF (RowCounter1 < 1) THEN RowCounter1 = 1 END * 2. Display Calls FOR J_RowCounter = RowCounter1 TO RowCounter2 CRT CallArray<J_RowCounter> NEXT J_RowCounter REPEAT RETURN * ------------------------- END OF PROGRAM --------------------------- * END Program End: -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Horn, John Sent: 23 February 2005 12:41 To: U2 Mailing List (E-mail) Cc: Roberts, Robert Subject: [U2] Subroutine utility Have any of you every seen or heard of a utility that would take a Pick program and identify what programs were called by that program and continue to transverse down those programs until all programs were identified? - John M. Horn IT Technical Expert HealthLink, Inc. 314-989-6050 [EMAIL PROTECTED] ------- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/ ------- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/