home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib26b.dsk / TFU.bas < prev    next >
BASIC Source File  |  2023-02-26  |  10KB  |  187 lines

  1. 1  REM **********************
  2. 2  REM *        TFU         *
  3. 3  REM * TEXT FILE UTILITY  *
  4. 4  REM *   BY RUDY A. GUY   *
  5. 5  REM * COPYRIGHT (C) 1985 *
  6. 6  REM * BY MICROSPARC, INC *
  7. 7  REM * CONCORD, MA  01742 *
  8. 8  REM **********************
  9. 70  POKE 768,104: POKE 769,168: POKE 770,104: POKE 771,166: POKE 772,223: POKE 773,154: POKE 774,72: POKE 775,152: POKE 776,72: POKE 777,96
  10. 80  ONERR  GOTO 1450
  11. 90  GOSUB 1390
  12. 100  REM  -->MAIN PROGRAM<--
  13. 110  TEXT : HOME 
  14. 120  VTAB 1: INVERSE : FOR I = 1 TO 80: PRINT " ";: NEXT : VTAB 1:A$ = "TEXT FILE UTILITY * BY RUDY A. GUY": GOSUB 1380:A$ = "COPYRIGHT 1985 BY MICROSPARC INC.": GOSUB 1380: NORMAL : POKE 34,2
  15. 130  VTAB 22: PRINT "CATALOG DELETE EDIT HOME LIST LOAD LOCK NEW  ,NUM  QUIT  RENAME  SEARCH  UNLOCK    CTRL - Z (RETURN) FOR PRINTER DUMP";: POKE 35,21: HOME 
  16. 140  GOSUB 1280: ONERR  GOTO 1450
  17. 150  REM   -->PARSE LINE<--
  18. 160  IF  LEN(LI$) = 0  THEN 140
  19. 170  IF  ASC( LEFT$(LI$,1)) >47  AND  ASC( LEFT$(LI$,1)) <58  THEN  GOSUB 1120: GOTO 140
  20. 180  IF  LEFT$(LI$,4) = "LOAD"  THEN 330
  21. 190  IF  LEFT$(LI$,4) = "SAVE"  THEN 600
  22. 200  IF  LEFT$(LI$,4) = "HOME"  THEN  HOME : GOTO 140
  23. 210  IF  LEFT$(LI$,4) = "LIST"  THEN  GOSUB 790: GOTO 140
  24. 220  IF  LEFT$(LI$,3) = "NEW"  THEN 910
  25. 230  IF  LEFT$(LI$,4) = "QUIT"  THEN  TEXT : HOME : END 
  26. 240  IF  LEFT$(LI$,3) = "CAT"  THEN  GOSUB 930: GOTO 140
  27. 250  IF  LEFT$(LI$,3) = "DEL"  THEN  GOSUB 930: GOTO 140
  28. 260  IF  LEFT$(LI$,3) = "REN"  THEN  GOSUB 930: GOTO 140
  29. 270  IF  LEFT$(LI$,4) = "UNLO"  THEN  GOSUB 930: GOTO 140
  30. 280  IF  LEFT$(LI$,4) = "LOCK"  THEN  GOSUB 930: GOTO 140
  31. 290  IF  LEFT$(LI$,4) = "SEAR"  THEN  GOSUB 950: GOTO 140
  32. 300  IF  LEFT$(LI$,4) = "EDIT"  THEN  GOSUB 1590: GOTO 140
  33. 310  IF  LEFT$(LI$,1) =  CHR$(26)  THEN  GOSUB 1400: GOTO 140
  34. 320  PRINT  CHR$(7)"+++ COMMAND ERROR": GOTO 140
  35. 330  REM -->LOAD FILE<--
  36. 340  FOR I = 1 TO LI:LI$(I) = "": NEXT :LI = 1
  37. 350  IF  LEN(LI$) = 4  THEN 320
  38. 360 LI$ =  RIGHT$(LI$, LEN(LI$) -4)
  39. 370  FOR I = 1 TO  LEN(LI$): IF  MID$ (LI$,I,1) =  CHR$(44)  THEN 390
  40. 380  NEXT :TE$ = LI$: GOTO 400
  41. 390 TE$ =  LEFT$(LI$,I -1): ONERR  GOTO 1460
  42. 400  PRINT  CHR$(4)"RENAME "TE$","LI$
  43. 410  POKE 216,0
  44. 420  ONERR  GOTO 500
  45. 430  PRINT  CHR$(4)"OPEN "TE$
  46. 440  PRINT  CHR$(4)"READ "TE$
  47. 450 LI$ = ""
  48. 460  GET A$: IF A$ =  CHR$(13)  THEN 480
  49. 470 LI$ = LI$ +A$: GOTO 460
  50. 480  IF LI$ = ""  THEN 460
  51. 490 LI$(LI) = LI$:LI = LI +1: GOTO 450
  52. 500  PRINT : PRINT  CHR$(4)"CLOSE":LI = LI -1: POKE 216,0: HOME : IF   NOT LI  THEN  PRINT "+++ NO FILE LOADED": GOTO 140
  53. 510  FOR I = 1 TO LI:AD$ =  STR$(I *10)
  54. 520  IF  LEN(AD$) <5  THEN AD$ = "0" +AD$: GOTO 520
  55. 530 LI$(I) = AD$ +" " +LI$(I)
  56. 540  PRINT LI$(I): NEXT 
  57. 550  IF  ASC( MID$ (LI$(LI),7,1)) >57  THEN 580
  58. 560  PRINT : INPUT "DELETE 1ST SET OF NUMBERS ?";YN$:: PRINT : IF  LEFT$(YN$,1) = "N"  THEN 580
  59. 570  FOR I = 1 TO LI:LI$(I) =  RIGHT$(LI$(I), LEN(LI$(I)) -6): PRINT LI$(I): NEXT 
  60. 580  ONERR  GOTO 1450
  61. 590  GOTO 140
  62. 600  REM  -->SAVE FILE<--
  63. 610  IF  LEN(LI$) = 4  THEN 320
  64. 620  IF  MID$ (LI$, LEN(LI$) -1,1) = "D"  THEN T$ =  RIGHT$(LI$,3):TF = 1:LI$ =  LEFT$(LI$, LEN(LI$) -3)
  65. 630  IF  RIGHT$(LI$,4) = ",NUM"  THEN FL = 1:LI$ =  LEFT$(LI$, LEN(LI$) -4)
  66. 640 LI$ =  RIGHT$(LI$, LEN(LI$) -4)
  67. 650  IF LI <1  THEN  PRINT  CHR$(7)"+++ NO WORK FILE": GOTO 140
  68. 660  FOR I = 1 TO  LEN(LI$): IF  MID$ (LI$,I,1) =  CHR$(44)  THEN 680
  69. 670  NEXT 
  70. 680 TE$ =  LEFT$(LI$,I -1)
  71. 690  IF TF  THEN TE$ = TE$ +T$
  72. 700  PRINT  CHR$(4)"OPEN "TE$: PRINT  CHR$(4)"CLOSE"
  73. 710  PRINT  CHR$(4)"DELETE"TE$
  74. 720  PRINT  CHR$(4)"OPEN "TE$
  75. 730  IF TF  THEN TF = 0:TE$ =  LEFT$(TE$, LEN(TE$) -3)
  76. 740  PRINT  CHR$(4)"WRITE "TE$
  77. 750  FOR I = 1 TO LI: IF   NOT FL  THEN  PRINT  RIGHT$(LI$(I), LEN(LI$(I)) -6): GOTO 770
  78. 760  PRINT LI$(I)
  79. 770  NEXT : PRINT  CHR$(4)"CLOSE":FL = 0
  80. 780  GOTO 140
  81. 790  REM  -->LIST FILE<--
  82. 800  IF LI <1  THEN  PRINT  CHR$(7)"+++ WORK FILE EMPTY": RETURN 
  83. 810  IF LI$ = "LIST"  THEN  FOR I = 1 TO LI: PRINT LI$(I): NEXT : RETURN 
  84. 820 TE$ =  RIGHT$(LI$, LEN(LI$) -5)
  85. 830  FOR I = 1 TO  LEN(TE$): IF  MID$ (TE$,I,1) =  CHR$(44)  THEN B =  VAL( LEFT$(TE$,I -1)):EN =  VAL( RIGHT$(TE$, LEN(TE$) -I)): GOTO 850
  86. 840  NEXT :EN =  VAL(TE$):B = 0
  87. 850  FOR I = 1 TO LI
  88. 860  IF  VAL( LEFT$(LI$(I),5)) > = B  AND  VAL( LEFT$(LI$(I),5)) < = EN  THEN  PRINT LI$(I)
  89. 870  IF  VAL( LEFT$(LI$(I),5)) = EN  THEN  RETURN 
  90. 880  NEXT 
  91. 890  RETURN 
  92. 900  REM  -->CLEAR FILE<--
  93. 910  CLEAR : GOSUB 1390: GOTO 140
  94. 920  REM  -->DOS COMMAND<--
  95. 930  PRINT  CHR$(4)LI$: RETURN 
  96. 940  REM  -->SEARCH<--
  97. 950  HOME : VTAB 12: PRINT "ENTER SEARCH KEY :";:SE$ = ""
  98. 960  GET A$: IF A$ =  CHR$(8)  AND  LEN(SE$) >1  THEN SE$ =  LEFT$(SE$, LEN(SE$) -1): PRINT " "A$A$;: GOTO 960
  99. 970  IF A$ =  CHR$(8)  AND  LEN(SE$) = 1  THEN SE$ = "": PRINT " "A$A$;: GOTO 960
  100. 980  IF A$ =  CHR$(8)  AND  LEN(SE$) = 0  THEN  PRINT " ";A$;: GOTO 960
  101. 990  IF A$ =  CHR$(21)  THEN 960
  102. 1000  PRINT A$;: IF A$ =  CHR$(13)  THEN 1020
  103. 1010 SE$ = SE$ +A$: GOTO 960
  104. 1020  FOR I = 1 TO LI
  105. 1030  FOR J = 1 TO  LEN(LI$(I)): IF  LEN(SE$) > LEN(LI$(I))  THEN 1060
  106. 1040  IF  MID$ (LI$(I),J, LEN(SE$)) = SE$  THEN  HOME : HTAB 2: PRINT LI$(I): GOTO 1080
  107. 1050  NEXT J
  108. 1060  NEXT I
  109. 1070  VTAB 12: CALL  -958: RETURN 
  110. 1080  VTAB 12: INPUT "(E)DIT (C)ONTINUE SEARCH OR (A)BORT ?";OP$:OP$ =  LEFT$(OP$,1): IF OP$ < >"E"  AND OP$ < >"C"  AND OP$ < >"A"  THEN  VTAB 12: CALL  -958: GOTO 1080
  111. 1090  IF OP$ = "C"  THEN  VTAB 12: CALL  -958: PRINT "SEARCHING...": GOTO 1050
  112. 1100  IF OP$ = "A"  THEN  VTAB 12: CALL  -958: RETURN 
  113. 1110  VTAB 12: CALL  -958: HTAB 1: VTAB 3: GOSUB 1660: RETURN 
  114. 1120  REM  -->BUILD FILE<--
  115. 1130 CH$ = "          ": REM  10 SPACES
  116. 1140  IF  LEN(LI$) <5  THEN LI$ = LI$ + CHR$(32): GOTO 1140
  117. 1150 LI = LI +1
  118. 1160  FOR I = 1 TO 5: IF  ASC( MID$ (LI$,I,1)) >57  OR  ASC( MID$ (LI$,I,1)) = 32  THEN LI$ = "0" +LI$
  119. 1170  NEXT 
  120. 1180  IF  MID$ (LI$,6,1) < > CHR$(32)  THEN  PRINT  CHR$(7)"+++ ENTRY ERROR":LI = LI -1: RETURN 
  121. 1190  IF  VAL( LEFT$(LI$(LI -1),5)) < VAL( LEFT$(LI$,5))  THEN LI$(LI) = LI$: RETURN 
  122. 1200  FOR I = 1 TO LI: IF  VAL( LEFT$(LI$(I),5)) > =  VAL( LEFT$(LI$,5))  THEN 1220
  123. 1210  NEXT 
  124. 1220  IF  RIGHT$(LI$, LEN(LI$) -5) =  RIGHT$(CH$, LEN(LI$) -5)  AND  VAL( LEFT$(LI$(I),5)) =  VAL( LEFT$(LI$,5))  THEN  FOR J = I TO LI -2:LI$(J) = LI$(J +1): NEXT J:LI = LI -2: RETURN 
  125. 1230  IF  VAL( LEFT$(LI$(I),5)) =  VAL( LEFT$(LI$,5))  THEN LI$(I) = LI$:LI = LI -1: RETURN 
  126. 1240  FOR I = 1 TO LI: IF  VAL( LEFT$(LI$,5)) < VAL( LEFT$(LI$(I),5))  THEN 1260
  127. 1250  NEXT 
  128. 1260 J = I
  129. 1270  FOR I = LI TO J  STEP  -1:LI$(I) = LI$(I -1): NEXT :LI$(J) = LI$: RETURN 
  130. 1280  REM  -->READ KEYBOARD<--
  131. 1290  PRINT "^";:LI$ = ""
  132. 1300  GET A$: IF A$ =  CHR$(8)  AND  LEN(LI$) >1  THEN LI$ =  LEFT$(LI$, LEN(LI$) -1): PRINT " "A$A$;: GOTO 1300
  133. 1310  IF A$ =  CHR$(8)  AND  LEN(LI$) = 1  THEN LI$ = "": PRINT " "A$A$;: GOTO 1300
  134. 1320  IF A$ =  CHR$(8)  AND  LEN(LI$) = 0  THEN  PRINT " ";A$;: GOTO 1300
  135. 1330  IF A$ =  CHR$(21)  THEN 1300
  136. 1340  PRINT A$;: IF A$ =  CHR$(13)  THEN  RETURN 
  137. 1350 LI$ = LI$ +A$: GOTO 1300
  138. 1360  RETURN 
  139. 1370  REM  -->CENTERING ROUTINE<--
  140. 1380  HTAB 21 - LEN(A$)/2: PRINT A$: RETURN 
  141. 1390  DIM LI$(500): RETURN 
  142. 1400  REM  -->PRINTER RTN<--
  143. 1410  PRINT  CHR$(4)"PR#1": PRINT  CHR$(9)"80N"
  144. 1420  FOR I = 1 TO LI: PRINT LI$(I): NEXT 
  145. 1430  PRINT  CHR$(4)"PR#0"
  146. 1440  RETURN 
  147. 1450  REM  -->ERROR ROUTINE<--
  148. 1460 ER =  PEEK(222): REM  <-- ERROR TYPE
  149. 1470 EL =  PEEK(218) + PEEK(219) *256: REM  <-- ERROR LINE
  150. 1480  CALL 768
  151. 1490  IF ER = 255  THEN  TEXT : HOME : END 
  152. 1500  REM OTHER ERRORS
  153. 1510  IF ER = 6  THEN  PRINT  CHR$(7)"+++ FILE NOT FOUND": GOTO 140
  154. 1520  IF ER = 8  THEN  PRINT  CHR$(7)"+++ I/O ERROR": GOTO 140
  155. 1530  IF ER = 9  THEN  PRINT  CHR$(7)"+++ DISK FULL": GOTO 140
  156. 1540  IF ER = 10  THEN  PRINT  CHR$(7)"+++ FILE LOCKED": GOTO 140
  157. 1550  IF EL = 870  THEN  PRINT  CHR$(7)"+++ DOS COMMAND ERROR": GOTO 140
  158. 1560  IF ER = 53  THEN  PRINT  CHR$(7)"+++ ENTRY ERROR": GOTO 140
  159. 1570  IF ER = 16  OR ER = 11  THEN  PRINT  CHR$(7)"+++SYNTAX ERROR": GOTO 140
  160. 1580  PRINT "ERROR TYPE :"ER: PRINT "ERROR LINE :"EL: STOP 
  161. 1590  REM -->EDIT LINE SEARCH<--
  162. 1600  IF LI <1  THEN  PRINT  CHR$(7)"+++ WORK FILE EMPTY": RETURN 
  163. 1610  IF  MID$ (LI$,5,1) < > CHR$(32)  THEN  PRINT  CHR$(7)"+++SYNTAX ERROR": RETURN 
  164. 1620 LI$ =  RIGHT$(LI$, LEN(LI$) -5):SE =  VAL(LI$)
  165. 1630  FOR I = 1 TO LI: IF SE =  VAL( LEFT$(LI$(I),5))  THEN FL = I
  166. 1640  NEXT : IF FL >0  THEN I = FL:FL = 0: HOME : HTAB 2: PRINT LI$(I): VTAB 3: GOTO 1660
  167. 1650  PRINT  CHR$(7)"+++LINE NUMBER NOT FOUND": RETURN 
  168. 1660  REM -->EDIT<--
  169. 1670 PO = 1:LI$ =  LEFT$(LI$(I),6):LI$(I) =  RIGHT$(LI$(I), LEN(LI$(I)) -6)
  170. 1680  PRINT "^";: HTAB 8
  171. 1690  GET A$: IF A$ =  CHR$(21)  THEN PO = PO +1:H =  PEEK(36): IF H = 39  THEN H = 0: PRINT : POKE 36,H: GOTO 1690
  172. 1700  IF A$ =  CHR$(21)  THEN H = H +1: POKE 36,H: GOTO 1690
  173. 1710  IF A$ =  CHR$(8)  AND PO >0  THEN PO = PO -1: PRINT A$;: GOTO 1690
  174. 1720  IF A$ =  CHR$(8)  AND PO = 0  THEN 1690
  175. 1730  IF A$ =  CHR$(13)  AND LI$(I) = ""  THEN J = I: FOR I = J +1 TO LI:LI$(I -1) = LI$(I): NEXT :LI$(LI) = "":LI = LI -1: HOME : RETURN 
  176. 1740  IF A$ =  CHR$(13)  THEN LI$(I) = LI$ +LI$(I): HOME : PRINT LI$(I): RETURN 
  177. 1750  IF A$ =  CHR$(4)  AND  LEN(LI$(I)) < = 1  THEN LI$(I) = "": GOTO 1690
  178. 1760  IF A$ =  CHR$(4)  AND PO = 1  THEN LI$(I) =  RIGHT$(LI$(I), LEN(LI$(I)) -1): HOME : HTAB 2: PRINT LI$;LI$(I): VTAB 3: HTAB 8:PO = 1: GOTO 1690
  179. 1770  IF A$ =  CHR$(4)  AND PO =  LEN(LI$(I))  THEN LI$(I) =  LEFT$(LI$(I),PO -1): PRINT " " CHR$(8) CHR$(8);:PO = PO -1: GOTO 1690
  180. 1780  IF A$ =  CHR$(4)  AND PO > LEN(LI$(I))  THEN 1690
  181. 1790  IF A$ =  CHR$(4)  THEN T1$ =  LEFT$(LI$(I),PO -1):T2$ =  RIGHT$(LI$(I), LEN(LI$(I)) -PO):LI$(I) = T1$ +T2$:H =  PEEK(36):V =  PEEK(37): HOME : PRINT "^"LI$;LI$(I);: POKE 36,H: POKE 37,V: GOTO 1690
  182. 1800  IF PO = 1  THEN LI$(I) = A$ +LI$(I):PO = PO +1:H =  PEEK(36):H = H +1: HOME : PRINT "^";LI$;LI$(I);: POKE 36,H: GOTO 1690
  183. 1810  IF PO > LEN(LI$(I))  THEN  PRINT A$;:LI$(I) = LI$(I) +A$:PO = PO +1: GOTO 1690
  184. 1820 T1$ =  LEFT$(LI$(I),PO -1):T2$ = A$ + RIGHT$(LI$(I), LEN(LI$(I)) -(PO -1)):LI$(I) = T1$ +T2$:PO = PO +1
  185. 1830 H =  PEEK(36): IF H = 39  THEN H = 0:V =  PEEK(37) +1: GOTO 1850
  186. 1840 H = H +1:V =  PEEK(37)
  187. 1850  HOME : PRINT "^";LI$;LI$(I): HTAB H +1: VTAB V +1: GOTO 1690