22 ' Compiled from SQUISH and XREFBUZZ in public domain by Tom Story.
24 '
26 ON ERROR GOTO 632
28 SCREEN 0:KEY OFF:WIDTH 80:COLOR 7,0:CLS:CLEAR:VERSION$=" Version 3.1 10-September-1986"
30 PRINT"PBAS PROGRAM V3.1 10-September-1986":PRINT:PRINT:PRINT"Select:":PRINT:PRINT"(E)xit or <cr>":PRINT:PRINT"(C)ross Reference/(S)quash";:LOCATE ,,0
32 X$=INKEY$:IF X$="" THEN GOTO 32
34 IF X$="E" OR X$="e" OR X$=CHR$(13) THEN CLS:END
36 IF X$="C" OR X$="c" THEN GOTO 286
38 IF X$="S" OR X$="s" THEN GOTO 40 ELSE BEEP:GOTO 32
40 REM *********
42 REM
44 REM SQUASH.BAS
46 REM
48 REM *********
50 '
52 ' Author: Dave Archibald
54 ' Translation: Alan J. Zett
56 ' Copyright (c) 1982, SoftSide Publications, Inc.
58 ' Squished some bugs 2/5/83: Herb Shear
60 ' Squished some bugs and made some cosmetic changes 4/11/86: Tom Story
62 ' Added line number stripping 4/16/86: Tom Story
64 '
66 REM Initialize variables, DIMension arrays, DEFine Function I$, and select run time options.
76 PRINT"Enter the name of the program to be Squished,":PRINT"(or <cr> for menu). ":PRINT:LINE INPUT"Drive:Filename(.Extension) ";SQ$
78 IF SQ$="" THEN GOTO 10
80 IF INSTR(SQ$,".")=0 THEN SQ$=SQ$+".BAS"
82 OPEN SQ$ FOR INPUT AS #1
84 PRINT:PRINT:PRINT"Enter the name for the final Squished program.":PRINT:LINE INPUT"Drive:Filename(.Extension) ";SV$
86 IF SV$="" THEN GOTO 10
88 IF INSTR(SV$,".")=0 THEN SV$=SV$+".BAS"
90 OPEN SV$ FOR OUTPUT AS #2
92 PRINT:PRINT:PRINT"Would you like extra spaces deleted ? (Y/N) ";
94 XS$=INKEY$:IF XS$="" THEN GOTO 94 ELSE XS$=FNI$(XS$):IF XS$="Y" OR XS$="N" THEN GOTO 96 ELSE GOTO 94
96 PRINT:PRINT"Would you like REM statements deleted ? (Y/N) ";
98 IP$=INKEY$:IF IP$="" THEN GOTO 98 ELSE IP$=FNI$(IP$):IF IP$="Y" OR IP$="N" THEN GOTO 100 ELSE GOTO 98
100 PRINT:PRINT"Would you like to combine lines ? (Y/N) ";
102 XC$=INKEY$:IF XC$="" THEN GOTO 102 ELSE XC$=FNI$(XC$):IF XC$="Y" OR XC$="N" THEN GOTO 104 ELSE GOTO 102
104 PRINT:PRINT"Would you like to strip out line numbers (compiler /N option) ? (Y/N) ";
106 SL$=INKEY$:IF SL$="" THEN GOTO 106 ELSE SL$=FNI$(SL$):IF SL$="Y" OR SL$="N" THEN GOTO 108 ELSE GOTO 106
108 PRINT:PRINT"Would you like to protect any lines ? (Y/N) ";
110 XP$=INKEY$:IF XP$="" THEN GOTO 110 ELSE XP$=FNI$(XP$):IF XP$="Y" OR XP$="N" THEN GOTO 114 ELSE GOTO 110
112 REM If nothing is to be done, reRUN the program.
114 IF XS$="N" AND IP$="N" AND XC$="N" AND SL$="N" AND XP$="N" THEN GOTO 10
116 REM Store user protected lines.
118 PRINT:PRINT
120 IF XP$="Y" THEN INPUT"Enter line number to protect (or <cr> to exit) ";PRO(PV):IF PRO(PV)>0 AND PV<100 THEN PV=PV+1: GOTO 120 ELSE PRINT
122 REM *********
124 REM Check for EndOfFile and PRINT error if current line does not start with a line number.
126 IF EOF(1) THEN CLOSE:GOTO 166
128 LINE INPUT #1,A$:LOCATE ,1:PRINT "Scanning Line (Pass #1): ";VAL(LEFT$(A$,INSTR(A$," ")));:IF ASC(A$)>58 THEN CLS:PRINT"**** '";SQ$;"' is not an ASCII file ****":PRINT:PRINT"<cr> for menu.";:INPUT GO$:GOTO 10
130 REM Search for reserved words that reference other program lines.
132 G1=1:G2=1:G3=1:G4=1:G5=1:G6=1:G7=1:G8=1
134 D=5:T=INSTR(G1,A$,"THEN "):IF T THEN G1=T+D:GOTO 154
136 T=INSTR(G2,A$,"GOTO "):IF T THEN G2=T+D: GOTO 154
138 T=INSTR(G3,A$,"ELSE "):IF T THEN G3=T+D: GOTO 154
140 T=INSTR(G4,A$,"GOSUB "):IF T THEN D=6:G4=T+D:GOTO 154
142 T=INSTR(G7,A$,"RETURN "):IF T THEN D=7:G7=T+D:GOTO 154
144 T=INSTR(G5,A$,"RESUME "):IF T THEN D=7:G5=T+D:GOTO 154
146 T=INSTR(G8,A$,"RESTORE "):IF T THEN D=8:G8=T+D:GOTO 154
148 T=INSTR(G6,A$,"RUN "):IF T THEN D=4:G6=T+D:GOTO 154
150 GOTO 126
152 REM Store all referenced lines into an array.
154 L$=MID$(A$,T-1,1):IF L$=" " OR L$=":" THEN 156 ELSE 134
156 A=VAL(MID$(A$,T+D)):IF A THEN FOR HH=1 TO R:IF REF(HH)<>A THEN NEXT:R=R+1:REF(R)=A
158 IF A>0 THEN T=T+D:D=1:T1=INSTR(T,A$,","):T2=INSTR(T,A$,":"):IF T1>0 AND (T2=0 OR T1<T2) THEN T=T1:GOTO 156
160 GOTO 134
162 REM *********
164 REM Sort all referenced and protected lines in ascending order.
166 FOR S=1 TO R:FOR S1=S TO R:IF REF(S)<REF(S1) THEN SWAP REF(S),REF(S1)
168 NEXT S1,S:FOR S=0 TO PV:FOR S1=S TO PV:IF PRO(S)>PRO(S1) THEN SWAP PRO(S),PRO(S1):NEXT S1,S
170 REM ReOPEN source file for INPUT and OPEN destination for OUTPUT.
172 OPEN SQ$ FOR INPUT AS #1:OPEN SV$ FOR OUTPUT AS #2:LOCATE ,1:PRINT SPACE$(79);
174 REM Get next program line to be processed.
176 IF EOF(1) THEN 282
178 LINE INPUT #1,A$:FOR HH=INSTR(A$," ") TO LEN(A$)-1:IF MID$(A$,HH+1,1)=" " THEN NEXT
180 REM Set up pointer variables and update display.
182 PP=HH:X=PP:LN=VAL(LEFT$(A$,INSTR(A$," "))):LOCATE ,1:PRINT"Scanning line (Pass #2):";LN;:GOTO 218
184 REM If combining lines is not allowed, then write new line.
186 IF XC$<>"Y" THEN PRINT #2,A$:GOTO 176
188 REM Set up C$ to start combining lines.
190 IF C$="" THEN C$=A$:GOTO 176
192 REM Checks if current line is referenced.
194 IF R>0 THEN IF LN=REF(R) THEN R=R-1:GOTO 212 ELSE IF LN>REF(R) THEN R=R-1:GOTO 194
196 V$=RIGHT$(A$,LEN(A$)-X)
198 REM strip out line number if allowed.
200 IF SL$="Y" THEN A$=V$:SL=SL+1
202 REM Never combine lines with IF or RETURN statements.
204 IF INSTR(C$,"IF") OR INSTR(C$,"RETURN") THEN 212
206 REM Combine two program lines and go for more.
208 IF LEN(C$)+LEN(V$)<=240 THEN C$=C$+":"+V$:RE=RE+1:GOTO 176
210 REM Not enough space in C$ to combine another line so write it out first, then continue.
212 PRINT #2,C$:C$=A$:GOTO 176
214 REM *********
216 REM Change color of current character being scanned.
218 N$=LEFT$(A$,PP):ZC=160+PP:PP=PP+1:P=0:J$="":DT=0:FOR T=PP TO LEN(A$):L$=MID$(A$,T,1):AZ=INT(ZC/80)
220 REM Set P equal to 1 on the first quote mark in a PRINT statement, ELSE set P equal to 0 on second.
222 IF L$=CHR$(34) THEN IF P THEN P=0 ELSE P=1
224 IF OD$="SCRN:" THEN PRINT #3,:PRINT #3,
226 IF P THEN 254
228 REM Branch to line XXX if DATA is found in the current program line.
230 IF MID$(A$,T,4)="DATA" THEN DT=1 ELSE IF L$=":" THEN DT=0
232 IF DT THEN 254
234 REM Remove all spaces when safe to do so and update Spaces Deleted counter.
236 IF L$<>" " OR XS$<>"Y" THEN 246 ELSE IF J$>"" THEN L1$=RIGHT$(J$,1):IF L1$=CHR$(34)OR L1$="^" OR (L1$>="(" AND L1$<"0") OR (L1$>"9" AND L1$<"A") THEN L$=""
238 L1$="X":IF T<LEN(A$) THEN L1$=MID$(A$,T+1,1)
240 IF L1$="^" OR L1$=CHR$(34) OR L1$=" " OR (L1$>="'" AND L1$<"0") OR (L1$>"9" AND L1$<"A") THEN L$=""
242 IF L$="" THEN SD=SD+1
244 REM Check for a user protected line.
246 IF PV=>PJ THEN IF LN=PRO(PJ) THEN PJ=PJ+1:GOTO 264 ELSE IF LN>PRO(PJ) THEN PJ=PJ+1:GOTO 246
248 REM Search for REMarks and remove if allowed.
250 IF MID$(A$,T,3)="REM" OR L$="'" THEN IF IP$<>"Y" THEN GOSUB 274:A$=N$+J$+MID$(A$,T):GOTO 264 ELSE RD=RD+1:WHILE LN>REF(R)AND R>0:R=R-1:WEND:IF LN=REF(R) THEN R=R-1:GOSUB 274:WHILE J$="":J$="'":WEND:A$=N$+J$:GOTO 264 ELSE IF J$="" THEN 176 ELSE 258
252 REM Construct a new Squished version of the currect line in J$. Also add a trailing quote mark if none found after a PRINT statement.
254 J$=J$+L$:NEXT:IF P THEN J$=J$+CHR$(34)
256 REM Add the current program line number and jump to line XXX.
258 GOSUB 274:A$=N$+J$:GOTO 186
260 REM *********
262 REM If lines have been combined, then save them.
264 IF C$<>"" THEN PRINT #2,C$:C$=""
266 REM Then save new program line.
268 PRINT #2,A$:GOTO 176
270 REM *********
272 REM Patch to remove indentation if spaces being deleted. Add `AND XC$="Y" to the logic if you want to preserve indentation when not combining.
274 IF XS$="Y"THEN X=INSTR(N$," "):N$=LEFT$(N$,X):SD=SD+PP-X-1
276 RETURN
278 REM *********
280 REM Write out last program line, update display, and start new program.
282 PRINT #2,C$:CLOSE:CLS:PRINT"Number of Lines Combined: ";RE:PRINT:PRINT"Number of Spaces Deleted: ";SD:PRINT:PRINT"Number of REM Statements Deleted: ";RD:PRINT:PRINT"Number of Line Numbers Removed: ";SL
284 COLOR 23,0:LOCATE 18,30:PRINT"Squashing Complete.":COLOR 7,0:LOCATE 20,30:INPUT"<cr> to Continue: ";GO$:GOTO 40
286 REM *********
288 REM
290 REM XREFBAS.BAS
292 REM
294 REM *********
296 'MODIFIED FOR IBM PC BY STEVE NOSSEN V1.10 1/13/82
298 'MODIFIED BY Buzz Hamilton V1.2 12/2/82
300 ' Add Keywords APPEND,ERROR, and SOUND
302 ' Relocate Keywords COM,INPUT, and LOC
304 ' Change end of DATA line check from space to colon
306 ' Permit dot in variable names
308 ' Eliminate dash spacer lines
310 ' Change default extension of input file to LST
312 'MODIFIED BY Tom Story V2.1, 27-June-1986
314 ' Added additional reserved words for Basic 3.0
316 ' Added references by RESTORE and RETURN
318 ' Added minor cosmetic changes
320 ' Corrected CSNC to CSNG in DATA block
322 ' Changed name to XREFBAS
324 ' Fixed problem with reserved words embedded in variable name.
326 CLS:CLEAR
328 LOCATE 1,15:PRINT "XREFBAS ";
330 PRINT"COPYRIGHT (C) 1980 BY ADVANCED INFORMATICS"
344 DATA ABS,AND,APPEND AS,ASC,ATN,AUTO,BEEP,BLOAD,BSAVE
346 DATA CALL,CDBL,CHAIN,CHDIR,CHR$,CINT,CIRCLE,CLEAR,CLOSE,CLS,COLOR,COMMON
348 DATA COM,CONT,COS,CSNG,CSRLIN,CVD,CVI,CVS,DATA,DATE$
350 DATA DEFDBL,DEFINT,DEFSNG,DEFSTR,DEF,DELETE,DIM,DRAW
352 DATA EDIT,ELSE,END,ENVIRON$,ENVIRON,EOF,EQV,ERASE,ERDEV$,ERDEV,ERL,ERROR
354 DATA ERR,EXP,FIELD,FILES,FIX,FOR,FRE,GET,GOSUB,GOTO,HEX$
356 DATA IF,IMP,INKEY$,INPUT AS,INPUT$,INPUT#,INPUT,INP,INSTR,INTER$,INT,IOCTL$
358 DATA IOCTL,KEY,KILL,LEFT$,LEN,LET,LINE,LIST
360 DATA LLIST,LOAD,LOCATE,LOC,LOF,LOG,LPOS,LPRINT,LSET,MERGE,MID$,MKDIR$,MKD$
362 DATA MKI$,MKS$,MOD,MOTOR,NAME,NEW,NEXT,NOT,OCT$,OFF,ON,OPEN,OPTION,OR
364 DATA OUTPUT AS,OUT,PAINT,PEEK,PEN,PLAY,PMAP,POINT,POKE,POS,PRESET,PRINT#
366 DATA PRINT,PSET,PUT,RANDOMIZE,READ,REM,RENUM,RESET
368 DATA RESTORE,RESUME,RETURN,RIGHT$,RMDIR,RND,RSET,RUN
370 DATA SAVE,SCREEN,SGN,SHELL,SIN,SOUND,SPACE$,SPC(,SQR
372 DATA STEP,STICK,STOP,STR$,STRIG,STRING$,SWAP,SYSTEM
374 DATA TAB(,TAN,THEN,TIMER,TIME$,TO,TROFF,TRON
376 DATA USING,USR,VAL,VARPTR$,VARPTR,WAIT,WEND,WHILE,WIDTH,WRITE#,WRITE,XOR,"\"
378 '
380 ' FILL ARRAY WITH RESERVED WORDS
382 '
384 RW%=0
386 READ RW$
388 RW%=RW%+1:RW$(RW%)=RW$:IF RW$="\" THEN 396
390 I=ASC(RW$)-ASC("A"):IF PT%(I)=0 THEN PT%(I)=RW%
392 GOTO 386
394 '
396 FOR I=0 TO 25:IF PT%(I)=0 THEN PT%(I)=RW%
398 NEXT
400 '
402 ' GET FILE NAME
404 '
406 PRINT:PRINT"Enter the name of the program to be cross referenced,":PRINT"(or <cr> for menu).":PRINT:LINE INPUT"Drive:Filename(.Extension) ";FILE$:PRINT
408 IF FILE$="" THEN GOTO 10
410 IF INSTR(FILE$,".")=0 THEN FILE$=FILE$+".BAS"
412 '
414 OD$="LPT1:":PRINT:LINE INPUT "Output File (default is LPT1:) -> ";TEMP$:PRINT
416 IF TEMP$="" THEN 420 ELSE OD$=TEMP$
418 IF INSTR(OD$,":")=0 THEN OD$=OD$+":"
420 IF LEFT$(OD$,5)="COM1:" THEN OPEN OD$ AS 3 ELSE OPEN "O",3,OD$
422 PRINT:PRINT"1) Cross Reference 2) List 3) Both";
424 SEL$=INKEY$:IF SEL$="" THEN GOTO 424 ELSE M=VAL(SEL$)
426 IF M<1 OR M>3 THEN BEEP:GOTO 424 ELSE PRINT:PRINT
428 OPEN FILE$ FOR INPUT AS #1: PRG$="'"+FILE$+"' "+DATE$+" "+TIME$:GOSUB 440:IF INSTR(OD$,"SCRN")=0 THEN PRINT #3,CHR$(12);
430 IF OD$="SCRN:" THEN PRINT:INPUT"<cr> to continue: ";GO$
432 GOTO 286
434 '
436 ' INITIALIZE FOR CROSS REFERENCE
438 '
440 LC=0:BC=0:PZ%=0:V$="":C$="":VC%=91:RC%=-1
442 FOR I=0 TO 91: VNXT%(I)=-1: NEXT
444 IF M>1 THEN GOSUB 620
446 '
448 ' INPUT LINE AND EXTRACT LINE NUMBER
450 '
452 IF EOF(1) THEN IF M=2 THEN GOTO 430 ELSE GOTO 568
454 LINE INPUT #1,L$:IF ASC(L$)>58 THEN CLS:PRINT"**** ";FILE$;" is not an ASCII file ****":PRINT:PRINT"<cr> for menu.";:INPUT GO$:GOTO 10