INPUT LINE "File to Edit> ";FILENAME
PRINT : XCALL STRIP,FILENAME
IF LEN(FILENAME)=0 PRINT "ERROR - INVALID FILENAME" : GOTO BACKOUT
IF INSTR(1,FILENAME,".")=0 FILENAME=FILENAME+".BAS"
LOOKUP FILENAME,THERE
IF THERE=0 CALL NEW'FILE
IF STAT="NOF" GOTO BACKOUT
BCKFILE=FILENAME[1,INSTR(1,FILENAME,".")-1]+".BAK"
LOOKUP BCKFILE,THERE : IF THERE#0 KILL BCKFILE
CALL INPUT'FILE
COMMAND'LOOP:
INPUT LINE "EDIT> ";QUEST
XCALL STRIP,QUEST : QUEST=UCS(QUEST)
ON INSTR(1,"ADEHILPRS",QUEST[1;1]) CALL &
ENTER'LINE,DELETE'LINE,EDIT'LINE,HELP, &
INSERT'LINE,LIST'FILE,LIST'FILE,REPLACE,SEARCH
IF (QUEST[1;1]="S" &
OR QUEST[1;1]="R") &
AND FND=0 &
PRINT "String not found"
IF QUEST[1;1]="Q" &
PRINT "Abandoning Changes" : &
GOTO BACKOUT
IF QUEST[1;1]="F" GOTO FINISH
PRINT
GOTO COMMAND'LOOP
INPUT'FILE:
PRINT "Getting ";FILENAME;
OPEN #1,FILENAME,INPUT
X=1
INPUT'LOOP:
INPUT LINE #1,TMP'LINE1
IF TMP'LINE1[101;1]#"" &
PRINT : &
PRINT "WARNING - LINE ";X USING "###";" LONGER THAN 100 CHARACTERS"
IF EOF(1) &
X=X-1 : PRINT : &
CLOSE #1 : RETURN
IF X=>MAX'LINES &
PRINT : CLOSE #1 : &
GOTO FILE'TOO'LARGE
EDIT'LINE(X)=TMP'LINE1
X=X+1 : IF X/10=INT(X/10) PRINT ".";
GOTO INPUT'LOOP
PRINT
IF BEGLINE>X PRINT "ERROR - OUT OF RANGE" : RETURN
IF BEGLINE<=0 AND ENDLINE<=0 BEGLINE=1 : ENDLINE=X
IF BEGLINE<=0 BEGLINE=1
IF ENDLINE=0 ENDLINE=BEGLINE
IF ENDLINE>X ENDLINE=X
FOR I = BEGLINE TO ENDLINE
PRINT I USING "###";" ";EDIT'LINE(I)
IF QUEST[1;1]="P" &
AND I/22=INT(I/22) &
PRINT : &
INPUT LINE "CR to continue or Q)uit> ";QUEST2 : &
PRINT : &
IF UCS(QUEST2[1;1])="Q" I=X
XCALL GETEM,CHAR
IF ASC(CHAR)=32 I=X
NEXT I
RETURN
FOR I = X+1 TO LINENO+1 STEP-1
EDIT'LINE(I)=EDIT'LINE(I-1)
NEXT I
EDIT'LINE(LINENO)=""
X=X+1
PRINT "LINE ";LINENO USING "###";"> ";
INPUT LINE TMP'LINE1
EDIT'LINE(LINENO)=TMP'LINE1
RETURN
EDIT'LINE:
PRINT
INPUT LINE "Edit line # ";LINENO
IF LINENO=0 RETURN
IF LINENO<0 OR LINENO>X GOTO EDIT'LINE
PRINT LINENO USING "###";" ";EDIT'LINE(LINENO)
GET'RPLC'STRING:
PRINT
INPUT LINE "String to replace> ";RPLC'STRING
RPLC'START=INSTR(1,EDIT'LINE(LINENO),RPLC'STRING)
IF RPLC'START=0 &
PRINT "String not found" : &
GOTO EDIT'LINE
INPUT LINE "New string> ";NEW'STRING
IF RPLC'START>1 &
TMP'LINE1=EDIT'LINE(LINENO)[1,RPLC'START-1] &
ELSE &
TMP'LINE=""
EDIT'LINE(LINENO)=TMP'LINE1+NEW'STRING+TMP'LINE2
PRINT
PRINT "Line # ";LINENO;" now reads"
PRINT LINENO USING "###";" ";EDIT'LINE(LINENO)
RETURN
ENTER'LINE:
PRINT
PRINT "'*' - Returns from Add mode"
X=X+1
ENTRY'LOOP:
PRINT "LINE ";X USING "###";"> ";
INPUT LINE TMP'LINE1
IF UCS(TMP'LINE1[1;1])="*" &
X=X-1 : &
RETURN
XCALL STRIP,TMP'LINE1
IF TMP'LINE1#"" &
EDIT'LINE(X)=TMP'LINE1 : &
X=X+1
IF X>128 &
PRINT : PRINT "Maximum number of lines reached" : &
X=X-1 : &
RETURN
GOTO ENTRY'LOOP
NEW'FILE:
PRINT
PRINT FILENAME;" does not exist - Create it? ";
INPUT LINE QUEST
QUEST=UCS(QUEST)
IF QUEST[1;1]#"Y" STAT="NOF" : RETURN
OPEN #1,FILENAME,OUTPUT
CLOSE #1
RETURN
HELP:
PRINT
PRINT " > HELP SCREEN < "
PRINT "L - List file contents"
PRINT "P - List file by page"
PRINT "A - Add lines to end of file"
PRINT "E - Edit an existing line"
PRINT "I - Insert a line into file"
PRINT "D - Delete a line from file"
PRINT "S - Search for specified string"
PRINT "R - Replace strings"
PRINT "Q - Quit, no update"
PRINT "F - Finish, update disk file"
PRINT "H - This Help screen"
RETURN
REPLACE:
RPLC'STRING=QUEST[3,LEN(QUEST)]
! INPUT LINE "Original string> ";RPLC'STRING
IF RPLC'STRING="" RETURN
INPUT LINE "Replacement string> ";NEW'STRING
XCALL STRIP,RPLC'STRING
XCALL STRIP,NEW'STRING
GET'ALL'SOME:
INPUT LINE "A)ll or S)ome? ";QUEST
QUEST=UCS(QUEST)
IF QUEST#"A" AND QUEST#"S" GOTO GET'ALL'SOME
I=0 : FND=0
REPLACE'MAIN'LOOP:
I=I+1 : J=1
IF I>X RETURN
REPLACE'SECONDARY'LOOP:
J=INSTR(J,EDIT'LINE(I),RPLC'STRING)
IF J=0 GOTO REPLACE'MAIN'LOOP
STRT=J : LINENO=I : FND=1
CALL REPLACE'ROUTINE
IF UCS(QUEST2)="Q" RETURN
J=J+1
GOTO REPLACE'SECONDARY'LOOP
REPLACE'ROUTINE:
RPLC'START=INSTR(STRT,EDIT'LINE(LINENO),RPLC'STRING)
IF RPLC'START=0 RETURN
Z=0
FOR Y = 1 TO RPLC'START
IF ASC(EDIT'LINE(LINENO)[Y;1])=9 Z=Z+7
NEXT Y
IF QUEST="S" &
PRINT LINENO USING "###";" ";EDIT'LINE(LINENO) : &
CALL PRINT'MARK : &
INPUT LINE "Replace this string? ";QUEST2 : &
IF UCS(QUEST2[1;1])#"Y" RETURN
IF RPLC'START>1 &
TMP'LINE1=EDIT'LINE(LINENO)[1,RPLC'START-1] &
ELSE &
TMP'LINE1=""
SEARCH:
RPLC'STRING=QUEST[3,LEN(QUEST)]
! INPUT LINE "Search string> ";RPLC'STRING
IF RPLC'STRING="" RETURN
XCALL STRIP,RPLC'STRING
I=0 : FND=0
SEARCH'MAIN'LOOP:
I=I+1 : J=1
IF I>X RETURN
SEARCH'SECONDARY'LOOP:
J=INSTR(J,EDIT'LINE(I),RPLC'STRING)
IF J=0 GOTO SEARCH'MAIN'LOOP
STRT=J : LINENO=I : FND=1
CALL SEARCH'ROUTINE
IF QUEST2[1;1]="N" RETURN
J=J+1
GOTO SEARCH'SECONDARY'LOOP
SEARCH'ROUTINE:
RPLC'START=INSTR(STRT,EDIT'LINE(LINENO),RPLC'STRING)
IF RPLC'START=0 RETURN
Z=0
FOR Y = 1 TO LEN(EDIT'LINE(LINENO))
IF ASC(EDIT'LINE(LINENO)[Y;1])=9 Z=Z+7
NEXT Y
PRINT LINENO USING "###";" ";EDIT'LINE(LINENO)
CALL PRINT'MARK
INPUT LINE "Find Next String? ";QUEST2
QUEST2=UCS(QUEST2)
RETURN
FINISH:
XCALL RENAME,FILENAME,BCKFILE
PRINT "Saving ";FILENAME;
OPEN #1,FILENAME,OUTPUT
FOR I = 1 TO X
PRINT #1,EDIT'LINE(I)
IF I/10=INT(I/10) PRINT ".";
NEXT I
CLOSE #1 : PRINT
GOTO BACKOUT