REM ************** PRGCNV.BAS ***************************************** REM PROGRAM TO CONVERT OTHER PROGRAMS (See Instructions, below) REM This pgm creates a directory file (PRGCNV.DIR) containing a list of REM specified filetypes to be converted. Those files are then read and REM when appropriate, lines are updated accordingly. Any file that is REM changed is output with a different extension than the original i/p REM file, which remains unchanged. (So if something goes wrong, this REM pgm can easily be rerun). Results are logged in (PRGCNV.LOG) REM (Also see: PRGCN2) REM Instructions before running: REM ---------------------------- REM 1. Set OLD'EXTn for file type(s) to process (line 110) REM 2. Set OLD'STR, NEW'STR, (and optionally NOT'STRx) (line 120) REM 3. Update list of already converted pgms (line 1020) REM v2.0 SWS 03/12/07 REM -- Change ERRMSG to ERRDAT (but not XCALL ERRMSG or ERRMSG.BSI) REM in odinary code lines only REM -- Change GET'NEXT to GN'REC (but not 'GET'NEXT, GET'NEXT', or REM GOTO GET'NEXT) in ordinary code lines only REM -- Change FUNCTION to FUNCT$ (but not 'FUNCTION or FUNCTION' or REM FUNCT K) in ordinary code lines REM -- Made pgm more generalized REM -- Cleaned up code REM v1.2 Set up for removal of ERMS18 SG 06/10/05 REM v1.1A Add modularity to coding SG 03/18/05 REM v1.1 Made a few minor cosmetic changes SWS 12/07/04 REM v1.0 Original SG 11/23/04 REM -- Eliminate INCLUDE ERM??? and MSGMAP statements MAP1 OLD'EXT1, S, 3 ! File type to be processed MAP1 OLD'EXT2, S, 3 ! File type to be processed MAP1 OLD'EXT3, S, 3 ! File type to be processed MAP1 OLD'STR, S, 50 ! String we want to replace MAP1 NEW'STR, S, 50 ! The replacement string MAP1 NOT'STR1, S, 50 ! ... unless it's this string MAP1 NOT'STR2, S, 50 ! ... or this one MAP1 NOT'STR3, S, 50 ! ... or this one MAP1 NOT'STR4, S, 50 ! ... or this one MAP1 NOT'STR5, S, 50 ! ... or this one MAP1 IN'NAME, S, 50 ! DIR listing MAP1 IN'SOURCE, S,200 ! Input program statements MAP1 TRIM'SOURCE, S,200 ! Trimmed Input statements MAP1 OUT'SOURCE, S,200 ! Output program statements MAP1 OUT'B, S,200 ! Portion of line Before str MAP1 OUT'A, S,200 ! Portion of line After str MAP1 WRK'STR, S, 80 MAP1 TIMESTAMP, S, 50 MAP1 INMOD, S, 6 ! Module to be processed MAP1 INEXT, S, 3 ! Extension of that module MAP1 INFIL, S, 10 ! Full name of i/p module MAP1 OUTFIL, S, 10 ! Full name of o/p module MAP1 PGMS'READ, F,6 ! Number of PROGRAMS read MAP1 PGMS'CHGD, F,6 ! Number of PROGRAMS changed MAP1 CHG'CTR, F,6 MAP1 LINES'READ, F,6 ! Number of lines read/PRG MAP1 LINES'CHANGED,F,6 ! Number of Lines changed/PRG MAP1 LINES'WRITTEN,F,6 ! Number of lines Written/PRG MAP1 LINES'ADDED, F,6 ! Number of lines Added/PRG MAP1 TOT'LINES'WR, F,6 ! Total number of Lines written MAP1 TOT'LINES'CH, F,6 ! Total number of Lines changed MAP1 TOT'LINES'RD, F,6 ! Total number of Lines read MAP1 TOT'LINES'AD, F,6 ! Total number of Lines added MAP1 GNL'RC, F ! GET'NEXT'LINE return code MAP1 GNDE'RC, F ! GET'NEXT'DIR'ENTRY return code MAP1 FNO, F MAP1 I, F MAP1 A, F MAP1 B, F MAP1 C, F MAP1 ZZ, F MAP1 FAS'VARIABLES ! FIND'A'STRING variables MAP2 FAS'SOURCE,S,200 ! workarea for line to test MAP2 FAS'STR, S,100 ! string to look for MAP2 FAS'RC, F ! return code MAP2 FASL, F ! length of string to test ! *************************************************************************** BEGIN: 100 XCALL NOECHO 110 OLD'EXT1 = "BAS" OLD'EXT2 = "PRT" OLD'EXT3 = "BSI" 120 OLD'STR = "FUNCTION" NEW'STR = "FUNCT$" NOT'STR1 = "FUNCTION'" NOT'STR2 = "'FUNCTION" NOT'STR3 = "FUNCTION K" ! Function Key or Kys NOT'STR4 = "INVALID FUNCTION" NOT'STR5 = "FUNCTIONS" OPEN'FILES: ! ----------------------- GOSUB CREATE'DIR'FILE GOSUB OPEN'PRINT'FILES ! ----------------------- ! *************************************************************************** MAIN'ROUTINE: 500 PRINT TAB(-1,0); WRK'STR = "CHANGE " + OLD'STR + " TO " + NEW'STR XCALL TRIM,WRK'STR A = LEN(WRK'STR) : B = INT((76-A)/2) XCALL BOX,01,B,3,A+4 !Start ln,start col,vert,horiz PRINT TAB(02,B+2); WRK'STR; PRINT TAB(-1,29); ! Turn cursor off PGMS'READ = 0 : PGMS'CHGD = 0 PRINT TAB(05,10);"Number of Programs Read: "; PRINT TAB(05,39); PGMS'READ; PRINT TAB(06,10);"Number of Programs Changed: "; PRINT TAB(06,39); PGMS'CHGD; ! *************************************************************************** MAIN'LOOP: ! ------------------------ GOSUB GET'NEXT'DIR'ENTRY ! ------------------------ 510 IF GNDE'RC = 1 & GOTO FINISH'UP ! EOF (End of DIR list) 512 IF GNDE'RC = 2 OR & GNDE'RC = 3 & GOTO MAIN'LOOP ! Ignore this line ! ---------------------- GOSUB PROCESS'PGM'FILE ! Process this line ! ---------------------- GOTO MAIN'LOOP ! Keep looping (thru DIR) ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PROCESS'PGM'FILE: ! ------------------- GOSUB OPEN'PGM'FILE ! ------------------- CHG'CTR = 0 ! Init change counter PPF'LOOP: ! ------------------- GOSUB GET'NEXT'LINE ! Sets: IN'SOURCE & GNL'RC ! ------------------- 610 IF GNL'RC = 0 GOTO PPF'EXIT ! EOF (End of program file) OUT'SOURCE = IN'SOURCE ! Copy orig line to o/p area 620 ON GNL'RC GOSUB PPF1, PPF2, PPF3, PPF4, PPF5, PPF6 ! These rtns might change OUT'SOURCE ! ------------------- GOSUB PUT'NEXT'LINE ! Write OUT'SOURCE ! ------------------- GOTO PPF'LOOP ! Keep looping (thru pgm) PPF'EXIT: ! -------------------- GOSUB CLOSE'PGM'FILE ! -------------------- 630 IF CHG'CTR > 0 & PGMS'CHGD = PGMS'CHGD + 1 : & PRINT TAB(06,39); PGMS'CHGD; ! Count pgs changed RETURN ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PPF1: ! Ordinary line of code ! --------------------- GOSUB PPF'REPLACE'RTN ! --------------------- RETURN PPF2: ! Blank (or null) line PPF3: ! Comment line PPF4: ! ++INCLUDE line PPF5: ! MAPn line RETURN ! Label line (can be followed PPF6: ! by code and/or comments) ! --------------------- ! GOSUB PPF'REPLACE'RTN ! --------------------- RETURN ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PPF'REPLACE'RTN: !--------------------------------------------! ! No change if line contains unwanted string ! !--------------------------------------------! 800 FAS'SOURCE = UCS(OUT'SOURCE) ! Original line 810 FAS'STR = NOT'STR1 ! ------------------- GOSUB FIND'A'STRING ! ------------------- IF FAS'RC > 0 GOTO PPF'RR'EXIT ! Found: no change 812 FAS'STR = NOT'STR2 ! ------------------- GOSUB FIND'A'STRING ! ------------------- IF FAS'RC > 0 GOTO PPF'RR'EXIT ! Found: no change 814 FAS'STR = NOT'STR3 ! ------------------- GOSUB FIND'A'STRING ! ------------------- IF FAS'RC > 0 GOTO PPF'RR'EXIT ! Found: no change 816 FAS'STR = NOT'STR4 ! ------------------- GOSUB FIND'A'STRING ! ------------------- IF FAS'RC > 0 GOTO PPF'RR'EXIT ! Found: no change 818 FAS'STR = NOT'STR5 ! ------------------- GOSUB FIND'A'STRING ! ------------------- IF FAS'RC > 0 GOTO PPF'RR'EXIT ! Found: no change !---------------------------------------------------! ! No change if line does NOT contain desired string ! !---------------------------------------------------! 820 FAS'STR = OLD'STR ! ------------------- GOSUB FIND'A'STRING ! ------------------- IF FAS'RC = 0 GOTO PPF'RR'EXIT ! Not found: no change !-----------------------------------------------------------! ! Line contains desired string and not any unwanted string, ! ! so change the desired string (OLD'STR) to the NEW'STR ! !-----------------------------------------------------------! 830 A = LEN(OLD'STR) B = LEN(OUT'SOURCE) OUT'B = "" : OUT'A = "" 832 IF FAS'RC > 1 THEN OUT'B = OUT'SOURCE[1,FAS'RC-1] 834 IF FAS'RC+A <= B THEN OUT'A = OUT'SOURCE[FAS'RC+A,-1] 840 OUT'SOURCE = OUT'B + NEW'STR + OUT'A LINES'CHANGED = LINES'CHANGED + 1 850 FNO = 14 : PRINT #FNO, "<"; IN'SOURCE ! Original line FNO = 14 : PRINT #FNO, ">"; OUT'SOURCE ! Changed line CHG'CTR = CHG'CTR + 1 ! Count changes in each pgm PPF'RR'EXIT: RETURN ! *************************************************************************** !---------------------------------------! ! GET'NEXT'DIR'ENTRY ! ! Return code: GNDE'RC ! ! 0 = program to process ! ! 1 = end of file ! ! 2 = specific program to bypass ! ! 3 = not a matching extension ! !---------------------------------------! GET'NEXT'DIR'ENTRY: 1000 GNDE'RC = 0 INPUT LINE #01, IN'NAME IF EOF(01) = 1 & GNDE'RC = 1 : & GOTO GNDE'EXIT ! EOF (end of DIR list) 1010 IF IN'NAME[1;6] = "PRGCNV" OR & IN'NAME[1;6] = "PRGCN2" & GNDE'RC = 2 : & GOTO GNDE'EXIT ! Skip conversion pgms !----------------------------------------------! ! The following pgms have already been changed ! !----------------------------------------------! ! 1020 IF IN'NAME[1;6] = "AESIN5" OR & ! IN'NAME[1;6] = "BRKINQ" OR & ! IN'NAME[1;6] = "LASCPR" OR & ! IN'NAME[1;6] = "LETMEM" OR & ! IN'NAME[1;6] = "FMTDMP" OR & ! IN'NAME[1;6] = "BINUPD" OR & ! IN'NAME[1;6] = "BINMEM" OR & ! IN'NAME[1;6] = "HOMCRT" OR & ! IN'NAME[1;6] = "PRTCRT" & ! GNDE'RC = 2 : & ! GOTO GNDE'EXIT ! Skip these progs 1030 FAS'SOURCE = IN'NAME A = 0 : B = 0 1032 IF OLD'EXT1 <> "" & FAS'STR = SPACE(1) + OLD'EXT1 : & GOSUB FIND'A'STRING : & A = FAS'RC ! Look for EXT1 1034 IF OLD'EXT2 <> "" & FAS'STR = SPACE(1) + OLD'EXT2 : & GOSUB FIND'A'STRING : & B = FAS'RC ! Look for EXT2 1036 IF OLD'EXT3 <> "" & FAS'STR = SPACE(1) + OLD'EXT3 : & GOSUB FIND'A'STRING : & C = FAS'RC ! Look for EXT3 1038 IF A <= 1 AND B <= 1 AND C <= 1 & GNDE'RC = 3 : & GOTO GNDE'EXIT ! No match 1040 ZZ=A : IF ZZ = 0 THEN ZZ=B : IF ZZ = 0 THEN ZZ=C INMOD = IN'NAME[1,ZZ] : XCALL TRIM,INMOD INEXT = IN'NAME[ZZ+1;3] : XCALL TRIM,INEXT INFIL = INMOD + "." + INEXT ! (eg: BAS BSI PRT) OUTFIL = INMOD + ".N" + INEXT[2,-1] ! (eg: NAS NSI NRT) 1042 FNO = 14 : PRINT #FNO,INFIL 1044 PGMS'READ = PGMS'READ + 1 ! Count pgs read PRINT TAB(05,39); PGMS'READ; GNDE'EXIT: RETURN ! *************************************************************************** !-------------------------------------------------------! ! GET'NEXT'LINE ! ! Return code: GNL'RC ! ! 0 = encountered end of file ! ! 1 = read ordinary line of code ! ! 2 = read a blank line ! ! 3 = read a comment line (starts ! or REM) ! ! 4 = read a ++INCLUDE line ! ! 5 = read a MAPn statement line ! ! 6 = read a label line ! ! ! ! Also sets: IN'SOURCE = the original line ! ! FAS'SOURCE = searchable portion of that ln ! !-------------------------------------------------------! GET'NEXT'LINE: 1200 GNL'RC = 1 1210 INPUT LINE #02, IN'SOURCE IF EOF(02) = 1 & GNL'RC = 0 : & GOTO GNL'EXIT ! EOF 1212 LINES'READ = LINES'READ + 1 1214 TRIM'SOURCE = UCS(IN'SOURCE) XCALL TRIM,TRIM'SOURCE 1216 FAS'SOURCE = TRIM'SOURCE GNL'BLANK: 1220 IF FAS'SOURCE = "" & GNL'RC = 2 : & GOTO GNL'EXIT ! Blank Line GNL'COMMENT: 1230 FAS'STR = "!" ! ------------------- GOSUB FIND'A'STRING ! ------------------- 1232 IF FAS'RC = 1 & GNL'RC = 3 : & GOTO GNL'EXIT ! "!" comment line 1234 FAS'STR = "REM" ! ------------------- GOSUB FIND'A'STRING ! ------------------- 1236 IF FAS'RC = 1 AND & (FAS'SOURCE[4;1] = SPACE(1) OR & FAS'SOURCE[4;1] = CHR$(09) ) & GNL'RC = 3 : & GOTO GNL'EXIT ! "REM" comment line GNL'INCLUDE: 1240 FAS'STR = "++INCLUDE " ! ------------------- GOSUB FIND'A'STRING ! ------------------- 1242 IF FAS'RC = 1 & GNL'RC = 4 : & GOTO GNL'EXIT ! Include line GNL'MAPn: 1250 FAS'STR = "MAP" ! ------------------- GOSUB FIND'A'STRING ! ------------------- 1252 IF FAS'RC = 1 & A = FAS'STR[FAS'RC+3;1] : & IF A => 1 AND A <= 9 & GNL'RC = 5 : & GOTO GNL'EXIT ! MAPn statement GNL'LABEL: !-----------------------------------------------------! ! A label starts with text and ends with a colon and ! ! contains no spaces or equal signs before the colon. ! ! It could also be followed by code and/or a comment ! !-----------------------------------------------------! 1260 FAS'STR = ":" ! ------------------- GOSUB FIND'A'STRING ! ------------------- 1262 IF FAS'RC > 1 & FAS'SOURCE = TRIM'SOURCE[1,FAS'RC-1] : & FAS'STR = SPACE(1) : & GOSUB FIND'A'STRING : A = FAS'RC : & FAS'STR = "=" : & GOSUB FIND'A'STRING : B = FAS'RC : & IF A=0 AND B=0 & GNL'RC = 6 : & GOTO GNL'EXIT ! Label GNL'EXIT: RETURN ! *************************************************************************** FIND'A'STRING: 1400 FAS'RC = INSTR(1, FAS'SOURCE, FAS'STR) RETURN ! *************************************************************************** PUT'NEXT'LINE: 1600 PRINT #03, OUT'SOURCE LINES'WRITTEN = LINES'WRITTEN + 1 RETURN ! *************************************************************************** OPEN'PGM'FILE: 2000 OPEN #02, INFIL, INPUT 2010 OPEN #03, OUTFIL, OUTPUT LINES'CHANGED = 0 LINES'READ = 0 LINES'WRITTEN = 0 LINES'ADDED = 0 RETURN CLOSE'PGM'FILE: !---------------------------------------------------------------------------- ! Debugging Code: ! --------------- ! 2200 IF LINES'CHANGED > 0 & ! FNO = 14 : & ! PRINT #FNO," lines read = ";LINES'READ : & ! PRINT #FNO," lines written = ";LINES'WRITTEN : & ! PRINT #FNO," lines changed = ";LINES'CHANGED : & ! PRINT #FNO," lines added = ";LINES'ADDED ! !---------------------------------------------------------------------------- 2210 TOT'LINES'RD = TOT'LINES'RD + LINES'READ TOT'LINES'WR = TOT'LINES'WR + LINES'WRITTEN TOT'LINES'CH = TOT'LINES'CH + LINES'CHANGED TOT'LINES'AD = TOT'LINES'AD + LINES'ADDED CLOSE #02 CLOSE #03 WRK'STR = OUTFIL IF LINES'CHANGED = 0 THEN KILL WRK'STR RETURN ! *************************************************************************** CREATE'DIR'FILE: 2400 WRK'STR = "" IF OLD'EXT1 <> "" WRK'STR = WRK'STR + "*." + OLD'EXT1 + "," IF OLD'EXT2 <> "" WRK'STR = WRK'STR + "*." + OLD'EXT2 + "," IF OLD'EXT3 <> "" WRK'STR = WRK'STR + "*." + OLD'EXT3 + "," IF WRK'STR <> "" WRK'STR = WRK'STR[1,-2] WRK'STR = "DIR/K/SEXT PRGCNV.DIR=" + WRK'STR XCALL AMOS,WRK'STR 2410 OPEN #01, "PRGCNV.DIR", INPUT 2420 TOT'LINES'CH = 0 TOT'LINES'RD = 0 TOT'LINES'WR = 0 TOT'LINES'AD = 0 RETURN CLOSE'DIR'FILE: 2600 CLOSE #01 RETURN ! *************************************************************************** OPEN'PRINT'FILES: 2800 XCALL ODTIM,TIMESTAMP,0,0,-1 ! Get current date & time FNO = 14 OPEN #FNO,"PRGCNV.LOG", OUTPUT PRINT #FNO PRINT #FNO,TIMESTAMP PRINT #FNO,"REPLACED '" + OLD'STR + "' " & "WITH '" + NEW'STR + "' " & "IN THE FOLLOWING PROGRAMS:" ! PRINT #FNO RETURN CLOSE'PRINT'FILES: 3000 FNO = 14 : CLOSE #FNO RETURN ! *************************************************************************** FINISH'UP: 4000 FNO = 14 PRINT #FNO PRINT #FNO PRINT #FNO,"Total Programs Read = ";PGMS'READ PRINT #FNO,"Total Programs Changed = ";PGMS'CHGD PRINT #FNO PRINT #FNO,"Total lines read = ";TOT'LINES'RD PRINT #FNO,"Total lines written = ";TOT'LINES'WR PRINT #FNO,"Total lines changed = ";TOT'LINES'CH PRINT #FNO,"Total lines added = ";TOT'LINES'AD PRINT #FNO EXIT'PROGRAM: ! ----------------------- GOSUB CLOSE'DIR'FILE GOSUB CLOSE'PRINT'FILES ! ----------------------- XCALL ECHO PRINT TAB(23,1) END PROGRAM PRGCNV,2.0