!*! 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 SKIP'PARS: ! ENTIRE SECTION ![102] XCALL STRIP,LUKSTRING LOOKUP LUKSTRING,EX IF EX = 0 DO'INC = 0 : PRINT #6,TAB(5);OUT'PROGNAME;":";TAB(30);& "AAAAAA";" ";"(CANNOT LOCATE>>";LUKSTRING;")" : RETURN OPEN #4, LUKSTRING, INPUT CALL GET'INC DO'INC = 0 RETURN 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) END1: CLOSE #2 KILL "DIR.LST" IF UCS(DUP'FIL) # "Y" AND FOUND END IF XCALS PRINT : PRINT TAB(-1,34); & " sorting INCLUD.LST and XCALL.LST - Please Wait ---";TAB(-1,35) & ELSE & PRINT : PRINT TAB(-1,34); & " sorting INCLUD.LST - Please Wait ---";TAB(-1,35) CMDLIN = "SYS:SORT.LIT " CMDLIN = CMDLIN + "INCLUD.LST" + CRLF CMDLIN = CMDLIN + "85" + CRLF CMDLIN = CMDLIN + "10" + CRLF CMDLIN = CMDLIN + "31" + CRLF CMDLIN = CMDLIN + "A" + CRLF + CRLF + CRLF IF XCALS = 0 GOTO OUTA'HERE CMDLIN = CMDLIN + "SYS:SORT.LIT " CMDLIN = CMDLIN + "XCALL.LST" + CRLF CMDLIN = CMDLIN + "85" + CRLF CMDLIN = CMDLIN + "06" + CRLF CMDLIN = CMDLIN + "31" + CRLF CMDLIN = CMDLIN + "A" + CRLF + CRLF OUTA'HERE: CHAIN CMDLIN END