; ----- Strip: Massage a COM-AND script ; ; Lines are left justified, and comments are removed. ; ; Warning: If a line length exceeds 80 cols, ; no adjustment is made to the line. ; ; R.McG; 4/89, Chicago ; ---------------------------------------------------------------- ; ; ----- Ask for an input file name ; CLEAR ; Clear the screen LEGEND " Stripper ver 1.1 " ; Version # WOPEN 10 10 13 70 (blue red) ; Draw a box ATSAY 10 12 (blue yellow) " Script stripper " ATSAY 11 12 (blue yellow) "Enter the file to be Stripped: " ATGET 12 12 (blue white) 58 S0 ; Read file name (58 chars) WCLOSE FOPENI S0 TEXT ; Try to open file IF NOT SUCCESS ; If file not open MESSAGE "*** File not found ***^M^J" EXIT ; Display error message and exit ENDIF ; ; ----- Ask for the output file ; OutputName: WOPEN 10 10 13 70 (blue red) ; Draw a box ATSAY 10 12 (blue yellow) " Scripted stripper " ATSAY 11 12 (blue yellow) "Enter the output file name: " ATGET 12 12 (blue white) 58 S0 ; Read file name (58 chars) WCLOSE IF ISFILE S0 ; Test for preexisting file WOPEN 10 10 13 70 (blue red) ; Draw a box ATSAY 10 12 (blue yellow) " Scripted stripper " ATSAY 11 12 (blue yellow) "The output file exists!" ATSAY 12 12 (blue yellow) "Do you wish to purge the file? " LOCATE 12,68 KEYGET S1 WCLOSE IF not FIND S1 "Y" GOTO OutputName ENDIF ENDIF ; ; Open the given file ; FOPENO S0 TEXT ; Try to open file IF NOT SUCCESS ; If file not open MESSAGE "*** Error opening output file ***^M^J" GOTO OutputName ; Display error message and exit ENDIF ; ; Initialize ; CLEAR ; Clear the screen (again) INIT N0 0 ; Reset line counter LEGEND " Script stripper processing" SET FLAG(0) OFF ; Line longer than 80 GOTO Loop ; And start ; ; ----- End of file ; Endfile: WRITE "^Z" ; Add ASCII file stopper FCLOSEO ; Close output file MESSAGE "^M^J*** End of file ***^M^J" EXIT ; And we're done ; ; ----- Read a line ; Loop: READ S0 80 N1 ; Read a line IF EOF GOTO EndFile ; Test for EOF IF FLAG(0) GOTO Continue ; Throw away long line continuations IF EQ N1 80 GOTO LongLine LJ S0 ; Left justify ; ; Blank lines must thrown away ; IF NULL S0 or ZERO N1 ; Test for a null line GOTO Loop ; .. at top of screen ENDIF ; ; Top of forms and other comment lines are thrown away ; IF STRCMP S0(0:0) "^L" or STRCMP S0(0:0) "*" or STRCMP S0(0:0) ";" GOTO Loop ; .. at top of screen ENDIF ; ; Skip scan if there is no comment on the line ; IF NOT FIND S0 ";" N1 ; And keep pos of potential comment GOTO Finish ENDIF FIND S0(0:N1) "`"" N2 ; Look for quoted field b4 comment IF EQ N2 -1 S0 = S0(0:N1-1) ; Truncate right here GOTO Finish ENDIF GOTO Test ; Test for ';' inside of quotes ; ; Delete trailing blanks ; Finish: S0 = S0&"" ; ; Write the line. Note the special care taken to see that ^M in the input ; .. isn't made into a , "!" isn't made into a and so on. ; WriteLn: LENGTH S0 N1 ; Set new length IF GT N1 40 S1 = S0(0:39) S0 = S0(40:N1-1) LENGTH S0 N0 ; Send the 1st half PRESERVE S1 LENGTH S1 N1 WRITE S1 N1 MESSAGE S1 ; Display line to screen PRESERVE S0 LENGTH S0 N0 WRITE S0 N0 CURSOR N10,N11 ; Read current cursor ATSAY N10,N11 (text) S0 ; Display line to screen ELSE PRESERVE S0 LENGTH S0 N0 WRITE S0 N0 MESSAGE S0 ; Display line ENDIF IF NOT FLAG(1) ; If not a long line, or end of long line WRITE "!" ; Add a cr/lf ENDIF GOTO Loop ; ; ----- Test for a ':' within a quoted field; N2 = position of 2nd """ ; Initialize for testing ; Test: N0 = N2-1 ; -1 as we'll INC first LENGTH S0 N1 ; ; Scan the line for a comment (allowing for quoted strings) ; Test100: INC N0 IF STRCMP S0(N0:N0) "`"" DO INC N0 IF STRCMP S0(N0:N0) "``" N0 = N0+2 ENDIF UNTIL STRCMP S0(N0:N0) "`"" or GE N0 N1 INC N0 ENDIF IF (NOT STRCMP S0(N0:N0) ";") and LT N0 N1 GOTO Test100 ENDIF S0 = S0(0:N0-1) GOTO Finish ; ; ----- A line was read 80 chars long. Flag (0) is set to provide for ; .. continuations of the line. ; Continue: S1 = "Loop" ; Set branch label IF FLAG(1) S1 = "FINISH" ; .. according to flag(1) IF LT N1 80 ; If short line SET FLAG(0) OFF ; .. reset ptrs SET FLAG(1) OFF ENDIF GOTO S1 ; Throw away what was read ; ; ----- Line read was 80 chars exactly. Test for a comment in the line ; .. anyway. If found, we'll copy just the instruction and throw ; .. away the remainder of the comment. ; LongLine: IF NULL S0 ; Test for 80 chars of blanks GOTO Loop ; .. at top of screen ENDIF SET FLAG(0) ON ; Flag long line condition ; ; Top of forms and other comment lines are thrown away ; .. If we find a comment here, FLAG(0) set causes the ; .. remainder of the line to be passed to "CONTINUE" ; S1 = S0 LJ S1 ; Left justify what we have anyway LENGTH S1 N1 ; Recompute length IF STRCMP S1(0:0) "^L" or STRCMP S1(0:0) "*" or STRCMP S1(0:0) ";" GOTO Loop ; .. at top of screen ENDIF ; ; Test for comment on the line ; IF NOT FIND S1 ";" N1 ; And keep pos of potential comment GOTO LL200 ; SKip if no possible comment ENDIF FIND S1(0:N1) "`"" N2 ; Look for quoted field b4 comment IF EQ N2 -1 S0 = S1(0:N1-1) ; Truncate right here GOTO Finish ; .. and throw away remainder ENDIF N0 = N2-1 ; ; Scan the line for a comment (allowing for quoted strings) ; LL100: LENGTH S1 N1 INC N0 IF STRCMP S1(N0:N0) "`"" DO INC N0 IF STRCMP S1(N0:N0) "``" N0 = N0+2 ENDIF UNTIL STRCMP S1(N0:N0) "`"" or GE N0 N1 INC N0 ENDIF IF (NOT STRCMP S1(N0:N0) ";") and LT N0 N1 GOTO LL100 ENDIF IF GE N0 N1 ; If we get to end of line without being GOTO LL200 ; .. sure, write the whole line ENDIF S0 = S1(0:N0-1) ; We can remove the comment GOTO Finish ; ... ; ; Line contains nothing like a comment ; LL200: SOUND 440,200 MESS "^M^J***** Warning - Line greater than 80 *****^M^J" SET FLAG(1) ON ; Indicate a keeper GOTO WriteLn ; Don't delete trailing blanks - may be important