File RESEQ.BA (BASIC source file)

Directory of image this file is from
This file as a plain text file

3 !
6 !
9 !COPYRIGHT  (C)  1979 BY DIGITAL EQUIPMENT CORPORATION
12 !
15 !
18 !
21 !THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
24 !AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
27 !CORPORATION.  DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
30 !FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
33 !
36 !THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
39 !UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
42 !(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
45 !SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
48 !
51 !DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
54 !OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
57 !DIGITAL.
60 !
63 !
66 !
69 !------------------------------------------------------------
72 !      PROGRAM RESEQ.BA (VERSION V7)
75 !      REWRITTEN BY J. REID   FEBRUARY 6,1979
78 !      RESEQUENCES LINE #'S IN A BASIC PROGRAM.
81 !      A FILENAME,NEW STARTING # AND STEP SIZE ARE INPUT.
84 !-----------------------------------------------------------
87 ! ------ PART1 ------     THIS PART INSPECTS EACH LINE#
90 !                         AND SAVES IT IN ARRAY N
93 DIM L$(80),N$(16)
96 DIM L2$(80),T$(1),R5$(6)
99 DIM N(500),L3$(80),L4$(80)
102 T$=CHR$(34)
105 Z9=0
108 PRINT "FILE";
111 INPUT N$
114 IF POS(N$,".BA",1)<>0 THEN 120     !SEE IF .BA IN FILENAME
117 N$=N$&".BA"                        !ADD .BA IF NOT THERE
120 PRINT "START,STEP";
123 INPUT S1,S
126 LET S1=INT(ABS(S1))
129 LET S=INT(ABS(S))
132 LET T=0
135 LET N2=0
138 FILE #1:N$
141 LET I=1
144 INPUT #1:L$                        !GET A LINE
147 IFEND #1 THEN 207                  !END- GO TO PART2
150 LET L=LEN(L$)
153 GOSUB 573                          !GET OLD LINE # =N1.
156 IF N1>0 THEN 171
159 PRINT "NO LINE NUMBER"
162 Z9=1
165 PRINT L$
168 GO TO 141
171 IF N1>N2 THEN 186
174 PRINT "OUT OF SEQUENCE"
177 Z9=1
180 PRINT L$
183 GO TO 141
186 LET N2=N1                          !N2=PRESENT LINE #.
189 LET T=T+1
192 LET N(T)=N1                        !SAVE OLD LINE #'S IN ARRAY N
195 IF T<500 THEN 141
198 PRINT "TOO MANY LINES"
201 STOP
204 ! ------ PART2 ------     THIS PART RESEQUENCES
207 IF Z9=1 THEN 201                   !EXIT IF LINE#'S INCORRECT
210 RESTORE #1                         !REOPEN INPUT FILE
213 FILEV #2:N$                        !OPEN INPUT FILE FOR OUTPUT
216 LET N2=S1                          !N2=NEW LINE #
219 INPUT #1: L$                       !GET A LINE
222 IFEND #1 THEN 351
225 LET I=1                            !POINTER I AT BEG. OF LINE (SUB6)
228 LET L=LEN(L$)
231 GOSUB 573                          !GET OLD LINE # AGAIN (N(T))?  
234 LET L2$=STR$(N2)                   !SO I IS AFTER LINE #
237 PRINT #2: L2$;                     !OUTPUT NEW LINE #
240 LET N2=N2+S
243 LET L$=SEG$(CAP$(L$),I,80)         !L$=LINE WO/LINE#
246 LET F=0
249 LET D=POS(CAP$(L$),"\",1) \ LET P=D!SEE IF BACKSLASH IN LINE
252 IF D=0 THEN 261
255 LET L2$=SEG$(CAP$(L$),P+1,80)      !IF BACKSLASH, SPLIT LINE
258 LET L$=SEG$(CAP$(L$),1,P-1)        !L$=FIRST STATEM.,L2$=THE REST
261 R5$="ON"\GOSUB 603\I=R+2           !LOOK FOR "ON","GOTO", --ETC.
264 IF I>2 THEN 306
267 R5$="GOTO"\GOSUB 603\I=R+4
270 IF I>4 THEN 300
273 R5$="GO TO"\GOSUB 603\I=R+5
276 IF I>5 THEN 300
279 R5$="THEN"\GOSUB 603\I=R+4
282 IF I>4 THEN 300
285 R5$="GOSUB"\GOSUB 603\I=R+5
288 IF I>5 THEN 300
291 R5$="GO SUB"\GOSUB 603\I=R+6
294 IF I>6 THEN 300
297 GOTO 309
300 GOSUB 360
303 GOTO 309
306 GOSUB 393
309 IF F=0 THEN 315
312 PRINT #2:"\";
315 PRINT #2:L$;
318 LET F=F+1
321 IF D>0 THEN 330
324 PRINT #2:
327 GO TO 219
330 LET D=POS(CAP$(L2$),"\",1) \ LET P=D !MORE BACKSLASHES IN L2$?
333 IF D>0 THEN 342
336 LET L$=L2$
339 GO TO 261
342 LET L$=SEG$(CAP$(L2$),1,P-1)       !L$=NEXT STATEMENT IN LINE
345 LET L2$=SEG$(CAP$(L2$),P+1,80)     !L2$=REST OF LINE
348 GO TO 261                          !LOOK FOR BRANCHES,ETC...
351 CLOSE #2                           !DONE!
354 STOP
357 ! ------ SUB1 ------     HERE IF BRANCH FOUND
360 O1=0
363 GOSUB 462                          !FIND 1ST NUMERAL (SUB3)
366 IF C<0 THEN 381                    !IF NO NUMBER FOUND
369 GOSUB 507                          !GET NEW LINE# (SUB4)
372 IF N1=0 THEN 381                   !IF NO NUMBER
375 L$=SEG$(CAP$(L$),1,P-1)&Q$&SEG$(CAP$(L$),I,80)
378 RETURN                             !FORM NEW STATEMENT
381 PRINT "BAD REFERENCE (SUB1)"
384 PRINT L$
387 RETURN
390 ! ------ SUB2 ------     HERE IF "ON" FOUND
393 O1=1
396 L3$=L$                             !SAVE L$
399 K=0
402 K=K+1
405 GOSUB 462                          !GET LINE#
408 IF C>= 0 THEN 417
411 IF K=1 THEN 453
414 GOTO 447
417 GOSUB 507                          !GET NEW LINE#
420 IF N1>0 THEN 429
423 IF K=1 THEN 453
426 GOTO 447
429 IF K=1 THEN 441
432 L3$=L3$&","&Q$                     !FORM NEW LINE
435 L4$=SEG$(CAP$(L$),I,80) 
438 GOTO 402
441 L3$=SEG$(CAP$(L$),1,P-1)&Q$
444 GOTO 402
447 L$=L3$&L4$
450 RETURN
453 PRINT "BAD REFERENCE (SUB2)"
456 PRINT L$
459 RETURN
462 ! ------ SUB3 ------    HERE TO GET POINTER AT NUMERAL
465 LET L=LEN(L$)
468 GOSUB 552                           !GET ASCII CHAR. AT I
471 IF O1=0 THEN 486                    !IF "ON" SKIP OVER NON-NUMERALS
474 IF C<0 THEN 504
477 IF C<48 THEN 468
480 IF C>57 THEN 468
483 GOTO 492
486 IF C=32 THEN 468
489 IF C<0 THEN 504                     !IF NO NUMBER FOUND
492 LET I=I-1 				!I=POINTER AT 1ST NUMERAL
495 IF O1=0 THEN 501
498 IF K<>1 THEN 504
501 LET P=I 				!SAVE THIS POSITION
504 RETURN
507 !     ------ SUB4 ------     HERE TO GET NEW LINE#
510 GOSUB 573			        !GET OLD LINE# FIRST
513 IF N1=0 THEN 531 			!IF NO LINE NUMBER FOUND
516 FOR J=1 TO T 			!THIS LOOP FINDS OLD LINE# IN N(T)
519 IF N1<>N(J) THEN 528
522 LET Q$=STR$(J*S-S+S1) 		!NEW LINE# COMPUTED 
525 RETURN
528 NEXT J
531 RETURN
534 !		SUB5 AND SUB6  GET AN OLD LINE#
537 !		INPUTS: I=CHARACTER POINTER
540 !		        L$=STATEMENT TO BE SCANNED
543 !		OUTPUT: C=ASCII CODE FOR CHAR. AT I
546 !		        N1=OLD LINE#
549 !		        I=POINTER AT CHAR. AFTER N1
552 !     ------ SUB5 ------
555 IF I<=L THEN 564 		       !POINTER WITHIN STATEMENT?
558 LET C=-1 			       !SCANNING BEYOND END
561 RETURN
564 LET C=ASC(SEG$(CAP$(L$),I,I))      !GET ASCII CODE FOR CHAR. AT I
567 LET I=I+1 			       !INCREMENT POINTER
570 RETURN
573 !     ------ SUB6 ------
576 LET N1=0 			       !INITIALIZE LINE#
579 GOSUB 552
582 IF C<48 THEN 594 		       !SEE IF CHAR. A NUMERAL
585 IF C>57 THEN 594 		       !
588 LET N1=N1*10+C-48 		       !FORM LINE NUMBER HERE
591 GO TO 579 		               !GET NEXT NUMERAL
594 IF C<0 THEN 600 		       !RETURN IF NO LINE#
597 LET I=I-1 			       !POSITION POINTER I AFTER N1 (LINE#)
600 RETURN
603 !     ------ SUB7 ------     HERE TO FIND "GOTO","THEN" --- ETC.
606 L5=LEN(L$)
609 R=POS(CAP$(L$),R5$,1)            !SEE IF R5$ IN LINE AT ALL
612 IF R=0 THEN 732                  !IF NOT THEN RETURN
615 B=1
618 C1=POS(CAP$(L$),"!",B)          !FIND !
621 R1=POS(CAP$(L$),"REM",B)         !FIND REMARK
624 IF R1=0 THEN  651
627 IF C1<R1 THEN 651
630 GOSUB 735                        !GET QUOTES (G1,G2)
633 IF G1=0 THEN 729                 !IF NO QUOTES
636 IF G2=0 THEN 723
639 IF R1<G1 THEN 729                !QUOTE AFTER REM
642 B=G2+1
645 IF B>L5-1 THEN 651
648 GOTO 621
651 B=1
654 IF C1=0 THEN 681
657 GOSUB 735                        !GET G1 AND G2 (PAIR OF QUOTES)
660 IF G1=0 THEN 681                 !IF NO QUOTES
663 IF G2=0 THEN 723                 !IF NOT A PAIR
666 IF C1<G1 THEN 681                !IF QUOTES AFTER!
669 B=G2+1                           !CHECK ANOTHER PAIR
672 IF B>L5-1 THEN 681
675 C1=POS(CAP$(L$),"!",B)           !LOOK FOR! (COMMENT TYPE)
678 GOTO 654
681 B=1
684 R=POS(CAP$(L$),R5$,B)            !LOOK FOR R5$
687 IF R=0 THEN 732
690 IF R1=0 THEN 696
693 IF R>=R1 THEN  729
696 IF C1=0 THEN 702                 !IF NO!
699 IF R>=C1 THEN 729                !R5$ IN COMMENT AREA?
702 GOSUB 735                        !GET PAIR OF QUOTES (G1,G2)
705 IF G1=0 THEN 732
708 IF G2=0 THEN 723
711 IF R<G1 THEN 732
714 B=G2+1
717 IF B>L5-1 THEN 729               !END OF L$?
720 GOTO 684
723 PRINT "UNPAIRED QU0TES"
726 PRINT L$
729 R=0
732 RETURN
735 !     ------ SUB8 ------     HERE TO FIND QUOTES IN L$
738 G1=POS(CAP$(L$),T$,B)            !G1=1ST QUOTE
741 G2=POS(CAP$(L$),T$,G1+1)         !G2=2ND QUOTE
744 RETURN
747 END



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search