home *** CD-ROM | disk | FTP | other *** search
- 1 '@initialization
- 2 defint a-z
- 3 option base 1
- 4 on error goto 145 ' @ERRORTRAPS
- 5 '
- 6 '@integers
- 7 cp = 0 ' current position in scanning loops
- 8 lcount = 0 ' initial line counter
- 9 lnumber = 0 ' line number where labels are found
- 10 howmany = 0 ' how many labels counter
- 11 lpoint = 0 ' pointer for parsing labels in second pass
- 12 sofar = 0 ' length of line being built
- 13 '
- 14 '@strings
- 15 a$ = "" ' oft used
- 16 cc$ = "" ' current character in scanning loops
- 17 tb$ = chr$(9) ' tab
- 18 sp$ = chr$(32) ' space
- 19 qt$ = chr$(34) ' quote
- 20 rm$ = chr$(39) ' rem (apostrophe)
- 21 cm$ = chr$(44) ' comma
- 22 cl$ = chr$(58) ' colon
- 23 qm$ = chr$(63) ' question mark
- 24 lm$ = chr$(64) ' label marker
- 25 white$ = tb$ + sp$ ' characters which comprise white space
- 26 split$ = white$ + rm$ + cm$ + cl$ ' characters which may end a label
- 27 tail$ = "" ' remarks to follow parsed lines
- 28 clabel$ = "" ' current label string for parsing
- 29 '
- 30 '@arrays
- 31 dim label$(1000) ' string storage for labels
- 32 dim lnumber(1000) ' and the line numbers they mark
- 33 '
- 34 '@getspec
- 35 ' input f$ ' use this line under mbasic interpreter
- 36 call ctail(f$) ' use this line for compiled version
- 37 source$ = f$ + ".PBS"
- 38 output$ = f$ + ".BAS"
- 39 '
- 40 '@checkout
- 41 open "i", 1, output$
- 42 print "File " output$ " exists. Replace (N/y)? ";
- 43 a$ = input$(1)
- 44 if instr("Yy",a$) <> 0 then print "Yes" : kill output$ : else print "No" : goto 112 ' @FINIT
- 45 '
- 46 '@okayout
- 47 close
- 48 '
- 49 '@checkin
- 50 open "i", 1, source$
- 51 '
- 52 '@pass1
- 53 print "First pass, searching for labels"
- 54 while not eof(1)
- 55 lcount = lcount + 1
- 56 line input #1, a$
- 57 gosub 131 ' @TRIMLEAD
- 58 if len(a$) = 0 then 66 ' @DONESCAN1
- 59 if left$(a$,1) <> lm$ then 66 ' @DONESCAN1
- 60 howmany = howmany + 1 ' if we're here, we've found a label
- 61 lnumber(howmany) = lcount ' on the current line
- 62 cp = 0
- 63 gosub 119 ' @FINDEND
- 64 label$(howmany) = clabel$ : clabel$ = ""
- 65 '
- 66 '@donescan1
- 67 wend
- 68 close
- 69 print "Found" howmany "labels in" lcount "lines"
- 70 lcount = 0 ' return this to initial value for next pass
- 71 '
- 72 '@pass2
- 73 print "Second pass, resolving labels
- 74 open "i", 1, source$
- 75 open "o", 2, output$
- 76 while not eof(1)
- 77 lcount = lcount + 1
- 78 line input #1, a$
- 79 gosub 131 ' @TRIMLEAD
- 80 gosub 138 ' @TRIMTAIL
- 81 tail$ = ""
- 82 if len(a$) = 0 then a$ = rm$ + a$ : goto 106 ' @DONESCAN2
- 83 if left$(a$,1) = lm$ then a$ = rm$ + a$ : goto 106 ' @DONESCAN2
- 84 '
- 85 '@parse
- 86 first$ = "" : clabel$ = "" : last$ = "" ' clear these first
- 87 if instr(a$,lm$) = 0 then 106 ' @DONESCAN2
- 88 first$ = left$(a$,instr(a$,lm$)-1) ' everything before the label mark
- 89 cp = len(first$)
- 90 gosub 119 ' @FINDEND
- 91 sofar = len(first$) + len(clabel$) ' how much of the line do we have?
- 92 last$ = right$(a$,len(a$)-sofar)
- 93 for cp = 1 to howmany
- 94 if label$(cp) <> clabel$ then 98 ' @REMAKE
- 95 tail$ = tail$ + sp$ + rm$ + sp$ + clabel$
- 96 clabel$ = str$(lnumber(cp))
- 97 '
- 98 '@remake
- 99 a$ = first$ + clabel$ + last$
- 100 next
- 101 if left$(clabel$,1) <> lm$ then 85 ' if label was found, continue ' @PARSE
- 102 tail$ = tail$ + sp$ + rm$ + qm$ + clabel$ ' note bad label in remark
- 103 mid$(a$,instr(a$,lm$)) = qm$ ' replace @ with ? in bad label
- 104 print " -> possible bad label: " clabel$ " on line" lcount
- 105 '
- 106 '@donescan2
- 107 print#2, lcount; a$ ; tail$
- 108 a$ = "" : tail$ = "" ' clear these last
- 109 wend
- 110 close
- 111 '
- 112 '@finit
- 113 print "Returning to system.";
- 114 end
- 115 end
- 116 '
- 117 '@subroutines
- 118 '
- 119 '@findend
- 120 cp = cp + 1
- 121 cc$ = mid$(a$,cp,1)
- 122 if instr(split$,cc$) > 0 then 127 ' @FOUNDEND
- 123 clabel$ = clabel$ + cc$
- 124 if cp <= len(a$) then 119 ' @FINDEND
- 125 cp = 0
- 126 '
- 127 '@foundend
- 128 call ucase(clabel$) ' disable this line if using interpreter
- 129 return
- 130 '
- 131 '@trimlead
- 132 if len(a$)=0 then 135 ' @NOLEAD
- 133 if instr(white$,left$(a$,1)) then a$ = right$(a$,len(a$)-1) : goto 131 ' @TRIMLEAD
- 134 '
- 135 '@nolead
- 136 return
- 137 '
- 138 '@trimtail
- 139 if len(a$)=0 then 142 ' @NOTAIL
- 140 if instr(white$,right$(a$,1)) then a$ = left$(a$,len(a$)-1) : goto 138 ' @TRIMTAIL
- 141 '
- 142 '@notail
- 143 return
- 144 '
- 145 '@errortraps
- 146 if err=53 and erl = 41 then resume 46 ' @CHECKOUT ' @OKAYOUT
- 147 if err=53 and erl = 50 then print "Can't find " source$ : resume 112 ' @CHECKIN ' @FINIT
- 148 if err=64 then print "Bad file name" : resume 112 ' @FINIT
- 149 print "Untrapped error" err "in line" erl : resume 112 ' @FINIT
- 150 end