diff --git a/source/APL/IMAGE.alg_m b/source/APL/IMAGE.alg_m new file mode 100644 index 0000000..a373732 --- /dev/null +++ b/source/APL/IMAGE.alg_m @@ -0,0 +1,893 @@ + 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.