!*! Updated on 10-Aug-90 at 4:47 PM by Matt Badger; edit time: 0:01:46
!*************************** AMUS Program Label ******************************
! Filename: INCLUD.BAS Date: 07/20/90
! Category: UTILITY Hash Code: 074-266-441-425 Version: 1.0
! Initials: EAES Name: Jon Dunham
! Company: E and E Specialties, Inc. Telephone #: 9138439240
! Related Files: INCLUD.DO
! Min. Op. Sys.: AMOS/L 1.X (needs ODTIM) Expertise Level: INT
! Special: Read the instructions- it usually helps
! Description: Creates a printout of all include modules and optionally all
! xcalls in a program and sorts the list by module name. Optionally finds
! all the xcalls in the include modules and lists them too.
!*****************************************************************************
PROGRAM INCLUD,1.0(102)
! [100] NEW PROGRAM 11/1/89 JWD
! [101] added optional search for xcalls and output
! to separate list 6/29/90 jwd
! [102] added optional scan of include subrs for xcalls and output
! to the xcall list. Also changed format of directory file to
! allow this 7/18/90 jwd
! [102A] exclude commonly used sbrs for E&E jwd 7/20/90
!
! [100]
! Looks for include modules and lists them with program name and sorts
! list by include module name. Very handy if you make a change to one
! module and need to know where it is used.
!
! [101]
! This program lists all xcalls in the program but lists each occurrence
! only once within a program.
!
! [102]
! Modified to cross reference the xcalls which are in all include
! modules as well as in the main program.
!
! To do this it needs to know where the include modules normally are.
! You will also need to change the default ppn ("MAP1 INC'DEF,B,1,0")
! when your modules are not in "0". If you use ersatz or specific
! devices for your includes which are not located in the library ppn
! ("0") leave the default ppn at "0" as the program will find them
! anyway. If the program can't find the module it will skip over it
! and print a comment. This has the side benefit of letting you know
! which modules aren't where they should be.
!
! The include modules either must be on same physical device as the
! files you are searching or else in an ersatz or specified device as
! part of the include statement. Needless to say, the stored modules
! must have the same name and extension as in the program.
!
! [Operation]
! This program works with INCLUD.DO in CMD:. Usage is "INCLUD" + any
! valid wild card for program extensions. A sorted list of INCLUDE
! modules and XCALL'S results.
!
! Be sure to DIRSEQ your programs first so they are in right Alpha order.
! Note that normally extensions only would be wild carded, NOT program
! names, however a range of programs can be requested I.E. "EMP???.BAS".
!
! Adapted from SRCH.BAS originally from BILL MCCULLOUGH (MPAC).
!
! Written by Jon Dunham, E and E Specialties, Inc., Lawrence, KS. E and E
! denies any liability for function of this program. My phone number is
! (913) 843-9240 or (800) 832-0404.
!
! This program uses the following XCALLS:
! STRIP, ODTIM, MESAG also requires SORT.LIT
!
! [INSTALLATION]
! To install place INCLUD.BAS in BAS: and compile. Place INCLUD.DO in CMD:.
!
! [.DO FILE FORMAT]
! $D *.BAS
! :R
! LOOKUP RES:STRIP.SBR/
! GOTO LOAD
! GOTO DONE
! ;LOAD
! LOAD BAS:STRIP.SBR
! ;DONE
! ERASE DIR.LST
! DIR $0
! DIR DIR=$0/D
! RUN INCLUD
! [END OF .DO FILE FORMAT]
!
MAP1 MISC'JUNK
MAP2 INSTRING,S,132 ! String from orig input file
MAP2 NEWSTRING,S,132 ! String to be output to list file
MAP2 LUKSTRING,S,50 ! lookup file name for include [102]
MAP2 SPACES,S,132,SPACE(132)
MAP2 PROGNAME,S,25
MAP2 OUT'PROGNAME,S,10 ![102]
MAP2 DAY'STR,S,50
MAP2 SEARCH'STRING(10),S,64
MAP2 DUP'FIL,S,1
MAP2 ANSWR,S,1 ![101]
MAP2 XCALS,B,1 ![101]
MAP2 CKINC,B,1 ![102]
MAP2 INC'PPN,S,9 ![102]
MAP2 INC'DEF,B,1,0 ![102] default ppn for includes
MAP2 CRLF
MAP3 CR,S,1,CHR(13)
MAP3 LF,S,1,CHR(10)
MAP1 XCAL'ARRAY(30) ![101]
MAP2 XCAL'NAME,S,6
MAP1 CMDLIN,S,100 ! CMDLIN is approx 85 bytes long
FILEBASE 1
SIGNIFICANCE 11
START:
CKINC = 0
XCALS = 0
XCALL ODTIM,DAY'STR,0,0,-1
PRINT TAB(-1,0);
PRINT TAB(5,1);" This program searches the files you specified and finds INCLUDE modules." ![101]
PRINT TAB(6,1);" You can also search for occurrences of XCALL's. Do you wish to also" ![101]
PRINT TAB(7,1);" scan for XCALL's ??" ![101]
PRINT TAB(7,25); ![101]
INPUT ANSWR ![101]
ANSWR = UCS(ANSWR)
IF ANSWR # "N" AND ANSWR # "Y" GOTO START ![101]
IF ANSWR = "Y" XCALS = 1 &
ELSE &
XCALS = 0 ![101]
! if you didn't want that option, you won't want the next one
IF XCALS = 0 GOTO INPUT'ARGUMENT ![102]
START1: ! ENTIRE SECTION ![102]
ANSWR=" "
PRINT TAB(9,1);TAB(-1,10);" This program can also search the ";&
TAB(-1,34);"INCLUDE";TAB(-1,35);" modules in the files you specified"
PRINT TAB(10,1);" and look for XCALLS there. Do you wish to also run this option ??"
PRINT TAB(10,70);
INPUT ANSWR
ANSWR = UCS(ANSWR)
IF ANSWR # "N" AND ANSWR # "Y" GOTO START1
IF ANSWR = "Y" CKINC = 1 &
ELSE &
CKINC = 0
INPUT'ARGUMENT:
I = 1
SEARCH'STRING(I) = "++INCLUDE"
PRINT "SEARCH STRING: ";SEARCH'STRING(I)
IF XCALS THEN I = I + 1 : &
SEARCH'STRING(I) = "XCALL" : &
PRINT "SEARCH STRING: ";SEARCH'STRING(I)
I = I + 1
PRINT
SEARCH'STRING(I) = "END"
HARDCOPY:
PRINT
OPEN #2, "DIR.LST" ,INPUT
LOOKUP "INCLUD.LST",FOUND
IF FOUND # 0 CALL DUP'FILE
OPEN #5, "INCLUD.LST" ,OUTPUT
PRINT #5
PRINT #5," LIST OF INCLUDE MODULES FOR AAAAAAAAAAA AS OF ";DAY'STR
PRINT #5
IF XCALS OPEN #6, "XCALL.LST" ,OUTPUT ![101]
IF XCALS PRINT #6 ![101]
IF XCALS PRINT #6," LIST OF XCALL MODULES FOR AAAAAAAAAAA AS OF ";DAY'STR
IF XCALS PRINT #6 ![101]
READ'DIRBAS:
FOUND'INC = 0
FOUND'XCL = 0 ![101]
INPUT LINE #2,PROGNAME
IF EOF(2) OR PROGNAME = SPACES GOTO END
PRINT PROGNAME;"**"
PROG'COLON = INSTR(1,PROGNAME,":") ![102]
PROG'BRACK = INSTR(1,PROGNAME,"[") ![102]
OUT'PROGNAME = PROGNAME[PROG'COLON+1,PROG'BRACK-1] ![102]
XCALL STRIP,OUT'PROGNAME
SEARCH'LINES = I - 1
OPEN #3, PROGNAME, INPUT
IF XCALS CALL CLEAR'ARRAY ![101]
GET'LINE:
INPUT LINE #3, INSTRING
IF EOF(3) GOTO PROG'DONE
INSTRING = UCS(INSTRING)
FOR I = 1 TO SEARCH'LINES
START'OLD = INSTR(1,INSTRING,SEARCH'STRING(I))
! Requested string not in this line - get next string or line
IF START'OLD = 0 GOTO FIND'NEXT
! Leave out commented stuff
EXCLUD'EX = INSTR(1,INSTRING,"!")
IF EXCLUD'EX = 0 GOTO DONT'CHECK
IF EXCLUD'EX > 0 AND EXCLUD'EX < 8 GOTO FIND'NEXT
DONT'CHECK:
IF XCALS XCAL'POS = INSTR(1,INSTRING,"XCALL") ![101]
IF XCALS AND XCAL'POS > 0 CALL DO'XCAL : GOTO FIND'NEXT ![101]
! FOUND'INC is flag for programs that have include modules
FOUND'INC = 1
PLUS'POS = INSTR(1,INSTRING,"++INCLUDE")
NEWSTRING = INSTRING[PLUS'POS + 10,132]
COLON'POS = INSTR(1,NEWSTRING,":")
STRIP'SPACES:
! eliminate stuff like ++INCLUDE MISC.INC (TABS OR SPACES)
XCALL STRIP,NEWSTRING
ZZ = LEN(NEWSTRING)
IF COLON'POS = 0 AND NEWSTRING[1,1] = " " NEWSTRING[1;ZZ-1] = NEWSTRING[2;ZZ] : &
NEWSTRING[ZZ;132] = SPACES : GOTO STRIP'SPACES
IF COLON'POS = 0 AND NEWSTRING[1,1] = CHR(9) NEWSTRING[1;ZZ-1] = NEWSTRING[2;ZZ] : &
NEWSTRING[ZZ;132] = SPACES : GOTO STRIP'SPACES
IF COLON'POS > 0 PRINT #5,TAB(5);OUT'PROGNAME;":";TAB(30-COLON'POS);NEWSTRING &
ELSE &
PRINT #5,TAB(5);OUT'PROGNAME;":";TAB(30);NEWSTRING
PRINT NEWSTRING
IF CKINC INC'POS = INSTR(1,NEWSTRING,".") ![102]
! variant for E & E [102A] exclude commonly used sbrs that I don't want listed
! IF CKINC INC'EXC = INSTR(1,NEWSTRING,"ACTDEV.FIL") ![102A]
! IF CKINC AND INC'EXC > 0 INC'POS=0 ![102A]
! IF CKINC INC'EXC = INSTR(1,NEWSTRING,"KEYOPR.BSR") ![102A]
! IF CKINC AND INC'EXC > 0 INC'POS=0 ![102A]
! IF CKINC INC'EXC = INSTR(1,NEWSTRING,"MISCEE.BSR") ![102A]
! IF CKINC AND INC'EXC > 0 INC'POS=0 ![102A]
! IF CKINC INC'EXC = INSTR(1,NEWSTRING,"LOCK.BSR") ![102A]
! IF CKINC AND INC'EXC > 0 INC'POS=0 ![102A]
!
IF CKINC AND INC'POS > 0 CALL CHECK'INCL ![102]
I = SEARCH'LINES
FIND'NEXT:
NEXT I
NEWSTRING = SPACES
GOTO GET'LINE
DUP'FILE:
XCALL MESAG,"OUTPUT FILE ALREADY EXISTS, - DO YOU WANT TO ERASE ?",4
INPUT DUP'FIL
IF UCS(DUP'FIL) # "Y" GOTO END1
RETURN
PROG'DONE:
CLOSE #3
PRINT
IF FOUND'INC = 0 &
PRINT #5,TAB(5);OUT'PROGNAME;":";TAB(30);"ZZZZZZZZZZ No INCLUDE modules found"
IF XCALS AND FOUND'XCL = 0 &
PRINT #6,TAB(5);OUT'PROGNAME;":";TAB(30);"ZZZZZZ No XCALL subroutines found"
GOTO READ'DIRBAS
CHECK'INCL: ! ENTIRE SECTON ![102],[102B]
DO'INC = 1 ! Flag to indicate that we got to this sbr
! take care of tabs in before comments but after sbr
TABBS = INSTR(1,NEWSTRING,CHR(9))
IF TABBS > 0 NEWSTRING[TABBS,132] = SPACES
XCALL STRIP,NEWSTRING
! take care of spaces in before comments but after sbr ![102B]
SPCS = INSTR(1,NEWSTRING," ") ![102B]
IF SPCS > 0 NEWSTRING[SPCS,132] = SPACES ![102B]
XCALL STRIP,NEWSTRING
!If there is a colon we have a specific device so skip parsing
IF COLON'POS > 0 LUKSTRING = NEWSTRING : GOTO SKIP'PARS
INC'PPN = SPACES
LUKSTRING = SPACES
PPN'COMMA = INSTR(1,PROGNAME,",")
INC'PPN[1,9] = PROGNAME[PROG'BRACK,PPN'COMMA]
XCALL STRIP,INC'PPN
PPN'LEN = LEN(INC'PPN)
IF INC'DEF = 0 INC'PPN[PPN'LEN+1;2] = "0]" &
ELSE &
INC'PPN[PPN'LEN+1;4] = INC'DEF USING "#ZZ" + "]"
LUKSTRING = PROGNAME[1,PROG'COLON]+NEWSTRING+INC'PPN
GET'INC: ! ENTIRE SECTION ![102]
INPUT LINE #4, INSTRING
IF EOF(4) CLOSE #4 : RETURN
INSTRING = UCS(INSTRING)
XCAL'POS = INSTR(1,INSTRING,"XCALL")
! Requested string not in this line - get next string or line
IF XCAL'POS = 0 GOTO GET'INC
! Leave out commented stuff
EXCLUD'EX = INSTR(1,INSTRING,"!")
IF EXCLUD'EX > 0 AND EXCLUD'EX < 8 GOTO GET'INC
IF XCAL'POS > 0 CALL DO'XCAL
GOTO GET'INC
DO'XCAL: ! ENTIRE SECTON ![101]
! FOUND'XCL is flag for files that have xcalls-if we made it here
! we certainly have one
FOUND'XCL = 1
NEWSTRING[1,6] = INSTRING[XCAL'POS + 6;6]
NEWSTRING[7,132] = SPACES
XCALL STRIP,NEWSTRING
NEW'LEN = LEN(NEWSTRING)
! Elim continuation line colons from xcalls
COLON'POS = INSTR(1,NEWSTRING,":")
IF COLON'POS>0 NEWSTRING[COLON'POS,6] = SPACE(6)
! Elim commas and stuff beyond
COMMA'POS = INSTR(1,NEWSTRING,",")
IF COMMA'POS > 0 NEWSTRING[1,6] = NEWSTRING[1,COMMA'POS-1] : &
NEWSTRING[COMMA'POS,6] = SPACE(6)
IF COMMA'POS = 0 AND NEW'LEN < 6 NEWSTRING[NEW'LEN + 1,6] = SPACE(6)
! Elim dup references to xcalls
FOR XZZ = 1 TO 30
IF XCAL'NAME(XZZ) = SPACE(6) GOTO NXT'ZZ
IF XCAL'NAME(XZZ) = NEWSTRING[1,6] XCAL'FLAG = 1
NXT'ZZ: ! ENTIRE SECTION ![101],[102]
NEXT XZZ
! found one previously in prog - outa here
IF XCAL'FLAG NEWSTRING = SPACES : XCAL'FLAG = 0 : RETURN
! keep separate track of how far we got thru array
XZ = XZ + 1
XCAL'NAME(XZ) = NEWSTRING[1,6]
! Force terminator to string
NEWSTRING[7,7] = CHR(0)
IF CKINC AND DO'INC &
PRINT #6,TAB(5);OUT'PROGNAME;":";TAB(30);NEWSTRING[1,6];" ";"(";LUKSTRING;")" &
ELSE &
PRINT #6,TAB(5);OUT'PROGNAME;":";TAB(30);NEWSTRING[1,6];" ";"(MAIN PROGRAM)"
IF CKINC AND DO'INC &
PRINT TAB(10);NEWSTRING[1,6];" ";"(INCLUDE MODULE)" &
ELSE &
PRINT TAB(10);NEWSTRING[1,6];" ";"(MAIN PROGRAM)"
I = SEARCH'LINES
NEWSTRING = SPACES
RETURN
CLEAR'ARRAY: ! ENTIRE SECTION ![101]
FOR XZ = 1 TO 30
XCAL'NAME(XZ) = SPACE(6)
NEXT XZ
XZ = 0
RETURN
END:
CLOSE #5
IF XCALS CLOSE #6
IF XCALS PRINT : PRINT TAB(-1,34); &
" Your list can be 'VUE'D as 'INCLUD.LST' and 'XCALL.LST'";TAB(-1,35) &
ELSE &
PRINT : PRINT TAB(-1,34); &
" Your list can be 'VUE'D as 'INCLUD.LST'";TAB(-1,35)