1 REM MENU driven file utility "FILEUT.BA" 2 ' Thanks to OVERHOLT'S RFU.100 and RENUM.100 3 ' Some mod's to the MENU and additions to correct BYTES remaining. 4 ' The program is MENU driven with prompts 5 ' SUBLIB.CO (SUBLDR.100) needed for file sort 6 ' Basic program uses 7936 BYTES 7 ' Comments on SIG [75665,44] welcome 10 CLEAR256,62299:LOADM"SUBLIB":POKE62959,MAXFILES:IFMAXFILES<2THENMAXFILES=2 20 CLEARFRE(0)/2:DEFINTA-Z:ONERRORGOTO1420 30 DIMFL$(21),FL(21),KY$(255),PL(5):ES$=CHR$(27):SCREEN,0 40 LB$=" Dir Find Sort Name "+"Copy Kill Renum Menu" 50 PRINTES$;"U";:CLS:PRINT@280,ES$;"T";LB$ 60 PRINT@92,"RAM File Utility";:PRINT@134,"Version 1.2"; 70 PRINT@209,"by MICHAEL ";:PRINT"L CRANER";:LINE(50,12)-(182,50),1,B 80 RS=0:ONKEYGOSUB120,300,390,630,700,1080,100,110:KEYON 90 PRINT@8,DATE$;" ";DAY$;" ";:PRINTTIME$;:IFRSTHEN50ELSE90 100 PRINTES$;"U";:CLS:CLEAR256,MAXRAM:MAXFILES=PEEK(62959):GOTO1510 110 CLEAR256,MAXRAM:MAXFILES=PEEK(62959):MENU 120 KEYOFF:PL(1)=-1705:LC=5:PRINTES$;"U";:CLS 130 PRINT@280,ES$;"T";:PRINT"Push to scroll.":PRINT@0,"File Name Address Length CRC" 140 FORLV=0TO1:LV=0:GOSUB1380:IFPL(0)THEN170 150 LV=1:PRINT@280,ES$;"U";"***END***":PRINT"Push for Summary."; 160 GOSUB1360:GOTO210 170 PRINTNM$;:PRINTUSING"########";AD!;:PRINT" ";:PRINTUSING"######";LN; 180 FL(1)=AD!-65536:FL(2)=LN:CALLHIMEM+2,2,VARPTR(FL(0)):X!=FL(3)-65536*(FL(3)<0):PRINTUSING"########";X!; 190 IFLC>0THENPRINT:LC=LC-1:GOTO210 200 GOSUB1360:I=CSRLIN:PRINT@40,ES$;"M";:PRINT@I*40,""; 210 NEXTLV:RM!=PEEK(64434)+PEEK(64435)*256:X!=PEEK(64192)+PEEK(64193)*256:TL!=RM!-X! 220 PRINTES$;"U";:CLS:PRINT"Total RAM used: ";TL! 230 PRINT"Next free address: ";RM!:X!=HIMEM 240 PRINT"Bytes available: ";:PRINTX!-TL!-32924 250 IFPEEK(64175)=0THENX$="Undefined":GOTO280 260 X$="":FORI=0TO15:X=PEEK(64175+I):IFX=13THEN280ELSEX$=X$+CHR$(X) 270 NEXTI 280 PRINT"IPL: ";X$:GOSUB1350 290 RS=-1:RETURN 300 KEYOFF:PRINTES$;"U";:CLS 310 PRINT"Enter string to search for:":LINEINPUTS$:PL(1)=-1705 320 FORLV=0TO1:LV=0:GOSUB1380:IFNM$=""THENLV=1:GOTO380 330 CLS:PRINT"Searching ";NM$ 340 FL(1)=AD!-65536:FL(2)=VARPTR(S$):FL(3)=LN:CALLHIMEM+1,1,VARPTR(FL(0)) 350 IFNOTFL(0)THENPRINT"Not found.":GOTO380 360 X!=FL(1)+65536:PRINT"Found at byte";:PRINTX!-AD!:BEEP 370 GOSUB1350 380 NEXTLV:RS=-1:RETURN 390 KEYOFF:PR$="Select DO. file to Sort." 400 GOSUB1140:IFNM$=""THENRS=-1:RETURN 410 IFRIGHT$(NM$,3)<>".DO"THENBEEP:GOTO400 420 IF(FRE("")-400)>LNTHEN450 430 CLS:PRINT"Not enough memory to sort ";NM$:GOSUB1350 440 RS=-1:RETURN 450 CLS:PRINT"Sorting file ";NM$:INPUT"Sort on which field";LC:IFLC<1ORLC>100THEN450 460 PRINT@80,"";:LINEINPUT"Delimiter? ";S$:IFLEN(S$)<>1THEN460 470 OPENNM$FORINPUTAS1:PRINT@280,"Phase 1 - Read keys."; 480 FORLV=1TO255:R$=CHR$(LV):LINEINPUT#1,X$:I=0:F=0 490 FORX=0TOLC-1 500 I=F+1:F=INSTR(I,X$,S$):IFF=0THENF=LEN(X$)+1:X=LC 510 NEXTX 520 KY$(LV)=MID$(X$,I,F-I)+R$ 530 IFEOF(1)THEN550 540 NEXTLV:PRINT@160,"Too many records!":PRINT"The first 255 will be sorted.";:LV=255 550 CLOSE#1:PRINT@280,"Phase 2 - Sort keys."; 560 PL(1)=LV:PL(2)=VARPTR(KY$(1)):CALLHIMEM+1,0,VARPTR(PL(0)) 570 PRINT@280,"Phase 3 - Rewrite file.";:R$=STRING$(LV,0) 580 FORI=1TOLV:L=ASC(RIGHT$(KY$(I),1)):MID$(R$,L,1)=CHR$(I):KY$(I)="":NEXTI 590 OPENNM$FORINPUTAS1:FORI=1TOLV:L=ASC(MID$(R$,I,1)):LINEINPUT#1,KY$(L):NEXTI 600 CLOSE#1:KILLNM$:OPENNM$FOROUTPUTAS1 610 FORI=1TOLV:PRINT#1,KY$(I):KY$(I)="":NEXTI 620 CLOSE:RS=-1:RETURN 630 KEYOFF:PR$="Select file to Rename." 640 GOSUB1140:IFNM$=""THENRS=-1:RETURN 650 CLS:PRINT"File selected: ";NM$:PRINT:PRINT"New name: ";:LINEINPUTX$ 660 IFX$=""THEN690 670 IFLEN(X$)>9THEN650 680 NAMENM$ASX$ 690 RS=-1:RETURN 700 KEYOFF:PR$="Select file to Copy." 710 GOSUB1140:IFNM$=""THENRS=-1:RETURN 720 IFRIGHT$(NM$,3)<>".DO"THENBEEP:GOTO710 730 CLS:PRINT"File selected: ";NM$:PRINT:PRINT"Copy to: ";:LINEINPUTDS$ 740 CLS:PRINT"Copy Options:":PRINT"<1> As-Is, no changes":PRINT"<2> Remove tabs, spaces" 750 PRINT"<3> Text replacement":PRINT"<4> Remove CR/LF's" 760 PRINT@280,"Which option? ";:PRINT"< >";:PRINT@296,ES$;"P"; 770 X$=INKEY$:IFX$=""THEN760ELSECO=INSTR("1234",X$):IFCO=0THEN760ELSEPRINTX$;ES$;"Q"; 780 OPENNM$FORINPUTAS1:OPENDS$FOROUTPUTAS2:CLS:IFCO<>3THEN800 790 S$="":R$="":LINEINPUT"Search for: ";S$:LINEINPUT"Replace with: ";R$:IFS$=""THENCO=1 800 X=0:PRINT@160,"Bytes copied: ";:PRINT@280,SPACE$(39);:IFEOF(1)THEN1070 810 ONCOGOTO820,880,930,1000 820 LN=LN-1:LC=FIX(LN/255):IFLC=0THEN860 830 FORLV=1TOLC:PRINT#2,INPUT$(255,1); 840 X=X+255:PRINT@174,X;:LN=LN-255 850 NEXTLV 860 IFLN=0THEN870ELSEPRINT#2,INPUT$(LN,1);:X=X+LN 870 GOTO1070 880 LC=-1:FORLV=0TO1:LV=0:I=ASC(INPUT$(1,1)):IFI=13THENLC=-1:GOTO910 890 IFI=34THENLC=NOTLC:GOTO910 900 IFI=32ORI=9THENIFLCTHEN920 910 PRINT#2,CHR$(I);:X=X+1:PRINT@174,X;:IFEOF(1)THENLV=1 920 NEXTLV:GOTO1070 930 RM$=S$:LC=LEN(S$):FORI=1TOLC 940 MID$(RM$,I,1)=INPUT$(1,1):IFEOF(1)THENRM$=LEFT$(RM$,I):GOTO990 950 NEXTI 960 IFRM$=S$THENPRINT#2,R$;:X=X+LEN(R$)+2:PRINT@174,X;:GOTO930 970 PRINT#2,LEFT$(RM$,1);:X=X+1:PRINT@174,X; 980 MID$(RM$,1,LC-1)=MID$(RM$,2):MID$(RM$,LC,1)=INPUT$(1,1):IFNOTEOF(1)THEN960 990 PRINT#2,RM$;:X=X+LEN(RM$):PRINT@174,X;:GOTO1070 1000 LC=0:FORLV=0TO1:LV=0:LINEINPUT#1,X$ 1010 IFLEN(X$)>0THEN1040 1020 PRINT#2,"":IFLCTHENPRINT#2,"":X=X+4ELSEX=X+2 1030 LC=0:GOTO1050 1040 PRINT#2,X$;" ";:X=X+LEN(X$)+1:LC=-1 1050 PRINT@174,X;:IFEOF(1)THENLV=1:PRINT#2,"" 1060 NEXTLV 1070 CLOSE:PRINT@174,X+1;:GOSUB1350:RS=-1:RETURN 1080 KEYOFF:PR$="Select file to Kill." 1090 GOSUB1140:IFNM$=""THENRS=-1:RETURN 1100 BEEP:PRINT@280,"Ok to Kill ";:PRINTNM$;" (Y/N)? ";ES$;"P"; 1110 X$=INKEY$:IFX$=""THEN1110ELSEI=INSTR("YyNn",X$):IFI=0THEN1110 1120 PRINTMID$("YYNN",I,1);ES$;"Q";:IFI>2THEN1090 1130 KILLNM$:GOTO1090 1140 PRINTES$;"U";:CLS:PRINT@280,ES$;"T";:PRINTPR$;CHR$(12); 1150 PL(1)=-1705:FX=0 1160 FORLV=0TO1:LV=0:GOSUB1380:IFNOTPL(0)THENLV=1:GOTO1180 1170 FL$(FX)=NM$:FL(FX)=PL(1):PRINTNM$;" ";:FX=FX+1:IF(FXMOD3)=0THENPRINT 1180 NEXTLV 1190 FL$(FX)="->Quit<-":PRINTFL$(FX):FX=FX+1 1200 L=0:H=0:RM$="":FORI=28TO31:RM$=RM$+CHR$(I):NEXTI 1210 PRINT@L*40+H*12,ES$;"p";:PRINTFL$(L*3+H);ES$;"q"; 1220 X$=INKEY$:IFX$=""THEN1220ELSEIFX$=CHR$(13)THEN1330 1230 I=INSTR(RM$,X$):IFI=0THEN1220ELSEX=L*3+H 1240 ONIGOTO1250,1270,1290,1310 1250 X=X+1:IFX>=FXTHENX=0 1260 GOTO1320 1270 X=X-1:IFX<0THENX=FX-1 1280 GOTO1320 1290 IFX>2THENX=X-3:ELSE1220 1300 GOTO1320 1310 IFX+3 to ";:PRINT"continue."; 1360 IFINKEY$<>CHR$(13)THEN1360 1370 RETURN 1380 NM$="":L%=PEEK(64434):H%=PEEK(64435):AD!=L%+H%*256:LN=0:PL%(2)=VARPTR(NM$) 1390 CALLHIMEM+1,3,VARPTR(PL(0)):IFNOTPL%(0)THEN1410 1400 FT=PL%(3):AD!=PL%(4)+65536:LN=PL%(5) 1410 RETURN 1420 PRINTES$;"U";CHR$(12);:PRINT"Error trap entered.":PRINT 1430 IFERL>=4000ANDERL<6000THEN1460 1440 PRINT"Probable programming ";:PRINT"or RAM error.":PRINT 1450 PRINT"Diagnostic:":PRINT"Error #";ERR;"in line";:PRINTERL:END 1460 IFERR<>7THEN1480 1470 PRINT"Out of memory!";:PRINT:GOTO1490 1480 PRINT"Improper or illegal ";:PRINT"file name.":PRINT 1490 PRINT"The function has been ";:PRINT"aborted." 1500 PRINT@280,"Push to ";:PRINT"restart.";:GOSUB1360:RUN 1510 CLS:CLEAR 2000:MAXFILES=2 1520 HT$=CHR$(8):QU$=CHR$(34):AP$=CHR$(39) 1530 ON ERROR GOTO 2460 1540 F$="":LINEINPUT "ENTER DO. File TO RENUMBER? ";F$ 1550 ER%=0:OPEN F$ FOR INPUT AS 1 1560 IF ER% THEN 1630 1570 IF F$="" THEN MENU 1580 ON ERROR GOTO 1510 1590 INPUT "Start line number";N 1600 INPUT "Increment";L 1610 IF L<=0 THEN L=10 1620 IF N<=0 THEN N=10 1630 NL%=0 1640 IF EOF(1) THEN 1670 1650 LINE INPUT#1,L$ 1660 NL%=NL%+1:GOTO 1640 1670 CLOSE 1680 DIM LN(NL%-1) 1690 OPEN F$ FOR INPUT AS 1 1700 FOR I%=0 TO NL%-1 1710 LINE INPUT#1,L$ 1720 J%=1 1730 IF J%<=LEN(L$) THEN IF MID$(L$,J%,1)>="0" AND MID$(L$,J%,1)<="9" THEN J%=J%+1:GOTO 1730 1740 LN(I%)=VAL(LEFT$(L$,J%-1)) 1750 NEXT I% 1760 CLOSE 1770 OPEN F$ FOR INPUT AS 1 1780 OPEN "temp$$" FOR OUTPUT AS 2 1790 FOR I%=0 TO NL%-1 1800 LINE INPUT#1,L$ 1810 LP%=1:O$="" 1820 GOSUB 1970:OL%=I%:GOSUB 2450:O$=W$ 1830 IF LP%>LEN(L$) THEN 1920 1840 GOSUB 2170:IF LP%>LEN(L$) THEN 1920 1850 R$=RIGHT$(W$,4) 1860 IF R$="GOTO" OR RIGHT$(W$,5)="GOSUB" THEN GOSUB 2220:GOTO 1830 1870 IF R$="DATA" THEN GOSUB 2260:GOTO 1830 1880 IF R$="EDIT" OR R$="LIST" OR R$="LLIST" THEN GOSUB 2320:GOTO 1830 1890 IF R$="THEN" OR R$="ELSE" OR RIGHT$(W$,6)="RESUME" OR RIGHT$(W$,3)="RUN" THEN GOSUB 2370:GOTO 1830 1900 IF RIGHT$(W$,3)="REM" THEN O$=O$+W$+MID$(L$,LP%):W$="":GOTO 1920 1910 O$=O$+W$:GOTO 1830 1920 O$=O$+W$:PRINT#2,O$ 1930 NEXT I% 1940 CLOSE:IF INSTR(F$,".")=0 THEN F$=F$+".DO" 1950 KILL F$:NAME "temp$$.do" AS F$ 1960 GOTO10 1970 W$="":NU%=0 1980 IF LP%>LEN(L$) THEN RETURN 1990 C$=MID$(L$,LP%,1) 2000 IF C$>="0" AND C$<="9" THEN 2050 2010 IF C$>="A" AND C$<="Z" THEN 2090 2020 IF C$=QU$ THEN GOSUB 2130:GOTO 1980 2030 IF C$=AP$ THEN O$=O$+MID$(L$,LP%):LP%=LEN(L$)+1:RETURN 2040 O$=O$+C$:LP%=LP%+1:GOTO 1980 2050 W$=C$:NU%=-1 2060 LP%=LP%+1:IF LP%>LEN(L$) THEN RETURN 2070 C$=MID$(L$,LP%,1):IF C$>="0" AND C$<="9" THEN W$=W$+C$:GOTO 2060 2080 RETURN 2090 W$=C$ 2100 LP%=LP%+1:IF LP%>LEN(L$) THEN RETURN 2110 C$=MID$(L$,LP%,1):IF C$>="A" AND C$<="Z" THEN W$=W$+C$:GOTO 2100 2120 RETURN 2130 O$=O$+C$ 2140 LP%=LP%+1:IF LP%>LEN(L$) THEN RETURN 2150 C$=MID$(L$,LP%,1):O$=O$+C$:IF C$<>QU$ THEN 2140 2160 LP%=LP%+1:RETURN 2170 GOSUB 1970:IF NU% THEN O$=O$+W$:GOTO 2170 2180 RETURN 2190 IF LP%>LEN(L$) THEN RETURN 2200 C$=MID$(L$,LP%,1):IF C$=" " OR C$=HT$ THEN O$=O$+C$:LP%=LP%+1:GOTO 2190 2210 RETURN 2220 IF MID$(L$,LP%,1)="," THEN O$=O$+",":LP%=LP%+1:GOSUB 2190:IF LP%>LEN(L$) THEN RETURN:ELSE 2220 2230 GOSUB 2370:IF NOT NU% THEN RETURN 2240 GOSUB 2190:IF LP%>LEN(L$) THEN RETURN 2250 IF MID$(L$,LP%,1)="," THEN 2220 2260 O$=O$+W$:W$="" 2270 IF LP%>LEN(L$) THEN RETURN 2280 C$=MID$(L$,LP%,1) 2290 IF C$=":" THEN RETURN 2300 IF C$=QU$ THEN GOSUB 2130:GOTO 2270 2310 O$=O$+C$:LP%=LP%+1:GOTO 2270 2320 O$=O$+W$:W$="":GOSUB 2190:IF LP%>LEN(L$) THEN RETURN 2330 IF C$<>"-" THEN GOSUB 2370:IF LP%>LEN(L$) THEN RETURN 2340 GOSUB 2190:IF LP%>LEN(L$) THEN RETURN 2350 IF C$="-" THEN O$=O$+C$:LP%=LP%+1:GOSUB 1920 2360 RETURN 2370 O$=O$+W$:W$="":NU%=0:GOSUB 2190:IF LP%>LEN(L$) THEN RETURN 2380 IF C$<"0" OR C$>"9" THEN RETURN 2390 GOSUB 1970 2400 NO=VAL(W$):LO%=0:HI%=NL%-1 2410 OL%=(LO%+HI%)\2:IF NO=LN(OL%) THEN GOSUB 2450:O$=O$+W$:W$="":RETURN 2420 IF NO