10 'RENUMBER.BAS PROGRAM RENUMBERS BASIC PROGRAMS. BASIC PROGRAM MUST BE SAVED IN ASCII FORMAT OR EDITED WITH A WORD PROCESSOR SUCH AS WORDSTAR. 20 OPTION BASE 1:DIM LINE.NUMBERS(1200,2) 30 CLS$=CHR$(26) 40 GOTO 2790 'MENU 50 ' SUBROUTINE RENUMBERS FILE 60 PRINT CLS$ 70 PRINT TAB(32)"R E N U M B E R":PRINT 80 LINE INPUT "FILE NAME TO RENUMBER ";FILE.NAME$ 90 LINE INPUT "BEGIN AT LINE NUMBER (RETURN FOR BEGINNING) ";A$ 100 BEGIN=VAL(A$) 110 LINE INPUT "END AT LINE NUMBER (RETURN FOR END) ";A$ 120 END.LINE=VAL(A$) 130 LINE INPUT "NEW STARTING LINE NUMBER ";A$ 140 NEWSTART=VAL(A$) 150 LINE INPUT "INCREMENT (DEFAULT=10) ";A$ 160 INCR%=VAL(A$) 170 MOVE%=0 180 RESET 190 OPEN "I",1,FILE.NAME$ 200 IF MID$(FILE.NAME$,2,1) <> ":" THEN DRIVE$="" ELSE DRIVE$=LEFT$(FILE.NAME$,2) 210 NEWFILE$=DRIVE$+"REN.REN" 220 OPEN "O",2,NEWFILE$ 230 GOSUB 2560 'FIRST PASS 240 IF BEGIN=0 THEN START%=1:GOTO 290 250 FIND=BEGIN 260 GOSUB 1070 270 IF FOUND%=0 THEN PRINT"BEGINNING LINE NUMBER NOT FOUND":GOTO 2120 280 START%=FOUND% 290 IF END.LINE=0 THEN FINISH%=NUM.LINES%:GOTO 340 300 FIND=END.LINE 310 GOSUB 1070 'FIND LINE NUMBER 320 IF FOUND%=0 THEN PRINT"ENDING LINE NUMBER NOT FOUND":GOTO 2120 330 FINISH%=FOUND% 340 IF NEWSTART=0 THEN NEWSTART=10 350 IF INCR%=0 THEN INCR%=10 360 ' ASSIGN NEW LINE NUMBERS 370 LNUM=NEWSTART 380 FOR NUMBER%=1 TO NUM.LINES% 390 IF (NUMBER% < START%) OR (NUMBER% > FINISH%) THEN LINE.NUMBERS(NUMBER%,2)=LINE.NUMBERS(NUMBER%,1):GOTO 420 400 LINE.NUMBERS(NUMBER%,2)=LNUM 410 LNUM=LNUM+INCR% 420 NEXT 430 ' ERROR CHECKING FOR SEQUENCE. ALL SEQUENCE ERRORS ARE FATAL. 440 IF MOVE%=1 THEN 480 450 IF FINISH%=NUM.LINES% THEN 530 460 IF (LINE.NUMBERS(FINISH%,2)) < (LINE.NUMBERS(FINISH%+1,2)) THEN 530 470 PRINT "ERROR IN SEQUENCE":GOTO 2120 480 IF MT%=NUM.LINES% THEN 530 490 IF (LINE.NUMBERS(FINISH%,2)) > (LINE.NUMBERS(MT%,2)) THEN 530 500 PRINT "ERROR IN SEQUENCE":GOTO 2120 510 ' NEWFILE$ AND TEMPFILE ARE NOW INPUT FILES. FILE.NAME$ IS OUTPUT FILE. 520 ' READ EACH LINE FROM NEWFILE$ OR TEMPFILE$, CHANGE LINE NUMBER REFRENCES, AND WRITE LINE TO FILE.NAME$. 530 OPEN "I",1,NEWFILE$ 540 IF MOVE%=1 THEN OPEN "I",3,TEMPFILE$ 550 OPEN "O",2,FILE.NAME$ 560 PRINT:PRINT 570 PRINT "BEGIN PASS TWO" 580 PRINT:PRINT "LINE NUMBER 00000"; 590 ' 600 IF START% < MT% THEN PARSED%=(FINISH%-START%)+1 ELSE PARSED%=1 610 IF MOVE%=0 THEN WHILE NOT(EOF(1)) ELSE WHILE NOT(EOF(1) AND EOF(3)) 620 IF MOVE%=0 THEN 660 630 IF (EOF(3)) OR (PARSED% < MT%) THEN 660 640 LINE INPUT #3,LI$ 650 GOTO 670 660 LINE INPUT #1,LI$ 670 CHAR%=1 680 NEWLINE$="" 690 FIND=VAL(LI$) 'FIND ITS NEW LINE NUMBER 700 IF FIND=0 THEN 840 710 GOSUB 1070 720 FOR X%=1 TO 5:PRINT CHR$(8);:NEXT 730 PRINT USING "#####";FIND; 740 PARSED%=PARSED%+1 750 GOSUB 2030 'AND PUT IT IN NEWLINE$ 760 SPACE%=0 770 ' FIND END OF LINE NUMBER 780 WHILE SPACE%=0 790 IF (MID$(LI$,CHAR%,1) < "0") OR (MID$(LI$,CHAR%,1) > "9") THEN SPACE%=1 800 CHAR%=CHAR%+1 810 WEND 820 NEWLINE$=NEWLINE$+MID$(LI$,CHAR%-1,1) 830 ' READ LINE ONE CHARACTER AT A TIME TO FIND WORDS. WORDS ARE PASSED TO A SUBROUTINE TO CHECK FOR LINE NUMBER REFRENCES. 840 TOKEN$="" 850 WHILE CHAR% <= LEN(LI$) 860 CHAR$=MID$(LI$,CHAR%,1) 870 NEWLINE$=NEWLINE$+CHAR$ 880 IF (CHAR$ >= "a") AND (CHAR$ <= "z") THEN CHAR$=CHR$(ASC(CHAR$)-32) 890 CHAR%=CHAR%+1 900 ' IF CHAR$ IS NOT ALPHANUMERIC OR "." THEN WE KNOW WE HAVE REACHED THE END OF A WORD. 910 IF ((CHAR$ >= "A") AND (CHAR$ <= "Z")) OR ((CHAR$ >= "0") AND (CHAR$ <= "9")) OR (CHAR$=".") THEN TOKEN$=TOKEN$+CHAR$:GOTO 950 920 IF (CHAR$ = "'") OR (CHAR$ = "?") OR (CHAR$ = CHR$(34)) THEN TOKEN$=CHAR$ 930 GOSUB 1170 'FIND IF WE NEED TO CHANGE LINE NUMBER 940 TOKEN$="" 950 WEND 960 ' THE LINE HAS BEEN PARSED. NOW WRITE IT TO THE FILE. 970 PRINT #2, NEWLINE$ 980 IF MOVE%=1 THEN WEND:GOTO 1000 990 WEND 1000 CLOSE 1010 KILL NEWFILE$ 1020 IF MOVE%=1 THEN RETURN 1030 PRINT:PRINT CHR$(7)"RENUMBER COMPLETED" 1040 LINE INPUT "PRESS RETURN TO CONTINUE ";A$ 1050 RETURN 1060 ' BINARY SEARCH. FINDS THE VARIABLE FIND IN THE ARRAY LINE.NUMBERS. IF FOUND, THE ARRAY INDEX IS RETURNED IN FOUND%. IF NOT, 0 IS RETURNED IN FOUND%. 1070 FIRST%=1:LAST%=NUM.LINES%:FOUND%=0 1080 WHILE (FIRST% <= LAST%) AND (FOUND% = 0) 1090 MID%=INT((FIRST%+LAST%)/2) 1100 IF LINE.NUMBERS(MID%,1) < FIND THEN FIRST%=MID%+1:GOTO 1130 1110 IF LINE.NUMBERS(MID%,1) > FIND THEN LAST%=MID%-1:GOTO 1130 1120 FOUND%=MID% 1130 WEND 1140 RETURN 1150 ' SUBROUTINE IS ENTERED WHEN TOKEN FOUND. IF TOKEN$ IS ONE OF OUR SPECIAL WORDS, THE PROPER SUBROUTINE IS CALLED TO PROCESS IT. 1160 ' 1170 IF (TOKEN$="GOTO") OR (TOKEN$="GOSUB") OR (TOKEN$="RESUME") OR (TOKEN$="ERL") THEN GOSUB 1250:RETURN 1180 IF TOKEN$="ON" THEN GOSUB 1390:RETURN 1190 IF (TOKEN$="THEN") OR (TOKEN$="ELSE") THEN GOSUB 1620:RETURN 1200 IF (TOKEN$="REM") OR (TOKEN$="'") THEN GOSUB 1780:RETURN 1210 IF (TOKEN$="?") OR (TOKEN$="PRINT") OR (TOKEN$="INPUT") THEN GOSUB 1810:RETURN 1220 IF TOKEN$=CHR$(34) THEN GOSUB 1930 1230 RETURN 1240 ' SUBROUTINE CHANGES LINE NUMBER REFRENCES FOR GOTO, GOSUB, RESUME, AND ERL. 1250 CHAR$=MID$(LI$,CHAR%,1) 1260 WHILE (CHAR$=" ") OR (CHAR$=" ") 1270 CHAR%=CHAR%+1 1280 CHAR$=MID$(LI$,CHAR%,1) 1290 WEND 1300 FIND=VAL(MID$(LI$,CHAR%)) 1310 GOSUB 1070 1320 IF FOUND% > 0 THEN GOSUB 2030:GOTO 1330 ELSE GOSUB 2060 1330 WHILE (CHAR$ >= "0") AND (CHAR$ <= "9") 1340 CHAR%=CHAR%+1 1350 CHAR$=MID$(LI$,CHAR%,1) 1360 WEND 1370 RETURN 1380 ' ROUTINE CHANGES LINE NUMBERS FOR ON..GOTO, ON..GOSUB AND ON ERROR GOTO STATEMENTS. 1390 CHAR$=MID$(LI$,CHAR%,1) 1400 DONE%=0:TOK$="" 1410 WHILE DONE% = 0 1420 NEWLINE$=NEWLINE$+CHAR$ 1430 IF ((CHAR$ >= "A") AND (CHAR$ <= "Z")) OR ((CHAR$ >= "0") AND (CHAR$ <= "9")) THEN TOK$=TOK$+CHAR$:GOTO 1450 1440 IF ((CHAR$=" ") OR (CHAR$=" ")) AND ((TOK$="GOTO") OR (TOK$="GOSUB")) THEN DONE%=1 ELSE TOK$="" 1450 CHAR%=CHAR%+1 1460 CHAR$=MID$(LI$,CHAR%,1) 1470 WEND 1480 CHAR$=MID$(LI$,CHAR%,1) 1490 WHILE (CHAR$ <> ":") AND (CHAR% <= LEN(LI$)) 1500 FIND=VAL(MID$(LI$,CHAR%)) 1510 GOSUB 1070 1520 IF FOUND% > 0 THEN GOSUB 2030:GOTO 1530 ELSE GOSUB 2060 1530 WHILE (((CHAR$ >= "0") AND (CHAR$ <= "9")) OR (CHAR$ = " ")) AND (CHAR% < LEN(LI$)) 1540 CHAR%=CHAR%+1 1550 CHAR$=MID$(LI$,CHAR%,1) 1560 WEND 1570 IF (CHAR$ = ":") OR (CHAR$= ",") THEN NEWLINE$=NEWLINE$+CHAR$ 1580 CHAR%=CHAR%+1:CHAR$=MID$(LI$,CHAR%,1) 1590 WEND 1600 RETURN 1610 ' SUBROUTINE CHECKS FOR LINE NUMBER REFRENCES AFTER A THEN STATEMENT. 1620 CHAR$=MID$(LI$,CHAR%,1) 1630 WHILE (CHAR$=" ") OR (CHAR$=" ") 'TAB 1640 NEWLINE$=NEWLINE$+CHAR$ 1650 CHAR%=CHAR%+1 1660 WEND 1670 IF (CHAR$ < "0") OR (CHAR$ > "9") THEN RETURN 1680 FIND=VAL(MID$(LI$,CHAR%)) 1690 GOSUB 1070 1700 IF FOUND% > 0 THEN GOSUB 2030:GOTO 1720 ELSE GOSUB 2060 1710 NEWLINE$=NEWLINE$+"'"+STR$(FIND) 1720 WHILE (CHAR$ >= "0") AND (CHAR$ <= "9") 1730 CHAR%=CHAR%+1 1740 CHAR$=MID$(LI$,CHAR%,1) 1750 WEND 1760 RETURN 1770 ' ROUTINE PARSES REM STATEMENTS. ALL CHARACTERS ON THE LINE ARE PLACED IN NEWLINE$. 1780 NEWLINE$=NEWLINE$+MID$(LI$,CHAR%) 1790 CHAR%=LEN(LI$)+1 1800 RETURN 1810 ' ROUTINE PARSES PRINT AND INPUT STATEMENTS. ALL CHARACTERS WITHIN THE STATEMENT ARE PLACED IN NEWLINE$. 1820 QUOTE%=0 1830 IF CHAR$ = ":" THEN DONE%=1 ELSE DONE%=0:CHAR$=MID$(LI$,CHAR%,1) 1840 WHILE (CHAR% < LEN(LI$)) AND (DONE%=0) 1850 IF (CHAR$=CHR$(34)) THEN IF QUOTE%=0 THEN QUOTE%=1 ELSE QUOTE%=0 1860 IF (CHAR$=":") AND (QUOTE%=0) THEN DONE%=1 1870 NEWLINE$=NEWLINE$+CHAR$ 1880 CHAR%=CHAR%+1 1890 CHAR$=MID$(LI$,CHAR%,1) 1900 WEND 1910 RETURN 1920 ' SUBROUTINE PARSES QUOTATION MARKS. ALL CHARACTERS UP TO AND INCLUDING THE NEXT QUOTATION MARK ARE PLACED IN NEWLINE$. 1930 CHAR$=MID$(LI$,CHAR%,1) 1940 WHILE (CHAR$ <> CHR$(34)) AND (CHAR% < LEN(LI$)) 1950 NEWLINE$=NEWLINE$+CHAR$ 1960 CHAR%=CHAR%+1 1970 CHAR$=MID$(LI$,CHAR%,1) 1980 WEND 1990 NEWLINE$=NEWLINE$+CHAR$ 2000 CHAR%=CHAR%+1 2010 RETURN 2020 ' SUBROUTINE ADDS LINE NUMBER TO NEWLINE$ 2030 NEWLINE$=NEWLINE$+MID$(STR$(LINE.NUMBERS(FOUND%,2)),2) 2040 RETURN 2050 ' SUBROUTINE ENTERED IF LINE NUMBER UNDEFINED. ADDS REMARK WITH UNDEFINED LINE NUMBER AND WRITES ERROR MESSAGE TO SCREEN. 2060 NEWLINE$=NEWLINE$+"'"+MID$(STR$(FIND),2) 2070 PRINT 2080 PRINT "UNDEFINED LINE NUMBER"FIND" IN"VAL(NEWLINE$) 2090 PRINT:PRINT "LINE NUMBER 00000"; 2100 RETURN 2110 ' SUBROUTINE ENTERED IF SEQUENCE ERROR FOUND 2120 CLOSE 2130 LINE INPUT "PRESS RETURN TO CONTINUE ";A$ 2140 SEQ%=1 2150 KILL NEWFILE$ 2160 RETURN 2170 ' SUBROUTINE MOVES BLOCK OF LINES. 2180 PRINT CLS$ 2190 PRINT TAB(36)"M O V E" 2200 PRINT 2210 LINE INPUT "FILE NAME ";FILE.NAME$ 2220 LINE INPUT "BEGINNING LINE NUMBER ";A$ 2230 BEGIN=VAL(A$) 2240 LINE INPUT "ENDING LINE NUMBER ";A$ 2250 END.LINE=VAL(A$) 2260 LINE INPUT "MOVE TO ";A$ 2270 MOVE.TO=VAL(A$) 2280 LINE INPUT "INCREMENT ";A$ 2290 INCR%=VAL(A$) 2300 MOVE%=1 2310 OPEN "I",1,FILE.NAME$ 2320 IF MID$(FILE.NAME$,2,1) <> ":" THEN DRIVE$="" ELSE DRIVE$=LEFT$(FILE.NAME$,2) 2330 NEWFILE$=DRIVE$+"REN.REN" 2340 TEMPFILE$=DRIVE$+"REN.TMP" 2350 OPEN "O",2,NEWFILE$ 2360 OPEN "O",3,TEMPFILE$ 2370 GOSUB 2560 'FIRST PASS 2380 IF BEGIN=0 THEN START%=1:GOTO 2410 2390 FIND=BEGIN:GOSUB 1070 2400 IF FOUND%=0 THEN PRINT "BEGINNING LINE NUMBER NOT FOUND":GOTO 2120 ELSE START%=FOUND% 2410 IF END.LINE=0 THEN FINISH%=NUM.LINES%:GOTO 2440 2420 FIND=END.LINE:GOSUB 1070 2430 IF FOUND%=0 THEN PRINT "ENDING LINE NUMBER NOT FOUND":GOTO 2120 ELSE FINISH%=FOUND% 2440 FIND=MOVE.TO:GOSUB 1070 2450 IF FOUND%=0 THEN PRINT "TARGET LINE NUMBER NOT FOUND":GOTO 2120 ELSE MT%=FOUND% 2460 IF INCR%=0 THEN INCR%=10 2470 SEQ%=0 2480 NEWSTART=MOVE.TO+INCR% 2490 GOSUB 370 'RENUMBER 2500 KILL TEMPFILE$ 2510 PRINT 2520 IF SEQ%=1 THEN RETURN 2530 LINE INPUT "MOVE COMPLETED. PRESS RETURN TO CONTINUE ";A$ 2540 RETURN 2550 ' READ EACH LINE OF SOURCE, PLACE LINE NUMBER IN ARRAY AND PLACE FIXED LINE IN REN.REN, OR REN.TMP. 2560 NUM.LINES%=0 2570 PRINT:PRINT "BEGIN PASS ONE":PRINT 2580 PRINT:PRINT "LINE NUMBER 00000"; 2590 WHILE NOT EOF(1) 2600 A$="" 2610 LINE INPUT #1, LI$ 2620 ' FOR..NEXT LOOP IN 240-260 SETS THE HIGH BIT OF EACH CHARACTER IN THE FILE TO 0. THIS WAS NECESSARY IN ORDER TO PROCESS WORDSTAR FORMAT FILES. 2630 FOR X%=1 TO LEN(LI$) 2640 A$=A$+CHR$((ASC(MID$(LI$,X%,1)) AND &H7F)) 2650 NEXT X% 2660 LASTLINE=VAL(A$) 2670 IF (MOVE%=0) OR ((LASTLINE < BEGIN) OR (LASTLINE > END.LINE)) THEN PRINT#2,A$:GOTO 2690 2680 PRINT #3,A$ 2690 IF LASTLINE=0 THEN 2740 2700 NUM.LINES%=NUM.LINES%+1 2710 FOR X%=1 TO 5:PRINT CHR$(8);:NEXT 2720 PRINT USING "#####";LASTLINE; 2730 LINE.NUMBERS(NUM.LINES%,1)=LASTLINE 2740 WEND 2750 PRINT:PRINT 2760 PRINT NUM.LINES%" LINES" 2770 CLOSE 2780 RETURN 2790 ' MAIN MENU ROUTINE. SELECTIONS ARE: 1. RENUMBER FILE 2. MOVE SUBROUTINE 3. EXIT 2800 PRINT CLS$ 2810 PRINT TAB(24)"JIM'S FABULOUS RENUMBER PROGRAM":PRINT:PRINT 2820 PRINT TAB(30)"1. RENUMBER FILE" 2830 PRINT TAB(30)"2. MOVE SUBROUTINE " 2840 PRINT TAB(30)"3. EXIT" 2850 PRINT 2860 LINE INPUT "ENTER YOUR CHOICE ";A$ 2870 A%=VAL(LEFT$(A$,1)) 2880 IF (A% < 1) OR (A% > 3) THEN 2860 2890 ON A% GOSUB 60,2180,2910 2900 GOTO 2800 2910 END