home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / basic / prebas.lbr / PREBAS.BQS / PREBAS.BAS
Encoding:
BASIC Source File  |  1985-03-18  |  28.8 KB  |  757 lines

  1. 10 '-----------------------------------------------------------------
  2. 20 '                        PREBAS.BAS
  3. 30 '
  4. 40 '         Copyright (c) 1985 by Greywolf
  5. 50 '
  6. 60 '    Pre-processor for BASIC. Will add line numbers to a standard
  7. 70 '    ASCII file, and (optionally) resolve labels in that file. 
  8. 80 '    Labels are identified by starting with the MARKER$ character,
  9. 90 '    (default is "@").
  10. 100 '
  11. 110 REVDATE$ = "22 JAN 1985" '        DATE OF LAST REVISION
  12. 120 '-----------------------------------------------------------------
  13. 130 '
  14. 140 ESC$ = CHR$(27): QUOTES$ = CHR$(34): TAB$ = CHR$(9): BELL$ = CHR$(7)
  15. 150 CR$ = CHR$(13): LF$ = CHR$(10): NL$ = CR$ + LF$
  16. 160 DEFINT A-Z: TRUE = -1: FALSE = 0: ABORT = FALSE: DEBUG = FALSE
  17. 170 MSDOS = FALSE '            True if we're running on a PC or clone.
  18. 180 OSEXEC = TRUE '            True if we're on an Osborne Exec.
  19. 190 '                    (Or an Osborne 1)
  20. 200 IF OSEXEC = TRUE THEN CLS$ = CHR$(26) '  The clear screen string.
  21. 210 MARKER$ = "@" '            The label identifier
  22. 220 OPTION BASE 1
  23. 230 DIM LABTAB$(2,1000) '        THE SECOND IS THE NUMBER OF LABELS
  24. 240 '                    WE CAN HANDLE
  25. 250 STARTNUM = 10: STEPSIZE = 10
  26. 260 ADDVECTS = TRUE '            Show the replaced labels as comments
  27. 270 '                    at the end of the line.
  28. 280 COMBUF = &H80 '            CPM comand line buffer
  29. 290 COMPILE = TRUE '            Set TRUE if compiling this
  30. 300 INFEXT$ = "": OUTFEXT$ = ".BAS" '    Default file extents 
  31. 310 HAVECL = FALSE '            At present we don't have a command line
  32. 320 CLERROR = FALSE
  33. 330 GOSUB 4340 '            @SIGNON
  34. 340 DOLABELS = TRUE: DOLINUMS = TRUE
  35. 350 KILLOLDOUT = FALSE
  36. 360 GOSUB 4440 '            See if we have a command line
  37. 370 IF CLERROR = TRUE THEN PRINT BELL$: SYSTEM
  38. 380 A$ = "Y"
  39. 390 WHILE A$ = "Y"
  40. 400    ABORT = FALSE
  41. 410    IF HAVECL = FALSE THEN GOSUB 620 '    GET THE FILE NAMES AND PARAMETERS
  42. 420    IF HAVECL = FALSE THEN GOSUB 4250 '    Clear screen.
  43. 430    IF ABORT = TRUE THEN GOTO 480
  44. 440    IF DOLABELS = FALSE THEN GOSUB 1770 
  45.  
  46.     ELSE GOSUB 2410: GOSUB 3050 '    TO @ADLNUMS ELSE TO @RESOLVE, @ADLABLN
  47. 450    PRINT
  48. 460    PRINT "PROCESSED " ((PRESNUM - STEPSIZE)/STEPSIZE) 
  49.  
  50.     " LINES, NUMBERED FROM" STARTNUM " TO " (PRESNUM - STEPSIZE)
  51. 470    PRINT
  52. 480    CLOSE
  53. 490    IF HAVECL = TRUE THEN A$ = "N": GOTO 570 'If we entered from comline
  54. 500 '                         we get out here.
  55. 510    PRINT:PRINT "DO YOU WANT TO NUMBER ANOTHER FILE (Y/N)? ";
  56. 520    GOSUB 4170 '            GET AN UPPER CASE KEY INTO A$
  57. 530    PRINT A$
  58. 540    IF A$ = "Y" THEN GOSUB 4250 '        @CLEARSCREEN
  59. 550    HAVECL = FALSE '    WE DONT HAVE A COMMAND LINE ANYMORE
  60. 560    KILLOLDOUT = FALSE
  61. 570 CLOSE
  62. 580 WEND
  63. 590 PRINT: PRINT "RETURNING YOU TO SYSTEM --"
  64. 600 PRINT    "                    BEANNACHD LEIBH."
  65. 610 END
  66. 620 '---------------------------------------------------------------------
  67. 630 '                                  @GETPARMS
  68. 640 '   Get the parameters from the user
  69. 650 '
  70. 660 ' ENTRY: Nothing
  71. 670 ' EXIT: INFILE$, OUTFILE$,STARTNUM,STEP  all set.
  72. 680 '---------------------------------------------------------------------
  73. 690 KILLOLDOUT = FALSE
  74. 700 PRINT: PRINT "INPUT X TO EXIT, OR ESC TO ACCEPT THE DEFAULTS"
  75. 710 PRINT  "(AFTER YOU HAVE GIVEN A FILENAME)" :PRINT
  76. 720 PRINT "WHAT IS THE NAME OF THE INFILE";
  77. 730 IF INFILE$ <> "" THEN PRINT: PRINT " ( <CR> FOR " + INFILE$ + ")";
  78. 740 PRINT "?:";
  79. 750 GOSUB 4020 '       GET AN ECHOED UPPER CASE LINE
  80. 760 IF UPLINE$ = "X" THEN ABORT = TRUE:RETURN
  81. 770 GSPEC$ = UPLINE$
  82. 780 GOSUB 6870 '        @GETSPEC
  83. 790 IF GOTSPEC$ = "" AND INFSPEC$ = "" THEN GOTO 720 ' IF WE DONT GOT ONE
  84. 800 IF GOTEXT$ <> "" THEN INFEXT$ = GOTEXT$
  85. 810 IF GOTSPEC$ <> "" THEN INFSPEC$ = GOTSPEC$
  86. 820 INFILE$ = INFSPEC$ + INFEXT$
  87. 830 IF GOTSPEC$ <> "" THEN OUTFSPEC$ = GOTSPEC$:
  88.  
  89.     OUTFILE$ = OUTFSPEC$ + OUTFEXT$
  90. 840 ON ERROR GOTO 1750
  91. 850 OPEN "I",#1,INFILE$
  92. 860 ON ERROR GOTO 0
  93. 870 '
  94. 880 '  WE HAVE AN INFILE -- GET THE OUTFILE
  95. 890 '
  96. 900 IF OUTFILE$ = "" THEN OUTFSPEC$ = INFSPEC$:
  97.  
  98.     OUTFILE$ = OUTFSPEC$ + OUTFEXT$
  99. 910 PRINT:PRINT:PRINT "WHAT IS THE NAME OF THE OUTPUT FILE";
  100. 920 PRINT: PRINT "( <CR> FOR " + OUTFILE$ + ")";
  101. 930 PRINT "?:";
  102. 940 GOSUB 4020 '       GET UPPER CASE LINE
  103. 950 IF UPLINE$ = ESC$ THEN ABORT = FALSE: RETURN
  104. 960 IF UPLINE$ = "X" THEN ABORT = TRUE: RETURN
  105. 970 IF UPLINE$ = "" THEN GOTO 1020
  106. 980 GSPEC$ = UPLINE$: GOSUB 6870 '    @GETSPEC
  107. 990 IF GOTEXT$ <> "" THEN OUTFEXT$ = GOTEXT$
  108. 1000 IF GOTSPEC$ <> "" THEN OUTFSPEC$ = GOTSPEC$
  109. 1010 OUTFILE$ = OUTFSPEC$ + OUTFEXT$
  110. 1020 IF OUTFILE$ = INFILE$ THEN    GOTO 1130 '    IF THEY ARE THE SAME WE KNOW
  111. 1030 '                                         THE OUTFILE ALREADY EXISTS
  112. 1040 ON ERROR GOTO 1070
  113. 1050 OPEN "I",#2,OUTFILE$ '             JUST SEE IF ITS THERE
  114. 1060 GOTO 1090 '                WE ALREADY HAVE THE OUTFILE
  115. 1070 IF ERR <> 53 THEN ON ERROR GOTO 0: RESUME
  116. 1080 RESUME 1130 'IF THERE WAS AN ERROR THERE WAS NO OLD OUTFILE SO WERE OK
  117. 1090 PRINT OUTFILE$ " ALREADY EXISTS -- OVERWRITE (Y/N)? ";
  118. 1100 GOSUB 4170: PRINT A$
  119. 1110 IF A$ = "Y" THEN KILLOLDOUT = TRUE ELSE CLOSE #2:OUTFILE$ = "":  GOTO 910
  120. 1120 '
  121. 1130 ON ERROR GOTO 0
  122. 1140 '
  123. 1150 '          WE HAVE AN OUTFILE -- FIND OUT IF WE'VE TO NUMBER
  124. 1160 '
  125. 1170 PRINT "DO YOU WANT TO ADD LINE NUMBERS? ";
  126. 1180 GOSUB 4170: PRINT A$
  127. 1190 IF A$ = "X" THEN ABORT = TRUE : RETURN
  128. 1200 IF A$ = ESC$ THEN ABORT = FALSE: RETURN
  129. 1210 IF A$ = "N" THEN DOLINUMS = FALSE ELSE DOLINUMS = TRUE
  130. 1220 PRINT "DO YOU WANT TO RESOLVE LABELS? ";
  131. 1230 GOSUB 4170: PRINT A$
  132. 1240 IF A$ = "X" THEN ABORT = TRUE : RETURN
  133. 1250 IF A$ = ESC$ THEN ABORT = FALSE: RETURN
  134. 1260 IF A$ = "N" THEN DOLABELS = FALSE ELSE DOLABELS = TRUE
  135. 1270 '
  136. 1280 IF DOLABELS = FALSE THEN GOTO 1440 '    If we don't do labels
  137. 1290 '                        we don't need a MARKER$
  138. 1300 PRINT "WHAT IS THE MARKER$ CHARACTER (<CR> FOR "   MARKER$  ")?: ";
  139. 1310 GOSUB 4170: PRINT A$
  140. 1320 IF A$ = "X" THEN ABORT = TRUE:RETURN
  141. 1330 IF A$ => "A" AND A$ <= "Z" THEN PRINT "INVALID MARKER":GOTO 1300
  142. 1340 IF A$ = ESC$ THEN ABORT = FALSE:RETURN
  143. 1350 IF A$ => "#" THEN MARKER$ = A$
  144. 1360 '
  145. 1370 PRINT "ADD COMMENTS TO END OF LINES?"
  146. 1380 PRINT "(e.g. 'TO: @LABEL1, @LABEL2...'): ";
  147. 1390 GOSUB 4170: PRINT A$
  148. 1400 IF A$ = "X" THEN ABORT = TRUE : RETURN
  149. 1410 IF A$ = ESC$ THEN ABORT = FALSE: RETURN
  150. 1420 IF A$ = "N" THEN ADDVECTS = FALSE ELSE ADDVECTS = TRUE
  151. 1430 '
  152. 1440 IF DOLINUMS = TRUE OR DOLABELS = TRUE THEN GOTO 1550 ' GO GET START, STEP
  153. 1450 '
  154. 1460 PRINT BELL$   "DO YOU WANT TO STRIP LINE NUMBERS FROM " INFILE$ "? "
  155. 1470 PRINT "(TYPE N TO CHANGE YOUR MIND, X TO CHANGE FILENAMES): ";
  156. 1480 GOSUB 4170: PRINT A$
  157. 1490 IF A$ = "X" THEN ABORT = TRUE : RETURN
  158. 1500 IF A$ = ESC$ THEN ABORT = FALSE: RETURN
  159. 1510 IF A$ = "Y" THEN RETURN ELSE GOTO 1170 '        go ask again
  160. 1520 '
  161. 1530 '  NOW -- GET A START NUMBER
  162. 1540 '
  163. 1550 PRINT "WHAT IS THE START NUMBER (<CR> FOR"   STARTNUM   ")?:";
  164. 1560 INPUT "",STARTNUM$
  165. 1570 IF STARTNUM$ = "X" OR STARTNUM$ = "x" THEN ABORT = TRUE:RETURN
  166. 1580 IF STEPSIZE$ = ESC$ THEN ABORT = FALSE:RETURN
  167. 1590  IF STARTNUM$ <> "" THEN STARTNUM = VAL(STARTNUM$)
  168. 1600 IF STARTNUM < 1 THEN STARTNUM = 10
  169. 1610 '
  170. 1620 '  WE HAVE STARTNUM -- GET STEP SIZE
  171. 1630 '
  172. 1640 PRINT "ENTER THE STEP SIZE (<CR> FOR"   STEPSIZE  ")?:";
  173. 1650 INPUT "",STEPSIZE$
  174. 1660 IF STEPSIZE$ = "X" OR STEPSIZE$ = "x" THEN ABORT = TRUE:RETURN
  175. 1670 IF STEPSIZE$ <> "" THEN STEPSIZE = VAL(STEPSIZE$)
  176. 1680 IF STEPSIZE < 1 THEN STEPSIZE = 10
  177. 1690 '
  178. 1700 '  WHEE -- WE HAVE THEM ALL
  179. 1710 '
  180. 1720 RETURN
  181. 1730 '
  182. 1740 '
  183. 1750 IF ERR <> 53 THEN ON ERROR GOTO 0:RESUME ' IF ITS NOT "FILE NOT FOUND"
  184. 1760 PRINT "COULD NOT FIND " INFILE$: INFILE$ = "": CLOSE: RESUME 720
  185. 1770 '---------------------------------------------------------------------
  186. 1780 '                          @ADLNUM
  187. 1790 '  Add line numbers (start at STARTNUM increase by STEPSIZE) to
  188. 1800 '  INFILE$ then write it out to OUTFILE$. This routine is also entered
  189. 1810 '  if we just want to strip out line numbers (with DOLINUMS = FALSE)
  190. 1820 '
  191. 1830 '  ENTRY: INFILE$ should be opened, DOLINUMS = FALSE or TRRUE
  192. 1840 '  EXIT:  ADLNUMERR is TRUE or FALSE.
  193. 1850 '---------------------------------------------------------------------
  194. 1860 '
  195. 1870 PRINT:PRINT "WRITING "  INFILE$ " TO "  OUTFILE$  " WITH";
  196. 1880 IF DOLINUMS = FALSE THEN PRINT " NO";
  197. 1890 PRINT " LINE NUMBERS ";                                    
  198. 1900 IF DOLINUMS = TRUE THEN PRINT STARTNUM  "," STEPSIZE  ".";
  199. 1910 PRINT
  200. 1920 PRESNUM = STARTNUM
  201. 1930 LNTEMP$ = OUTFSPEC$ + ".TMP"
  202. 1940 OPEN "O",#3,LNTEMP$
  203. 1950 FIRSTFND = TRUE
  204. 1960 WHILE EOF(1) = FALSE
  205. 1970    IF DOLINUMS = TRUE THEN ADD$ = MID$(STR$(PRESNUM),2) + " "
  206.  
  207.     ELSE ADD$ = ""
  208. 1980    LINE INPUT #1,PRESLINE$
  209. 1990    ONECHAR$ = LEFT$(PRESLINE$,1) '         HERE, WE GET RID OF EXISTING
  210. 2000    IF ONECHAR$ < "1" OR ONECHAR$ > "9" THEN GOTO 2100 '     LINE NUMBER
  211. 2010    WHILE ONECHAR$ => "0" AND ONECHAR$ <= "9" '             BUT NOT IF IT
  212. 2020        IF FIRSTFND = TRUE THEN GOSUB 2200:
  213.  
  214.             FIRSTFND = FALSE:
  215.  
  216.             IF A$ <> "Y" THEN CLOSE:
  217.  
  218.             RETURN
  219.  
  220.         '    @WARNING, there is already numbers
  221. 2030        PRESLINE$ = RIGHT$(PRESLINE$,(LEN(PRESLINE$)-1)) ' STARTS WITH
  222. 2040        ONECHAR$ = LEFT$(PRESLINE$,1) '                   A ZERO (MIGHT
  223. 2050    WEND '                                                BE SBASIC LABEL)
  224. 2060 '          NOW GET RID OF ANY EXTRA SPACES
  225. 2070 '
  226. 2080    IF ONECHAR$ = " " THEN PRESLINE$ =RIGHT$(PRESLINE$,(LEN(PRESLINE$)-1)):
  227.  
  228.         ONECHAR$ = LEFT$(PRESLINE$,1)
  229. 2090    IF ONECHAR$ = " " THEN PRESLINE$ =RIGHT$(PRESLINE$,(LEN(PRESLINE$)-1)):
  230.  
  231.         ONECHAR$ = LEFT$(PRESLINE$,1)
  232. 2100    PRESLINE$ = ADD$ + PRESLINE$
  233. 2110    PRESNUM = PRESNUM + STEPSIZE
  234. 2120    PRINT #3,PRESLINE$
  235. 2130 WEND
  236. 2140 CLOSE
  237. 2150 IF DOLINUMS = FALSE AND FIRSTFND = TRUE THEN
  238.  
  239.     PRINT BELL$: PRINT "COULD NOT FIND ANY LINE NUMBERS IN " INFILE$:
  240.  
  241.     KILL LNTEMP$:
  242.  
  243.     RETURN
  244. 2160 IF OUTFILE$ = INFILE$ THEN KILL INFILE$
  245. 2170 IF KILLOLDOUT = TRUE THEN KILL OUTFILE$
  246. 2180 NAME LNTEMP$ AS OUTFILE$
  247. 2190 RETURN
  248. 2200 '----------------------------------------------------------------------
  249. 2210 '                          @WARNING
  250. 2220 '          Here we have found line numbers already in the file so
  251. 2230 '          warn user and find out if he wants to proceed.
  252. 2240 '
  253. 2250 ' ENTRY: no parms.
  254. 2260 ' EXIT: A$ = "Y" if we are to proceed, else it = "X", ABORT is set or
  255. 2270 '         cleared.
  256. 2280 '-------------------------------------------------------------------------
  257. 2290 '
  258. 2300 IF HAVECL = TRUE THEN A$ = "Y":
  259.  
  260.     PRINT "STRIPPING OUT OLD LINE NUMBERS":
  261.  
  262.     RETURN
  263. 2310 IF DOLINUMS = FALSE AND DOLABELS = FALSE THEN
  264.  
  265.     PRINT "HAVE FOUND LINE NUMBERS IN " INFILE$
  266.  
  267.     NL$  "STRIPPING AND WRITING TO " OUTFILE$:
  268.  
  269.     A$ = "Y": RETURN
  270. 2320 PRINT BELL$: PRINT "WARNING -- numbered lines already in the file,"
  271. 2330 PRINT INFILE$ ", starting at line number"  PRESNUM
  272. 2340 PRINT "Do you wish to proceed (strip/overwrite old numbers) ?"
  273. 2350 PRINT "(Input 'Y' to proceed -- anything else will abort): ";
  274. 2360 GOSUB 4170 : PRINT A$ '           GET THE CHAR
  275. 2370 IF A$ <> "Y" THEN A$ = "X": ABORT = TRUE: CLOSE: KILL LNTEMP$:
  276.  
  277.     PRINT "PROCESS ABORTED"
  278. 2380 RETURN
  279. 2390 '
  280. 2400 '
  281. 2410 '----------------------------------------------------------------------
  282. 2420 '                               @RESOLVE
  283. 2430 '
  284. 2440 '       Find all lines starting with a label (marked by MARKER
  285. 2450 '       [usually '@']). Set them up with their line numbers in LABTABLE$()
  286. 2460 ' ENTRY: INFILE$ is opened.
  287. 2470 ' EXIT: LABTABLE$ is set up, LABTABCNT has the number of labels.
  288. 2480 '
  289. 2490 '-----------------------------------------------------------------------
  290. 2500 '
  291. 2510 LABTABCNT = 1: PRESNUM = STARTNUM
  292. 2520 PRINT "PASS ONE: RESOLVING LABELS IN " INFILE$ " MARKED BY "  MARKER$
  293. 2530 WHILE EOF(1) = FALSE
  294. 2540    POSPTR = 1
  295. 2550    LINE INPUT #1,PRESLINE$
  296. 2560    GOSUB 5380 '            TO @SPACES
  297. 2570    IF MID$(PRESLINE$,POSPTR,1) = MARKER$ THEN GOSUB 2660 ' TO @ADDLAB
  298. 2580    PRESNUM = PRESNUM + STEPSIZE
  299. 2590 WEND
  300. 2600 CLOSE #1 '                      Now we just close and open to reset
  301. 2610 OPEN "I",#1,INFILE$
  302. 2620 RETURN
  303. 2630 '
  304. 2640 ' Ye Gods!!! That was simple!
  305. 2650 '
  306. 2660 '------------------------------------------------------------------------
  307. 2670 '                               @ADDLAB
  308. 2680 '   Add a label and its line number to the LABTAB$(). Increment LABTABCNT
  309. 2690 '-------------------------------------------------------------------------
  310. 2700 GOSUB 2770 '              TO @GETWORD -- First we resolve the word.
  311. 2710 LABTAB$(1,LABTABCNT) = GOTWORD$
  312. 2720 LABTAB$(2,LABTABCNT) = MID$(STR$(PRESNUM),2)
  313. 2730 LABTABCNT = LABTABCNT + 1
  314. 2740 RETURN
  315. 2750 '
  316. 2760 '
  317. 2770 '----------------------------------------------------------------------
  318. 2780 '                               @GETWORD
  319. 2790 '       Get the syntactic word at the location in PRESLINE$ pointed to by
  320. 2800 '       POSPTR, and return it (uppercase) in GOTWORD$.POSPTR is preserved.
  321. 2810 '------------------------------------------------------------------------
  322. 2820 GETVAR = POSPTR
  323. 2830 GOTWORD$ = ""
  324. 2840 GPRESCHR$ = MID$(PRESLINE$,GETVAR,1)
  325. 2850 WHILE GETVAR <= LEN(PRESLINE$)
  326. 2860    IF GPRESCHR$ < "#" THEN GOTO 2960 '   TO @OUTLOOP
  327. 2870    IF GPRESCHR$ = CHR$(39) THEN GOTO 2960 '   TO @OUTLOOP
  328. 2880    IF GPRESCHR$ > "9" AND GPRESCHR$ < "?" THEN GOTO 2960 '   TO @OUTLOOP
  329. 2890    IF GPRESCHR$ = CHR$(96) THEN GOTO 2960 '   TO @OUTLOOP
  330. 2900    IF GPRESCHR$ > CHR$(126) THEN GOTO 2960 '   TO @OUTLOOP
  331. 2910    IF GPRESCHR$ => "a" AND GPRESCHR$ <= "z" 
  332.  
  333.         THEN GPRESCHR$ = CHR$(ASC(GPRESCHR$) - 32)
  334. 2920    GOTWORD$ = GOTWORD$ + GPRESCHR$
  335. 2930    GETVAR = GETVAR + 1
  336. 2940    GPRESCHR$ = MID$(PRESLINE$,GETVAR,1)
  337. 2950    GOTO 2980 '                               TO @GLOOPEND
  338. 2960 '@OUTLOOP -- Force exit from loop
  339. 2970    GETVAR = LEN(PRESLINE$) + 1
  340. 2980 '@GLOOPEND
  341. 2990 WEND
  342. 3000 '
  343. 3010 '
  344. 3020 RETURN
  345. 3030 '
  346. 3040 '
  347. 3050 '---------------------------------------------------------------------
  348. 3060 '                          @ADLABLN
  349. 3070 '  Find and resolve all program jump LABELS, replacing them with
  350. 3080 '  line numbers (start at STARTNUM increase by STEPSIZE). Read
  351. 3090 '  INFILE$ then write it out to OUTFILE$. Optionally add numbers
  352. 3100 '  to all other lines (if DOLINUMS is true).
  353. 3110 '
  354. 3120 '  ENTRY: INFILE$ should be opened. LABTAB$ should be set up.
  355. 3130 '  EXIT:  ADLNUMERR is TRUE or FALSE.
  356. 3140 '---------------------------------------------------------------------
  357. 3150 '
  358. 3160 PRINT:PRINT "PASS TWO:"
  359. 3170 PRINT:PRINT "WRITING "  INFILE$ " TO "  OUTFILE$  " WITH";
  360. 3180 IF DOLINUMS = FALSE THEN PRINT " NO";
  361. 3190 PRINT " LINE NUMBERS ";
  362. 3200 PRINT STARTNUM  "," STEPSIZE  "."
  363. 3210 PRESNUM = STARTNUM
  364. 3220 PRINT "WITH LABEL RESOLUTION. -- MARKER = "  MARKER$
  365. 3230 PRINT "PLEASE WAIT"
  366. 3240 LNTEMP$ = OUTFSPEC$ + ".TMP"
  367. 3250 OPEN "O",#3,LNTEMP$
  368. 3260 FIRSTFND = TRUE
  369. 3270 WHILE EOF(1) = FALSE
  370. 3280    ADD$ = MID$(STR$(PRESNUM),2) + " " '    GET RID OF LEADING BLANK
  371.  
  372.                         IN STR$ FUNCT.
  373. 3290    LINE INPUT #1,PRESLINE$
  374. 3300    POSPTR = 1
  375. 3310    GOSUB 5380 '                clear leading white space, and
  376. 3320    ONECHAR$ = MID$(PRESLINE$,POSPTR,1) '    see if we have a @LABEL
  377. 3330    IF ONECHAR$ = MARKER$ THEN ADD$ = ADD$ + "'": GOTO 3480
  378. 3340    ONECHAR$ = LEFT$(PRESLINE$,1) '         HERE, WE GET RID OF EXISTING
  379. 3350    IF ONECHAR$ < "1" OR ONECHAR$ > "9" THEN GOTO 3470 '     LINE NUMBER
  380. 3360    WHILE ONECHAR$ => "0" AND ONECHAR$ <= "9" '             BUT NOT IF IT
  381. 3370        IF FIRSTFND = TRUE THEN GOSUB 2290: 
  382.  
  383.             FIRSTFND = FALSE:
  384.  
  385.             IF A$ <> "Y" THEN CLOSE:
  386.  
  387.             RETURN 
  388.  
  389.         '    @WARNING, we already have line numbers
  390. 3380 '
  391. 3390        PRESLINE$ = RIGHT$(PRESLINE$,(LEN(PRESLINE$)-1)) ' STARTS WITH
  392. 3400        ONECHAR$ = LEFT$(PRESLINE$,1) '                   A ZERO (MIGHT
  393. 3410    WEND '                                                BE SBASIC LABEL)
  394. 3420 '          NOW GET RID OF ANY EXTRA SPACES
  395. 3430 '
  396. 3440    IF ONECHAR$ = " " THEN PRESLINE$ =RIGHT$(PRESLINE$,(LEN(PRESLINE$)-1)):
  397.  
  398.         ONECHAR$ = LEFT$(PRESLINE$,1)
  399. 3450    IF ONECHAR$ = " " THEN PRESLINE$ =RIGHT$(PRESLINE$,(LEN(PRESLINE$)-1)):
  400.  
  401.         ONECHAR$ = LEFT$(PRESLINE$,1)
  402. 3460 '            AND ADD IN OUR OWN SPACE
  403. 3470    IF DOLINUMS = FALSE THEN ADD$ = "" '        We arive here only if
  404.  
  405.                             we have no label
  406. 3480    PRESLINE$ = ADD$ + PRESLINE$
  407. 3490    POSPTR = LEN(ADD$): IF POSPTR = 0 THEN POSPTR = 1
  408. 3500    GOSUB 3590 ' @FINDLAB         *** Here we find the labels. ***
  409. 3510    PRESNUM = PRESNUM + STEPSIZE
  410. 3520    PRINT #3,PRESLINE$
  411. 3530 WEND
  412. 3540 CLOSE
  413. 3550 IF OUTFILE$ = INFILE$ THEN KILL INFILE$
  414. 3560 IF KILLOLDOUT = TRUE THEN KILL OUTFILE$
  415. 3570 NAME LNTEMP$ AS OUTFILE$
  416. 3580 RETURN
  417. 3590 '-------------------------------------------------------------------
  418. 3600 '                @FINDLAB
  419. 3610 ' FIND ANY LABEL REFERENCES IN PRESLINE$, RESOLVE THEM, AND REBUILD
  420. 3620 ' PRESLINE$. AT ALL TIMES POSPTR POINTS TO THE NEXT CHARACTER TO BE
  421. 3630 ' PICKED UP.
  422. 3640 '--------------------------------------------------------------------
  423. 3650 '
  424. 3660 FLOUTFLAG = FALSE
  425. 3670 LINEND$ = "": INQUOTE = FALSE: LEADSP = FALSE
  426. 3680 WHILE FLOUTFLAG = FALSE AND POSPTR <= LEN(PRESLINE$)
  427. 3690    PRESCHAR$ = MID$(PRESLINE$,POSPTR,1)
  428. 3700    IF PRESCHAR$ = QUOTES$ THEN
  429.  
  430.         IF INQUOTE = FALSE THEN
  431.  
  432.             INQUOTE = TRUE
  433.  
  434.         ELSE
  435.  
  436.             INQUOTE = FALSE
  437. 3710    IF INQUOTE = TRUE THEN GOTO 3760
  438. 3720    IF PRESCHAR$ = " " OR PRESCHAR$ = TAB$ THEN LEADSP = TRUE: GOTO 3760
  439. 3730    IF PRESCHAR$ = "'" THEN FLOUTFLAG = TRUE: GOTO 3770 '    TO @FLWEND
  440. 3740    IF LEADSP = TRUE AND PRESCHAR$ = MARKER$
  441.  
  442.         THEN GOSUB 3810 '     TO @GOTALAB
  443. 3750    LEADSP = FALSE
  444. 3760    POSPTR = POSPTR + 1
  445. 3770 ' @FLWEND
  446. 3780 WEND
  447. 3790 IF ADDVECTS = TRUE THEN PRESLINE$ = PRESLINE$ + LINEND$
  448. 3800 RETURN
  449. 3810 '-------------------------------------------------------------------
  450. 3820 '                @GOTALAB
  451. 3830 '
  452. 3840 '         WE HAVE A LABEL SO PROCESS IT.
  453. 3850 '------------------------------------------------------------------
  454. 3860 GOSUB 2770 '            Get a word.
  455. 3870 IF LEN(GOTWORD$) = 1 THEN RETURN '        we do not resolve a solo @
  456. 3880 GTLN$ = "" 
  457. 3890 FOR GTI = 1 TO LABTABCNT
  458. 3900    IF GOTWORD$ = LABTAB$(1,GTI) THEN
  459.  
  460.         GTLN$ = LABTAB$(2,GTI): GTI = LABTABCNT + 1
  461. 3910 NEXT GTI
  462. 3920 IF GTLN$ = "" THEN PRINT
  463.  
  464.     GOTWORD$ " AT LINE " PRESNUM " -- TARGET NOT FOUND":
  465.  
  466.     RETURN
  467. 3930 IF LINEND$ = "" THEN LINEND$ = " '    TO: " ELSE LINEND$ = LINEND$ + ", "
  468. 3940 LINEND$ = LINEND$ + GOTWORD$
  469. 3950 GTEMP$ = LEFT$(PRESLINE$,POSPTR-1)
  470. 3960 RGT = LEN(PRESLINE$) - POSPTR - LEN(GOTWORD$) + 1
  471. 3970 PRESLINE$ = GTEMP$ + GTLN$ + RIGHT$(PRESLINE$,RGT)
  472. 3980 POSPTR = POSPTR + LEN(GOTWORD$) - 1
  473. 3990 RETURN
  474. 4000 '
  475. 4010 '
  476. 4020 '-----------------------------------------------------------------
  477. 4030 '                          @LINEUP
  478. 4040 '  Get an upper case line from the user.
  479. 4050 '
  480. 4060 ' Exit: UPLINE$ has the line
  481. 4070 '-------------------------------------------------------------------
  482. 4080 UPLINE$ = "": INPUT "", TEMP$
  483. 4090 FOR LU = 1 TO LEN(TEMP$)
  484. 4100    ULC$ = MID$(TEMP$,LU,1)
  485. 4110    IF ULC$ => "a" AND ULC$ <= "z" THEN ULC$ = CHR$(ASC(ULC$) - 32)
  486. 4120    UPLINE$ = UPLINE$ + ULC$
  487. 4130 NEXT LU
  488. 4140 RETURN
  489. 4150 '
  490. 4160 '
  491. 4170 '----------------------------------------
  492. 4180 '  STROBE KEY -- TOUPPER
  493. 4190 '
  494. 4200 A$ = "": WHILE A$ = "": A$=INKEY$: WEND
  495. 4210 IF A$ => "a" AND A$ <= "z" THEN A$ = CHR$(ASC(A$) - 32)
  496. 4220 RETURN
  497. 4230 '
  498. 4240 '
  499. 4250 '------------------------------------------------------------
  500. 4260 '            @clearscreen (& home)
  501. 4270 '    The clear screen is machine dependant, so I isolate it
  502. 4280 '    in its own routine for easy changes.
  503. 4290 '----------------------------------------------------------
  504. 4300 PRINT CLS$;
  505. 4310 RETURN
  506. 4320 '
  507. 4330 '
  508. 4340 '--------------------------------------------------------
  509. 4350 '            @SIGNON
  510. 4360 '--------------------------------------------------------
  511. 4370 GOSUB 4250 '        @CLEARSCREEN
  512. 4380 PRINT "PREBAS -- A pre-processor for BASIC"
  513. 4390 PRINT "Copyright (c) 1985 by Greywolf"
  514. 4400 PRINT "Last revised -- "  REVDATE$
  515. 4410 PRINT:PRINT:PRINT
  516. 4420 RETURN
  517. 4430 '
  518. 4440 '-------------------------------------------------------------------
  519. 4450 '            @PARSECL
  520. 4460 '
  521. 4470 '    Parse the command line for two filespecs, and optional
  522. 4480 '    parameters proceeded by "$".
  523. 4490 '
  524. 4500 ' ENTRY: no parms
  525. 4510 ' EXIT: INFSPEC$, INFEXT$, INFILE$, OUTFSPEC$, OUTFEXT$, OUTFILE$, 
  526. 4520 '    MARKER$ all filled if present. STARTNUM, STEPSIZE initialized.
  527. 4530 '    DOLINUMS, DOLABELS, ADDVECTS set or reset. (All on CL demands.)
  528. 4540 '    HAVECL, CLERROR set TRUE or FALSE.
  529. 4550 '---------------------------------------------------------------------
  530. 4560 '@PARSECL
  531. 4570 '
  532. 4580 IF MSDOS = TRUE THEN RETURN '        I DONT KNOW WHICH SEGMENT ITS
  533. 4590 '                    GOING TO BE IN.
  534. 4600 IF COMPILE = FALSE THEN RETURN '        No comline under interpreter.
  535. 4610 PRESLINE$ = ""
  536. 4620 COMLEN = PEEK(COMBUF) '            Get the size
  537. 4630 IF COMLEN = 0 THEN RETURN
  538. 4640 POSPTR = COMBUF + 1
  539. 4650 FOR CLI = POSPTR TO POSPTR + COMLEN - 1
  540. 4660    PRESLINE$ = PRESLINE$ + CHR$(PEEK(CLI))
  541. 4670 NEXT CLI
  542. 4680 '
  543. 4690 '@PARSE3
  544. 4700 '        We have a comline, break it up
  545. 4710 '
  546. 4720 PRFLAG = FALSE '    Kludge so I can still set KILLOLDOUT when we have $ 
  547. 4730 '            following just one filename.
  548. 4740 POSPTR = 1
  549. 4750 GOSUB 5380 '            Clear initial white space TO: @SPACES
  550. 4760 IF POSPTR > COMLEN THEN RETURN
  551. 4770 '@REALINE '        We have a real command line!
  552. 4780 GOSUB 5540 '        So get the first word '    TO: @PWORD
  553. 4790 GSPEC$ = PARWORD$
  554. 4800 GOSUB 6870 '        @GETSPEC
  555. 4810 IF GOTSPEC$ = "" THEN GOSUB 6760: CLERROR = TRUE: RETURN '    TO: @SYNERR
  556. 4820 '
  557. 4830 '                WHOOPEE! We have an infile
  558. 4840 HAVECL = TRUE
  559. 4850 INFSPEC$ = GOTSPEC$
  560. 4860 IF GOTEXT$ <> "" THEN INFEXT$ = GOTEXT$
  561. 4870 INFILE$ = INFSPEC$ + INFEXT$
  562. 4880 OUTFSPEC$ = GOTSPEC$: OUTFILE$ = OUTFSPEC$ + OUTFEXT$
  563. 4890 '
  564. 4900 ON ERROR GOTO 4940
  565. 4910 OPEN "I",#1,INFILE$
  566. 4920 ON ERROR GOTO 0 '            We have our infile, so
  567. 4930 GOTO 4960 '            proceed.
  568. 4940 IF ERR <> 53 THEN ON ERROR GOTO 0: RESUME '    Not "file not found"?
  569. 4950 PRINT "COULD NOT FIND " INFILE$: CLERROR = TRUE: RETURN
  570. 4960 GOSUB 5380 '    TO: @SPACES
  571. 4970 IF POSPTR > COMLEN THEN GOTO 5150 '     Find out if there is already
  572.  
  573.                         an outfile
  574. 4980 PCHAR$ = MID$(PRESLINE$,POSPTR,1) '    No? then do we have a "$"
  575. 4990 IF PCHAR$ = "$" THEN PRFLAG = TRUE: GOTO 5150 
  576. 5000 '
  577. 5010 '        WE HAVE ANOTHER FILESPEC
  578. 5020 '
  579. 5030 GOSUB 5540 '        So get the next word '    TO: @PWORD
  580. 5040 GSPEC$ = PARWORD$
  581. 5050 GOSUB 6870 '        @GETSPEC
  582. 5060 IF GOTSPEC$ = "" THEN GOSUB 6760: CLERROR = TRUE: RETURN '    TO: @SYNERR
  583. 5070 '
  584. 5080 '                WHOOPEE! We have an outfile
  585. 5090 OUTFSPEC$ = GOTSPEC$
  586. 5100 IF GOTEXT$ <> "" THEN OUTFEXT$ = GOTEXT$
  587. 5110 OUTFILE$ = OUTFSPEC$ + OUTFEXT$
  588. 5120 '
  589. 5130 IF OUTFILE$ = INFILE$ THEN    GOTO 5240 '    IF THEY ARE THE SAME WE KNOW
  590. 5140 '                                         THE OUTFILE ALREADY EXISTS
  591. 5150 ON ERROR GOTO 5180
  592. 5160 OPEN "I",#2,OUTFILE$ '             JUST SEE IF ITS THERE
  593. 5170 GOTO 5200 '                WE ALREADY HAVE THE OUTFILE
  594. 5180 IF ERR <> 53 THEN ON ERROR GOTO 0: RESUME
  595. 5190 RESUME 5220 'IF THERE WAS AN ERROR THERE WAS NO OLD OUTFILE SO WERE OK
  596. 5200 KILLOLDOUT = TRUE 
  597. 5210 '
  598. 5220 ON ERROR GOTO 0
  599. 5230 IF PRFLAG = TRUE THEN GOSUB 5730: RETURN '    TO: @PARAMS
  600. 5240 GOSUB 5380 '    TO: @SPACES
  601. 5250 IF POSPTR > COMLEN THEN RETURN '        Was there anything else on line
  602. 5260 PCHAR$ = MID$(PRESLINE$,POSPTR,1) '    Yes? then do we have a "$"
  603. 5270 IF PCHAR$ = "$" THEN GOSUB 5730: RETURN '    TO: @PARAMS
  604. 5280 '
  605. 5290 '
  606. 5300 '
  607. 5310 '------------------------------------------------------------
  608. 5320 '            @SPACES
  609. 5330 '        Clear spaces from PRESLINE$ at POSPTR
  610. 5340 '
  611. 5350 ' ENTRY: POSPTR points to the next pos in PRESLINE$
  612. 5360 ' EXIT:  POSPTR points to the next non-white char, or is > LEN(PRESLINE$)
  613. 5370 '------------------------------------------------------------
  614. 5380 '@SPACES
  615. 5390 SPCHAR$ = MID$(PRESLINE$,POSPTR,1)
  616. 5400 WHILE (SPCHAR$ = TAB$ OR SPCHAR$ = " ") AND POSPTR <= LEN(PRESLINE$)
  617. 5410    POSPTR = POSPTR + 1
  618. 5420    SPCHAR$ = MID$(PRESLINE$,POSPTR,1)
  619. 5430 WEND
  620. 5440 RETURN
  621. 5450 '
  622. 5460 '
  623. 5470 '------------------------------------------------------------
  624. 5480 '            @PWORD
  625. 5490 '    Return the next word at POSPTR (in uppercase)
  626. 5500 ' ENTRY: POSPTR is next char.
  627. 5510 ' EXIT:     POSPTR points to next white char or "$" or is > LEN(PRESLINE$)
  628. 5520 '        PARWORD$ contains the word.
  629. 5530 '------------------------------------------------------------
  630. 5540 '@PWORD
  631. 5550 PARWORD$ = ""
  632. 5560 SPCHAR$ = MID$(PRESLINE$,POSPTR,1)
  633. 5570 WHILE SPCHAR$ <> TAB$ AND SPCHAR$ <> " " AND SPCHAR$ <> "$"
  634.  
  635.         AND POSPTR <= LEN(PRESLINE$)
  636. 5580    IF SPCHAR$ => "a" AND SPCHAR$ <= "z" THEN
  637.  
  638.         SPCHAR$ = CHR$(ASC(SPCHAR$) - 32) '    Covert to upper, so we
  639.  
  640.                             don't get no funny
  641.  
  642.                             filenames
  643. 5590    PARWORD$ = PARWORD$ + SPCHAR$
  644. 5600    POSPTR = POSPTR + 1
  645. 5610    SPCHAR$ = MID$(PRESLINE$,POSPTR,1)
  646. 5620 WEND
  647. 5630 RETURN
  648. 5640 '
  649. 5650 '
  650. 5660 '------------------------------------------------------------
  651. 5670 '            @PARAMS
  652. 5680 '    Get any CL parameters, using the CPM convention of $P1 P2...
  653. 5690 ' ENTRY: POSPTR points at a trailing "$" in PRESLINE$
  654. 5700 ' EXIT:     Any valid parm is set up. If there is a syntax error,
  655. 5710 '        we print a message and set CLERROR.
  656. 5720 '------------------------------------------------------------
  657. 5730 '@PARAMS
  658. 5740 POSPTR = POSPTR + 1 '            Step over the $
  659. 5750 GOSUB 5380 '    TO: @SPACES
  660. 5760 WHILE POSPTR <= COMLEN AND CLERROR = FALSE
  661. 5770    PLUSMIN$ = "?"
  662. 5780 '@GETPR
  663. 5790    C$ = MID$(PRESLINE$,POSPTR,1)
  664. 5800    IF C$ => "a" AND C$ <= "z" THEN C$ = CHR$(ASC(C$) - 32)
  665. 5810    IF C$ = "+" OR C$ = "-" THEN
  666.  
  667.         PLUSMIN$ = C$: POSPTR = POSPTR + 1: GOTO 5780 '    TO: @GETPR
  668. 5820 '
  669. 5830 '            Here we look up what option is on the CL
  670. 5840 '
  671. 5850    IF C$ = "L" THEN GOSUB 6040: GOTO 5930 '    TO: @PRLABS, @WEOK
  672. 5860    IF C$ = "S" THEN GOSUB 6300: GOTO 5930 '    TO: @PRSNUM, @WEOK
  673. 5870    IF C$ = "P" THEN GOSUB 6400: GOTO 5930 '    TO: @PRSTEP, @WEOK
  674. 5880    IF C$ = "M" THEN GOSUB 6500: GOTO 5930 '    TO: @PRMARK, @WEOK
  675. 5890    IF C$ = "N" THEN GOSUB 6170: GOTO 5930 '    TO: @PRNUMS, @WEOK
  676. 5900    IF C$ = "C" THEN GOSUB 6620: GOTO 5930 '    TO: @PRCOMS, @WEOK
  677. 5910 '
  678. 5920    CLERROR = TRUE
  679. 5930 '@WEOK
  680. 5940    GOSUB 5380 '    TO: @SPACES
  681. 5950 WEND
  682. 5960 '
  683. 5970 IF CLERROR= TRUE THEN GOSUB 6760 '    TO: @SYNERR
  684. 5980 '
  685. 5990 RETURN
  686. 6000 '
  687. 6010 '------------------------------------------------------------
  688. 6020 '            @PRLABS
  689. 6030 '            Do we do labels?
  690. 6040 '@PRLABS
  691. 6050 POSPTR = POSPTR + 1
  692. 6060 GOSUB 5540 '    TO: @PWORD
  693. 6070 IF PARWORD$ <> "" THEN CLERROR = TRUE: RETURN
  694. 6080 IF PLUSMIN$ = "+" THEN DOLABELS = TRUE: RETURN
  695. 6090 IF PLUSMIN$ = "-" THEN DOLABELS = FALSE: RETURN
  696. 6100 CLERROR = TRUE
  697. 6110 RETURN
  698. 6120 '
  699. 6130 '
  700. 6140 '------------------------------------------------------------
  701. 6150 '            @PRNUMS
  702. 6160 '        Do we do line numbering 
  703. 6170 '@PRNUMS
  704. 6180 POSPTR = POSPTR + 1
  705. 6190 GOSUB 5540 '    TO: @PWORD
  706. 6200 IF PARWORD$ <> "" THEN CLERROR = TRUE: RETURN
  707. 6210 IF PLUSMIN$ = "+" THEN DOLINUMS = TRUE: RETURN
  708. 6220 IF PLUSMIN$ = "-" THEN DOLINUMS = FALSE: RETURN
  709. 6230 CLERROR = TRUE
  710. 6240 RETURN
  711. 6250 '
  712. 6260 '
  713. 6270 '------------------------------------------------------------
  714. 6280 '            @PRSNUM
  715. 6290 '        What is the start number?
  716. 6300 '@PRSNUM
  717. 6310 POSPTR = POSPTR + 1
  718. 6320 GOSUB 5540 '    TO: @PWORD
  719. 6330 STARTNUM = VAL(PARWORD$)
  720. 6340 RETURN
  721. 6350 '
  722. 6360 '
  723. 6370 '------------------------------------------------------------
  724. 6380 '            @PRSTEP
  725. 6390 '        What is the stepsize?
  726. 6400 '@PRSTEP
  727. 6410 POSPTR = POSPTR + 1
  728. 6420 GOSUB 5540 '    TO: @PWORD
  729. 6430 STEPSIZE = VAL(PARWORD$)
  730. 6440 RETURN
  731. 6450 '
  732. 6460 '
  733. 6470 '------------------------------------------------------------
  734. 6480 '            @PRMARK
  735. 6490 '        What is the new MARKER$ (NO ERROR CHECKING)
  736. 6500 '@PRMARK
  737. 6510 POSPTR = POSPTR + 1
  738. 6520 GOSUB 5540 '    TO: @PWORD
  739. 6530 IF LEN(PARWORD$) <> 1 THEN CLERROR = TRUE: RETURN
  740. 6540 MARKER$ = PARWORD$
  741. 6550 RETURN
  742. 6560 '
  743. 6570 '
  744. 6580 '
  745. 6590 '------------------------------------------------------------
  746. 6600 '            @PRCOMS
  747. 6610 '    Do we add vector comments to the end of lines?
  748. 6620 '@PRCOMS
  749. 6630 POSPTR = POSPTR + 1
  750. 6640 GOSUB 5540 '    TO: @PWORD
  751. 6650 IF PARWORD$ <> "" THEN CLERROR = TRUE: RETURN
  752. 6660 IF PLUSMIN$ = "+" THEN ADDVECTS = TRUE: RETURN
  753. 6670 IF PLUSMIN$ = "-" THEN ADDVECTS = FALSE: RETURN
  754. 6680 CLERROR = TRUE
  755. 6690 RETURN
  756. 6700 '
  757. 6710 '
  758. 6720 '------------------------------------------------------------
  759. 6730 '            @SYNERR
  760. 6740 '    We have a command line syntax error -- tell user
  761. 6750 '
  762. 6760 '@SYNERR
  763. 6770 PRINT
  764. 6780 PRINT "SYNTAX ERROR -- Proper syntax is:"
  765. 6790 PRINT "PREBAS INFILE[.EXT] [OUTFILE[.EXT]] "
  766. 6800 PRINT "[$[{+,-}L] [{+,-}N] [{+,-}C] [Mc] [Sxxx] [Pxxx]]"
  767. 6810 PRINT
  768. 6820 RETURN
  769. 6830 '
  770. 6840 '
  771. 6850 '
  772. 6860 '
  773. 6870 '------------------------------------------------------------
  774. 6880 '                @GETSPEC
  775. 6890 '
  776. 6900 '    Take the string in GSPEC$ and split it into a filespec, and
  777. 6910 '    a file extent (if present). Return in GOTSPEC$ and GOTEXT$
  778. 6920 '-------------------------------------------------------------
  779. 6930 GOTSPEC$ = "": GOTEXT$ = ""
  780. 6940 GSPTR = 1
  781. 6950 GSCHAR$ = MID$(GSPEC$,GSPTR,1)
  782. 6960 WHILE GSPTR <= LEN(GSPEC$) AND GSCHAR$ <> "."
  783. 6970    GOTSPEC$ = GOTSPEC$ + GSCHAR$
  784. 6980    GSPTR = GSPTR + 1
  785. 6990    GSCHAR$ = MID$(GSPEC$,GSPTR,1)
  786. 7000 WEND
  787. 7010 '
  788. 7020 '        We have the fspec, see if theres a fext.
  789. 7030 '
  790. 7040 IF GSCHAR$ <> "." THEN RETURN
  791. 7050 GOTEXT$ = "."
  792. 7060 FOR GSI = GSPTR + 1 TO GSPTR + 4
  793. 7070    GOTEXT$ = GOTEXT$ + MID$(GSPEC$,GSI,1)
  794. 7080 NEXT GSI
  795. 7090 '
  796. 7100 RETURN
  797. 7110 '
  798. 7120 CLERROR = TRUE: RETURN
  799. PTR + 4
  800. 7070    GOTEXT$ = GOTEXT$ + MID$(GSPEC$,GSI,1)
  801.