10 REM *********************** 15 REM 20 REM TEXT FILE EDITOR / VIEWER 25 REM 30 REM BY MICHAEL O'MALLEY 35 REM 40 REM *********************** 50 REM 100 D$ = CHR$ (4) : REM CTRL-D 105 W = 1000 : REM 1000 LINES ! 110 DIM W$(W) : REM 1000 LINES ! 115 L = 0 : REM NUMBER OF LINES LOADED 130 F$ = "" : REM CURRENT FILE 140 P$ = "N/A" : REM CURRENT DIRECTORY 150 R$ = CHR$ (13) : REM CARRIAGE RETURN 155 EO$ = CHR$ (26) : REM END-OF-FILE 160 LS = 23 : REM LINES ON SCREEN 170 FC = 0 : REM HAS FILE CHANGED 0=NO,1=YES 175 IL = 0 : REM CURRENT INSERTION POINT IN ARRAY 180 R = 0 : REM A COUNTER 200 REM 201 REM ********************** 202 REM MAIN MENU 203 REM ********************** 205 TEXT : HOME 210 PRINT "---------------------------------------" 215 PRINT " TEXT FILE EDITOR / VIEWER" 220 PRINT " BY MICHAEL O'MALLEY" 225 PRINT "---------------------------------------" 230 PRINT " DIR : "P$; 235 PRINT ", FILE : "F$; 237 IF F$ < > "" AND FC = 0 THEN PRINT " (NOCHG)" 238 IF F$ < > "" AND FC = 1 THEN PRINT " (CHG)" 239 IF F$ = "" THEN PRINT 240 PRINT " "L" LINES LOADED (CAPACITY = "W")" 243 PRINT "---------------------------------------"; 245 PRINT : PRINT " F. CHANGE CURRENT FILE" 250 PRINT : PRINT " D. DISPLAY FILE TO SCREEN" 255 PRINT : PRINT " DE. DELETE LINE(S)" 260 PRINT : PRINT " IN. INSERT LINE(S)" 265 PRINT : PRINT " CD. CHANGE DIRECTORY (PRO-DOS ONLY)" 270 PRINT : PRINT " C. CATALOG DISK" 272 PRINT : PRINT " S. SAVE FILE TO DISK" 275 PRINT : PRINT " Q. QUIT PROGRAM" 285 PRINT : PRINT " PLEASE ENTER YOUR CHOICE : "; 290 A$ = "" : INPUT A$ 295 IF A$ = "F" THEN GOSUB 500 : REM CHANGE CURRENT FILE. GOTO USED INSTEAD OF GOSUB TO AVOID THE PROBLEM WITH ONERR AND EMPTY FILES. 300 IF A$ = "D" THEN GOSUB 700 : REM DISPLAY FILE TO SCREEN 305 IF A$ = "DE" THEN GOSUB 900 : REM DELETE LINE(S) 310 IF A$ = "IN" THEN GOSUB 1100 : REM INSERT LINE(S) 315 IF A$ = "CD" THEN GOSUB 1400 : REM CHANGE DIRECTORY (PRO-DOS ONLY) 320 IF A$ = "C" THEN GOSUB 1500 : REM CATALOG DISK 322 IF A$ = "S" THEN GOSUB 9400 : REM SAVE FILE TO DISK 325 IF A$ = "Q" THEN GOSUB 9900 : REM QUIT PROGRAM 330 IF A$ < > "F" AND A$ < > "D" AND A$ < > "DE" AND A$ < > "IN" AND A$ < > "CD" AND A$ < > "C" AND A$ < > "S" AND A$ < > "Q" THEN PRINT : PRINT "*ERROR: INVALID INPUT !!" : GOTO 285 : REM BACK TRY AGAIN ... 499 GOTO 200 : REM DISPLAY THE MENU 500 REM 501 REM ********************** 502 REM CHANGE CURRENT FILE 503 REM ********************** 505 REM THIS IS CALLED VIA A GOTO INSTEAD OF A GOSUB TO AVOID THE PROBLEM WITH ONERR AND EMPTY FILES. ONERR GOTO SEEMS TO HAVE PROBLEMS WHEN INSIDE A PIECE OF CODE THAT IS ENTERED VIA A GOSUB. 510 GOSUB 9500 : REM IF CURRENT FILE HAS BEEN CHANGED THEN PROMPT USER TO SAVE IT BEFORE ALLOWING THEM TO SELECT A NEW FILE. 515 PRINT : PRINT 520 INPUT "ENTER FILE : "; F$ 522 REM POKE 42769,234 : REM CANCEL ALL DOS ERROR MESSAGES. 525 ONERR GOTO 580 : REM ON ANY ERRORS ... 527 L = 0 529 PRINT 530 PRINT D$; "OPEN "; F$ 532 PRINT "OPEN "; F$ 535 PRINT D$; "READ "; F$ 536 PRINT "READ "; F$ 537 PRINT "READING FILE ... " 540 FOR I = 1 TO W 545 INPUT W$(I) 555 L = L + 1 : REM INCREMENT LINES LOADED 570 NEXT I 580 PRINT 585 PRINT D$; "CLOSE "; F$ 590 PRINT L" LINES LOADED !" 595 GOSUB 9700 : REM HIT ANY KEY TO CONTINUE 597 FC = 0 : REM FILE HAS NOT CHANGED ! 599 GOTO 200 700 REM 701 REM ********************** 702 REM DISPLAY FILE TO SCREEN 703 REM ********************** 710 TEXT : HOME 715 IF F$ = "" THEN PRINT : PRINT " << NO FILE HAS BEEN SELECTED >>" : GOTO 790 720 IF L = 0 THEN PRINT : PRINT " << FILE IS EMPTY >>" : GOTO 790 725 C = 0 730 FOR I = 1 TO L 735 PRINT W$(I) 740 C = C + 1 750 IF C = LS THEN C = 0 : GOSUB 9700 : REM HIT ANY KEY TO CONTINUE 760 NEXT I 790 GOSUB 9700 : REM HIT ANY KEY TO CONTINUE 799 RETURN 900 REM 901 REM ********************** 902 REM DELETE LINE(S) 903 REM ********************** 915 PRINT : PRINT 920 PRINT " DELETE FROM LINE (1-"; L; ", -1=QUIT) : "; 922 INPUT SL 923 IF SL = - 1 THEN GOTO 990 925 IF SL < 0 THEN PRINT : PRINT "*ERROR: CANNOT DELETE PRIOR TO START !" : GOTO 915 930 IF SL > L THEN PRINT : PRINT "*ERROR: CANNOT DELETE AFTER END !" : GOTO 915 940 PRINT : PRINT " DELETE TO LINE ("; SL; "-"; L; ", -1=QUIT) : "; 942 INPUT EL 943 IF EL = - 1 THEN GOTO 990 945 IF EL < SL THEN PRINT : PRINT "*ERROR: CANNOT DELETE PRIOR TO START LINE !" : GOTO 940 950 IF EL > L THEN PRINT : PRINT "*ERROR: CANNOT DELETE AFTER END !" : GOTO 940 960 FOR IL = EL TO SL STEP - 1 970 GOSUB 1000 : REM SHUFFLE DOWN DATA TO REMOVE THIS LINE 980 NEXT IL 985 FC = 1 : REM FILE HAS CHANGED ! 990 GOSUB 9700 : REM HIT ANY KEY TO CONTINUE 999 RETURN 1000 REM 1001 REM ********************** 1002 REM SHUFFLE DOWN DATA TO REMOVE THIS LINE. 1005 REM ********************** 1010 ONERR GOTO 1090 : REM ON ANY ERRORS ... 1035 IF L = IL THEN GOTO 1090 : REM NOTHING TO SHUFFLE DOWN 1040 IF IL > L THEN GOTO 1099 : REM WE HAVE A PROBLEM HOUSTON !! 1062 REM PRINT : PRINT "**DEBUG: L = "; L; ", IL = "; IL 1065 FOR R = IL TO L 1070 W$(R) = W$(R + 1) 1080 NEXT R 1090 L = L - 1 : REM DECREASE THE NUMBER OF LINES IN THE ARRAY 1095 REM PRINT "DONE SHFFLING !" 1099 RETURN 1100 REM 1101 REM ********************** 1102 REM INSERT LINE(S) 1103 REM ********************** 1110 TEXT : HOME 1112 IF F$ = "" THEN PRINT : PRINT " << NO FILE HAS BEEN SELECTED >>" : GOTO 1290 1114 IF L = 0 THEN GOTO 1150 : REM FILE IS EMPTY - JUST INSERT LINES AT START 1116 IF L = W THEN PRINT : PRINT "*ERROR: ARRAY SIZE ("; W; ") REACHED !" : GOTO 1290 1118 PRINT " INSERT LINES AFTER WHICH LINE (0-"; L; ") "; 1120 INPUT IL 1135 IF IL < 0 THEN PRINT : PRINT "*ERROR: CANNOT INSERT LINE PRIOR TO START !" : GOTO 1115 1140 IF IL > L THEN IL = L : PRINT " INSERTING LINES AT END-OF-FILE" 1150 PRINT 1152 PRINT " *** ENTER LINES NOW *** " 1154 PRINT " (DO NOT ENTER ANY COMMAS !)" 1156 PRINT " (ENTER --Q TO QUIT)" 1160 PRINT : PRINT (IL + 1); ". "; 1165 INPUT NL$ 1170 IF NL$ = "--Q" THEN GOTO 1290 : REM USER WANTS TO QUIT 1175 REM GOSUB 715 : REM DISPLAY FILE TO SCREEN 1185 GOSUB 1300 : REM SHUFFLE UP DATA TO MAKE ROOM FOR NEW LINE 1190 W$(IL) = NL$ 1192 REM GOSUB 715 : REM DISPLAY FILE TO SCREEN 1195 FC = 1 : REM FILE HAS CHANGED ! 1200 GOTO 1160 : REM ASK FOR ANOTHER LINE OF DATA 1290 GOSUB 9700 : REM HIT ANY KEY TO CONTINUE 1299 RETURN 1300 REM 1301 REM ********************** 1302 REM SHUFFLE UP DATA IN ARRAY TO MAKE ROOM FOR THE NEW LINE. 1305 REM ********************** 1310 ONERR GOTO 1390 : REM ON ANY ERRORS ... 1315 IF L = W THEN PRINT : PRINT "*ERROR: ARRAY SIZE ("; W; ") EXCEEDED !" : GOTO 1399 1320 L = L + 1 : REM INCREASE THE NUMBER OF LINES IN THE ARRAY 1325 IL = IL + 1 : REM MOVE TO THE NEXT FREE LINE 1335 IF L = IL THEN GOTO 1390 : REM NOTHING TO SHUFFLE DOWN 1350 SP = IL 1360 IF IL < = 1 THEN SP = 2 1362 REM PRINT : PRINT "**DEBUG: L = "; L; ", IL = "; IL 1365 FOR R = L TO SP STEP - 1 1370 W$(R) = W$(R - 1) 1372 REM PRINT (R-1); " -> "; R; " "; W$(R-1) 1380 NEXT R 1390 W$(IL) = "" 1395 REM PRINT "DONE SHFFLING !" 1399 RETURN 1400 REM 1401 REM ********************** 1402 REM CHANGE DIRECTORY (PRO-DOS ONLY). THERE IS NO SUCH THING AS DIRECTORIES IN NORMAL APPLE DOS. HOW DO YOU KNOW IF YOU ARE RUNNING UNDER PRO-DOS ??? 1403 REM ********************** 1410 TEXT : HOME 1415 ONERR GOTO 1470 : REM ON ANY ERRORS ... 1420 REM THE PRO-DOS "PREFIX" COMMAND CHANGES THE DIRECTORY. 1425 PRINT : PRINT 1430 PRINT " WARNING: DIRECTORIES ARE PRO-DOS ONLY !" 1435 PRINT " ENTER NOTHING IF YOU ARE NOT SURE !!" 1440 PRINT : PRINT 1445 INPUT "INPUT PREFIX "; P$ 1450 IF P$ = "" THEN GOTO 1470 1460 PRINT D$; "PREFIX "; P$ 1470 GOSUB 9700 : REM HIT ANY KEY TO CONTINUE 1499 RETURN 1500 REM 1501 REM ********************** 1502 REM CATALOG DISK 1503 REM ********************** 1510 TEXT : HOME 1520 PRINT D$; "CATALOG" 1530 GOSUB 9700 : REM HIT ANY KEY TO CONTINUE 1599 RETURN 9400 REM 9401 REM ********************** 9402 REM SAVE FILE TO DISK. 9403 REM ********************** 9410 IF FC = 0 THEN PRINT : PRINT " << FILE HAS NOT CHANGED >>" : GOTO 9490 : REM FILE HAS NOT CHANGED - SO DO NOT PROMPT USER TO SAVE IT ! 9415 ONERR GOTO 9490 : REM ON ANY ERRORS ... 9420 PRINT "SAVING "; F$; " ... " 9425 PRINT D$; "OPEN "; F$ 9430 PRINT D$; "WRITE "; F$ 9450 FOR I = 1 TO L 9460 PRINT W$(I) 9470 NEXT I 9475 PRINT D$; "CLOSE "; F$ 9480 PRINT "CLOSE "; F$ 9485 PRINT L" LINES SAVED !" 9490 GOSUB 9700 : REM HIT ANY KEY TO CONTINUE 9495 FC = 0 : REM FILE HAS NOT CHANGED ! 9499 RETURN 9500 REM 9501 REM ********************** 9502 REM IF FILE HAS BEEN CHANGED THEN PROMPT USER TO SAVE IT. 9503 REM ********************** 9510 IF FC = 0 THEN GOTO 9599 : REM FILE HAS NOT CHANGED - SO DO NOT PROMPT USER TO SAVE IT ! 9520 PRINT : PRINT 9525 INPUT "SAVE CHANGED FILE TO DISK (Y/N) "; AN$ 9530 IF AN$ = "Y" THEN GOSUB 9400 : REM SAVE FILE 9599 RETURN 9700 REM 9701 REM ********************** 9702 REM HIT ANY KEY TO CONTINUE 9703 REM ********************** 9710 PRINT : PRINT 9715 PRINT " << HIT ANY KEY TO CONTINUE >> "; 9720 GET H1$ 9730 PRINT 9790 REM TEXT : HOME 9799 RETURN 9800 REM 9801 REM ********************** 9802 REM ON ANY ERRORS 9803 REM - SUCH AS END-OF-FILE, OR, 9804 REM - FILE DOES NOT EXIST 9805 REM THEN CLOSE THE FILE. 9806 REM ********************** 9810 PRINT : PRINT "DOS ERROR CODE = " PEEK (222) : REM GET DOS ERROR CODE 9825 PRINT "CLOSE "; F$ 9830 PRINT D$; "CLOSE "; F$ 9899 RETURN 9900 REM 9901 REM ********************** 9902 REM EXIT PROGRAM 9903 REM ********************** 9905 TEXT : HOME 9910 GOSUB 9500 : REM IF FILE HAS BEEN CHANGED THEN PROMPT USER TO SAVE IT. 9970 PRINT : PRINT 9975 PRINT "THANKS FOR USING TEXT EDITOR / VIEWER" 9980 PRINT : PRINT 9985 PRINT "DON'T FORGET : CONTACT MIKE O'MALLEY" 9990 PRINT " FOR PROGRAM UPDATES" 9995 PRINT : PRINT 9999 END