home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib20a.dsk / JUNE.1984 / FILE.CABINET.bas < prev    next >
BASIC Source File  |  2023-02-26  |  27KB  |  821 lines

  1. 10  REM  *********2.6.85********
  2. 20  REM  *     FILE.CABINET    *
  3. 30  REM  *  BY ALAN H. STEIN   *
  4. 40  REM  * COPYRIGHT (C)  1984 *
  5. 50  REM  * BY MICROSPARC, INC. *
  6. 60  REM  * LINCOLN, MA.  01773 *
  7. 70  REM  ***********************
  8. 80  REM 
  9. 90  DEF  FN TB(X) =  INT(20 -X/2): REM  TAB STOP FOR CENTERING DISPLAY
  10. 100  DIM F$(100)
  11. 110 D$ =  CHR$(4): REM  CTRL D
  12. 120 R$ =  CHR$(13): REM  CARRIAGE RETURN
  13. 130 Q$ =  CHR$(34): REM  QUOTATION MARK"
  14. 140 DASH$ = "---------------------------------------"
  15. 150 RM =  -1: REM  NUMBER OF RECORD IN ARRAY
  16. 160  ONERR  GOTO 8060
  17. 170  HOME : VTAB 5: HTAB 5
  18. 180  PRINT "        FILE CABINET"
  19. 190  PRINT : PRINT  TAB( 18)"BY"
  20. 200  PRINT : PRINT  TAB( 13)"ALAN H. STEIN": PRINT : PRINT "** COPYRIGHT 1984 BY MICROSPARC, INC. **"
  21. 210  PRINT "WHAT IS THE NAME OF YOUR FILE?"
  22. 220  PRINT : PRINT "TYPE IN A NAME AND PRESS <RETURN>"
  23. 230  VTAB 19: CALL  -958: INPUT "";FM$
  24. 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
  25. 240 TM =  FN TB( LEN(FM$)): REM  CALCULATE TAB STOP FOR CENTERING FILE NAME
  26. 250 FK$ = FM$ +".KEYS"
  27. 260 FS$ = FM$ +".STAT"
  28. 270 FF$ = FM$ +".FREE"
  29. 280  HOME : VTAB 10: HTAB 17
  30. 290  PRINT "CONFIRM"
  31. 300  PRINT  TAB( 17)"------"
  32. 310  PRINT : PRINT  TAB( 11)"YOUR FILE NAME IS"
  33. 320  PRINT : PRINT  TAB( TM)FM$
  34. 330  VTAB 22: HTAB 13
  35. 340  PRINT "ANSWER Y OR N"
  36. 350  HTAB 19: GET A$
  37. 360  IF A$ = "Y"  THEN  PRINT : GOTO 390
  38. 370  IF A$ = "N"  THEN  PRINT : GOTO 170
  39. 380  GOTO 350
  40. 390 RR = 0
  41. 400  GOSUB 4870: REM  READ STATISTICS FILE
  42. 410  IF RR = 0  THEN 730
  43. 420  HOME : HTAB 15
  44. 430  PRINT "YOUR FILE"
  45. 440  PRINT  TAB( TM)FM$
  46. 450  PRINT  TAB( 11)"DOES NOT YET EXIST"
  47. 460  VTAB 10: HTAB 3
  48. 470  PRINT "DO YOU WANT TO CREATE A NEW FILE?"
  49. 480  VTAB 22: HTAB 13
  50. 490  PRINT "ANSWER Y OR N"
  51. 500  HTAB 19: GET A$
  52. 510  IF A$ = "Y"  THEN  PRINT : GOTO 540
  53. 520  IF A$ = "N"  THEN  PRINT : PRINT D$"CLOSE": PRINT D$"DELETE"FS$: CLEAR : GOTO 90
  54. 530  GOTO 500
  55. 540 RR = 1
  56. 550 NR =  -1:PT =  -1:FR =  -1
  57. 560  HOME : HTAB TM -6
  58. 570  PRINT "FILE NAME:  "FM$
  59. 580  VTAB 10: HTAB 5
  60. 590  PRINT "WHAT WILL THE RECORD LENGTH BE?"
  61. 600  VTAB 22: CALL  -958
  62. 610  PRINT "TYPE IN THE LENGTH AND PRESS <RETURN>"
  63. 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
  64. 630  HOME : HTAB TM -6
  65. 640  PRINT "FILE NAME:  "FM$
  66. 650  VTAB 10: HTAB 6
  67. 660  PRINT "CONFIRM:  RECORD LENGTH IS ";LN
  68. 670  VTAB 22: HTAB 13
  69. 680  PRINT "ANSWER Y OR N"
  70. 690  HTAB 19: GET A$
  71. 700  IF A$ = "Y"  THEN  PRINT : GOTO 730
  72. 710  IF A$ = "N"  THEN  PRINT : GOTO 560
  73. 720  GOTO 690
  74. 730  REM  *****
  75. 740  REM  SET UP THE FREE LIST, STATISTICS AND ARRAYS
  76. 750  REM  *****
  77. 760 RR = 1
  78. 770  HOME : VTAB 10: HTAB 10
  79. 780  PRINT "SETTING UP FREE LIST"
  80. 790  IF PT > = 49  THEN 920
  81. 800 P1 = PT +1
  82. 810 PT = 49
  83. 820  PRINT D$"OPEN ";FF$;",L6"
  84. 830  FOR I = P1 TO PT
  85. 840 I1 = NR +I +1 -P1
  86. 850  PRINT D$"WRITE ";FF$;",R";I
  87. 860  PRINT I1
  88. 870  NEXT I
  89. 880  PRINT D$"CLOSE";FF$
  90. 890 NR = NR +PT +1 -P1
  91. 900  REM  WRITE STATISTICS FILE
  92. 910  GOSUB 4770
  93. 920  REM  SET UP ARRAYS
  94. 930  DIM K$(NR),P(NR),L(NR),R(NR)
  95. 940  REM  *****
  96. 950  REM  SET UP THE MAIN MENU
  97. 960  REM  *****
  98. 970  HOME : HTAB 5
  99. 980  PRINT "         FILE CABINET"
  100. 990  PRINT : PRINT  TAB( 15)"FILE NAME"
  101. 1000  PRINT : PRINT  TAB( TM)FM$
  102. 1010  VTAB 10
  103. 1020  PRINT  TAB( 7)"PRESS"; TAB( 17)"IN ORDER TO"
  104. 1030  PRINT  TAB( 7)"-----"; TAB( 17)"-- ----- --"
  105. 1040  PRINT 
  106. 1050  PRINT  TAB( 7)"  1"; TAB( 15)"SEARCH FOR A RECORD"
  107. 1060  PRINT  TAB( 7)"  2"; TAB( 15)"ENTER A RECORD"
  108. 1070  PRINT  TAB( 7)"  3"; TAB( 15)"PRINT ENTIRE FILE"
  109. 1080  PRINT  TAB( 7)"  4"; TAB( 15)"DISPLAY STATISTICS"
  110. 1090  PRINT  TAB( 7)"  5"; TAB( 15)"REWRITE FILE"
  111. 1100  VTAB 22
  112. 1110  PRINT  TAB( 7)"  6"; TAB( 15)"QUIT PROGRAM"
  113. 1120  HTAB 19: GET A$:A =  VAL(A$): IF A <1  OR A >6  THEN 1120
  114. 1130  PRINT : ON A GOTO 1150,2330,1150,3270,1150,8190
  115. 1140  GOTO 1120
  116. 1150  IF NR -PT = 0  THEN  HOME : VTAB 12: PRINT "THERE ARE NO RECORDS YET": PRINT "PRESS ANY KEY TO RETURN TO MENU";: GET A$: PRINT : GOTO 970
  117. 1160  ON A GOTO 1170,2330,3070,3270,3400,8190
  118. 1170  REM  *****
  119. 1180  REM  SEARCH FOR RECORD
  120. 1190  REM  *****
  121. 1200  HOME 
  122. 1210  PRINT  TAB( 10)"SEARCH FOR A RECORD"
  123. 1220  PRINT  TAB( 10)"------ --- - ------"
  124. 1230  VTAB 10
  125. 1240  PRINT "TYPE IN THE KEY OF THE RECORD YOU WANT"
  126. 1250  PRINT "AND PRESS <RETURN>"
  127. 1260  VTAB 20: HTAB 6
  128. 1270  PRINT "THE WHOLE KEY IS NOT NEEDED"
  129. 1280  PRINT : PRINT  TAB( 11)"ONLY THE BEGINNING"
  130. 1290  INPUT "";T$
  131. 1300  IF  LEN(T$) >30  THEN T$ =  LEFT$(T$,30)
  132. 1310 LK =  LEN(T$): IF LK = 0  THEN LK = 1
  133. 1320  HOME : VTAB 10: HTAB 5
  134. 1330  PRINT "SEARCHING FOR RECORD WITH KEY"
  135. 1340  PRINT : PRINT  TAB(  FN TB(LK))T$
  136. 1350 RN = FR:P(RN) =  -1
  137. 1360  IF K$(RN) = ""  THEN  GOSUB 4970
  138. 1370  IF T$ =  LEFT$(K$(RN),LK)  THEN 1440: REM  FOUND RECORD
  139. 1380  IF T$ < LEFT$(K$(RN),LK)  THEN 1420: REM  SEARCH TO THE LEFT
  140. 1390  REM  SEARCH TO THE RIGHT
  141. 1400  IF R(RN) < > -1  THEN P(R(RN)) = RN:RN = R(RN): GOTO 1360
  142. 1410  GOTO 1440: REM  CLOSEST KEY FOUND
  143. 1420  REM  SEARCH TO THE LEFT
  144. 1430  IF L(RN) < > -1  THEN P(L(RN)) = RN:RN = L(RN): GOTO 1360
  145. 1440  REM  CLOSEST KEY FOUND
  146. 1450  HOME 
  147. 1460  PRINT "KEY SEARCHED FOR:",T$
  148. 1470  PRINT : PRINT "KEY FOUND:",K$(RN)
  149. 1480  VTAB 8
  150. 1490  PRINT  TAB( 7)"PRESS"; TAB( 17)"IN ORDER TO"
  151. 1500  PRINT  TAB( 7)"-----"; TAB( 17)"-- ----- --"
  152. 1510  PRINT 
  153. 1520  PRINT  TAB( 7)"  1"; TAB( 15)"DISPLAY RECORD"
  154. 1530  PRINT  TAB( 7)"  2"; TAB( 15)"PRINT   RECORD"
  155. 1540  PRINT  TAB( 7)"  3"; TAB( 15)"DELETE  RECORD"
  156. 1550  PRINT  TAB( 7)"  4"; TAB( 15)"CHANGE  RECORD"
  157. 1560  PRINT  TAB( 7)"  5"; TAB( 15)"FIND NEXT RECORD"
  158. 1570  PRINT  TAB( 7)"  6"; TAB( 15)"FIND PREVIOUS RECORD"
  159. 1580  VTAB 22
  160. 1590  PRINT  TAB( 7)"  7"; TAB( 15)"RETURN TO MAIN MENU"
  161. 1600  HTAB 19: GET A$:A =  VAL(A$): IF A <1  OR A >7  THEN 1600
  162. 1610  PRINT : ON A GOTO 1630,1700,1770,1910,1970,2150,940
  163. 1620  GOTO 1600
  164. 1630  REM  DISPLAY RECORD
  165. 1640  GOSUB 7440: REM  DISPLAY SUBROUTINE
  166. 1650  HOME 
  167. 1660  PRINT  TAB( 10)"THE RECORD WITH KEY"
  168. 1670  PRINT : PRINT  TAB(  FN TB( LEN(K$(RN))))K$(RN)
  169. 1680  PRINT : PRINT  TAB( 11)"HAS BEEN DISPLAYED"
  170. 1690  GOTO 1480: REM  RETURN TO MENU
  171. 1700  REM  PRINT RECORD
  172. 1710  GOSUB 7270: REM  PRINT SUBROUTINE
  173. 1720  HOME : HTAB 10
  174. 1730  PRINT "THE RECORD WITH KEY"
  175. 1740  PRINT : PRINT  TAB(  FN TB( LEN(K$(RN))))K$(RN)
  176. 1750  PRINT : PRINT  TAB( 12)"HAS BEEN PRINTED"
  177. 1760  GOTO 1480: REM  RETURN TO MENU
  178. 1770  REM  DELETE RECORD
  179. 1780  HOME : VTAB 8: HTAB 3
  180. 1790  PRINT "CONFIRM:  DELETING RECORD WITH KEY"
  181. 1800  PRINT : PRINT  TAB(  FN TB( LEN(K$(RN))))K$(RN)
  182. 1810  PRINT : PRINT  TAB( 13)"ANSWER Y OR N"
  183. 1820  HTAB 19: GET A$
  184. 1830  IF A$ = "Y"  THEN  PRINT : GOTO 1860
  185. 1840  IF A$ = "N"  THEN  PRINT : GOTO 1450
  186. 1850  GOTO 1820
  187. 1860  HOME : VTAB 10: HTAB 8
  188. 1870  PRINT "DELETING RECORD WITH KEY:"
  189. 1880  PRINT : PRINT  TAB(  FN TB( LEN(K$(RN))))K$(RN)
  190. 1890  GOSUB 5560: REM  DELETION SUBROUTINE
  191. 1900  GOTO 940: REM  RETURN TO MAIN MENU
  192. 1910  REM  CHANGE RECORD
  193. 1920  HOME : VTAB 10: HTAB 8
  194. 1930  PRINT "CHANGING RECORD WITH KEY:"
  195. 1940  PRINT : PRINT  TAB(  FN TB( LEN(K$(RN))))K$(RN)
  196. 1950  GOSUB 6380: REM  CHANGE SUBROUTINE
  197. 1960  GOTO 940: REM  RETURN TO MAIN MENU
  198. 1970  REM  FIND THE NEXT RECORD
  199. 1980  HOME : VTAB 10: HTAB 6
  200. 1990  PRINT "SEARCHING FOR THE NEXT RECORD"
  201. 2000  GOSUB 5160: REM  GET RECORD NUMBER
  202. 2010  IF RN =  -1  THEN  GOTO 2080: REM  NO NEXT RECORD
  203. 2020  REM  NEXT RECORD FOUND
  204. 2030  HOME : HTAB 5
  205. 2040  PRINT "THE NEXT RECORD HAS BEEN FOUND"
  206. 2050  PRINT : PRINT  TAB( 15)"ITS KEY IS"
  207. 2060  PRINT : PRINT  TAB(  FN TB( LEN(K$(RN))))K$(RN)
  208. 2070  GOTO 1480: REM  RETURN TO MENU
  209. 2080  REM  NO NEXT RECORD EXISTS
  210. 2090  HOME : VTAB 5: HTAB 8
  211. 2100  PRINT "THERE IS NO NEXT RECORD"
  212. 2110  VTAB 20
  213. 2120  PRINT "PRESS ANY KEY TO RETURN TO MENU";
  214. 2130  GET A$: PRINT 
  215. 2140  GOTO 940
  216. 2150  REM  FIND THE PREVIOUS RECORD
  217. 2160  HOME : VTAB 10: HTAB 4
  218. 2170  PRINT "SEARCHING FOR THE PREVIOUS RECORD"
  219. 2180  GOSUB 5360: REM  GET PREVIOUS RECORD NUMBER
  220. 2190  IF RN =  -1  THEN 2260: REM  NO PREVIOUS RECORD EXISTS
  221. 2200  REM  PREVIOUS RECORD FOUND
  222. 2210  HOME : HTAB 3
  223. 2220  PRINT "THE PREVIOUS RECORD HAS BEEN FOUND"
  224. 2230  PRINT : PRINT  TAB( 15)"ITS KEY IS"
  225. 2240  PRINT : PRINT  TAB(  FN TB( LEN(K$(RN))))K$(RN)
  226. 2250  GOTO 1480: REM  RETURN TO MENU
  227. 2260  REM  NO PREVIOUS RECORD EXISTS
  228. 2270  HOME : VTAB 5: HTAB 6
  229. 2280  PRINT "THERE IS NO PREVIOUS RECORD"
  230. 2290  VTAB 15
  231. 2300  PRINT "PRESS ANY KEY TO RETURN TO MENU";
  232. 2310  GET A$: PRINT 
  233. 2320  GOTO 940
  234. 2330  REM  *****
  235. 2340  REM  ADD NEW RECORD
  236. 2350  REM  *****
  237. 2360  IF PT =  -1  THEN 2520: REM  NO ROOM ON FILE
  238. 2370 COUNT =  -1
  239. 2380  HOME : HTAB 11
  240. 2390  PRINT "ENTERING A RECORD"
  241. 2400  PRINT : PRINT "TYPE IN THE KEY AND PRESS <RETURN>"
  242. 2410  INPUT "";A$: IF A$ = ""  AND COUNT =  -1  THEN 970
  243. 2420  IF A$ = ""  THEN  GOTO 2620: REM  FINISHED
  244. 2430 COUNT = COUNT +1: IF COUNT = 99  THEN  PRINT "MAXIMUM NUMBER OF FIELDS!": PRINT "PRESS ANY KEY TO CONTINUE";: GET A$: PRINT : GOTO 2620
  245. 2440 F$(COUNT) = A$
  246. 2450  HOME 
  247. 2460  FOR I = 0 TO COUNT
  248. 2470  PRINT F$(I)
  249. 2480  NEXT I
  250. 2490  PRINT : PRINT "TYPE THE NEXT FIELD AND PRESS <RETURN>"
  251. 2500  PRINT "WHEN FINISHED, JUST PRESS <RETURN>"
  252. 2510  GOTO 2410
  253. 2520  REM  NO ROOM ON FILE
  254. 2530  HOME : VTAB 10: HTAB 7
  255. 2540  PRINT "THERE IS NO MORE ROOM IN THE FILE"
  256. 2550  PRINT : PRINT  TAB( 6)"IN ORDER TO ADD MORE RECORDS"
  257. 2560  PRINT : PRINT  TAB( 8)"YOU MUST EXIT THE PROGRAM"
  258. 2570  PRINT  TAB( 13)"THEN RERUN IT"
  259. 2580  VTAB 21
  260. 2590  PRINT "PRESS ANY KEY TO RETURN TO MENU";
  261. 2600  GET A$: PRINT 
  262. 2610  GOTO 940: REM  RETURN TO THE MAIN MENU
  263. 2620  REM  FIND THE NEXT FREE RECORD
  264. 2630  PRINT D$"OPEN ";FF$;",L6"
  265. 2640  PRINT D$"READ ";FF$;",R";PT
  266. 2650  INPUT RN
  267. 2660  PRINT D$"CLOSE ";FF$
  268. 2670 PT = PT -1
  269. 2680  IF FR < > -1  THEN  GOTO 2730
  270. 2690  REM  FIRST RECORD
  271. 2700 FR = RN
  272. 2710 P(RN) =  -1
  273. 2720  GOTO 2980: REM  WRITE ON DISK
  274. 2730  REM  NOT FIRST RECORD -- LOCATE IN TREE
  275. 2740 T = RN:RN = FR:P(RN) =  -1: REM  SAVE RECORD NUMBER
  276. 2750  IF K$(RN) = ""  THEN  GOSUB 4970: REM  GET KEY FROM DISK
  277. 2760  IF  LEFT$(F$(0),30) =  LEFT$(K$(RN),30)  THEN 2790
  278. 2770  IF F$(0) <K$(RN)  THEN 2890
  279. 2780  IF F$(0) >K$(RN)  THEN 2920
  280. 2790  REM  DUPLICATE KEY
  281. 2800 RN = T
  282. 2810  HOME : HTAB 16
  283. 2820  PRINT "YOUR KEY"
  284. 2830  PRINT : PRINT  TAB(  FN TB( LEN(F$(0))))F$(0)
  285. 2840  PRINT : PRINT  TAB( 11)"IS A DUPLICATE KEY"
  286. 2850  VTAB 20: CALL  -958
  287. 2860  PRINT "TYPE IN A NEW KEY AND PRESS <RETURN>"
  288. 2870  INPUT "";F$(0): IF F$(0) = ""  THEN 2850
  289. 2880  GOTO 2740
  290. 2890  REM  GO TO THE LEFT ON THE TREE
  291. 2900  IF L(RN) < > -1  THEN P(L(RN)) = RN:RN = L(RN): GOTO 2750
  292. 2910 L(RN) = T: GOTO 2950: REM  PREVIOUS NODE FOUND -- WRITE LINKS ON DISK
  293. 2920  REM  GO TO THE RIGHT ON THE TREE
  294. 2930  IF R(RN) < > -1  THEN P(R(RN)) = RN:RN = R(RN): GOTO 2750
  295. 2940 R(RN) = T: REM  PREVIOUS LINK FOUND
  296. 2950  GOSUB 5050: REM  WRITE LINKS ON DISK
  297. 2960 P(T) = RN
  298. 2970 RN = T
  299. 2980 L(RN) =  -1:R(RN) =  -1
  300. 2990 K$(RN) = F$(0)
  301. 3000  GOSUB 7870: REM  WRITE RECORD TO FILE
  302. 3010  GOSUB 4770: REM  WRITE NEW STATISTICS
  303. 3020  HOME : HTAB 10
  304. 3030  PRINT "THE RECORD WITH KEY"
  305. 3040  PRINT  TAB(  FN TB( LEN(K$(RN))))K$(RN)
  306. 3050  PRINT  TAB( 12)"HAS BEEN ENTERED"
  307. 3060  GOTO 1480: REM  DISPLAY SUB-MENU
  308. 3070  REM  *****
  309. 3080  REM  PRINT THE ENTIRE FILE
  310. 3090  REM  *****
  311. 3100  HOME : VTAB 8: HTAB 14
  312. 3110  PRINT "PRINTING FILE"
  313. 3120  VTAB 16: HTAB 7
  314. 3130  PRINT "SEARCHING FOR FIRST RECORD"
  315. 3140  REM  FIND THE FIRST RECORD
  316. 3150 RN = FR:P(RN) =  -1
  317. 3160 T = RN
  318. 3170  IF K$(RN) = ""  THEN  GOSUB 4970: REM  GET KEY FROM DISK
  319. 3180  IF L(RN) =  -1  THEN 3210: REM  FIRST RECORD FOUND
  320. 3190 P(L(RN)) = RN:RN = L(RN)
  321. 3200  GOTO 3160
  322. 3210  REM  RECORD FOUND
  323. 3220  GOSUB 7270: REM  PRINT RECORD
  324. 3230  GOSUB 5160: REM  FIND NEXT RECORD
  325. 3240  IF RN < > -1  THEN  GOTO 3210: REM  PRINT NEXT RECORD
  326. 3250  REM  END OF FILE REACHED -- RETURN TO THE MAIN MENU
  327. 3260  GOTO 940
  328. 3270  REM  *****
  329. 3280  REM  DISPLAY STATISTICS
  330. 3290  REM  *****
  331. 3300  HOME : HTAB TB
  332. 3310  PRINT FM$
  333. 3320  VTAB 8
  334. 3330  PRINT : PRINT  TAB( 5)"RECORD LENGTH:",LN
  335. 3340  PRINT : PRINT  TAB( 5)"NUMBER OF RECORDS:",NR -PT
  336. 3350  PRINT : PRINT  TAB( 5)"FREE RECORDS:",PT +1
  337. 3360  VTAB 21
  338. 3370  PRINT "   PRESS ANY KEY TO RETURN TO MENU"
  339. 3380  HTAB 19: GET A$: PRINT 
  340. 3390  GOTO 940
  341. 3400  REM  *****
  342. 3410  REM  REWRITE FILE
  343. 3420  REM  *****
  344. 3430  HOME : HTAB TB: PRINT FM$
  345. 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
  346. 3450  VTAB 8
  347. 3460  PRINT  TAB( 14)"REWRITE FILE"
  348. 3470  PRINT : PRINT "PRESENT RECORD LENGTH:",LN
  349. 3480  PRINT : PRINT "TYPE IN THE NEW RECORD LENGTH ": PRINT "AND PRESS <RETURN>   "
  350. 3490  PRINT : PRINT "TO VOID THE REWRITE NOW --": PRINT  TAB( 5)"TYPE IN 0 FOR THE NEW RECORD LENGTH"
  351. 3500  INPUT "";LM
  352. 3510  IF LM <3  THEN  GOTO 940: REM  RETURN TO THE MAIN MENU
  353. 3520  HOME : VTAB 10: HTAB 13
  354. 3530  PRINT "REWRITING FILE"
  355. 3540  PRINT : PRINT  TAB( TM)FM$
  356. 3550 TM$ = "DATA.TEMP":TK$ = "KEY.TEMP"
  357. 3560 TR = NR -PT -1
  358. 3570  DIM TP(PT): REM  BLANK RECORDS
  359. 3580  DIM KT$(TR): REM  TEMPORARY KEYS
  360. 3590  REM  PUT BLANK RECORDS IN ARRAY
  361. 3600  PRINT D$"OPEN ";FF$;",L6"
  362. 3610  FOR I = 0 TO PT
  363. 3620  PRINT D$"READ ";FF$;",R";I
  364. 3630  INPUT TP(I)
  365. 3640  NEXT I
  366. 3650  PRINT D$"CLOSE ";FF$
  367. 3660  REM  SORT BLANK RECORDS
  368. 3670  FOR I = 1 TO PT
  369. 3680  FOR J = I TO 1  STEP  -1
  370. 3690  IF TP(J) >TP(J -1)  THEN 3740
  371. 3700 TEMP = TP(J)
  372. 3710 TP(J) = TP(J -1)
  373. 3720 TP(J -1) = TEMP
  374. 3730  NEXT J
  375. 3740  NEXT I
  376. 3750  REM  WRITE RECORD 0
  377. 3760 RN =  -1:RB = 0
  378. 3770  GOSUB 4430: REM  READ NEXT RECORD
  379. 3780  REM  WRITE KEY AND LINKS IN NEW FILE
  380. 3790 KT$(0) = K$(RN):L(0) =  -1:R(0) =  -1
  381. 3800 Z = 0
  382. 3810  HOME : VTAB 5: HTAB 13
  383. 3820  PRINT "WRITING RECORD  "
  384. 3830  VTAB 10
  385. 3840  PRINT "NUMBER"; TAB( 10)0
  386. 3850  PRINT "KEY"; TAB( 10)KT$(0)
  387. 3860  GOSUB 4560: REM  WRITE RECORD
  388. 3870  REM  NOW DO THE OTHER RECORDS
  389. 3880  FOR N = 1 TO TR
  390. 3890  GOSUB 4430: REM  READ NEXT RECORD
  391. 3900  REM  WRITE RECORD N IN NEW FILE
  392. 3910 KT$(N) = K$(RN)
  393. 3920  REM  SET UP LINKS
  394. 3930 L(N) =  -1:R(N) =  -1
  395. 3940 T = 0
  396. 3950 KEY$ = KT$(N)
  397. 3960  IF KEY$ <KT$(T)  THEN 4000
  398. 3970  IF R(T) < > -1  THEN T = R(T): GOTO 3960
  399. 3980 R(T) = N
  400. 3990  GOTO 4020
  401. 4000  IF L(T) < > -1  THEN T = L(T): GOTO 3960
  402. 4010 L(T) = N
  403. 4020  REM  WRITE LINKS ON DISK
  404. 4030  HOME : VTAB 5: HTAB 13
  405. 4040  PRINT "WRITING RECORD"
  406. 4050  VTAB 10
  407. 4060  PRINT "NUMBER"; TAB( 10)N
  408. 4070  PRINT "KEY"; TAB( 10)KT$(N)
  409. 4080 Z = T: GOSUB 4500: REM  WRITE PREVIOUS LINK
  410. 4090 Z = N: GOSUB 4560: REM  WRITE RECORD
  411. 4100  NEXT N
  412. 4110  REM  CONFIRM FILE REWRITE
  413. 4120  HOME : VTAB 8: HTAB 16
  414. 4130  PRINT "THE FILE"
  415. 4140  PRINT : PRINT  TAB( TM)FM$
  416. 4150  PRINT : PRINT  TAB( 11)"HAS BEEN REWRITTEN"
  417. 4160  PRINT : PRINT  TAB( 5)"IT IS NOW IN A TEMPORARY FILE"
  418. 4170  VTAB 20: HTAB 3
  419. 4180  PRINT "DO YOU WANT TO COMPLETE THE REWRITE?"
  420. 4190  PRINT : PRINT  TAB( 13)"ANSWER Y OR N"
  421. 4200  HTAB 19: GET A$
  422. 4210  IF A$ = "Y"  THEN  PRINT : GOTO 4240
  423. 4220  IF A$ = "N"  THEN  PRINT : GOTO 4370
  424. 4230  GOTO 4200
  425. 4240  HOME : VTAB 10: HTAB 6
  426. 4250  PRINT "DELETING AND RENAMING FILES"
  427. 4260  PRINT : PRINT D$"DELETE ";FM$
  428. 4270  PRINT D$"RENAME ";TM$;",";FM$
  429. 4280  PRINT D$"DELETE ";FK$
  430. 4290  PRINT D$"RENAME ";TK$;",";FK$
  431. 4300  PRINT D$"DELETE ";FF$
  432. 4310 LN = LM:NR = TR:PT =  -1:FR = 0
  433. 4320  GOSUB 4770: REM  WRITE STATISTICS FILE
  434. 4330  HOME : VTAB 10: HTAB 11
  435. 4340  PRINT "REWRITE IS COMPLETE"
  436. 4350  PRINT : PRINT  TAB( 11)"PROGRAM MAY BE RERUN"
  437. 4360  GOTO 8190: REM  EXIT PROGRAM
  438. 4370  REM  ABORT REWRITE
  439. 4380  HOME : VTAB 10: HTAB 10
  440. 4390  PRINT "REWRITE BEING ABORTED"
  441. 4400  PRINT : PRINT D$"DELETE ";TM$
  442. 4410  PRINT D$"DELETE ";TK$
  443. 4420  GOTO 8190: REM  EXIT PROGRAM
  444. 4430  REM  FIND THE NEXT RECORD
  445. 4440 RN = RN +1
  446. 4450  IF RB >PT  THEN 4470
  447. 4460  IF TP(RB) = RN  THEN RB = RB +1: GOTO 4440
  448. 4470  IF K$(RN) = ""  THEN  GOSUB 4690: REM  READ KEY FROM DISK
  449. 4480  GOSUB 7730
  450. 4490  RETURN 
  451. 4500  REM  WRITE KEY AND LINKS ON DISK
  452. 4510  PRINT D$"OPEN ";TK$;",L44"
  453. 4520  PRINT D$"WRITE ";TK$;",R";Z
  454. 4530  PRINT Q$;KT$(Z);R$;L(Z);R$;R(Z)
  455. 4540  PRINT D$"CLOSE ";TK$
  456. 4550  RETURN 
  457. 4560  REM  WRITE RECORD ON DISK
  458. 4570  GOSUB 4500: REM  WRITE KEY AND LINKS
  459. 4580  PRINT D$"OPEN ";TM$;",L";LM
  460. 4590  PRINT D$"WRITE ";TM$;",R";Z
  461. 4600 LT = 1
  462. 4610  FOR I = 1 TO COUNT
  463. 4620 LT = LT + LEN(F$(I)) +2
  464. 4630  IF LT >LM  THEN 4660: REM  TRUNCATE LONG RECORD
  465. 4640  PRINT Q$;F$(I)
  466. 4650  NEXT I
  467. 4660  PRINT 
  468. 4670  PRINT D$"CLOSE ";TM$
  469. 4680  RETURN 
  470. 4690  REM  *****
  471. 4700  REM  READ KEY
  472. 4710  REM  *****
  473. 4720  PRINT : PRINT D$"OPEN ";FK$;",L44"
  474. 4730  PRINT D$"READ ";FK$;",R";RN
  475. 4740  INPUT K$(RN)
  476. 4750  PRINT D$"CLOSE ";FK$
  477. 4760  RETURN 
  478. 4770  REM  *****
  479. 4780  REM  WRITE STATISTICS FILE
  480. 4790  REM  *****
  481. 4800  HOME : VTAB 10: HTAB 8
  482. 4810  PRINT "WRITING STATISTICS FILE"
  483. 4820  PRINT D$"OPEN ";FS$
  484. 4830  PRINT D$"WRITE ";FS$
  485. 4840  PRINT LN;R$;NR;R$;PT;R$;FR
  486. 4850  PRINT D$"CLOSE ";FS$
  487. 4860  RETURN 
  488. 4870  REM  *****
  489. 4880  REM  READ STATISTICS FILE
  490. 4890  REM  *****
  491. 4900  HOME : VTAB 10: HTAB 8
  492. 4910  PRINT "READING STATISTICS FILE"
  493. 4920  PRINT D$"OPEN ";FS$
  494. 4930  PRINT D$"READ ";FS$
  495. 4940  IF RR < >2  THEN  INPUT LN,NR,PT,FR
  496. 4950  PRINT D$"CLOSE ";FS$
  497. 4960  RETURN 
  498. 4970  REM  *****
  499. 4980  REM  READ KEY AND LINKS
  500. 4990  REM  *****
  501. 5000  PRINT : PRINT D$"OPEN ";FK$;",L44"
  502. 5010  PRINT D$"READ ";FK$;",R";RN
  503. 5020  INPUT K$(RN),L(RN),R(RN)
  504. 5030  PRINT D$"CLOSE ";FK$
  505. 5040  RETURN 
  506. 5050  REM  *****
  507. 5060  REM  WRITE KEY AND LINKS ON DISK
  508. 5070  REM  *****
  509. 5080  IF  LEN(K$(RN)) >30  THEN K$(RN) =  LEFT$(K$(RN),30)
  510. 5090  HOME : VTAB 10: HTAB 5
  511. 5100  PRINT "WRITING KEY AND LINKS ON DISK"
  512. 5110  PRINT D$"OPEN ";FK$;",L44"
  513. 5120  PRINT D$"WRITE "FK$;",R";RN
  514. 5130  PRINT Q$;K$(RN);R$;L(RN);R$;R(RN)
  515. 5140  PRINT D$"CLOSE ";FK$
  516. 5150  RETURN 
  517. 5160  REM  *****
  518. 5170  REM  FIND THE NEXT RECORD
  519. 5180  REM  *****
  520. 5190  REM  TAKE RECORD NUMBER RN
  521. 5200  REM  CHANGE RN TO NEXT RECORD NUMBER IF ONE EXISTS
  522. 5210  REM  OTHERWISE CHANGE RN TO -1
  523. 5220  IF K$(RN) = ""  THEN  GOSUB 4970
  524. 5230  IF R(RN) =  -1  THEN  GOTO 5300: REM  NO RIGHT LINK
  525. 5240  REM  RIGHT LINK EXISTS
  526. 5250 P(R(RN)) = RN:RN = R(RN)
  527. 5260  IF K$(RN) = ""  THEN  GOSUB 4970
  528. 5270  IF L(RN) =  -1  THEN  RETURN 
  529. 5280 P(L(RN)) = RN:RN = L(RN)
  530. 5290  GOTO 5260
  531. 5300  REM  NO RIGHT LINK EXISTS
  532. 5310 T3 = RN
  533. 5320 RN = P(RN)
  534. 5330  IF RN =  -1  THEN  RETURN 
  535. 5340  IF L(RN) = T3  THEN  RETURN : REM  T3 WAS A LEFT LINK SO RN IS NEXT
  536. 5350  GOTO 5310
  537. 5360  REM  *****
  538. 5370  REM  FIND THE PREVIOUS RECORD
  539. 5380  REM  *****
  540. 5390  REM  TAKE RECORD NUMBER RN
  541. 5400  REM  CHANGE RN TO PREVIOUS RECORD NUMBER IF ONE EXISTS
  542. 5410  REM  OTHERWISE CHANGE RN T0 -1
  543. 5420  IF K$(RN) = ""  THEN  GOSUB 4970
  544. 5430  IF L(RN) =  -1  THEN  GOTO 5500: REM  NO LEFT LINK
  545. 5440  REM  LEFT LINK EXISTS
  546. 5450 P(L(RN)) = RN:RN = L(RN)
  547. 5460  IF K$(RN) = ""  THEN  GOSUB 4970
  548. 5470  IF R(RN) =  -1  THEN  RETURN 
  549. 5480 P(R(RN)) = RN:RN = R(RN)
  550. 5490  GOTO 5460
  551. 5500  REM  NO LEFT LINK EXISTS
  552. 5510 T3 = RN
  553. 5520 RN = P(RN)
  554. 5530  IF RN =  -1  THEN  RETURN 
  555. 5540  IF R(RN) = T3  THEN  RETURN : REM  T3 WAS A RIGHT LINK SO RN WAS LAST
  556. 5550  GOTO 5510
  557. 5560  REM  ******
  558. 5570  REM  DELETE RECORD
  559. 5580  REM  ******
  560. 5590 PT = PT +1
  561. 5600  REM  SET UP FREE LIST
  562. 5610  PRINT D$"OPEN ";FF$;",L6"
  563. 5620  PRINT D$"WRITE ";FF$;",R";PT
  564. 5630  PRINT RN
  565. 5640  PRINT D$"CLOSE ";FF$
  566. 5650 PREV = P(RN)
  567. 5660 LEFT = L(RN)
  568. 5670 RIGHT = R(RN)
  569. 5680  IF LEFT < > -1  OR RIGHT < > -1  THEN 5780
  570. 5690  REM  TERMINAL NODE
  571. 5700  IF RN = FR  THEN FR =  -1: GOTO 5760: REM  ONLY NODE
  572. 5710 T = RN
  573. 5720 RN = P(RN)
  574. 5730  IF L(RN) = T  THEN L(RN) =  -1
  575. 5740  IF R(RN) = T  THEN R(RN) =  -1
  576. 5750  GOSUB 5050: REM  WRITE PREVIOUS LINK ON DISK
  577. 5760  GOSUB 4770: REM  WRITE STATISTICS ON DISK
  578. 5770  RETURN 
  579. 5780  IF LEFT < > -1  AND RIGHT < > -1  THEN 5940
  580. 5790  REM  ONE MISSING LINK
  581. 5800  IF PREV < > -1  THEN 5850
  582. 5810  REM  DELETE TOP NODE
  583. 5820 FR = LEFT
  584. 5830  IF RIGHT < > -1  THEN FR = RIGHT
  585. 5840  GOTO 5760
  586. 5850  REM  ONE MISSING LINK
  587. 5860  REM  DELETE INTERIOR NODE
  588. 5870 NXT = LEFT
  589. 5880  IF LEFT =  -1  THEN NXT = RIGHT
  590. 5890 T = RN
  591. 5900 RN = PREV
  592. 5910  IF L(RN) = T  THEN L(RN) = NXT
  593. 5920  IF R(RN) = T  THEN R(RN) = NXT
  594. 5930  GOTO 5750
  595. 5940  REM  NO MISSING LINKS
  596. 5950 TEMP = RN
  597. 5960 RN = RIGHT
  598. 5970  IF K$(RN) = ""  THEN  GOSUB 4970
  599. 5980  IF L(RN) =  -1  THEN 6020
  600. 5990 PL = RN:RN = L(RN)
  601. 6000  IF K$(RN) = ""  THEN  GOSUB 4970
  602. 6010  GOTO 5980
  603. 6020  IF RN < >RIGHT  THEN 6150
  604. 6030  REM  NO LEFT LINK
  605. 6040 L(RN) = LEFT
  606. 6050  GOSUB 5050: REM  WRITE LINKS
  607. 6060  IF PREV < > -1  THEN 6100
  608. 6070  REM  TOP NODE
  609. 6080 FR = RIGHT
  610. 6090  GOTO 5760
  611. 6100  REM  NOT TOP NODE
  612. 6110 RN = PREV
  613. 6120  IF L(RN) = TEMP  THEN L(RN) = RIGHT
  614. 6130  IF R(RN) = TEMP  THEN R(RN) = RIGHT
  615. 6140  GOTO 5750
  616. 6150  REM  LEFT LINK EXISTS
  617. 6160  REM  CHOP OFF LEFT BRANCH
  618. 6170 X = RN
  619. 6180 RN = PL
  620. 6190 L(RN) =  -1
  621. 6200  GOSUB 5050: REM  WRITE LINKS
  622. 6210  REM  PUT X IN PLACE OF TEMP
  623. 6220 RN = X
  624. 6230 L(RN) = LEFT
  625. 6240  GOSUB 5050: REM  WRITE LINKS
  626. 6250  REM  FIND RIGHTMOST NODE ON DISPLACED BRANCH
  627. 6260  IF R(RN) =  -1  THEN 6300
  628. 6270 RN = R(RN)
  629. 6280  IF K$(RN) = ""  THEN  GOSUB 4970
  630. 6290  GOTO 6260
  631. 6300 R(RN) = RIGHT
  632. 6310  GOSUB 5050: REM  WRITE LINKS
  633. 6320  REM  LINK BRANCH WITH PREVIOUS NODE
  634. 6330  IF PREV =  -1  THEN FR = X: GOTO 5760: REM  TOP NODE
  635. 6340  REM  NOT TOP NODE
  636. 6350 RN = PREV
  637. 6360  IF L(RN) = TEMP  THEN L(RN) = X: GOTO 5750
  638. 6370  IF R(RN) = TEMP  THEN R(RN) = X: GOTO 5750
  639. 6380  REM  *****
  640. 6390  REM  CHANGE RECORD
  641. 6400  REM  *****
  642. 6410  GOSUB 7730: REM  READ RECORD FROM DISK
  643. 6420  HOME : VTAB 8: HTAB 15: IF NR -PT <2  THEN 6910
  644. 6430  PRINT "THE KEY IS"
  645. 6440  PRINT  TAB(  FN TB( LEN(K$(RN))))K$(RN)
  646. 6450  PRINT : PRINT  TAB( 5)"DO YOU WANT TO CHANGE THE KEY?"
  647. 6460  PRINT : PRINT  TAB( 13)"ANSWER Y OR N"
  648. 6470  HTAB 19: GET A$
  649. 6480  IF A$ = "Y"  THEN  PRINT : GOTO 6510
  650. 6490  IF A$ = "N"  THEN  PRINT : GOTO 6910
  651. 6500  GOTO 6470
  652. 6510  REM  CHANGE THE KEY
  653. 6520  PRINT : PRINT "TYPE IN THE NEW KEY AND PRESS <RETURN>"
  654. 6530  INPUT "";KEY$: IF KEY$ = ""  THEN 6910
  655. 6540  HOME : VTAB 10: HTAB 8
  656. 6550  PRINT "REARRANGING BINARY TREE"
  657. 6560  IF  LEFT$(KEY$,30) =  LEFT$(K$(RN),30)  THEN 6910: REM  IF SAME KEY THEN DON'T CHANGE
  658. 6570 RS = RN
  659. 6580  GOSUB 5560: REM  DELETE RECORD
  660. 6590 RN = RS
  661. 6600  REM  ESTABLISH NEW LINKS
  662. 6610 T = RN: REM  SAVE RECORD NUMBER
  663. 6620 PT = PT -1
  664. 6630  GOSUB 4770: REM  PRINT STATISTICS FILE
  665. 6640 L(RN) =  -1:R(RN) =  -1
  666. 6650 RN = FR
  667. 6660  IF K$(RN) = ""  THEN  GOSUB 4970
  668. 6670  IF  LEFT$(KEY$,30) =  LEFT$(K$(RN),30)  THEN 6700
  669. 6680  IF KEY$ <K$(RN)  THEN 6790
  670. 6690  IF KEY$ >K$(RN)  THEN 6830
  671. 6700  REM  DUPLICATE KEY
  672. 6710  HOME : VTAB 8: HTAB 16
  673. 6720  PRINT "YOUR KEY"
  674. 6730  PRINT : PRINT  TAB(  FN TB( LEN(KEY$)))KEY$
  675. 6740  PRINT : PRINT  TAB( 13)"IS A DUPLICATE"
  676. 6750  PRINT : PRINT  TAB( 11)"TYPE IN A NEW KEY"
  677. 6760  PRINT "AND PRESS <RETURN>"
  678. 6770  PRINT : INPUT "";KEY$: IF KEY$ = ""  THEN 6710
  679. 6780  GOTO 6650
  680. 6790  REM  KEY$<K$(RN)
  681. 6800  IF L(RN) < > -1  THEN P(L(RN)) = RN:RN = L(RN): GOTO 6660
  682. 6810 L(RN) = T
  683. 6820  GOTO 6860
  684. 6830  REM  KEY$>K$(RN)
  685. 6840  IF R(RN) < > -1  THEN P(R(RN)) = RN:RN = R(RN): GOTO 6660
  686. 6850 R(RN) = T
  687. 6860  REM  PUT LINKS ON DISK
  688. 6870  GOSUB 5050
  689. 6880 P(T) = RN
  690. 6890 RN = T
  691. 6900 K$(RN) = KEY$
  692. 6910  REM  CHECK ON CHANGES FOR THE REST OF THE RECORD
  693. 6920  IF COUNT = 0  THEN 7070
  694. 6930  FOR I = 1 TO COUNT
  695. 6940  GOSUB 7180: REM  DISPLAY RECORD
  696. 6950  PRINT : PRINT "DO YOU WANT TO CHANGE THE LAST FIELD?"
  697. 6960  PRINT : PRINT  TAB( 13)"ANSWER Y OR N"
  698. 6970  GET A$
  699. 6980  IF A$ = "Y"  THEN 7010
  700. 6990  IF A$ = "N"  THEN 7060
  701. 7000  GOTO 6970
  702. 7010  PRINT : PRINT  TAB( 7)"TYPE IN THE REVISED FIELD"
  703. 7020  PRINT "AND PRESS <RETURN>"
  704. 7030  PRINT : PRINT "TO TRUNCATE RECORD - JUST PRESS <RETURN>"
  705. 7040  INPUT "";F$(I)
  706. 7050  IF F$(I) = ""  THEN 7150: REM  FINISHED
  707. 7060  NEXT I
  708. 7070 I = COUNT
  709. 7080  GOSUB 7180: REM  DISPLAY RECORD
  710. 7090 I = I +1
  711. 7100  PRINT : PRINT "TYPE THE NEXT FIELD AND PRESS <RETURN>"
  712. 7110  PRINT "WHEN FINISHED, JUST PRESS <RETURN>"
  713. 7120  INPUT "";F$(I)
  714. 7130  IF F$(I) = ""  THEN 7150: REM  FINISHED
  715. 7140  GOTO 7080
  716. 7150 COUNT = I -1
  717. 7160  GOSUB 7870: REM  WRITE RECORD ON DISK
  718. 7170  RETURN 
  719. 7180  REM  DISPLAY RECORD
  720. 7190  HOME 
  721. 7200  PRINT "KEY:  ";K$(RN)
  722. 7210  IF I = 0  THEN  RETURN 
  723. 7220  FOR J = 1 TO I
  724. 7230  PRINT 
  725. 7240  PRINT F$(J)
  726. 7250  NEXT J
  727. 7260  RETURN 
  728. 7270  REM  *****
  729. 7280  REM  PRINT RECORD
  730. 7290  REM  *****
  731. 7300  HOME : VTAB 10: HTAB 7
  732. 7310  PRINT "READING RECORD FROM DISK"
  733. 7320  GOSUB 7730: REM  READ RECORD FROM DISK
  734. 7330  PRINT D$;"PR#1"
  735. 7340  PRINT : PRINT : PRINT : PRINT : PRINT 
  736. 7350  PRINT K$(RN)
  737. 7360  PRINT  LEFT$(DASH$, LEN(K$(RN))): PRINT 
  738. 7370  IF COUNT = 0  THEN 7410
  739. 7380  FOR I = 1 TO COUNT
  740. 7390  PRINT F$(I)
  741. 7400  NEXT I
  742. 7410  PRINT : PRINT 
  743. 7420  PRINT D$;"PR#0"
  744. 7430  RETURN 
  745. 7440  REM  *****
  746. 7450  REM  DISPLAY RECORD
  747. 7460  REM  *****
  748. 7470  HOME : VTAB 10: HTAB 7
  749. 7480  PRINT "READING RECORD FROM DISK"
  750. 7490  GOSUB 7730: REM  READ RECORD FROM DISK
  751. 7500  HOME 
  752. 7510  PRINT K$(RN)
  753. 7520  PRINT  LEFT$(DASH$, LEN(K$(RN)))
  754. 7530 I = 1
  755. 7540  IF I >COUNT  THEN 7680
  756. 7550  PRINT F$(I)
  757. 7560 I = I +1
  758. 7570  IF  PEEK(37) >16  THEN 7590
  759. 7580  GOTO 7540
  760. 7590 J =  PEEK(37): PRINT : PRINT 
  761. 7600  VTAB 24
  762. 7610  PRINT "PRESS ANY KEY TO SEE THE NEXT LINE";
  763. 7620  VTAB J +1: HTAB 1
  764. 7630  POKE 35,22
  765. 7640  GET A$
  766. 7650  PRINT F$(I)
  767. 7660 I = I +1
  768. 7670  IF I < = COUNT  THEN 7640
  769. 7680  POKE 35,24
  770. 7690  VTAB 24: CALL  -958
  771. 7700  PRINT "PRESS ANY KEY TO RETURN TO MENU";
  772. 7710  GET A$: PRINT 
  773. 7720  RETURN 
  774. 7730  REM  *****
  775. 7740  REM  READ RECORD FROM DISK
  776. 7750  REM  *****
  777. 7760  IF RM = RN  THEN  RETURN 
  778. 7770 RM = RN
  779. 7780 COUNT = 1
  780. 7790  PRINT : PRINT D$;"OPEN ";FM$;",L";LN
  781. 7800  PRINT D$"READ ";FM$;",R";RN
  782. 7810  INPUT F$(COUNT)
  783. 7820  IF F$(COUNT) = ""  THEN 7840
  784. 7830 COUNT = COUNT +1: GOTO 7810
  785. 7840  PRINT D$"CLOSE ";FM$
  786. 7850 COUNT = COUNT -1
  787. 7860  RETURN 
  788. 7870  REM  *****
  789. 7880  REM  WRITE RECORD ON DISK
  790. 7890  REM  *****
  791. 7900 RM = RN
  792. 7910  GOSUB 5050: REM  WRITE KEY ON DISK
  793. 7920  HOME : VTAB 10: HTAB 9
  794. 7930  PRINT "WRITING RECORD ON DISK"
  795. 7940  PRINT D$"OPEN ";FM$;",L";LN
  796. 7950  PRINT D$"WRITE ";FM$;",R";RN
  797. 7960  IF COUNT = 0  THEN 8030
  798. 7970 LT = 1
  799. 7980  FOR I = 1 TO COUNT
  800. 7990 LT = LT + LEN(F$(I)) +2
  801. 8000  IF LT >LN  THEN 8030: REM  OVERWRITE PROTECT
  802. 8010  PRINT Q$;F$(I)
  803. 8020  NEXT I
  804. 8030  PRINT 
  805. 8040  PRINT D$"CLOSE ";FM$
  806. 8050  RETURN 
  807. 8060  REM  *****
  808. 8070  REM  CHECK FOR NEW FILE
  809. 8080  PRINT D$"CLOSE"
  810. 8090  IF RR < >0  OR  PEEK(222) < >5  THEN 8120: REM  UNEXPECTED ERROR
  811. 8100 RR = 2
  812. 8110  RESUME : REM  START A NEW FILE
  813. 8120  PRINT D$"CLOSE":ER =  PEEK(222): IF ER = 8  THEN  PRINT "CHECK YOUR DISK DRIVE DOOR": GOTO 8180
  814. 8130  IF ER = 13  THEN  PRINT "THAT IS NOT A DATA FILE": GOTO 8180
  815. 8140  IF ER = 10  THEN  PRINT "THAT FILE IS LOCKED": GOTO 8180
  816. 8150  IF ER = 4  THEN  PRINT "DISK IS WRITE PROTECTED": GOTO 8180
  817. 8160  PRINT "UNEXPECTED ERROR #";ER;" IN LINE "; PEEK(218) + PEEK(219) *256
  818. 8170  IF ER = 0  OR ER >15  THEN 8200
  819. 8180  PRINT  CHR$(7);: PRINT "PRESS ANY KEY TO TRY AGAIN";: GET A$: PRINT : GOTO 280
  820. 8190  REM  EXIT PROGRAM
  821. 8200  END