200 PRINT : PRINT TAB( 13)"ALAN H. STEIN": PRINT : PRINT "** COPYRIGHT 1984 BY MICROSPARC, INC. **"
210 PRINT "WHAT IS THE NAME OF YOUR FILE?"
220 PRINT : PRINT "TYPE IN A NAME AND PRESS <RETURN>"
230 VTAB 19: CALL -958: INPUT "";FM$
235 IF FM$ = "" OR VAL(FM$) >0 OR LEN(FM$) >10 THEN PRINT CHR$(7): VTAB 19: CALL -958: PRINT "FILE NAMES MUST BE NO LONGER THAN 10": PRINT "CHARACTERS AND MUST START WITH A LETTER.": PRINT "PRESS A KEY TO TRY AGAIN.";: GET FM$: PRINT : GOTO 230
240 TM = FN TB( LEN(FM$)): REM CALCULATE TAB STOP FOR CENTERING FILE NAME
250 FK$ = FM$ +".KEYS"
260 FS$ = FM$ +".STAT"
270 FF$ = FM$ +".FREE"
280 HOME : VTAB 10: HTAB 17
290 PRINT "CONFIRM"
300 PRINT TAB( 17)"------"
310 PRINT : PRINT TAB( 11)"YOUR FILE NAME IS"
320 PRINT : PRINT TAB( TM)FM$
330 VTAB 22: HTAB 13
340 PRINT "ANSWER Y OR N"
350 HTAB 19: GET A$
360 IF A$ = "Y" THEN PRINT : GOTO 390
370 IF A$ = "N" THEN PRINT : GOTO 170
380 GOTO 350
390 RR = 0
400 GOSUB 4870: REM READ STATISTICS FILE
410 IF RR = 0 THEN 730
420 HOME : HTAB 15
430 PRINT "YOUR FILE"
440 PRINT TAB( TM)FM$
450 PRINT TAB( 11)"DOES NOT YET EXIST"
460 VTAB 10: HTAB 3
470 PRINT "DO YOU WANT TO CREATE A NEW FILE?"
480 VTAB 22: HTAB 13
490 PRINT "ANSWER Y OR N"
500 HTAB 19: GET A$
510 IF A$ = "Y" THEN PRINT : GOTO 540
520 IF A$ = "N" THEN PRINT : PRINT D$"CLOSE": PRINT D$"DELETE"FS$: CLEAR : GOTO 90
530 GOTO 500
540 RR = 1
550 NR = -1:PT = -1:FR = -1
560 HOME : HTAB TM -6
570 PRINT "FILE NAME: "FM$
580 VTAB 10: HTAB 5
590 PRINT "WHAT WILL THE RECORD LENGTH BE?"
600 VTAB 22: CALL -958
610 PRINT "TYPE IN THE LENGTH AND PRESS <RETURN>"
620 INPUT "";LN$:LN = VAL(LN$): IF LN <3 THEN PRINT "LENGTH MUST BE 3 OR MORE": PRINT "PRESS ANY KEY TO TRY AGAIN": GET A$: PRINT : GOTO 600
630 HOME : HTAB TM -6
640 PRINT "FILE NAME: "FM$
650 VTAB 10: HTAB 6
660 PRINT "CONFIRM: RECORD LENGTH IS ";LN
670 VTAB 22: HTAB 13
680 PRINT "ANSWER Y OR N"
690 HTAB 19: GET A$
700 IF A$ = "Y" THEN PRINT : GOTO 730
710 IF A$ = "N" THEN PRINT : GOTO 560
720 GOTO 690
730 REM *****
740 REM SET UP THE FREE LIST, STATISTICS AND ARRAYS
750 REM *****
760 RR = 1
770 HOME : VTAB 10: HTAB 10
780 PRINT "SETTING UP FREE LIST"
790 IF PT > = 49 THEN 920
800 P1 = PT +1
810 PT = 49
820 PRINT D$"OPEN ";FF$;",L6"
830 FOR I = P1 TO PT
840 I1 = NR +I +1 -P1
850 PRINT D$"WRITE ";FF$;",R";I
860 PRINT I1
870 NEXT I
880 PRINT D$"CLOSE";FF$
890 NR = NR +PT +1 -P1
900 REM WRITE STATISTICS FILE
910 GOSUB 4770
920 REM SET UP ARRAYS
930 DIM K$(NR),P(NR),L(NR),R(NR)
940 REM *****
950 REM SET UP THE MAIN MENU
960 REM *****
970 HOME : HTAB 5
980 PRINT " FILE CABINET"
990 PRINT : PRINT TAB( 15)"FILE NAME"
1000 PRINT : PRINT TAB( TM)FM$
1010 VTAB 10
1020 PRINT TAB( 7)"PRESS"; TAB( 17)"IN ORDER TO"
1030 PRINT TAB( 7)"-----"; TAB( 17)"-- ----- --"
1040 PRINT
1050 PRINT TAB( 7)" 1"; TAB( 15)"SEARCH FOR A RECORD"
2400 PRINT : PRINT "TYPE IN THE KEY AND PRESS <RETURN>"
2410 INPUT "";A$: IF A$ = "" AND COUNT = -1 THEN 970
2420 IF A$ = "" THEN GOTO 2620: REM FINISHED
2430 COUNT = COUNT +1: IF COUNT = 99 THEN PRINT "MAXIMUM NUMBER OF FIELDS!": PRINT "PRESS ANY KEY TO CONTINUE";: GET A$: PRINT : GOTO 2620
2440 F$(COUNT) = A$
2450 HOME
2460 FOR I = 0 TO COUNT
2470 PRINT F$(I)
2480 NEXT I
2490 PRINT : PRINT "TYPE THE NEXT FIELD AND PRESS <RETURN>"
2500 PRINT "WHEN FINISHED, JUST PRESS <RETURN>"
2510 GOTO 2410
2520 REM NO ROOM ON FILE
2530 HOME : VTAB 10: HTAB 7
2540 PRINT "THERE IS NO MORE ROOM IN THE FILE"
2550 PRINT : PRINT TAB( 6)"IN ORDER TO ADD MORE RECORDS"
2560 PRINT : PRINT TAB( 8)"YOU MUST EXIT THE PROGRAM"
2570 PRINT TAB( 13)"THEN RERUN IT"
2580 VTAB 21
2590 PRINT "PRESS ANY KEY TO RETURN TO MENU";
2600 GET A$: PRINT
2610 GOTO 940: REM RETURN TO THE MAIN MENU
2620 REM FIND THE NEXT FREE RECORD
2630 PRINT D$"OPEN ";FF$;",L6"
2640 PRINT D$"READ ";FF$;",R";PT
2650 INPUT RN
2660 PRINT D$"CLOSE ";FF$
2670 PT = PT -1
2680 IF FR < > -1 THEN GOTO 2730
2690 REM FIRST RECORD
2700 FR = RN
2710 P(RN) = -1
2720 GOTO 2980: REM WRITE ON DISK
2730 REM NOT FIRST RECORD -- LOCATE IN TREE
2740 T = RN:RN = FR:P(RN) = -1: REM SAVE RECORD NUMBER
2750 IF K$(RN) = "" THEN GOSUB 4970: REM GET KEY FROM DISK
2760 IF LEFT$(F$(0),30) = LEFT$(K$(RN),30) THEN 2790
2770 IF F$(0) <K$(RN) THEN 2890
2780 IF F$(0) >K$(RN) THEN 2920
2790 REM DUPLICATE KEY
2800 RN = T
2810 HOME : HTAB 16
2820 PRINT "YOUR KEY"
2830 PRINT : PRINT TAB( FN TB( LEN(F$(0))))F$(0)
2840 PRINT : PRINT TAB( 11)"IS A DUPLICATE KEY"
2850 VTAB 20: CALL -958
2860 PRINT "TYPE IN A NEW KEY AND PRESS <RETURN>"
2870 INPUT "";F$(0): IF F$(0) = "" THEN 2850
2880 GOTO 2740
2890 REM GO TO THE LEFT ON THE TREE
2900 IF L(RN) < > -1 THEN P(L(RN)) = RN:RN = L(RN): GOTO 2750
2910 L(RN) = T: GOTO 2950: REM PREVIOUS NODE FOUND -- WRITE LINKS ON DISK
2920 REM GO TO THE RIGHT ON THE TREE
2930 IF R(RN) < > -1 THEN P(R(RN)) = RN:RN = R(RN): GOTO 2750
2940 R(RN) = T: REM PREVIOUS LINK FOUND
2950 GOSUB 5050: REM WRITE LINKS ON DISK
2960 P(T) = RN
2970 RN = T
2980 L(RN) = -1:R(RN) = -1
2990 K$(RN) = F$(0)
3000 GOSUB 7870: REM WRITE RECORD TO FILE
3010 GOSUB 4770: REM WRITE NEW STATISTICS
3020 HOME : HTAB 10
3030 PRINT "THE RECORD WITH KEY"
3040 PRINT TAB( FN TB( LEN(K$(RN))))K$(RN)
3050 PRINT TAB( 12)"HAS BEEN ENTERED"
3060 GOTO 1480: REM DISPLAY SUB-MENU
3070 REM *****
3080 REM PRINT THE ENTIRE FILE
3090 REM *****
3100 HOME : VTAB 8: HTAB 14
3110 PRINT "PRINTING FILE"
3120 VTAB 16: HTAB 7
3130 PRINT "SEARCHING FOR FIRST RECORD"
3140 REM FIND THE FIRST RECORD
3150 RN = FR:P(RN) = -1
3160 T = RN
3170 IF K$(RN) = "" THEN GOSUB 4970: REM GET KEY FROM DISK
3180 IF L(RN) = -1 THEN 3210: REM FIRST RECORD FOUND
3190 P(L(RN)) = RN:RN = L(RN)
3200 GOTO 3160
3210 REM RECORD FOUND
3220 GOSUB 7270: REM PRINT RECORD
3230 GOSUB 5160: REM FIND NEXT RECORD
3240 IF RN < > -1 THEN GOTO 3210: REM PRINT NEXT RECORD
3250 REM END OF FILE REACHED -- RETURN TO THE MAIN MENU
3260 GOTO 940
3270 REM *****
3280 REM DISPLAY STATISTICS
3290 REM *****
3300 HOME : HTAB TB
3310 PRINT FM$
3320 VTAB 8
3330 PRINT : PRINT TAB( 5)"RECORD LENGTH:",LN
3340 PRINT : PRINT TAB( 5)"NUMBER OF RECORDS:",NR -PT
3350 PRINT : PRINT TAB( 5)"FREE RECORDS:",PT +1
3360 VTAB 21
3370 PRINT " PRESS ANY KEY TO RETURN TO MENU"
3380 HTAB 19: GET A$: PRINT
3390 GOTO 940
3400 REM *****
3410 REM REWRITE FILE
3420 REM *****
3430 HOME : HTAB TB: PRINT FM$
3440 IF NR -PT <2 THEN PRINT "THIS FILE HAS LESS THAN 2 RECORDS AND": PRINT "MAY NOT BE REWRITTEN": PRINT "PRESS ANY KEY TO RETURN TO MENU": GET A$: PRINT : GOTO 970
3450 VTAB 8
3460 PRINT TAB( 14)"REWRITE FILE"
3470 PRINT : PRINT "PRESENT RECORD LENGTH:",LN
3480 PRINT : PRINT "TYPE IN THE NEW RECORD LENGTH ": PRINT "AND PRESS <RETURN> "
3490 PRINT : PRINT "TO VOID THE REWRITE NOW --": PRINT TAB( 5)"TYPE IN 0 FOR THE NEW RECORD LENGTH"
3500 INPUT "";LM
3510 IF LM <3 THEN GOTO 940: REM RETURN TO THE MAIN MENU
3520 HOME : VTAB 10: HTAB 13
3530 PRINT "REWRITING FILE"
3540 PRINT : PRINT TAB( TM)FM$
3550 TM$ = "DATA.TEMP":TK$ = "KEY.TEMP"
3560 TR = NR -PT -1
3570 DIM TP(PT): REM BLANK RECORDS
3580 DIM KT$(TR): REM TEMPORARY KEYS
3590 REM PUT BLANK RECORDS IN ARRAY
3600 PRINT D$"OPEN ";FF$;",L6"
3610 FOR I = 0 TO PT
3620 PRINT D$"READ ";FF$;",R";I
3630 INPUT TP(I)
3640 NEXT I
3650 PRINT D$"CLOSE ";FF$
3660 REM SORT BLANK RECORDS
3670 FOR I = 1 TO PT
3680 FOR J = I TO 1 STEP -1
3690 IF TP(J) >TP(J -1) THEN 3740
3700 TEMP = TP(J)
3710 TP(J) = TP(J -1)
3720 TP(J -1) = TEMP
3730 NEXT J
3740 NEXT I
3750 REM WRITE RECORD 0
3760 RN = -1:RB = 0
3770 GOSUB 4430: REM READ NEXT RECORD
3780 REM WRITE KEY AND LINKS IN NEW FILE
3790 KT$(0) = K$(RN):L(0) = -1:R(0) = -1
3800 Z = 0
3810 HOME : VTAB 5: HTAB 13
3820 PRINT "WRITING RECORD "
3830 VTAB 10
3840 PRINT "NUMBER"; TAB( 10)0
3850 PRINT "KEY"; TAB( 10)KT$(0)
3860 GOSUB 4560: REM WRITE RECORD
3870 REM NOW DO THE OTHER RECORDS
3880 FOR N = 1 TO TR
3890 GOSUB 4430: REM READ NEXT RECORD
3900 REM WRITE RECORD N IN NEW FILE
3910 KT$(N) = K$(RN)
3920 REM SET UP LINKS
3930 L(N) = -1:R(N) = -1
3940 T = 0
3950 KEY$ = KT$(N)
3960 IF KEY$ <KT$(T) THEN 4000
3970 IF R(T) < > -1 THEN T = R(T): GOTO 3960
3980 R(T) = N
3990 GOTO 4020
4000 IF L(T) < > -1 THEN T = L(T): GOTO 3960
4010 L(T) = N
4020 REM WRITE LINKS ON DISK
4030 HOME : VTAB 5: HTAB 13
4040 PRINT "WRITING RECORD"
4050 VTAB 10
4060 PRINT "NUMBER"; TAB( 10)N
4070 PRINT "KEY"; TAB( 10)KT$(N)
4080 Z = T: GOSUB 4500: REM WRITE PREVIOUS LINK
4090 Z = N: GOSUB 4560: REM WRITE RECORD
4100 NEXT N
4110 REM CONFIRM FILE REWRITE
4120 HOME : VTAB 8: HTAB 16
4130 PRINT "THE FILE"
4140 PRINT : PRINT TAB( TM)FM$
4150 PRINT : PRINT TAB( 11)"HAS BEEN REWRITTEN"
4160 PRINT : PRINT TAB( 5)"IT IS NOW IN A TEMPORARY FILE"
4170 VTAB 20: HTAB 3
4180 PRINT "DO YOU WANT TO COMPLETE THE REWRITE?"
4190 PRINT : PRINT TAB( 13)"ANSWER Y OR N"
4200 HTAB 19: GET A$
4210 IF A$ = "Y" THEN PRINT : GOTO 4240
4220 IF A$ = "N" THEN PRINT : GOTO 4370
4230 GOTO 4200
4240 HOME : VTAB 10: HTAB 6
4250 PRINT "DELETING AND RENAMING FILES"
4260 PRINT : PRINT D$"DELETE ";FM$
4270 PRINT D$"RENAME ";TM$;",";FM$
4280 PRINT D$"DELETE ";FK$
4290 PRINT D$"RENAME ";TK$;",";FK$
4300 PRINT D$"DELETE ";FF$
4310 LN = LM:NR = TR:PT = -1:FR = 0
4320 GOSUB 4770: REM WRITE STATISTICS FILE
4330 HOME : VTAB 10: HTAB 11
4340 PRINT "REWRITE IS COMPLETE"
4350 PRINT : PRINT TAB( 11)"PROGRAM MAY BE RERUN"
4360 GOTO 8190: REM EXIT PROGRAM
4370 REM ABORT REWRITE
4380 HOME : VTAB 10: HTAB 10
4390 PRINT "REWRITE BEING ABORTED"
4400 PRINT : PRINT D$"DELETE ";TM$
4410 PRINT D$"DELETE ";TK$
4420 GOTO 8190: REM EXIT PROGRAM
4430 REM FIND THE NEXT RECORD
4440 RN = RN +1
4450 IF RB >PT THEN 4470
4460 IF TP(RB) = RN THEN RB = RB +1: GOTO 4440
4470 IF K$(RN) = "" THEN GOSUB 4690: REM READ KEY FROM DISK
4480 GOSUB 7730
4490 RETURN
4500 REM WRITE KEY AND LINKS ON DISK
4510 PRINT D$"OPEN ";TK$;",L44"
4520 PRINT D$"WRITE ";TK$;",R";Z
4530 PRINT Q$;KT$(Z);R$;L(Z);R$;R(Z)
4540 PRINT D$"CLOSE ";TK$
4550 RETURN
4560 REM WRITE RECORD ON DISK
4570 GOSUB 4500: REM WRITE KEY AND LINKS
4580 PRINT D$"OPEN ";TM$;",L";LM
4590 PRINT D$"WRITE ";TM$;",R";Z
4600 LT = 1
4610 FOR I = 1 TO COUNT
4620 LT = LT + LEN(F$(I)) +2
4630 IF LT >LM THEN 4660: REM TRUNCATE LONG RECORD
4640 PRINT Q$;F$(I)
4650 NEXT I
4660 PRINT
4670 PRINT D$"CLOSE ";TM$
4680 RETURN
4690 REM *****
4700 REM READ KEY
4710 REM *****
4720 PRINT : PRINT D$"OPEN ";FK$;",L44"
4730 PRINT D$"READ ";FK$;",R";RN
4740 INPUT K$(RN)
4750 PRINT D$"CLOSE ";FK$
4760 RETURN
4770 REM *****
4780 REM WRITE STATISTICS FILE
4790 REM *****
4800 HOME : VTAB 10: HTAB 8
4810 PRINT "WRITING STATISTICS FILE"
4820 PRINT D$"OPEN ";FS$
4830 PRINT D$"WRITE ";FS$
4840 PRINT LN;R$;NR;R$;PT;R$;FR
4850 PRINT D$"CLOSE ";FS$
4860 RETURN
4870 REM *****
4880 REM READ STATISTICS FILE
4890 REM *****
4900 HOME : VTAB 10: HTAB 8
4910 PRINT "READING STATISTICS FILE"
4920 PRINT D$"OPEN ";FS$
4930 PRINT D$"READ ";FS$
4940 IF RR < >2 THEN INPUT LN,NR,PT,FR
4950 PRINT D$"CLOSE ";FS$
4960 RETURN
4970 REM *****
4980 REM READ KEY AND LINKS
4990 REM *****
5000 PRINT : PRINT D$"OPEN ";FK$;",L44"
5010 PRINT D$"READ ";FK$;",R";RN
5020 INPUT K$(RN),L(RN),R(RN)
5030 PRINT D$"CLOSE ";FK$
5040 RETURN
5050 REM *****
5060 REM WRITE KEY AND LINKS ON DISK
5070 REM *****
5080 IF LEN(K$(RN)) >30 THEN K$(RN) = LEFT$(K$(RN),30)
5090 HOME : VTAB 10: HTAB 5
5100 PRINT "WRITING KEY AND LINKS ON DISK"
5110 PRINT D$"OPEN ";FK$;",L44"
5120 PRINT D$"WRITE "FK$;",R";RN
5130 PRINT Q$;K$(RN);R$;L(RN);R$;R(RN)
5140 PRINT D$"CLOSE ";FK$
5150 RETURN
5160 REM *****
5170 REM FIND THE NEXT RECORD
5180 REM *****
5190 REM TAKE RECORD NUMBER RN
5200 REM CHANGE RN TO NEXT RECORD NUMBER IF ONE EXISTS
5210 REM OTHERWISE CHANGE RN TO -1
5220 IF K$(RN) = "" THEN GOSUB 4970
5230 IF R(RN) = -1 THEN GOTO 5300: REM NO RIGHT LINK
5240 REM RIGHT LINK EXISTS
5250 P(R(RN)) = RN:RN = R(RN)
5260 IF K$(RN) = "" THEN GOSUB 4970
5270 IF L(RN) = -1 THEN RETURN
5280 P(L(RN)) = RN:RN = L(RN)
5290 GOTO 5260
5300 REM NO RIGHT LINK EXISTS
5310 T3 = RN
5320 RN = P(RN)
5330 IF RN = -1 THEN RETURN
5340 IF L(RN) = T3 THEN RETURN : REM T3 WAS A LEFT LINK SO RN IS NEXT
5350 GOTO 5310
5360 REM *****
5370 REM FIND THE PREVIOUS RECORD
5380 REM *****
5390 REM TAKE RECORD NUMBER RN
5400 REM CHANGE RN TO PREVIOUS RECORD NUMBER IF ONE EXISTS
5410 REM OTHERWISE CHANGE RN T0 -1
5420 IF K$(RN) = "" THEN GOSUB 4970
5430 IF L(RN) = -1 THEN GOTO 5500: REM NO LEFT LINK
5440 REM LEFT LINK EXISTS
5450 P(L(RN)) = RN:RN = L(RN)
5460 IF K$(RN) = "" THEN GOSUB 4970
5470 IF R(RN) = -1 THEN RETURN
5480 P(R(RN)) = RN:RN = R(RN)
5490 GOTO 5460
5500 REM NO LEFT LINK EXISTS
5510 T3 = RN
5520 RN = P(RN)
5530 IF RN = -1 THEN RETURN
5540 IF R(RN) = T3 THEN RETURN : REM T3 WAS A RIGHT LINK SO RN WAS LAST
5550 GOTO 5510
5560 REM ******
5570 REM DELETE RECORD
5580 REM ******
5590 PT = PT +1
5600 REM SET UP FREE LIST
5610 PRINT D$"OPEN ";FF$;",L6"
5620 PRINT D$"WRITE ";FF$;",R";PT
5630 PRINT RN
5640 PRINT D$"CLOSE ";FF$
5650 PREV = P(RN)
5660 LEFT = L(RN)
5670 RIGHT = R(RN)
5680 IF LEFT < > -1 OR RIGHT < > -1 THEN 5780
5690 REM TERMINAL NODE
5700 IF RN = FR THEN FR = -1: GOTO 5760: REM ONLY NODE
5710 T = RN
5720 RN = P(RN)
5730 IF L(RN) = T THEN L(RN) = -1
5740 IF R(RN) = T THEN R(RN) = -1
5750 GOSUB 5050: REM WRITE PREVIOUS LINK ON DISK
5760 GOSUB 4770: REM WRITE STATISTICS ON DISK
5770 RETURN
5780 IF LEFT < > -1 AND RIGHT < > -1 THEN 5940
5790 REM ONE MISSING LINK
5800 IF PREV < > -1 THEN 5850
5810 REM DELETE TOP NODE
5820 FR = LEFT
5830 IF RIGHT < > -1 THEN FR = RIGHT
5840 GOTO 5760
5850 REM ONE MISSING LINK
5860 REM DELETE INTERIOR NODE
5870 NXT = LEFT
5880 IF LEFT = -1 THEN NXT = RIGHT
5890 T = RN
5900 RN = PREV
5910 IF L(RN) = T THEN L(RN) = NXT
5920 IF R(RN) = T THEN R(RN) = NXT
5930 GOTO 5750
5940 REM NO MISSING LINKS
5950 TEMP = RN
5960 RN = RIGHT
5970 IF K$(RN) = "" THEN GOSUB 4970
5980 IF L(RN) = -1 THEN 6020
5990 PL = RN:RN = L(RN)
6000 IF K$(RN) = "" THEN GOSUB 4970
6010 GOTO 5980
6020 IF RN < >RIGHT THEN 6150
6030 REM NO LEFT LINK
6040 L(RN) = LEFT
6050 GOSUB 5050: REM WRITE LINKS
6060 IF PREV < > -1 THEN 6100
6070 REM TOP NODE
6080 FR = RIGHT
6090 GOTO 5760
6100 REM NOT TOP NODE
6110 RN = PREV
6120 IF L(RN) = TEMP THEN L(RN) = RIGHT
6130 IF R(RN) = TEMP THEN R(RN) = RIGHT
6140 GOTO 5750
6150 REM LEFT LINK EXISTS
6160 REM CHOP OFF LEFT BRANCH
6170 X = RN
6180 RN = PL
6190 L(RN) = -1
6200 GOSUB 5050: REM WRITE LINKS
6210 REM PUT X IN PLACE OF TEMP
6220 RN = X
6230 L(RN) = LEFT
6240 GOSUB 5050: REM WRITE LINKS
6250 REM FIND RIGHTMOST NODE ON DISPLACED BRANCH
6260 IF R(RN) = -1 THEN 6300
6270 RN = R(RN)
6280 IF K$(RN) = "" THEN GOSUB 4970
6290 GOTO 6260
6300 R(RN) = RIGHT
6310 GOSUB 5050: REM WRITE LINKS
6320 REM LINK BRANCH WITH PREVIOUS NODE
6330 IF PREV = -1 THEN FR = X: GOTO 5760: REM TOP NODE
6340 REM NOT TOP NODE
6350 RN = PREV
6360 IF L(RN) = TEMP THEN L(RN) = X: GOTO 5750
6370 IF R(RN) = TEMP THEN R(RN) = X: GOTO 5750
6380 REM *****
6390 REM CHANGE RECORD
6400 REM *****
6410 GOSUB 7730: REM READ RECORD FROM DISK
6420 HOME : VTAB 8: HTAB 15: IF NR -PT <2 THEN 6910
6430 PRINT "THE KEY IS"
6440 PRINT TAB( FN TB( LEN(K$(RN))))K$(RN)
6450 PRINT : PRINT TAB( 5)"DO YOU WANT TO CHANGE THE KEY?"
6460 PRINT : PRINT TAB( 13)"ANSWER Y OR N"
6470 HTAB 19: GET A$
6480 IF A$ = "Y" THEN PRINT : GOTO 6510
6490 IF A$ = "N" THEN PRINT : GOTO 6910
6500 GOTO 6470
6510 REM CHANGE THE KEY
6520 PRINT : PRINT "TYPE IN THE NEW KEY AND PRESS <RETURN>"
6530 INPUT "";KEY$: IF KEY$ = "" THEN 6910
6540 HOME : VTAB 10: HTAB 8
6550 PRINT "REARRANGING BINARY TREE"
6560 IF LEFT$(KEY$,30) = LEFT$(K$(RN),30) THEN 6910: REM IF SAME KEY THEN DON'T CHANGE
6570 RS = RN
6580 GOSUB 5560: REM DELETE RECORD
6590 RN = RS
6600 REM ESTABLISH NEW LINKS
6610 T = RN: REM SAVE RECORD NUMBER
6620 PT = PT -1
6630 GOSUB 4770: REM PRINT STATISTICS FILE
6640 L(RN) = -1:R(RN) = -1
6650 RN = FR
6660 IF K$(RN) = "" THEN GOSUB 4970
6670 IF LEFT$(KEY$,30) = LEFT$(K$(RN),30) THEN 6700
6680 IF KEY$ <K$(RN) THEN 6790
6690 IF KEY$ >K$(RN) THEN 6830
6700 REM DUPLICATE KEY
6710 HOME : VTAB 8: HTAB 16
6720 PRINT "YOUR KEY"
6730 PRINT : PRINT TAB( FN TB( LEN(KEY$)))KEY$
6740 PRINT : PRINT TAB( 13)"IS A DUPLICATE"
6750 PRINT : PRINT TAB( 11)"TYPE IN A NEW KEY"
6760 PRINT "AND PRESS <RETURN>"
6770 PRINT : INPUT "";KEY$: IF KEY$ = "" THEN 6710
6780 GOTO 6650
6790 REM KEY$<K$(RN)
6800 IF L(RN) < > -1 THEN P(L(RN)) = RN:RN = L(RN): GOTO 6660
6810 L(RN) = T
6820 GOTO 6860
6830 REM KEY$>K$(RN)
6840 IF R(RN) < > -1 THEN P(R(RN)) = RN:RN = R(RN): GOTO 6660
6850 R(RN) = T
6860 REM PUT LINKS ON DISK
6870 GOSUB 5050
6880 P(T) = RN
6890 RN = T
6900 K$(RN) = KEY$
6910 REM CHECK ON CHANGES FOR THE REST OF THE RECORD
6920 IF COUNT = 0 THEN 7070
6930 FOR I = 1 TO COUNT
6940 GOSUB 7180: REM DISPLAY RECORD
6950 PRINT : PRINT "DO YOU WANT TO CHANGE THE LAST FIELD?"
6960 PRINT : PRINT TAB( 13)"ANSWER Y OR N"
6970 GET A$
6980 IF A$ = "Y" THEN 7010
6990 IF A$ = "N" THEN 7060
7000 GOTO 6970
7010 PRINT : PRINT TAB( 7)"TYPE IN THE REVISED FIELD"
7020 PRINT "AND PRESS <RETURN>"
7030 PRINT : PRINT "TO TRUNCATE RECORD - JUST PRESS <RETURN>"
7040 INPUT "";F$(I)
7050 IF F$(I) = "" THEN 7150: REM FINISHED
7060 NEXT I
7070 I = COUNT
7080 GOSUB 7180: REM DISPLAY RECORD
7090 I = I +1
7100 PRINT : PRINT "TYPE THE NEXT FIELD AND PRESS <RETURN>"
7110 PRINT "WHEN FINISHED, JUST PRESS <RETURN>"
7120 INPUT "";F$(I)
7130 IF F$(I) = "" THEN 7150: REM FINISHED
7140 GOTO 7080
7150 COUNT = I -1
7160 GOSUB 7870: REM WRITE RECORD ON DISK
7170 RETURN
7180 REM DISPLAY RECORD
7190 HOME
7200 PRINT "KEY: ";K$(RN)
7210 IF I = 0 THEN RETURN
7220 FOR J = 1 TO I
7230 PRINT
7240 PRINT F$(J)
7250 NEXT J
7260 RETURN
7270 REM *****
7280 REM PRINT RECORD
7290 REM *****
7300 HOME : VTAB 10: HTAB 7
7310 PRINT "READING RECORD FROM DISK"
7320 GOSUB 7730: REM READ RECORD FROM DISK
7330 PRINT D$;"PR#1"
7340 PRINT : PRINT : PRINT : PRINT : PRINT
7350 PRINT K$(RN)
7360 PRINT LEFT$(DASH$, LEN(K$(RN))): PRINT
7370 IF COUNT = 0 THEN 7410
7380 FOR I = 1 TO COUNT
7390 PRINT F$(I)
7400 NEXT I
7410 PRINT : PRINT
7420 PRINT D$;"PR#0"
7430 RETURN
7440 REM *****
7450 REM DISPLAY RECORD
7460 REM *****
7470 HOME : VTAB 10: HTAB 7
7480 PRINT "READING RECORD FROM DISK"
7490 GOSUB 7730: REM READ RECORD FROM DISK
7500 HOME
7510 PRINT K$(RN)
7520 PRINT LEFT$(DASH$, LEN(K$(RN)))
7530 I = 1
7540 IF I >COUNT THEN 7680
7550 PRINT F$(I)
7560 I = I +1
7570 IF PEEK(37) >16 THEN 7590
7580 GOTO 7540
7590 J = PEEK(37): PRINT : PRINT
7600 VTAB 24
7610 PRINT "PRESS ANY KEY TO SEE THE NEXT LINE";
7620 VTAB J +1: HTAB 1
7630 POKE 35,22
7640 GET A$
7650 PRINT F$(I)
7660 I = I +1
7670 IF I < = COUNT THEN 7640
7680 POKE 35,24
7690 VTAB 24: CALL -958
7700 PRINT "PRESS ANY KEY TO RETURN TO MENU";
7710 GET A$: PRINT
7720 RETURN
7730 REM *****
7740 REM READ RECORD FROM DISK
7750 REM *****
7760 IF RM = RN THEN RETURN
7770 RM = RN
7780 COUNT = 1
7790 PRINT : PRINT D$;"OPEN ";FM$;",L";LN
7800 PRINT D$"READ ";FM$;",R";RN
7810 INPUT F$(COUNT)
7820 IF F$(COUNT) = "" THEN 7840
7830 COUNT = COUNT +1: GOTO 7810
7840 PRINT D$"CLOSE ";FM$
7850 COUNT = COUNT -1
7860 RETURN
7870 REM *****
7880 REM WRITE RECORD ON DISK
7890 REM *****
7900 RM = RN
7910 GOSUB 5050: REM WRITE KEY ON DISK
7920 HOME : VTAB 10: HTAB 9
7930 PRINT "WRITING RECORD ON DISK"
7940 PRINT D$"OPEN ";FM$;",L";LN
7950 PRINT D$"WRITE ";FM$;",R";RN
7960 IF COUNT = 0 THEN 8030
7970 LT = 1
7980 FOR I = 1 TO COUNT
7990 LT = LT + LEN(F$(I)) +2
8000 IF LT >LN THEN 8030: REM OVERWRITE PROTECT
8010 PRINT Q$;F$(I)
8020 NEXT I
8030 PRINT
8040 PRINT D$"CLOSE ";FM$
8050 RETURN
8060 REM *****
8070 REM CHECK FOR NEW FILE
8080 PRINT D$"CLOSE"
8090 IF RR < >0 OR PEEK(222) < >5 THEN 8120: REM UNEXPECTED ERROR
8100 RR = 2
8110 RESUME : REM START A NEW FILE
8120 PRINT D$"CLOSE":ER = PEEK(222): IF ER = 8 THEN PRINT "CHECK YOUR DISK DRIVE DOOR": GOTO 8180
8130 IF ER = 13 THEN PRINT "THAT IS NOT A DATA FILE": GOTO 8180
8140 IF ER = 10 THEN PRINT "THAT FILE IS LOCKED": GOTO 8180
8150 IF ER = 4 THEN PRINT "DISK IS WRITE PROTECTED": GOTO 8180
8160 PRINT "UNEXPECTED ERROR #";ER;" IN LINE "; PEEK(218) + PEEK(219) *256
8170 IF ER = 0 OR ER >15 THEN 8200
8180 PRINT CHR$(7);: PRINT "PRESS ANY KEY TO TRY AGAIN";: GET A$: PRINT : GOTO 280