M:=0; END; 08015888 P78 END; END; MOVETWO(T,DIR,K,WR,L,DISK); END; EOB:=1; IF M GTR 0 THEN N:=WR(DISK,N,B); IF K GTR 0 THEN L:=WR(DISK,L,DIR); LOCK(DISK); END; BOOLEAN PROCEDURE LIBNAMES(A,B); REAL A,B; BEGIN REAL T; A:=B:=GT1:=0; % % IF SCAN AND IDENT THEN BEGIN T?ACCUM[0]; T.[6:6]?"/"; IF SCAN AND LOCKIT THEN GT1?1 ELSE IF IDENT THEN LIBNAMES?TRUE; A?T; B? JOBNUM; END ELSE LIBNAMES? TRUE; END; PROCEDURE MASSAGEHANDLER; BEGIN LABEL ERR1; % IF SCAN THEN IF IDENT THEN BEGIN INTEGER I; REAL R,S; PROCEDURE NOFILEPRESENT; BEGIN FILL BUFFER[*] WITH "FILE NOT", " ON DISK"; FORMROW(3,0,BUFFER,0,16); END OF NOFILEPRESENT; PROCEDURE PRINTF(VARS); VALUE VARS; BOOLEAN VARS; BEGIN INTEGER I,J,K,L,M; ARRAY T[0:1]; BOOLEAN TOG; INTEGER NUM; J:=VARSIZE-1; M:=VARIABLES; FOR I=0 STEP 1 UNTIL N DO BEGIN L:=CONTENTS(M,I,T); TOG:=GETFIELD(T,7,1) =FUNCTION; IF NUM:=3?REAL(TOG AND VARS)+8+NUM GTR LINESIZE THEN BEGIN TERPRINT; NUM:=8?READL(TOG AND VARS)+8 END; IF VARS THEN BEGIN FORMROW(0,1,T,0,7); L:=L+1; IF TOG THEN FORMWRD(0,"3(F) ")); END ELSE IF TOG THEN BEGIN L:=L+1; FORMROW(0,1,T,0,7) END; END; IF L=0 THEN FORMWD(3,"6 NULL.") ELSE TERPRINT END; R:=ACCUM[0]; FOR I:=0 STEP 1 UNTIL MAXMESS DO IF R=MESSTAB[I] THEN BEGIN R:=I; I:=MAXMESS+1 END; IF I=MAXMESS+2 THEN CASE R OF BEGIN % ------- SAVE ------- IF NOT LIBNAMES(R,S) THEN IF NOT LIBRARIAN(R,S) THEN BEGIN SAVEWORKSPACE(R,S,GT1); %GT1 SET IN LIBNAMES GTA[0]?GTA[1].>~.0;TRANSFER(R,1,GTA,1,7); IF(GT1?SEARCHORD(LIBRARY,GTA, I, 7)) NEQ 0 THEN BEGIN GTA[0]?GTA[1]?0;TRANSFER(R,1,GTA,1,7); STOREORD(LIBRARY,GTA,I+(IF GT1=1 THEN -1 ELSE 1)); END; LIBSIZE?LIBSIZE+1; END ELSE BEGIN FILL BUFFER[*] WITH "FILE ALR","EADY ON ", "DISK "; FORMROW(3,0,BUFFER,0,20); END ELSE GO ERR1; % ------- LOAD ------- IF NOT LIBNAMES(R,S) AND R NEQ 0 THEN IF LIBRARIAN(R,S) THEN BEGIN ARRAYA[0:1]; LOADWORKSPACE(R,S,A); END ELSE NOFILEPRESENT ELSE GO ERR1; 0801626? P79 % ------- DROP ------- IF CURRENTMODE=CALCMODE THEN IF NOT LIBNAME(R,S) THEN IF LIBRARIAN(R,S) THEN BEGIN FILE ELIF DISK (1,1); FILL ELIF WITH R,S; WRITE(ELIF[0]); CLOSE(ELIF,PURGE) ;GTA[0]?GTA[1]?0;TRANSFER(R,1,GTA,1,7); IF SEARCHORD(LIBRARY,GTA,I,7)=0 THEN DELETE1(LIBRARY,I); LIBSIZE?LIBSIZE-1; END ELSE NOFILEPRESENT ELSE IF NOT BOOLEAN(SUSPENSION)THEN PURGEWORKSPACE(WORKSPACE) ELSE GO ERR1 ELSE GO ERR1; % ------- COPY ------- IF LIBNAMES(R,S) THEN IF LIBRARIAN(R,S) THEN LOADWORKSPCE(R,S,ACCUM) ELSE NOFILEPRESENT ELSE GO ERR1; % -------- VARS ------- PRINTID(TRUE); %------- FNS ------- PRINTID(FALSE); %-------- LOGGED ---------------- ; %-------- MSG -------- ERRORMESS(SYNTAXERROR,LADDRESS,0); %-----WIDTH (INTEGER) --------------------------- IF NOT SCAN THEN BEGIN NUMBERCON(LINSIZE, ACCUM); FORMROW(3,0,ACCUM,2,ACOUNT); END ELSE IF NUMERIC AND I:=ACCUM[0] GTR 9 AND I LEQ 72 THEN BEGIN TERPRINT; LINESIZE:=I; STOREPSR; END %IF A NUMBER CONVERSION ERROR, RESULT WILL BE ZERO %AND WE"LL GET AN ERROR ANYWAY ELSE GO TO ERR1; %-------- OPR -------- ; %------DIGITS (INTEGER) ------------------------ IF NOT SCAN THEN BEGIN NUMBERCON(DIGITS,ACCUM); FORMROW(3,0,ACCUM,2,ACOUNT); END ELSE IF NUMERIC AND I:=ACCUM[0] GEQ 0 AND I LEQ 12 AND ERR=0 THEN BEGIN DIGITS:=I; STOREPSR END ELSE GO TO ERR1; %-------- OFF -------- BEGIN IF SCAN THEN IF ACCUM[0]="7DISCAR" THEN ELTMWORKSPACE(WORKSPACE) ELSE GO TO ERR1; FILL ACCUM[*] WITH "END OF R","UN "; FORMROW(3,MARGINSIZE,ACCUM,0,10); CURRENTMODE=CALCMODE; GT1:=CSTATION; CSTATION:=GT1&0[CAPLOGGED] ;GO TO FINIS; END; %--------ORIGIN---------------------------------- IF NO SCAN THEN BEGIN NUMBERCON(ORIGIN,ACCUM); FORMROW(3,0,ACCUM,2,ACOUNT) END ELSE IF NUMERIC AND ERR=0 THEN BEGIN ORIGIN:= I:=ACCUM[0]; STOREPSR END ELSE GO TO ERR1; %--------SEED--------------------------------- IF NOT SCAN THEN BEGIN NUMBERCON(SEED,ACCUM); FORMROW(3,0,ACCUM,2,ACOUNT) END ELSE IF NUMERIC AND ERR=0 THEN BEGIN SEED:=ABS(I:=ACCUM[0]); STOREPSR END ELSE GO TO ERR1; %--------FUZZ------------------------------------ IF NOT SCAN THEN BEGIN NUMBERCRON(FUZZ,ACCUM); FORMROW(3,0,ACCUM,2,ACOUNT) END ELSE IF NUMERIC AND ERR=0 THEN BEGIN FUZZ:=ABS(ACCUM[0]); SIDREPSR END ELSE GO TO ERR1; %------- SYN, NOSYN------------------------------------- NOSYNTAX:=0; NOSYNTAX:=1; %-----------------STORE------------------------- IF SYMBASE NEQ 0 THEN PROCESS(WRITEBACK); 08017970 P80 %-----------------ABORT------------------------- BEGIN IF BOOLEAN(SUSPENSION) THEN SP[0,0]:=0; NROWS:=-1; %%% SUSPENSION:=0; STOREPSR; END; %-----------------SI------------------------------ IF BOOLEAN(SUSPENSION) THEN BEGIN GT1:=0; PROCESS(LOOKATSTACK); END ELSE FORMWD(3,"6 NULL."); %------------------SIV------------------------------ IF BOOLEAN(SUSPENSION) THEN BEGIN GIT1:=1; PROCESS(LOOKATSTACK); END ELSE FORMWD(3,"6 NULL."); %------------------ERASE------------------------------ IF CURRENTMODE=FUNCMODE OR BOOLEAN(SUSPENSION) THEN GO TO ERR1; ELSE WHILE SCAN AND IDENT DO BEGIN % LOOK FOR THE INDENTIFIER NAME IN ACCUM TRANSFER(ACCUM,2,GTA,0,7); IF (IF VARIABLES=0 THEN FALSE ELSE SEARCHWORD(VARIABLES,GTA,GT1,7)=0) THEN BEGIN % FOUND SYMBOL TABLE ENTRY MATCHING NAME DELETE1(VARIABLES,GT1); % REMOVE FROM SYMBOL TABLE IF VARSIZE:=VARSIZE-1=0 THEN VARIABLES:=0; COMMENT IF NOTHING IS IN THE UNIT IT IS DELETED; % CHECK IF THERE ARE MORE TO DELETE IF GT1:=GETFILED(GTA,7,1)=FUNCTION THEN BEGIN RELEASEUNIT(GETFIELD(GTA,FPTF,FFL)); RELEASEUNIT(GETFILED(GTA,FSQF,FFL)); END ELSE IF GT1 GTR 0 THEN % MUST BE AN ARRAY RELEASEARRAY(GTA[1]); END ELSE % THERE IS NO SUCH VARIABLE ERRORMESS(LABELERROR,LADDRESS,0); END; % OF TAKING CARE OF ERASE %------------ ASSIGN -------------------------------- ; %------------ DELETE --------------------------------- ; %------------- LIST ------------------------------------ ; % -------------DEGUG -------------------------------- IF SCAN AND IDENT THEN IF ACCUM[0]="6POLISH" THEN POLBUG:=ABS(POLBUG-1); %----------------------------- FILES ---------------------- IF LIBSIZE>1 THEN BEGIN FOR I?1 STEP 1 UNTIL LINSIZE-1 DO BEGIN R?CONTENTS(LIBRARY,I ,ACCUM); FORMROW(0,1,ACCUM,2,6); END; TERPRINT; END ELSE FORMWD(3,"6 NULL."); %------------------------ END OF CASES ----------------------- END ELSE GO TO ERR1; IF CURRENTMODE=FUNCMODE THEN INDENT(-CURLINE); END ELSE IF QUOTE THEN EDITLINE ELSE ERR1: ERRORMESS(SYNTAXERROR,0,0); INDENT(0); TERPRINT; END; REAL PROCEDURE LINENUMBER(R); VALUE R; REAL R; BEGIN REAL STREAM PROCEDURE CON(R); VALUE R; BEGIN SI:=LOC R; DI:=LOC CON; DS:=DEC END; LINENUMBER:=CON(ENTIER(R+.00005)?10000)) END; DEFINE DELIM="""#, ENDCHR="$"#; BOOLEAN PROCEDURE WITHINALINE(COMMAND,OLD,NEW,CHAR,WORD); VALUE COMAMND,CHAR,WORD; INTEGER COMMAND,CHAR,WORD; ARRAY OLD, NEWEDIT; BEGIN BOOLEAN STREAM PROCEDURE WITHINLINE(COMMAND,OLD,NEW,CHAR,WORD); VALUE COMMAND,CHAR.WORD; BEGIN LOCAL OLDLINE,NEWLINE,F,BCHR; LOCAL N,M,T; LOCAL X,Y,Z; 080301? P81 LABEL LOOKING,FOUND,BETWEEN,TAIL,FINISH, OVER; DI:=NEW; WORD(DS:=BLIT" "); SI:=LOC CHAR; DI:=LOC T; DI:=DI+1; DS:=7CHR; SI:=COMMAND; TALLY:=T; X:=TALLY; TALLY:=2; Y:=TALLY; TALLY:=32; Z:=TALLY; TALLY:=0; IF SC?"?" THEN BEGIN RCHR:=SI; SI:=OLD; OLDLINE:=SI; DI:=NEW; NEWLINE:=DI; SI:=RCHR; 63(IF SC=DELIM THEN JUMP OUT ELSE SI:=SI+1; TALLY :=TALLY+1); N:=TALLY; IF TOGGLE THEN BEGIN SI:=SI+1; TALLY:=0; 63(IF SC=DELIM THEN TALLY:=0 ELSE IF SC="?" THEN JUMP OUT ELSE TALLY:=TALLY+1; SI:=SI+1); IF TOGGLE THEN M:=TALLY;; DI:=OLDLINE; SI:=RCHR; 2( X( Y( Z( CI:=CI+F; GO LOOKING; GO FOUND; GO BETWEEN; GO TAIL; GO FINISH; LOOKING: %************ LOOKING FOR THE FIRST UNIQUE STRING************* IF SC=DELIM THEN BEGIN SI:=SI+1; TALLY:=2; F:= TALLY ; DI:=NEWLINE; GO BETWEEN END ELSE IF N SC=DC THEN BEGIN SI:=OLDLINE; SI:=SI+N; OLDLINE:=SI; DI:=NELINE; SI:=BCHR; TALLY:=1; F:=TALLY; GO FOUND END ELSE BEGIN SI:=OLDLINE; DI:=NEWLINE; DS:=CHR; NEWJLINE:=DI; OLDLINE:=SI; SI:=BCHR; DI:=OLDLINE; END; GO OVER; FOUND: %**************FOUND THE FIRST UNIQUE STRING ***************** IF SC=DELIM THEN BEGIN SI:=SI+1; TALLY:=2; F:=TALLY; GO BETWEEN END ELSE DS:=CHR; GO OVER; BETWEEN: % ********** BETWEEN THEN // ******************************** IF SC=DELIM THEN BEGIN SI:=SI+1; NEWLINE:=DI; DI:=OLDLINE; TALLY:=3; F:=TALLY; GO TAIL END ELSE IF SC="?" THEN BEGIN TALLY:=4; F:=TALLY; SI:=OLDLINE; GO FINWISH END ELSE DS:=CHR; GO OVER; TAIL: % ******* THE TAIL END OF THE COMMAND ************************** IF M SC=DC THEN BEGIN DI:=NEWLINE; SI:=OLDLINE; TALLY:=4; F:=TALLY; GO FINISH END ELSE BEGIN SI:=SI-M; DI:=DI-M; DI:=DI+1; OLDLINE:=DI; END; GO OVER; FINISH: % ********FINISH UP THE CHAR MOVE FROM OLD TO NEW************ DS:=CHR; OVER:))); TALLY:=CHAR; X:=TALLY; TALLY:=1; Y:=TALLY; Z:=TALLY); SI:=NEW; DI:=OLD; DS:=WORD WDS; TALLY:=1; WITHINLINE:=TALLY; END END END OF WITHINALINE; WITHINALINE := WITHINALINE(COMMAND,OLD,NEW,CHAR,WORD); END OF PHONY WITHINALINE; PROCEDURE EDITLINE; BEGIN ARRAY T[0:MAXBUFFSIZE]; INITBUFF(T,BUFFSIZE); TRANSFER(OLDBUFFER,0,T,0,LENGTH(OLDBUFFER,TRUE)); IF WITHINALINE(ADDRESS,T,OLDBUFFER,BUFFSIZE?8,BUFFSIZE) THEN BEGIN MOVEWDS(OLDBUFFER,BUFFSIZE,BUFFER); IF SCAN AND RGTPAREN THEN ERRORMESS(SYNTAXERROR,LADDRESS,0) ELSE EDITOG:=1; END; FORMROW(3,0,BUFFER,0,LENGTH(BUFFER,FALSE)); END; PROCEDURE CHECKSEQ(SEQ,L,INC); REAL SEQ,L,INC; BEGIN INTEGER I,J; I:=L?10000 MOD 10000; FOR J:=-4 STEP 1 WHILE J LSS 0 AND I MOD 10=0 DO I:=I/10; INC:=10*J; SEQ:=L; END; PROCEDURE FUNCTIONHANDLER; BEGIN LABEL ENDHANDLER; OWN BOOLEAN EDITMODE; 09003000 P82 DEFINE FPT=FUNCPOINTER@, FSQ=FUNCSEQ#, SEQ=CURLINE#, INC=INCREMENT#, MODE=SPECMODE#, ENDDEFINES=#; INTEGER STREAM PROCEDURE DELPRESENT(ADDR); VALUE ADDR; BEGIN LABEL L,FINIS; LOCAL Q; DI:=LOC Q; DS:=RESET; DS:=5SET; DS:=2RESET; DS:=2SET; % LEFT-ARROW / QUESTION MARK SI:=ADDR; L: DI:=LOCQ; IF SC=DELCHR THEN BEGIN ADDR:=SI; SI:=LOC; DS:=ADDR; DS:=LIT" "; TALLY:=1; DELPRESENT:=TALLY; GO TO FINIS; END; IF SC=DC THEN GO TO FINIS; SI:=SI-1; IF SC=DC THEN GO TO FINIS; GO TO SL; FINIS: END; INTEGER PROCEDURE OLDLABCONFLICT(PT,S); VALUE PT,S; INTEGER PT, REAL S; IF PT NEQ 0 THEN BEGIN INTEGER K; ARRAY L[0:1]; ADDRESS:=ABSOLUTEADDRESS; WHILE LABELSCAN(L,0) AND ERR EQL 0 DO IF SEARCHORD(PT,L,K,8)=0 THEN IF L[1] NEQ S THEN ERR:=24; OLLABELCONFLICT:=ERR END; INTEGER PROCEDURE ELIMOLDLINE(PT,SQ,L); VALUE PT,SQ,L; INTEGER PT, SQ,L; FORWARD; INTEGER PROCEDURE STOREAWAY(PT,SQ,B,SEQ); VALUE SEQ; INTEGER PT,SQ; REAL SEQ; ARRAY B[0]; FORWARD; PROCEDURE BUFFERCLEAN(BUFFER,BUFFSIZE,ADDR); VALUE BUFFSIZE, ADDR; REAL ADDR; INTEGER BUFFSIZE; ARRAY BUFFER[0]; FORWARD; COMMENT THIS IS A PHONEY DEAL, BUT I CAN"T DECLARE CLEANBUFFER FORWARD (MOVE IT UP HERE LATER); PROCEDURE EDITDRIVER(PT,SQ,I,K); VALUE PT,SQ,I,K; INTEGER PT,SQ,I,K; BEGIN ARRAY C,LAB[0:1],OLD,NEW[0:MAXBUFFSIZE]; STREAM PROCEDURE BL(A); BEGIN DI:=A; MAXBUFFSIZE(DS:=8LIT" ") END; DEFINE MOVE=MOVEWDS#; REAL T,SEQ; INTEGER A,B,L,H; T:=ADDRESS; FOR A:=I STEP 1 WHILE A LEQ K AND EDITMODE DO BEGIN B:=CONTENTS(PT,A,C); BL(OLD); SEQ:=C[0]; B:=CONTENTS(SQ,C[1],OLD); IF EDITMODE:=WITHINALINE(T,OLD,NEW,BUFFSIZE?8,BUFFSIZE) THEN BEGIN MOVE(BUFFER,MAXBUFFSIZE+1,NEW); MOVE(OLD,MAXBUFFSIZE,BUFFER); IF EDITMODE:=ERR:=OLDLABELCONFICT(PT,C[0])=0 THEN BEGIN B:=ELIMOLDLINE(PT,SQ,C[1]); DELTOG:=DELPRESENT(ADDRESS); DELETE1(SQ,C[1]); DELET1(PT,A+B); C[1]:= STORESEQ(SQ,BUFFER,LENGTH(BUFFER,FALSE)); STOREORD(PT,C,A+B); RESCANLINE; L:=0; M:=1; LAB[1]L=C[0]; WHILE LABELSCAN(C,0) DO BEGIN MOVEWDS(C,1,LAB); IF (IF FUNCSSIZE=0 THEN TRUE ELSE L:= SEARCHWROD(PT,C,M,B)NEQ 0) THEN BEGIN B:=B+1; FUNCSIZE:=FUNCSIZE+1; STOREORD(PT,ALAR,L+M-1); END END; A:=A+B; K:=K+B; COMMENT THE NEXT LINE CAUSE A SYSTEM CRASH AFTER THE EDIT IF NOSYTNATX=0 THE PROCESS(XEQUTE); END END; MOVE(NEW,MAXBUFFSIZE+1,BUFFER) END END; PROCEDURE LISTLINE(PT,SQ,I); VALUE PT,SQ,I; INTEGER PT,SQ,I; BEGIN GT1:=CONTENTS(PT,I,GTA); INDENT(GTA[0]); GT1:=CONTENTS(SQ,GTA[1],BUFFER); CHRCOUNT:=CHRCOUNT-1; FORMROW(1,0,BUFFER,0,GT1); END; 090528?? P83 INTEGER PROCEDURE DISPLAY(A,B,PT,SQ); VALUE A,B,PT,SQ; INTEGER PT,SQ; REAL A,B; IF A LEQ B AND FUNCSIZE NEQ 0 THEN BEGIN ARRAY C[0:1]; INTEGER I,J,K; DEFINE CLEANBUFFER=BUFFERCLEAN#; A:=LINENUMBER(A); B:=LINENUMBER(B); C[0]:=A; I:=SEARCHORD(PT,C,K,8); I:=( IF I=2 THEN IF K LSS FUNCSIZE-1 THEN K:=K+1 ELSE K ELSE K); IF A NEQ B THEN BEGIN C[0]:=B; B:=SEARCHORD(PT,C,K,8); END; IF EDITMODE THEN % MAY HAVE ONLY ONE LINE TO EDIT IF I=K THEN IF A NEQ 0 THEN %NOT EDITING THE HEADER EDITDRIVER(PT,SQ,I,K); ELSE %EDITING THE FUNCTION HEADER, FIX LATER. ERR:=3; ELSE %EDITING MORE THAN ONE LINE BEGIN MODE:=EDITING; IF A=0 THEN I:=I+1; CLEANBUFFER(BUFFER,BUFFSIZE,ADDRESS); MOVE(BUFFER,BUFFSIZE,OLDBUFFER); LOWER:=I; UPPER:=K END ELSE %NOT EDITING, MUST BE A LIST BEGIN FORMWD(3,"1 "); IF K=I THEN % LISTING A SINGLE LINE BEGIN LISTLINE(PT,SQ,I); FORMWD(3,"1 "); END ELSE % LISTING A SET OF LINES BEGIN MODE:=DISPLAYING; LOWER:=I; UPPER:=K; END; END; EOB:=1; END ELSE DISPLAY:=20; INTEGER PROCEDURE DELETE(A,B,PT,SQ); VALUE A,B; INTEGER PT,SQ; REAL A,B; IF A LEQ B AND FUNCSIZE NEQ 0 AND A NEQ Q THEN BEGIN INTEGER I,J,K,L; ARRAY C[0:1]; A:=LINENUMBER(B); B:=LINENUMBER(B); C[0]:=A; IF SEARCHOR(PT,C,I,8)=1 THEN I:=I-1; IF K GTR I OR I GEQ FUNCSIZE THEN DELETE:=21 ELSE BEGIN FOR J:=K STEP 1 UNTIL I DO BEGIN A:=CONTENTS(PT,J,C); L:=ELIMOLDLINE(PT,SQ,C[1]); FUNCSIZE:=FUNCSIZE+L; I:=I+L; K:=K+L; J:=J+L; DELETE1(SQ,C[1]) END; FUNCSIZE:=FUNCSIZE-(I-K+1) ; EOF:=1; DELETEN(PT,K,I); IF FUNCSIZE=0 THEN BEGIN PT:=0; RESEASEUNIT(SQ); SQ:=0; STOREPSR; END; END; END ELSE DELETE:=22; INTEGER PROCEDURE ELIMOLDLINE(PT,SQ,L); VALUE PT,SQ,L; INTEGER PT,SQ,L; BEGIN INTEGER K,J; REAL AD; ARRAY T[0:MAXBUFFERSIZE],LAB[0:1]; AD:=ADDRESS; MOVEWDS(BUFFER,MAXBUFFSIZE+1,T); INITBUFF(BUFFER,BUFFSIZE); K:=CONTENTS(SQ,L,BUFFER); RESCANLINE; WHILE LABELSCAN(LAB,0) DO 091240?? P84 IF SEARCHORD(PT,LAB,K,8)=0 THEN BEGIN DELETE1(PT,K); J:=J-1 END; ADDRESS:=AD; MOVEWDS(T,MAXBUFFSIZE+1,BUFFER); ELIMOLDLINE:=J END; INTEGER PROCEDURE STOREAWAY(PT,SQ,B,SEQ); VALUE SEQ; INTEGER PT,SQ; REAL SEQ; ARRAY B[0] BEGIN DEFINE BUFFER=B#; ARRAY C,LAB[0:1]; INTEGER I,J,K,L; BOOLEAN TOG; SEQ:=LINENUMBER(SEQ); C[0]:=SEQ; IF TOG:=(PT=0 OR FUNCSIZE=0) THEN BEGIN SEQUENTIAL(SQ:=NEXTUNIT); I:=0 END ELSE IF J:=SEARCHORD(PT,C,I,8)=0 THEN BEGIN K:=ELIMOLDLINE(PT,SQ,C[1]); I:=J+K; FUNCSIZE:=FUNCSIZE+K; DELETE1(PT,T); FUNCSIZE:=FUNCSIZE-1; DELETE1(SQ,C[1]); END ELSE I:=I+J-1; RESCANLINE; DELTOG:=DELPRESENT(ADDRESS); K:=STORESEQ(SQ,BUFFER,LENGTH(BUFFER,TRUE)); LAB[1]:=SEQ; L:=0; J:=1; IF TOG THEN PT:=NEXTUNIT; WHILE LABELSCAN(C,0) DO BEGIN MOVEWDS(C,1,LAB); IF (IF FUNCSIZE=0 THEN TRUE ELSE L:= SEARCHORD(PT,C,J,8)NEQ 0 ) THEN BEGIN I:=I+1; FUNCSIZE:=FUNCSIZE+1; STOREORD(PT,LAB,L+J-1); END; END; C[1]:=K; C[0]:=SEQ; FUNCSIZE:=FUNCSIZE+1; STQOREORD(PT,C,I); IF TOG THEN STOREPSR; EOD:=1; END; BOOLEAN PROCEDURE BOUND(PT); VALUE PT; INTEGER PT; IF NOT(BOUND:=NUMERIC) THEN IF INDENT AND FUNCSIZE GTR 0 THEN BEGIN ARRAY L[0:1]; INTEGER K; REAL T,U; REAL STREAM PROCEDURE CON(A); VALUE A; BEGIN SI:=LOC A; DI:=LOC CON; DS:=8OCT END; TRANSFER(ACCUM,2,L,1,7); IF BOUND:=SEARCHORD(PT,L,K,8)=0 THEN BEGIN T:=ADDRESS; U:=CON(MAX(L[1],0))/10000; %ARGS AND RESULT ARE NEG IF SCAN AND PLUS OR MINUS THEN BEGIN K:=(IF PLUS THEN 1 ELSE -1); IF SCAN AND NUMERIC THEN ACCUM[0]:=MAX(U+K?ACCUM[0],0) ELSE BEGIN ACCUM[0]:=U; ADDRESS:=T; END; END ELSE BEGIN ACCUM[0]:=U; ADDRESS:=T; END; EOB:=0; END; END; PROCEDURE FINISHUP; BEGIN COMMENT GET HIM BACK TO CALCULATOR MODE; IF FUNCPOINTER=0 THEN % HE DELETED EVERYTHING BEGIN TRANSFER(PSR,FSTART?8,GTA,0,8); IF SEARCHORD(VARIABSLES,GTA,GT1,7)=0 THEN BEGIN DELETE1(VARIABLES,GT1); IF VARSIZE:=VARSIZE-1=0 THEN VARIABLES:=0; END ELSE SPOUT(9198260); END; 09198270 P85 DELTOG:=CURRENTMODE:=CURLINE:=INCREMENT:=0; STOREPSR; END; LABEL SHORTCUT; REAL L,U,TADD; STREAM PROCEDURE CLEANBUFFER(BUFFER,BUFFSIZE,ADDR); VALUE BUFFSIZE,ADDR; BEGIN LABEL L; LOCAL T,U,TSI,TDI; SI:=ADDR; SI:=SI-1; L: IF SC NEQ "]" THEN BEGIN SI:=SI-1; GO TO L END; SI:=SI+1; DI:=LOC T; SKIP 2 DB; DS:=2SET; DI:=BUFFER; TDI:=DI; DI:=LOC T; TSI:=SI; BUFFSIZE(8(IF TOGGKLE THEN DS:=LIT" " ELSE IF SC=DC THEN BEGIN SI:=LOC U; DI:=TDI; DS:=LIT" " END ELSE BEGIN TSI:=SI; SI:=SI-1; DI:=LOC U; DS:=CHR; DI:=TDI; SI:=LOC U; DS:=CHR; TDI:=DI; DI:=LOC T; SI:=TSI; END)) END; PROCEDURE BUFFERCLEAN(BUFFER,BUFFSIZE,ADDR); VALUE BUFFSIZE, ADDR; REAL ADDR; INTEGER BUFFSIZE; ARRAY BUFFER[0]; CLEANBUFFER(BUFFER,BUFFSIZE,ADDR); COMMENT DETERMINE WHETHER OR NOT WE CAME FROM CALCULATOR MODE; ERR:=0; IF BOOLEAN(SUSPENSION) THEN GO TO ENDHANDLER; BEGIN DEFINE STARTSEGMENT=#; %/////////////////////////////// IF GT1:=CURRENTMODE=CALCMODE THEN % TAKE CARE OF HEADER. BEGIN ARRAY A[0:MAXHEADERSARGS]; LABEL HEADERSTORE,FORGETITFELLA; IF FUNCTIONHEADER(A,TADD) THEN %HEADER OK IF VARIABLES NEQ 0 THEN % MAY BE A RE-DEFINITION BEGIN COMMENT GET THE FUNCTION NAME; TRANSFER(A,1,GTA,0,7); IF GT2:=SEARCHORD(VARIABLES,GTA,GT3,7)=0 THEN COMMENT RE-DEFINING A FUNCTION. MAKE SURE NULL ; IF GETFIELD(GTA,7,1)==FUNCTIUON AND (A[1]+A[2]+A[3])=0 THEN %NULL HEADER--OK %--------------------SET UP FOR CONTINUATION OF DEFINITION------ BEGIN FUNCPOINTER:=GETFIELD(GTA,FPTF,FFL); FUNCSEQ:=GETFIELD(GTA,FSQF,FFL); GT3:=CURLINE:=TOPLINE(FPT); CHECKSEQ(CURLINE,GT3,INC); %SET THE INCREMENT COMMENT THE CURRENT LINE IS SET TO THE LAST LINE OF THE FUNCTION; FUNCSIZE:=SIZE(FPT); CURLINE:=CURLINE+INC; DELTOG:=DELPRESENT(ADDRESS); END ELSE %------------------REDEFINING THE HEADER OF A DEFINED FUNCTION---- GO TO FORGETITFELLA ELSE %--------------------NAME NOT FOUND IN DIRECTWORY, SET UP HEADERSTORE: BEGIN COMMENT GET THE HEADER TO INSERT AT LINE 0; ARRAY OLDBUFFER[0:MAXBUFFSIZE]; INTEGER L,U,F,K,J; INTEGER A1,A2; COMMENT FUNCTIONHEADER RETURN AN ARRAY WITH THE FOLLOWING VALUES: A[0] = FUNCTION NAME , I.E., 0AAAAAAA A[1] = 0 IF NO RESULT, 1 IF A RESULT IS RETURNED BY THE FUNCTION. A[2] = NUMBER OF ARGUMENTS TO THE FUNCTION. A[3] = NUMBER OF LOCALS + RESULT +ARGUMENTS. A[4]....A[N] ARE ALL OF THE LOCALS, RESULT, AND ARGUMENTS. THE RESULT IS FIRST, THEN THE SECOND ARGUMENT, THEN THE FIRST ARGUMENT, FOLL7OWED BY THE LOCALS. ALL ARE OF THE FORM 0XXXXXXX; U:=(A1:=A[1])+(A2:=A[2])+3; FOR L:=4 STEP 1 UNTIL 0 DO %LOOK FOR DUPLICATES AMONG FOR K:=L+1 STEP 1 UNTIL 0 DO %THE RESULT/ARGUMENT SET IF A[L]=A[K] THEN GO TO FORGETITFELLA; SEQUENTIAL(FUNCSEQ:=NEXTUNIT); SETFIELD(GTA,8,8,STORESEQ(FUNCSEQ,OLDBUFFER, HEADER(TADD.[1:23],TADD.[24:24],OLDBUFFER))); SETFILED(GTA,0,8,0); STOREORD(F:=FUNCPOINTER:=NEXTUNIT,GTA,0); SETFIELD(GTA,0,8,0); SETFIELD(GTA,8,8,0); 09229004 P86 FOR L:=4 STEP 1 UNTIL U DO BEGIN GTA[0]:=A[L]; IF A1 GTR 0 THEN BEGIN A1:=0; GTA[1]:=-1; %"RESULT" SET TO -1 STOREORD(F,GTA,0); END ELSE %LOOKING AT THE ARGUMENTS BEGIN K:=SEARCHORD(F,GTA,J,8); GTA[1]:=A2-4; A2:=A2-1; GTA[0]:=A[L]; STOREORD(F,GTA,J+K-1); END END; FUNCSIZE:=U:=U-2; U:=A[3]-U+L; FOR L:=L STEP 1 UNTIL U DO %GET LOCALS INTO THE LABEL TABLE BEGIN GTA[0]:=A[L]; IF K:=SEARCHORD(F,GTA,J,8) NEQ 0 THEN %NOT YET IN TABLE. BEGIN GTA[0]:=A[L]; GTA[1]:=0; STOREORD(F,GTA,J+K-1); FUNCSIZE:=FUNCSIZE+1 END; END; GTA[1]:=0&ENTIER(A[1])[CRETURN]&ENTIER(A[2])[CNUMBERARGS]; CURLINE:=INCREMENT:=1; DELTOG:=0; COMMENT GET THE "TYPE" OF THE FUNCTION LATER WHEN THERE IS A PLACE FOR IT. THE TYPE IS EITHER 1 (FUNCTION CALL), OR 0 (SUBROUTINE CALL); END; %-------------------------------------------------------- END ELSE % VARIABLES=0, MAKE UP A DIRECTORY BEGIN GT3:=0; GT2:=1; GO TO HEADERSTORE END ELSE % HEADER SYNTAX IS BAD GO TO ENDHANDLER; COMMENT WE MAKE IT TO HERE IF ALL IS WELL ABOVE; IF GT2 NEQ 0 THEN %NME NOT FOUND IN DIRECTORY; BEGIN TRANSFER(A,1,GTA,0,7); %GET FUNCTION NAME SETFIELD(GTA,7,1,FUNCTION); SETFIELD(GTA,FPTF,FFL,FUNCPOINTER); SETFIELD(GTA,FSQF,FFL,FUNCSEQ); IF VARIABLES=0 THEN VARIABLE:=NEXTUNIT; STOREORD(VARIABLES,GTA,GT3+GT2-1); VARSIZE:=VARSIZE+1; END; CURRENTMODE:=FUNCMODE; TRANSFER(GTA,0,PSR,FSTART?8,8); STOREPSR; IF SCAN THEN GO TO SHORTCUT; IF FALSE THEN FORGETITFELLA: ERRORMESS(ERR:=LABELERROR,TADD.[1:23],0); END ELSE % WE ARE IN FUNCTION DEFINITION MODE IF GT1:=MODE NEQ 0 THEN % A SPECIAL FUNCTION SUCH AS DISPLAY OR EDIT BEGIN L:=LOWER; IF GT1=DISPLAYING THEN LISTLINE(FPT,FSQ,L) ELSE IF GT1=EDITING THEN BEGIN INITBUFF(BUFFER,BUFFSIZE); MOVE(OLDBUFFER,BUFFSIZE,BUFFER); EDITMODE:=TRUE; ADDRESS:=ABSOLUTEADDRESS; EDITDRIVER(FP1,FSQ,L,L) ;IF NOT EDITMODE THEN BEGIN MODE:=0; ERR:=30 END; END ELSE IF GT1=RESEQUENCING THEN IF GT1:=L LEQ UPPER THEN BEGIN GT2:=CONTENTS(FPT,L,GTA); GT3:=GTA[0]:=LINENUMBER(CURLINE); DELETE1(FPT,L); STOREORD(FPT,GTA,L); CURLINE:=CURLINE+INCREMENT; GT2:=CONTENTS(FSQ,GTA[1],BUFFER); RESCANLINE; WHILE (IF ERR NEQ 0 THEN FALSE ELSE LABELSCAN(GTA,0)) FO IF GT1:=SEARCHORD(FPT,GTA,GT2,8)=0 THEN BEGIN GTA[1]:=GT3; DELETE1(FPT,GT2); STOREORD(FPT,GTA,GT2) END ELSE ERR:=16 END ELSE MODE:=0; LOWER:=L+1; IF LOWER GTR UPPER THEN BEGIN IF MODE=DISPLAYING THEN FORMWD(3,"1 "); 092314?? P87 MODE:=0; END; O TO ENDHANDLER END; END ; % OF BLOCK STARTED EON LINE 9225115 ////////////////// IF ERR=0 AND EOB=0 THEN SHORTCUT: BEGIN LABEL RGTBRACK,DELOPTION; %////////////////////////// IF DEDLV THEN FINISHUP ELSE IF LFTBRACKET THEN BEGIN IF SCAN THEN IF DOUND(FPT) THEN BEGIN L:=ACCUM[0]; IF SCAN THEN IF QUDV OR EDITMWODE:=(QUOTEQUAD) THEN IF SCAN THEN IF BOUND(FPT) THEN BEGIN U:=ACCUM[0]; RGTBRACK: IF SCAN AND RGTBRACKET THEN IF(IF EDITMODE THEN FALSE ELSE SCAN) THEN IF DELV THEN BEGIN ERR:=DISPLAY(L,U,FPT,FSQ); DELTOG:=1; END ELSEERR:=1; ELSE ERR:=DISPLAY(L,U,FPT,FSQ) ELSE ERR:=2 END ELSE IF RGTBRACKT THEN IF(IF EDITMODE THEN FALSE ELSE SCAN) THEN IF DELV THEN BEGIN ERR:=DISPLAY(L,L,FPT,FSQ); DELTOG:=1; END ELSE ERR:=3 ELSE ERR:=DISPLAY(L,L,FPT,FSQ) ELSE ERR:=4 ELSE ERR:=5 ELSE IF RGTBRACKET THEN BEGIN TADD:=ADDRESS; IF SCAN THEN IF IDENT AND ACCUM[0]="ADELETE" THEN IF SCAN THEN IF LFTBRACKET THEN DELOPTION: IF SCAN AND BOUND(FPT) THEN BEGIN U:=ACCUM[0]; IF SCAN AND RGTBRACKET THEN IF SCAN THEN IF DELV THEN BEGIN ERR:=DELETE(L,U,FPT,FSQ); FINISHUP END ELSE ERR:=6 ELSE ERR:=DELETE(L,U.FPT,FSQ) ELSE ERR:=7 END ELSE ERR:=8 ELSE IF DELV THEN BEGIN ERR:=DELETE(L,L,FPT,FSQ); FINSIHUP END ELSE ERR:=9 ELSE ERR:=DELETE(L,L,FPT,FSQ) ELSE IF LFTBRACKET TEHN GO TO DESLOPTION ELSE BEGIN CHECKSEQ(SEQ,L,INC); CLEANBUFFER(BUFFER,BUFFSIZE,TADD); ADDRESS:=ABSADDR(BUFFER); ITEMCOUNT:=0; IF SCAN THEN GO TO SHORTCUT END ELSE ERR:=DELETE(L,L,FPT,FSQ) END ELSE ERR:=10 ELSE ERR:=11 09310000 P88 END ELSE IF QUADV OR EDITMODE:=(QUOTEQUAD) THEN BEGIN L:=0; U:=9999.9999; GO TO RGTBRACK END ELSE IF IOTA THEN IF SCAN AND RGTBRACKET AND FPT NEQ 0 THEN BEGIN IF SCAN THEN IF DELV THEN DELTOG:=1; ELSE ERR:=15; IF ERR == 0 THEN BEGIN MODE:=RFSEQUENCING; CURLINE:=INCREMENT:=1; SETFIELD(GTA,0,8,0); GT1:=SEARCHORD(FPT,GTA,GT2,8); LOWER:=GTT2+1; UPPER:=FUNCSIZE-1; END END ELSE ERR:=14; ELSE ERR:=12 ELSE ERR:=13 END ELSE IF CURLINE=0 THEN %CHANGING HEADER ERR:=26 ELSE IF ERR:=OLDLABCONFLICT(FPT,LINENUMBER(SEQ))=0 THEN BEGIN IF NOSYNTAX=0 THEN PROCESS(XEQUTE); IF ERR:=STOREAWAY(FPT,FSQ,BUFFER,SEQ)=0 THEN SEQ:=SEQ+INC; END; IF ERR NEQ 0 TEHN BEGIN FORMWD(2,"5ERROR "); EOD:=1; FORMROW(1,1,ACCUM,2,ACCUM[0].[1:11]); END; END; %OF BLOCK STARTED ON LINE 9238000 ////////////////////// ENDHANDLER: IF BOOLEAN(SUSPENSION) THEN BEGIN FILL ACCUM[*] WITH "ABORT SU", "SP. FNS."; FORMROW(3,0,ACCUM,0,16); INDENT(0); TERPRINT; END ELSE IF MODE=0 THEN BEGIN IF BOOLEAN(DELTOG) THEN FINISHUP; INDENT(-CURLINE); TERPRINT; END; END; EXPOVR:=FAULTL; INTOVR:=FAULTL; INDEXF:=FAULTL; FLAG:=FAULTL; ZERO:=FAULTL; INITIALIZETABLE; TRYAGAIN: IF FALSE THEN %ENTERS WITH A FAULT. FAULTL: BEGIN SPOUT(09334300); %SEND MESSAGE TO SPO BEGIN CSTATION.APLOGGED:=0; CSTATION.APLHEADING:=0 END END; APLMONITOR; ENDOFJOB: FINIS: WRAPUP; END. END;END. LAST CARD ON OCRDING TAPE TOTAL LOGIICAL RECORDS= 7273 END OF JOB.