mirror of
https://github.com/retro-software/B5500-software.git
synced 2026-01-19 17:17:48 +00:00
5487 lines
395 KiB
Plaintext
5487 lines
395 KiB
Plaintext
BEGIN 00000490P01
|
|
% THIS APL/B5500 PROGRAM WAS DEVELOPED BY THE COMPUTER SCIENCE GROUP
|
|
% AT THE UNIVERSITY OF WASHINGTON UNDER THE SPONSORSHIP OF PROFESSOR
|
|
% HELLMUT GOLDE. THE PROGRAM MAY BE NOT BE OFFERED FOR SALE OR LEASE
|
|
% IN ITS ORIGINAL OR ANY MODIFIED FORM. ANY PUBLICATION RELATING TO
|
|
% THIS PROGRAM OR ANY MODIFICATION OF THE PROGRAM MUST EXPLICITLY CREDIT
|
|
% THE COMPUTER SCIENCE GROUP OF THE UNIVERSITY OF WASHINGTON AND THE
|
|
% PRINCIPAL IMPLEMENTORS, GARY KILDALL, LEROY SMITH, SALLY SWEDINE,
|
|
% AND MARY ZOSEL. COMPUTER RESOURCES FOR THE DEVELOPMENT OF THE
|
|
% PROGRAM WERE MADE AVAILABLE BY THE UNIVERSITY OF WASHINGTON COMPUTER
|
|
% CENTER.
|
|
DEFINE VERSIONDATE="1-11-71"# ;
|
|
%MODIFICATIONS FOR B-5500 TIME-SHARING MCP MADE BY:
|
|
% JOSE HERNANDEZ, BURROUGHS CORPORATION.
|
|
BOOLEAN BREAKFLAG;
|
|
ARRAY GIA[0:1];
|
|
LABEL FINIS; %GO THERE WHEN YOU ARE IN TROUBLE (SPOUT A MESSAGE)
|
|
BOOLEAN PROCEDURE LIBRARIAN(A,B); VALUE A,B: REAL A,B; FORWARD;
|
|
LABEL FAULTL; % FAULT LABEL
|
|
MONITOR EXPOVR,INTOVR,INDEX:=INDEXF,FLAG,ZERO;
|
|
REAL BIGGEST, NULLV;
|
|
INTEGER STACKSIZE,LIBSIZE;
|
|
REAL STATUSWORD,CORELOC;
|
|
BOOLEAN RETURN;
|
|
BOOLEAN MEMBUG,DEBUG;
|
|
COMMENT MEMBUG SWITCHES ----------------------
|
|
BIT FUNCTION BIT FUNCTION
|
|
-----------------------------------------------------------------
|
|
1 25
|
|
2 26
|
|
3 27
|
|
4 28
|
|
5 DUMP TYPES @ INSERT 30
|
|
6 DUMP TYPES @ DELETE 30
|
|
7 31
|
|
8 32
|
|
9 33
|
|
10 34
|
|
11 35
|
|
12 36
|
|
13 37
|
|
14 38
|
|
15 39
|
|
16 40
|
|
17 41
|
|
18 42
|
|
19 43
|
|
20 DUMP INDEX 44
|
|
21 45
|
|
22 DUMP TYPES 46
|
|
23 CHECK TYPES 47
|
|
24 DUMP BUFFER #S
|
|
;
|
|
FILE PRINT 4 "SYSTEMS" " BOX " (1,15);
|
|
FILE TWXIN 19(2,30),TWXOUT 19(2,10);
|
|
%
|
|
DEFINE
|
|
PAGESIZE=120#,
|
|
AREASIZE=40#,
|
|
CF=[26:13]#, COMMENT COUNT FIELD -- NUMBER OF ITEMS ON PAGE;
|
|
TF=[39:9] #, COMMENT T-FIELD (TYPE FIELD);
|
|
FF=[9:1]#, COMMENT FULL FIELD FOR SEQUENTIAL STORAGE;
|
|
AF=[1:23] #, COMMENT A-FIELD;
|
|
BF=[24:23]#, COMMENT B-FIELD;
|
|
MF=[1:1]#, COMMENT METHOD OF STORAGE FIELD;
|
|
SF=[13:13]#, COMMENT SEQUENTIAL STORAGE SIZE FIELD (#CHRS);
|
|
BOOL=[47:1]#,
|
|
SKIP=1#, COMMENT --AMOUNT OF SPACE RESERVED AT THE
|
|
START OF EACH PAGE;
|
|
ALLOWANCE=10#, COMMENT --DEVIATION FROM THE AVERAGE PAGE SIZE
|
|
ALLOWED BEFORE CORRECTION; 00001550P02
|
|
RECSIZE=2#,
|
|
MAXPAGES=20#,
|
|
PAGESPACE=20#,
|
|
NEXTP=[42:6]#,
|
|
LASTP=[36:6]#,
|
|
PAGEF=[19:11]#,
|
|
BUFF=[12:6]#,
|
|
CHANGEDBIT=[1:1]#,
|
|
MBUFF=8#,
|
|
SBUFF=4#,
|
|
FLAGB=[18:1]#, COMMENT FLAG BIT FOR BUFFER MAINTENANCE;
|
|
EXTRAROOM=1#,
|
|
LIBJOB="/APLIBE"#,%MFID FOR APL SYSTEM FILE
|
|
ENDOFDEFINES=#;
|
|
REAL PROCEDURE CDR(X); VALUE X; REAL X; CDR:=X.NEXTP;
|
|
PROCEDURE RPLACD(X,Y); VALUE Y;REAL X,Y; X.NEXTP:=Y;
|
|
BOOLEAN PROCEDURE NULL(X); VALUE X; REAL X; NULL:=X.NEXTP=0;
|
|
BOOLEAN STREAM PROCEDURE EOFMARK(SK,RS,A); VALUE SK,RS;
|
|
BEGIN LABEL NO; SI:=A; SK(SI:=SI+8);
|
|
RS(8( 2(IF SB THEN JUMP OUT 3 TO NO; SKIP SB);
|
|
3(IF SB THEN SKIP SB ELSE JUMP OUT 3 TO NO); IF SB THEN
|
|
JUMP OUT 2 TO NO; SKIP SB));TALLY:=1;EOFMARK:=TALLY;
|
|
NO:
|
|
END;
|
|
STREAM PROCEDURE MARKEOF(SK,RS,A); VALUE SK,RS;
|
|
BEGIN DI:=A;
|
|
SK(DI:=DI+8);
|
|
RS(8(DS:=2RESET; DS:=3SET; DS:=RESET));
|
|
END;
|
|
SAVE FILE ESTABLISH DISK [MAXPAGES:AREASIZE]
|
|
(1,PAGESIZE,SAVE 100);
|
|
FILE NEWDISK DISK (1,PAGESIZE);
|
|
FILE DISK1 DISK (1,PAGESIZE),
|
|
DISK2 DISK (1,PAGESIZE),
|
|
DISK3 DISK (1,PAGESIZE),
|
|
DISK4 DISK (1,PAGESIZE),
|
|
DISK5 DISK (1,PAGESIZE),
|
|
DISK6 DISK (1,PAGESIZE),
|
|
DISK7 DISK (1,PAGESIZE),
|
|
DISK8 DISK (1,PAGESIZE);
|
|
SWITCH FILE POINTERS:=DISK1,DISK1,DISK2,DISK3,DISK4,DISK5,DISK6,DISK7,
|
|
DISK8;
|
|
PROCEDURE SETPOINTERNAMES;
|
|
BEGIN
|
|
IF NOT LIBRARIAN(LIBJOB,TIME(-1)) THEN
|
|
BEGIN
|
|
WRITE(ESTABLISH);
|
|
MARKEOF(SKIP,RECSIZE,ESTABLISH(0));
|
|
WRITE(ESTABLISH[1]);
|
|
WRITE(ESTABLISH[MAXPAGES|AREASIZE-1]);
|
|
LOCK(ESTABLISH);
|
|
CLOSE(ESTABLISH)
|
|
;LIBSIZE~-1;
|
|
END
|
|
END;
|
|
DEFINE
|
|
LIBMAINTENANCE=0#,
|
|
MESSDUM=#;
|
|
PROCEDURE MEMORY(MODE,TYPE,A,N,M);VALUE MODE,TYPE;
|
|
INTEGER MODE,TYPE,N,M; ARRAY A[0]; FORWARD;
|
|
STREAM PROCEDURE MOVE(A,N,B); VALUE N;
|
|
BEGIN SI:=A; DI:=B; DS:=N WDS;
|
|
END;
|
|
PROCEDURE MESSAGE(I); VALUE I; INTEGER I;
|
|
BEGIN
|
|
FORMAT F("MEMORY ERROR",I5);
|
|
COMMENT CHANGE LINE 3050 TO WRITE(PRINT,SF[I]) FOR MEMORY ERROR PROBS.
|
|
THIS FORMAT IS NOW EXCLUDED SINCE MEMORY IS SEEMINGLY WELL DEBUGED
|
|
SWITCH FORMAT SF:=
|
|
("LIBRARY MAINTENANCE IN PROGRESS."),
|
|
("SYSTEM ERROR--MEMORY ACCESS WITH EXPRESSION FOR N OR M."),
|
|
("SYSTEM ERROR--IMPROPER ARGUMENTS TO FREEPAGE."),
|
|
("SYSTEM ERROR--TOO LARGE A SUBSCRIPT FOR TYPE SPECIFIED."),
|
|
("SYSTEM ERROR--TYPE CANNOT BE ZERO WHEN INSERTING OR DELETING."),
|
|
("SYSTEM ERROR--CHARACTER STTRING TOO LONG TO STORE."),
|
|
("SYSTEM ERROR--ATTEMPT TO INSERT NON-SEQUENTIAL ELEMENT",
|
|
"IN TYPE A STORAGE."),
|
|
("SYSTEM ERROR--NO BLANKS IN PAGES."),
|
|
("SYSTEM ERROR--ATTEMPTED BINARY SEARCH OF UNORDERED DATA."),
|
|
("SYSTEM ERROR--BINARY SEARCH OF UNALLOCATED DATA ATTEMPTED."),
|
|
("SYSTEM ERROR--BINARY SEARCH FOUND A BLANK PAGE."),
|
|
("SYSTEM ERROR--DELETION OF TYPE B STORAGE NOT IMPLEMENTED."),
|
|
("SYSTEM ERROR--ATTEMPT TO DELETE FROM NON-EXISTENT STORAGE."), 00002970P03
|
|
("SYSTEM ERROR--ATTEMPT TO DELETE RECORD FROM OUTSIDE",
|
|
" ALLOCATED STORAGE."),
|
|
("SYSTEM ERROR--ATTEMPTED MEMORY SEARCH WITH -N- TOO LARGE."),
|
|
("SYSTEM ERROR--ATTEMPT TO CHANGE PREVIOUSLY DESIGNATED STORAGE",
|
|
" KIND"),
|
|
("SYSTEM ERROR--POINTERS TO DATA TYPES OVERLAP."),
|
|
(" ");
|
|
WRITE(PRINT,F,I);
|
|
IF I GTR 0 THEN
|
|
BEGIN
|
|
INTEGER GT1,GT2,GT3;
|
|
MEMORY(10,GT1,GIA,GT2,GT3);
|
|
GO TO FINIS;
|
|
END;
|
|
END;
|
|
PROCEDURE MEMORY(MODE,TYPE,A,N,M); VALUE MODE,TYPE;
|
|
INTEGER MODE,TYPE,N,M; ARRAY A[0];
|
|
BEGIN
|
|
DEFINE T64= DI:=LOC T; DI:=DI+1; DS:=7 CHR#;
|
|
STREAM PROCEDURE WRITERECS(PAGE,A,SKP,NB,NR,NS,RL);
|
|
VALUE SKP,NB,NR,NS,RL;
|
|
BEGIN
|
|
COMMENT -- NS IS THE NUMBER OF WORDS TO SAVE (ON THE
|
|
TAIL OF THE PAGE);
|
|
LOCAL T,T1,T2,TT;
|
|
COMMENT -- MOVE TO POSITION FOR WRITE;
|
|
SI:=LOC NB; T64; SI:=PAGE; SKP(SI:=SI+8);
|
|
T(2(32(RL(SI:=SI+8)))); NB(RL(SI:=SI+8));
|
|
T1:=SI; COMMENT -- RECORDS WILL BE WRITTEN HERE;
|
|
DI:=LOC TT; SI:=LOC NS; DI:=DI+1; DS:=7CHR;
|
|
SI:=T1; COMMENT MOVE TO THE END OF THE FIELD TO BE SAVED;
|
|
TT(2(32(RL(SI:=SI+8)))); NS(RL(SI:=SI+8));
|
|
T2:=SI; COMMENT -- END OF FIELD TO BE SAVED;
|
|
SI:=LOC NR; T64; DI:=T2;
|
|
T(2(32(RL(DI:=DI+8)))); NR(RL(DI:=DI+8));
|
|
SI:=T2; SI:=SI-8; DI:=DI-8;
|
|
TT(2(32(RL(DS:=WDS; SI:=SI-16); DI:=DI-16))));
|
|
NS(RL(DS:=WDS; SI:=SI-16; DI:=DI-16));
|
|
COMMENT -- HAVE ACCOMPLISHED THE "SAVE", NOW DO THE WRITE;
|
|
SI:=A; DI:=T1;
|
|
T(2(32(DS:=RL WDS))); NR(DS:=RL WDS)
|
|
END;
|
|
STREAM PROCEDURE READRECS(PAGE,A,SKP,NB,NR,NM,RL);
|
|
VALUE SKP,NB,NR,NM,RL;
|
|
BEGIN
|
|
COMMENT
|
|
SKP = "SKIP" - - THE NUMBER OF WORDS TO JUMP OVER
|
|
NB = "NUMBER BEFORE" -- " " RECORDS TO SKIP BEFORE
|
|
READING THE RECORD,
|
|
NR = "NUMBER OF RECORDS" " " " " READ FROM THE
|
|
BUFFER,
|
|
NM ="NUMBER TO MOVE" - - " " " " MOVE OVER TO
|
|
THE PREVIOUSLY READ AREA,
|
|
RL ="RECORD LENGTH" - - THE LENGTH OF EACH ITEM
|
|
;
|
|
LOCAL T,T1,T2;
|
|
SI:=LOC NB; T64; SI:=PAGE; SKP(SI:=SI+8);
|
|
T(2(32(RL(SI:=SI+8)))); NB(RL(SI:=SI+8));
|
|
T1:=SI;
|
|
COMMENT - - T1 NOW HAS THE STARTING POSITION FOR THE READ;
|
|
SI:=LOC NR; T64; SI:=T1; DI:=A;
|
|
T(2(32(DS:=RL WDS))); NR(DS:=RL WDS);
|
|
T2:=SI; COMMENT T2 CONTAINS THE END OF THE READ;
|
|
SI:=LOC NM; T64; SI:=T2; DI:=T1;
|
|
T(2(32(DS:=RL WDS))); NM(DS:=RL WDS)
|
|
END READRECS;
|
|
DEFINE MOVEALOG=
|
|
DI:=LOC C; DI:=DI+6; DS:=2CHR; DI:=LOC Z;
|
|
TSI:=SI; TALLY:=TALLY+1;
|
|
IF TOGGLE THEN
|
|
BEGIN SI:=LOC C; SI:=SI+6;
|
|
IF 2 SC NEQ DC THEN
|
|
BEGIN TAL:=TALLY; SI:=LOC TAL; SI:=SI+7;
|
|
IF SC="0" THEN
|
|
BEGIN TALLY:=TMP; TALLY:=TALLY+1; TMP:=TALLY;
|
|
TALLY:=0;
|
|
END ELSE
|
|
BEGIN SI:=LOC Z; IF SC LEQ"9" THEN ;
|
|
END
|
|
END ELSE
|
|
BEGIN DI:=TDI; SI:=LOC SIZE; SI:=SI+6; DS:=2CHR;
|
|
TDI:=DI; SI:=SI-2; DI:=LOC C64; DI:=DI+7 ; DS:=CHR; 00003750P04
|
|
SI:=NEW; DI:=TDI; C64(2(DS:=32CHR)); DS:=SIZE CHR;
|
|
TDI:=DI; SI:=TSI; DI:=LOC C; DI:=DI+6;
|
|
DS:=2CHR; TSI:=SI;
|
|
TALLY:=TAL;CHRSTORE:=TALLY; SI:=LOC TMP; SI:=SI+7;
|
|
DI:=LOC CHRSTORE; DI:=DI+6; DS:=CHR END
|
|
END;
|
|
SI:=LOC C; DI:=LOC C64; DI:=DI+1; DS:=7CHR; DI:=TDI; SI:=SI-1;
|
|
DS:=2CHR; SI:=TSI;
|
|
C64(2(DS:=32CHR)); DS:=C CHR; TDI:=DI; TSI:=SI#;
|
|
INTEGER STREAM PROCEDURE CHRSTORE(A,SKP,B,NEW,NB,SIZE,NA,MODE,
|
|
PAGESIZE); VALUE SKP,NB,SIZE,NA,MODE,PAGESIZE;
|
|
BEGIN LOCAL T,C,TSI,TDI,
|
|
Z,C64,TMP,TAL;
|
|
LABEL DONE;
|
|
SI:=LOC NB; T64;
|
|
SI:=LOC MODE; SI:=SI+7;
|
|
IF SC="0" THEN ; COMMENT SET TOGGLE;
|
|
SI:=A; DI:=B; SKP(DS:=8CHR);
|
|
TSI:=SI; TDI:=DI;
|
|
T(2(32(MOVEALONG))); NB(MOVEALONG);
|
|
COMMENT NOW HAVE MOVED UP TO NB;
|
|
IF TOGGLE THEN
|
|
BEGIN TALLY:=TAL; CHRSTORE:=TALLY; SI:=LOC TMP; SI:=SI+7;
|
|
DI:=LOC CHRSTORE; DI:=DI+6; DS:=CHR;
|
|
SI:=LOC SIZE; SI:=SI+6; DI:=TDI; DS:=2CHR; TDI:=DI;
|
|
SI:=LOC SIZE; DI:=LOC C64; DI:=DI+1; DS:=7CHR; SI:=NEW;
|
|
DI:=TDI; C64(2(DS:=32CHR)); DS:=SIZE CHR;
|
|
END ELSE
|
|
BEGIN TSI:=SI; TDI:=DI;
|
|
SI:=LOC MODE; SI:=SI+7;
|
|
IF SC="1" THEN
|
|
COMMENT REMOVE AN ENTRY HERE;
|
|
BEGIN DI:=LOC C; DI:=DI+6; SI:=TSI; DS:=2CHR;
|
|
TSI:=SI; DI:=LOC C64; DI:=DI+1; SI:=LOC C;
|
|
DS:=7CHR; SI:=TSI; C64(2(SI:=SI+32)); SI:=SI+C;
|
|
TSI:=SI; DI:=LOC CHRSTORE; SI:=LOC C; DS:=WDS;
|
|
DI:=TDI; DS:=2LIT"0"; TDI:=DI;
|
|
END ELSE
|
|
IF SC="2" THEN
|
|
COMMENT READ OUT AND ENTRY
|
|
BEGIN DI:=LOC C; DI:=DI+6; SI:=TSI; DS:=2CHR;
|
|
TSI:=SI; DI:=LOC C64; DI:=DI+1; SI:=LOC C;
|
|
DS:=7CHR; SI:=TSI; DI:=NEW;
|
|
C64(2(DS:=32CHR)); DS:=C CHR;
|
|
SI:=LOC C; DI:=LOC CHRSTORE; DS:=WDS; GO DONE END;
|
|
SI:=LOC NA; T64; SI:=TSI; DI:=TDI;
|
|
T(2(32(TDI:=DI; DI:=LOC C; DI:=DI+6; DS:=2CHR;
|
|
TSI:=SI; SI:=LOC C; DI:=LOC C64; DI:=DI+1; DS:=7CHR;
|
|
SI:=SI-1;DT:=TDI;DS:=2CHR;SI:=TSI;C64(2(DS:=32CHR));DS:=C CHR)));
|
|
NA( TDI:=DI; DI:=LOC C; DI:=DI+6; DS:=2CHR; TSI:=SI;
|
|
SI:=LOC C;DI:=LOC C64;DI:=DI+1;DS:=7CHR;SI:=SI-1;
|
|
DI:=TDI;DS:=2CHR;SI:=TSI;C64(2(DS:=32CHR));DS:=C CHR);
|
|
END;
|
|
SI:=LOC PAGESIZE; T64; SI:=B; DI:=A;
|
|
%CARD LIST UNSAFE
|
|
COMMENT $CARD LIST UNSAFE;
|
|
T(2(DS:=32WDS)); DS:=PAGESIZE WDS;
|
|
%CARD LIST SAFE
|
|
COMMENT $CARD LIST SAFE;
|
|
DONE:
|
|
END;
|
|
STREAM PROCEDURE SETNTH(P,K,N); VALUE K,N;
|
|
BEGIN DI:=P; SI:=LOC K; N(DI:=DI+8); DS:=WDS END;
|
|
BOOLEAN STREAM PROCEDURE LESS(A,AN,B,BN,K); VALUE K,AN,BN;
|
|
BEGIN
|
|
SI:=A; DI:=B; SI:=SI+AN; DI:=DI+BN;
|
|
IF K SC LSS DC THEN TALLY:=1;
|
|
LESS:=TALLY;
|
|
END;
|
|
REAL STREAM PROCEDURE ADDD(A,B); VALUE A,B;
|
|
BEGIN SI:=LOC A; DI:=LOC B; DS:=8ADD; SI:=LOC B;
|
|
DI:=LOC ADDD; DS:=WDS
|
|
END;
|
|
INTEGER PROCEDURE FREEPAGE(INDEX,TYPEZERO,START,FINISH);
|
|
VALUE TYPEZERO,START,FINISH; INTEGER TYPEZERO,START,FINISH;
|
|
ARRAY INDEX[0,0];
|
|
IF START GTR FINISH THEN MESSAGE(2) ELSE
|
|
BEGIN ARRAY T[0:RECSIZE+EXTRAROOM+SKIP-1],P[0:FINISH-START];
|
|
INTEGER T,J,K,R;
|
|
R:=RECSIZE+EXTRAROOM+SKIP;
|
|
J:=START-(FINISH+1);
|
|
FOR I:=FINISH STEP -1 UNTIL TYPEZERO DO
|
|
IF K:=(I+J) LESS TYPEZERO THEN 00004690P05
|
|
BEGIN T[R-1]:=P[TYPEZERO-K-1];
|
|
MOVE(T,R,INDEX[I,0])
|
|
END ELSE
|
|
BEGIN IF I GEQ START THEN P[FINISH-I]:=INDEX[I,R-1];
|
|
MOVE(INDEX[K,0],R,INDEX[I,0]);
|
|
END;
|
|
FREEPAGE:=TYPEZERO-J;
|
|
END;
|
|
INTEGER PROCEDURE SEARCH(A,B,N,MIN,MAX,NP); VALUE N,MIN,MAX;
|
|
INTEGER N,MIN,MAX,NP;
|
|
ARRAY A[0,0]; REAL B;
|
|
BEGIN
|
|
INTEGER I,T;
|
|
FOR I:=MIN STEP 1 WHILE T:=T+A[I,0].CF LEQ B AND I LESS MAX-1 DO;
|
|
IF T LSS B THEN
|
|
BEGIN MESSAGE(3); SEARCHL:=NP:=0;
|
|
END ELSE
|
|
BEGIN SEARCHL:=I; NP:=B-T+A[I,0].CF
|
|
END
|
|
END;
|
|
PROCEDURE SORT(A,P,N,C); VALUE P,N,C; INTEGER P,N,C;
|
|
ARRAY A[0,0];
|
|
BEGIN INTEGER R;
|
|
BEGIN
|
|
ARRAY T[0:R:=RECSIZE+EXTRAROOM+SKIP-1];
|
|
LABEL ENDJ;
|
|
INTEGER I,J,L,K,M,SK; R:=R+1;
|
|
SK:=SKIP TIMES 8;
|
|
K:=N-P+1; I:=1; DO UNTIL (I:=I TIMES 2) GTR K;
|
|
M:=I-1;
|
|
WHILE (M:=M DIV 2) NEQ 0 DO
|
|
BEGIN K:=N-M; J:=P;
|
|
DO BEGIN
|
|
L:=(I:=J)+M;
|
|
DO BEGIN
|
|
IF A[L,0].TF GTR A[I,0].TF THEN GO ENDJ;
|
|
IF A[L,0].TF EQL A[I,0].TF THEN
|
|
IF NOT(LESS(A[L,0],SK,A[I,0],SK,C)) THEN
|
|
GO ENDJ;
|
|
MOVE(A[L,0],R,T); MOVE(A[I,0],R,A[L,0]);
|
|
MOVE(T,R,A[I,0])
|
|
END UNTIL (I:=(L:=I)-M) LSS P;
|
|
ENDJ:
|
|
END UNTIL (J:=J+1) GTR K;
|
|
END
|
|
END
|
|
END SORT;
|
|
COMMENT - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
MODE MEANING
|
|
---- -------
|
|
1 = INTERROGATE TYPE
|
|
2 = INSERT RECORD REL ADDRS N
|
|
(RELATIVE TO START OF LAST PAGE)
|
|
3 = RETURN THE NUMBER OF RECORDS (M)
|
|
4 = " ITEM AT RECORD # N
|
|
5 = INSERT " " " " "
|
|
6 = DELETE " " " " "
|
|
7 = SEARCH FOR THE RECORD -A-
|
|
8 = FILE OVERFLOW, INCREASE BY N
|
|
9 = FILE MAINTENANCE
|
|
10 = EMERGENCY FILE MAINTENANCE
|
|
11 SET STORAGE KIND
|
|
12= ALTER STORAGE ALLOCATION RESOURCES
|
|
13= RELEASE "TYPE" STORAGE TO SYSTEM
|
|
14= CLOSE ALL PAGES FOR AREA TRANSITION
|
|
NOTE THAT WHEN SEQUENTIAL STORAGE MAINTENANCE IS DONE, N
|
|
WILL ALWAYS INDICATE THE ADDRESS OF THE STRING RELATIVE TO
|
|
THE TYPE SPECIFIED, AND M WILL ALWAYS BE THE LENGTH OF THE
|
|
STRING IN -A- (EITHER AS INPUT OR OUTPUT)
|
|
;
|
|
PROCEDURE UPDATE(T,L,U,D); VALUE L,U,D; INTEGER L,U,D;
|
|
ARRAY T[0];
|
|
BEGIN INTEGER I,J,K;
|
|
FOR I:=L STEP 1 UNTIL U DO
|
|
BEGIN J:=T[I].AF+D; T[I].AF:=J;
|
|
J:=T[I].BF+D; T[I].BF:=J
|
|
END
|
|
END;
|
|
OWN INTEGER CURPAGE,NPAGES,NTYPES,P,PS,U,L;
|
|
OWN INTEGER FIRST,AVAIL,MAXBUFF,CURBUFF;
|
|
REAL GT1;
|
|
LABEL MOREPAGES;
|
|
COMMENT 00005615P06
|
|
IF MEMBUG.[21:1] THEN DUMPMEMORY(MODE,TYPE,N,M);
|
|
IF MODE=8 THEN NPAGES:=NPAGES+N;
|
|
MOREPAGES:
|
|
BEGIN
|
|
OWN BOOLEAN POINTERSET, TYPESET;
|
|
INTEGER I, T, NR;
|
|
OWN ARRAY BUF[0:MBUFF], TYPS[0:511];
|
|
OWN ARRAY INDX[0:NPAGES,0:RECSIZE+EXTRAROOM+SKIP-1];
|
|
PROCEDURE SETTYPES;
|
|
BEGIN INTEGER I, T;
|
|
FOR I := 0 STEP 1 UNTIL NPAGES DO
|
|
IF INDX[I,0].TF NEQ T THEN
|
|
BEGIN
|
|
TYPS[T].BF := I; TYPS[T:=INDX[I,0].TF].AF := I;
|
|
TYPS[T].BOOL := INDX[I,0].MF;
|
|
END;
|
|
TYPS[T].BF := I;
|
|
END SETTYPES;
|
|
REAL PROCEDURE BUFFNUMBER(I); VALUE I; INTEGER I;
|
|
BEGIN INTEGER K,L,M;
|
|
LABEL D;
|
|
DEFINE B=BUF#;
|
|
IF( IF K:=INDX[I,P].BUFF=0 THEN TRUE ELSE BUF[K].PAGEF
|
|
NEQ INDX[I,P].PAGEF+1) THEN
|
|
BEGIN IF NULL(K:=CDR(AVAIL)) THEN
|
|
BEGIN K:=CDR(FIRST);
|
|
WHILE M:=CDR(B[K]) NEQ 0 DO
|
|
BEGIN L:=K; K:=M; END;
|
|
RPLACD(B[L],0);
|
|
IF BOOLEAN(B[K].CHANGEDBIT) THEN
|
|
WRITE(POINTERS[K][B[K].PAGEF-1]);
|
|
B[K].CHANGEDBIT:=0;
|
|
END ELSE RPLACD(AVAIL,CDR(B[K]));
|
|
B[K].PAGEF:=INDX[I,P].PAGEF+1;
|
|
INDX[I,P].BUFF:=K;
|
|
READ(POINTERS[K][INDX[I,P].PAGEF]);
|
|
END ELSE
|
|
IF CDR(FIRST)=K THEN GO TO D ELSE
|
|
BEGIN L:=CDR(FIRST);
|
|
WHILE M:=CDR(B[L]) NEQ K DO L:=M;
|
|
RPLACD(B[L],CDR(B[M]));
|
|
END;
|
|
RPLACD(B[K],CDR(FIRST)); RPLACD(FIRST,K);
|
|
B: BUFFNUMBER:=K
|
|
END;
|
|
PROCEDURE MARK(I); VALUE I; INTEGER I;
|
|
BUF[INDX[I,P].BUFF].CHANGEDBIT:=1;
|
|
BOOLEAN PROCEDURE WRITEBUFFER;
|
|
BEGIN INTEGER I;
|
|
I:=CDR(FIRST);
|
|
WHILE NOT NULL(I) DO
|
|
IF BOOLEAN(BUF[I].CHANGEDBIT) THEN
|
|
BEGIN WRITEBUFFER:=TRUE;
|
|
BUF[I].CHANGEDBIT:=0;
|
|
WRITE(POINTERS[I][BUF[I].PAGEF-1]);
|
|
RPLACD(I,0);
|
|
END ELSE I:=CDR(BUF[I]);
|
|
END;
|
|
IF NOT POINTERSET THEN
|
|
BEGIN LABEL EOF;
|
|
READ(POINTERS[1][NPAGES])[EOF];
|
|
IF EOFMARK(SKIP,RECSIZE,POINTERS[1](0))THEN GO TO EOF;
|
|
MOVE(POINTERS[1](0),1,T);
|
|
COMMENT -- USE T TO DETERMIN THE VARIABLE REC SIZE LATER;
|
|
MOVE(POINTERS[1](0),RECSIZE+SKIP,INDX[NPAGES,0]);
|
|
INDX[NPAGES,RECSIZE+1].PAGEF:=NPAGES;
|
|
NPAGES:=NPAGES+1;
|
|
GO TO MOREPAGES;
|
|
COMMENT - - INITIALIZE VARIABLES;
|
|
EOF: POINTERSET:=TRUE;
|
|
U:=PAGESIZE-SKIP-PAGESPACE;
|
|
L:=(U-ALLOWANCE)/RECSIZE;
|
|
U:=(U+ALLOWANCE+RECSIZE/2)/RECSIZE;
|
|
PS:=(U+L)/2;
|
|
CURPAGE:=NPAGES:=NPAGES-1;
|
|
CURBUFF:=1;
|
|
P:=RECSIZE+SKIP;
|
|
FOR T:=1 STEP 1 UNTIL SBUFF DO RPLACD(BUF[T],T+1);
|
|
RPLACD(BUF[SBUFF],0); RPLACD(AVAIL,1);
|
|
MAXBUFF:=SBUFF;
|
|
T:=0;
|
|
SORT(INDX,0,NPAGES,RECSIZE TIMES 8);
|
|
FOR I:=0 STEP 1 UNTIL NPAGES DO 00006370P07
|
|
IF INDX[I,0].TF GTR T THEN T:=INDX[I,0].TF;
|
|
NTYPES:=T;
|
|
END;
|
|
IF TYPE GTR NTYPES THEN NTYPES:=TYPE;
|
|
IF NOT TYPESET THEN
|
|
BEGIN TYPESET:=TRUE; SETTYPES;
|
|
COMMENT
|
|
IF MEMBUG THEN DUMPINDEX(TYPS,NTYPES,INDX,RECSIZE,
|
|
P);
|
|
END;
|
|
COMMENT --- DECIDE WHETHER TO SAVE CURRENT PAGE BEFORE GOING ON;
|
|
IF MODE=2 THEN
|
|
BEGIN MODE:=5; NR:=N
|
|
END ELSE
|
|
IF MODE GEQ 4 THEN %MAY BE FILE MAINTENANCE
|
|
IF MODE GEQ 8 THEN %IS FILE MAINTENANCE
|
|
ELSE %WE MAY BE GOING TO
|
|
IF MODE NEQ 7 THEN %ANOTHER PAGE
|
|
BEGIN
|
|
IF TYPE=0 THEN BEGIN MESSAGE(4); MODE:=0 END ELSE
|
|
IF TYPS[TYPE].AF=TYPS[TYPE].BF THEN
|
|
IF TYPS[0].BF GTR 0 THEN
|
|
BEGIN INTEGER J,K; REAL PG;
|
|
K:=TYPS[0].BF-1; TYPS[0].BF:=K; PG:=INDX[K,P];
|
|
FOR I:=1 STEP 1 UNTIL TYPE-1 DO
|
|
IF (T:=TYPS[I]).AF NEQ T.BF THEN
|
|
BEGIN FOR K:=T.AF STEP 1 UNTIL T.BF -1 DO
|
|
MOVE(INDX[K,0]),P+EXTRAROOM,INDX[K-1,0]);
|
|
TYPS[I].AF:=T.AF-1; TYPS[I].BF:=K:=T.BF-1
|
|
END;
|
|
IF CURPAGE GTR TYPS[0].BF THEN
|
|
IF CURPAGE LEQ K THEN CURPAGE:=CURPAGE-1;
|
|
TYPS[TYPE].BF:=K+1; TYPS[TYPE].AF:=K;
|
|
INDX[K,P]:=PG; INDX[K,0]:=0; INDX[K,0].TF:=TYPE;
|
|
IF TYPS[TYPE].BOOL=1 THEN
|
|
BEGIN SETNTH(INDX[K,0],0,1); INDX[K,0].MF:=1
|
|
END;
|
|
COMMENT
|
|
IF MEMBUG.[22:1] THEN DUMPTYPES(MODE,TYPS,NTYPES);
|
|
MEMORY(MODE,TYPE,A,N,M); MODE:=0
|
|
END ELSE
|
|
BEGIN T:=1; MEMORY(8,TYPE,A,T,M); MEMORY(MODE,TYPE,A,N,M);
|
|
MODE:=0
|
|
END ELSE
|
|
IF NOT( BOOLEAN(TYPS[TYPE].BOOL) AND MODE=5) THEN
|
|
CURBUFF:=BUFFNUMBER(CURPAGE:=
|
|
SEARCHL(INDX,N,NPAGES,TYPS[TYPE].AF,TYPS[TYPE].BF,
|
|
NR) );
|
|
COMMENT
|
|
IF MEMBUG.[23:1] THEN CHECKTYPES(TYPS,NTYPES);
|
|
END;
|
|
COMMENT
|
|
IF MEMBUG.[20:1] THEN DUMPINDEX(TYPS,NTYPES,INDX,RECSIZE,P);
|
|
COMMENT
|
|
IF MEMBUG.[24:1] THEN DUMPBUFF(BUF,FIRST,AVAIL);
|
|
CASE MODE OF
|
|
BEGIN
|
|
%------- MODE=0 ------- RESERVED ---------------
|
|
;
|
|
%------- MODE=1 --------------------------------------------------
|
|
IF M=0 THEN N:=TYPS[TYPE].BOOL ELSE
|
|
IF M=1 THEN
|
|
BEGIN FOR I:=1 STEP 1 UNTIL NTYPES DO
|
|
IF (T:=TYPS[I].AF=T.BF THEN
|
|
BEGIN N:=I; I:=NTYPES+1
|
|
END;
|
|
IF I=NTYPES+1 THEN N:=NTYPES+1
|
|
END;
|
|
%------- MODE=2 ------- RESERVED ---------------
|
|
;
|
|
%------- MODE=3 ------- RETURN THE NUMBER OF RECORDS----
|
|
BEGIN COMMENT IF TYPE LSS 0 THEN THE TOTAL NUMBER
|
|
OF PAGES IS GIVEN, OTHERWISE THE NUMBER OF "TYPE" PAGES IS
|
|
GIVEN;
|
|
FOR I:=0 STEP 1 UNTIL NPAGES DO
|
|
IF INDX[I,0].TF=TYPE OR TYPE LSS 0 THEN
|
|
NR:=NR+INDX[I,0].CF;
|
|
M:=NR
|
|
END;
|
|
%------- MODE=4 ------- RETURN ITEM AT SUBSCRIPT N -----
|
|
IF NR GEQ INDX[CURPAGE,0].CF THEN MESSAGE(3) ELSE
|
|
IF BOOLEAN (TYPS[TYPE].BOOL) THEN COMMENT SEQUENTIAL STORAGE;
|
|
BEGIN ARRAY B[0:PAGESIZE]; 00007270P08
|
|
M:=CHRSTORE(POINTERS[CURBUFF](0),2,B,A,NR,0,0,2,0);
|
|
END ELSE
|
|
BEGIN
|
|
M:=RECSIZE|8;
|
|
READRECS(POINTERS[CURBUFF](0),A,SKIP,NR,1,0,RECSIZE);
|
|
END;
|
|
%------- MODE=5 ------- INSERT ITEM AT SUBSCRIPT N;
|
|
BEGIN INTEGER K,J,S; REAL PG;
|
|
IF BOOLEAN(TYPS[TYPE].BOOL) THEN
|
|
COMMENT FIND A PLACE FOR THE CHARACTER STRING OF LENGTH
|
|
M;
|
|
IF M GTR (PAGESIZE-SKIP-1)|8-2 THEN MESSAGE(5) COMMENT
|
|
THIS CHARACTER STRING IS TOO LONG ; ELSE
|
|
BEGIN ARRAY C[0:PAGESIZE];
|
|
STREAM PROCEDURE ADDZERO(CHARS,POINTER); VALUE CHARS;
|
|
BEGIN LOCAL T;
|
|
SI:=LOC CHARS; DI:=LOC T; DI:=DI+1; DS:=7CHR;
|
|
DI:=POINTER; T(2(DI:=DI+32)); CHARS(DI:=DI+1);
|
|
DS:=2LIT"0";
|
|
END;
|
|
BOOLEAN B,NOTLASTPAGE;
|
|
LABEL TRYITAGAIN;
|
|
TRYITAGAIN:
|
|
FOR I:=(T:=TYPS[TYPE]).AF STEP 1 WHILE I LSS T.BF AND
|
|
NOT B DO
|
|
IF NOT(B:=((PAGESIZE-SKIP-1)|8-(GT1:=INDX[I,0]).SF)GEQ M+2
|
|
AND NOT BOOLEAN(GT1.FF)) THEN S:=S+GT1.CF ELSE I:=I-1;
|
|
NOTLASTPAGE:=B AND I NEQ T.BF-1;
|
|
COMMENT IF B IS TRUE, THEN A PAGE HAS BEEN FOUND;
|
|
IF NOT B THEN COMMENT GET A PAGE THAT IS FREE;
|
|
BEGIN
|
|
COMMENT
|
|
IF MEMBUG.[5:1] THEN DUMPTYPES(5,1,TYPS,NTYPES);
|
|
IF TYPS[0].BF=0 THEN BEGIN K:=CURPAGE; T:=1;
|
|
MEMORY(8,TYPE,A,T,M); CURPAGE:=K+1
|
|
END
|
|
ELSE
|
|
IF (PAGESIZE-SKIP-1)|8-INDX[(I:=I-1)-1,0].SF GTR 2 THEN
|
|
BEGIN
|
|
CURBUFF:=BUFFNUMBER(CURPAGE:=I-1);
|
|
ADDZERO((GT1:INDX[CURPAGE,0].SF)+8|(SKIP+1),POINTERS
|
|
[CURBUFF](0));
|
|
INDX[CURPAGE,0].SF:=GT1+2;
|
|
INDX[CURPAGE,0].CF:=INDX[CURPAGE,0].CF+1;
|
|
COMMENT SINCE ALLOCATING A NEW PAGE, SET COUNT TO
|
|
ONE MORE AND FREEZE THE COUNT;
|
|
S:=S+1; % SINCE THE COUNT INCREASED
|
|
MOVE(INDX[CURPAGE,0],SKIP+1,POINTERS[CURBUFF](0));
|
|
MARK(CURPAGE);
|
|
END;
|
|
T:=TYPS[0].BF; TYPS[0].BF:=T:=T-1;
|
|
COMMENT T IS THE SUBSCRIPT INTO THE NEW PAGE;
|
|
PG:=INDX[T,P]; COMMENT PG HOLDS THE NEW PAGE #;
|
|
FOR K:=T+1 STEP 1 UNTIL I DO
|
|
MOVE(INDX[K,0],RECSIZE+SKIP+EXTRAROOM,INDX[K-1,0]);
|
|
T:=TYPS[TYPE].AF; UPDATE(TYPS,1,TYPE-1,-1);
|
|
IF CURPAGE GTR TYPS[0].BF THEN IF CURPAGE LEQ
|
|
I THEN CURPAGE:=CURPAGE-1;
|
|
INDX[I,0]:=0; INDX[I,0].MF:=1; INDX[I,0].TF:=TYPE;
|
|
COMMENT MUST ALSO ASSIGN A NUMBER TO THIS PAGE
|
|
(TO BE STORED IN THE PAGE) TO KEEP IT IN SEQUENCE
|
|
WITHIN THIS TYPE;
|
|
IF (T:=TYPS[TYPE]).AF LSS T.BF-1 THEN
|
|
T:=INDX[T.BF-1,1] ELSE T:=0;
|
|
SETNTH(INDX[I,0],ADDD(1,T),1);
|
|
COMMENT END OF THE INITIALIZATION OF THE INDEX ARRAY,
|
|
WE STILL HAVE TO MAKE SOME ENTRIES INTO THE PAGE
|
|
WHICH WE WILL DO BELOW;
|
|
END OF TEST FOR NEW PAGE;
|
|
COMMENT I IS SET TO THE PROPER SUBSCRIPT FOR THE CHR STORE;
|
|
CURBUFF:=BUFFNUMBER(CURPAGE:=I);
|
|
COMMENT NOW THE CORRECT PAGE IS IN CORE.
|
|
------------------------------
|
|
M= NUMBER OF CHARACTERS IN A (ON INPUT)
|
|
N= ADDRESS OF A WITHIN IN THIS TYPE (ON OUTPUT
|
|
------------------------------;
|
|
K:=INDX[I,0];
|
|
T:=CHRSTORE(POINTERS[CURBUFF](0),SKIP+1,C,A,K,CF,M,0,0,
|
|
PAGESIZE);
|
|
COMMENT K.CF IS THE NUMBER OF ITEMS ALREADY IN THIS
|
|
PAGE. IF THERE IS A SEGMENT WHICH IS NULL, IT WILL
|
|
BE FOUND AND ASSIGNED AS THE SEG NUMBER FOR 00007860P09
|
|
THIS CHARACTER STRING (T). IF NOT, IT WILL STICK THE
|
|
STRING ON THE END (WE KNOW THERE IS ENOUGH ROOM
|
|
SINCE WE CHECKED INDX[I,0].SF -- THE NUMBER OF CHRS USED
|
|
IN THIS PAGE, OR WE CREATED A NEW PAGE);
|
|
N:=S+T; S:=K.SF; COMMENT S CONTAINS THE # OF CHRS USED UP;
|
|
IF T:=T+1 GTR K.CF THEN COMMENT ADDED THE STRING ON THE END;
|
|
IF NOTLASTPAGE THEN % PAGE ALREADY FULL
|
|
BEGIN S:=0; B:=FALSE; INDX[I,0].FF:=1;
|
|
MOVE(INDX[I,0],SKIP+1,POINTERS[CURBUFF](0));
|
|
MARK(CURPAGE); GO TRYITAGAIN; END ELSE
|
|
BEGIN K.CF:=T; S:=S+2;
|
|
END
|
|
ELSE IF T=K.CF AND NOTLASTPAGE THEN INDX[I,0].FF:=1;
|
|
INDX[I,0].CF:=K.CF; INDX[I,0].SF:=S+M;
|
|
MOVE(INDX[I,0],SKIP+1,POINTERS[CURBUFF](0));
|
|
MARK(CURPAGE);
|
|
COMMENT THE PAGE DESCRIPTOR HAS BEEN UPDATED;
|
|
COMMENT
|
|
IF MEMBUG.[5:1] THEN DUMPTYPES(5,2,TYPS,NTYPES);
|
|
END ELSE COMMENT KIND OF STORAGE IS SORTED;
|
|
IF NR GTR (T:=INDX[CURPAGE,0].CF) THEN
|
|
COMMENT SUBSCRIPT IS NOT IN THE MIDDLE OF THE PAGE;
|
|
MESSAGE(6) ELSE
|
|
BEGIN
|
|
IF T GEQ U THEN COMMENT WILL EXCEED UPPER PAGE BOUND;
|
|
BEGIN ARRAY B[0:RECSIZE TIMES
|
|
(T-PS+(I:=(IF NR GEQ PS THEN 0 ELSE 1)))-1];
|
|
COMMENT B IS JUST BIG ENOUGH TO CARRY THE
|
|
EXCESS FROM THE OLD PAGE;
|
|
READRECS(POINTERS[CURBUFF](0),B,SKIP,PS-I,
|
|
J:=(T-PS+I),0,RECSIZE);
|
|
COMMENT -- B NOW HAS THE EXCESS;
|
|
INDX[CURPAGE,0].CF:=T-J; SETNTH(POINTERS[CURBUFF](0),
|
|
INDX[CURPAGE,0],0);
|
|
MARK(CURPAGE);
|
|
IF TYPS[0].BF=0 THEN
|
|
BEGIN K:=CURPAGE; T:=1;
|
|
MEMORY(8,TYPE,A,T,M); CURPAGE:=K+1;
|
|
END;
|
|
COMMENT -- ASSIGN A FREE PAGE (SUBS T);
|
|
T:=TYPS[0].BF; TYPS[0].BF:=T:=T-1;
|
|
|
|
PG:=INDX[T,P];
|
|
FOR K:=T+1 STEP 1 UNTIL CURPAGE DO
|
|
MOVE(INDX[K,0],RECSIZE+SKIP+EXTRAROOM,INDX[K-1,0]);
|
|
INDX[CURPAGE,P]:=PG;
|
|
T:=0;T.CF:=J;T.TF:=TYPE;
|
|
CURBUFF:=BUFFNUMBER(CURPAGE);
|
|
WRITERECS(POINTERS[CURBUFF](0),B,SKIP,0,J,0,RECSIZE);
|
|
SETNTH(POINTERS[CURBUFF](0),T,0);
|
|
MOVE(POINTERS[CURBUFF](0),RECSIZE+SKIP,INDX[CURPAGE,0]);
|
|
MARK(CURPAGE);
|
|
T:=TYPS[TYPE].AF; TYPS[TYPE].AF:=T-1;
|
|
UPDATE(TYPS,1,TYPE-1,-1);
|
|
IF J=0 THEN MESSAGE(7);
|
|
IF BOOLEAN (I) THEN
|
|
COMMENT I=0 IMPLIES THE RECORD GOES TO NEW PAGE,
|
|
I=1 IMPLIES THE RECORD GOES TO NOOLD PAGE;
|
|
BEGIN
|
|
T:=INDX[CURPAGE:=CURPAGE-1,0].CF;
|
|
CURBUFF:=BUFFNUMBER(CURPAGE);
|
|
; COMMENT OLD PAGE IS NOW BACK;
|
|
END ELSE
|
|
BEGIN T:=J; NR:=NR-PS
|
|
END
|
|
END;
|
|
WRITERECS(POINTERS[CURBUFF](0),A,SKIP,NR,1,T-NR,RECSIZE);
|
|
T:=INDX[CURPAGE,0].CF; INDX[CURPAGE,0].CF:=T+1;
|
|
SETNTH(POINTERS[CURBUFF](0),INDX[CURPAGE,0],0);
|
|
IF NR=0 THEN MOVE(POINTERS[CURBUFF](0),RECSIZE+SKIP,INDX
|
|
[CURPAGE,0]); MARK(CURPAGE);
|
|
END;
|
|
END;
|
|
%------- MODE=6 ------- DELETE A RECORD FROM THE FILE ----
|
|
IF (T:=TYPS[TYPE].AF=T.BF THEN MESSAGE(12) COMMENT
|
|
ATTEMPT TO DELETE NON-EXISTENT STORAGE;
|
|
ELSE
|
|
IF NR GEQ(T:=INDX[CURPAGE,0].CF) THEN MESSAGE(13) COMMENT
|
|
ATTEMPT TO DELETE OUTSIDE STORAGE RANGE; ELSE
|
|
IF BOOLEAN(T.BOOL) THEN COMMENT SEQUENTIAL STORAGE;
|
|
BEGIN COMMENT NR IS THE RECORD TO DELETE;
|
|
ARRAY B[0:PAGESIZE-1]; 00008610P10
|
|
COMMENT PAGESIZE -1 SHOULD BE COMPUTED TO THE EXACT
|
|
NUMBER OF WORDS TO MOVE -- IT WOULD SPEED THINGS UP;
|
|
INTEGER L;
|
|
T:=INDX[CURPAGE,0]; COMMENT T.CF IS THE NUMBER OF
|
|
RECORDS ON THIS PAGE, T.SF IS THE NUMBER OF CHRS;
|
|
L:=CHRSTORE(POINTERS[CURBUFF](0),SKIP+1,B,A,NR,0,T.CF
|
|
-NR-1,1,PAGESIZE);
|
|
COMMENT WE WILL BRING BACK THE NUMBER OF CHRS IN M;
|
|
M:=L;
|
|
MARK(CURPAGE);
|
|
COMMENT MAKE CHANGES TO THE CHARACTER COUNT;
|
|
INDX[CURPAGE,0].SF:=T.SF-L;
|
|
INDX[CURPAGE,0].FF:=0; % PAGE IS CERTAINLY NOT FULL NOW
|
|
COMMENT AND WE ARE DONE WITH THE DELETION;
|
|
MOVE(INDX[CURPAGE,0],SKIP+1,POINTERS[CURBUFF](0));
|
|
END
|
|
ELSE
|
|
BEGIN ARRAY A[0:RECSIZE-1];
|
|
INDX[CURPAGE,0].CF:=I-1;
|
|
SETNTH(POINTERS[CURBUFF](0),INDX[CURPAGE,0],0);
|
|
IF I GTR 1 THEN
|
|
BEGIN
|
|
READRECS(POINTERS[CURBUFF](0),A,SKIP,NR,1,I-NR-1,RECSIZE);
|
|
MARK(CURPAGE);
|
|
IF NR=0 THEN
|
|
MOVE(POINTERS[CURBUFF](0),RECSIZE+SKIP,INDX[CURPAGE,0])
|
|
END ELSE COMMENT FREE THE EMPTY PAGE;
|
|
BEGIN MARK(CURPAGE);
|
|
;TYPS[0].BF:=FREEPAGE(INDX,TYPS[0].BF,CURPAGE,CURPAGE);
|
|
UPDATE(TYPS,1,TYPE-1,1); TYPS[TYPE].AF:=T.AF+1;
|
|
COMMENT
|
|
IF MEMBUG.[6:1] THEN DUMPTYPES(MODE,TYPS,NTYPES);
|
|
END
|
|
END;
|
|
%------- MODE=7 ------- SEARCH FOR A RECORD FROM THE FILE ---
|
|
IF N GTR 3 THEN MESSAGE(14) ELSE
|
|
COMMENT RETURN RECORD CLOSEST (BUT LESS THAN OR EQUAL TO) TO
|
|
THE CONTENT OF -A-. A WILL BE REPLACED BY THE RECORD FOUND;
|
|
IF BOOLEAN((I:=TYPS[TYPE].BOOL) THEN
|
|
MESSAGE(8) COMMENT BINARY SEARCH OF NON-SEQUENTIAL DATA;
|
|
ELSE
|
|
IF I.AF=I.BF THEN MESSAGE(9) COMMENT --NO STORAGE OF
|
|
THIS TYPE ALLOCATED AS YET;
|
|
ELSE BEGIN
|
|
INTEGER F,U,L;
|
|
ARRAY B[0:RECSIZE-1];
|
|
U:=TYPS[TYPE].BF; L:=TYPS[TYPE].AF;
|
|
WHILE U-L GTR 1 DO
|
|
IF LESS(A,0,INDX[F:=(U+L) DIV 2,0],8,M) THEN U:=F ELSE L:=F;
|
|
CURBUFF:=BUFFNUMBER(CURPAGE:=L);
|
|
L:=0; U:=INDX[CURPAGE,0].CF;
|
|
IF L-U=0 THEN MESSAGE(10) COMMENT BINARY SEARCH FOUND
|
|
A PAGE WITH NO RECORDS;
|
|
ELSE BEGIN
|
|
WHILE U-L GTR 1 DO
|
|
BEGIN READRECS(POINTERS[CURBUFF](0),B,SKIP,
|
|
F:=(U+L) DIV 2,1,0,RECSIZE);
|
|
IF LESS(A,0,B,0,M) THEN U:=F ELSE L:=F
|
|
END;
|
|
COMMENT -----------------------------------
|
|
ON INPUT:
|
|
N=0 IMPLIES DO NOT PLACE RECORD INTO FILE
|
|
IF RECORD IS FOUND. RETURN RELA-
|
|
TIVE POSITION OF THE CLOSEST RECORD
|
|
IN THIS PAGE.
|
|
N=1 " DO NO PLACE IN FILE. RETURN ABSO-
|
|
LUTE SUBSCRIPT OF CLOSSEST RECORD.
|
|
N=2 " PLACE RECORD INTO FILE IF NOT FOUND.
|
|
RETURN RELATIVE POSITION OF RECORD.
|
|
N=3 " PLACE RECORD INTO FILE, IF NOT
|
|
FOUND, RETURN ABS SUBSCRIPT OF
|
|
THE RECORD.
|
|
ON OUTPUT:
|
|
M=0 " RECORD FOUND WAS EQUAL TO RECORD
|
|
SOUGHT.
|
|
M=1 " RECORD FOUND WAS GREATER THAN THE
|
|
SOUGHT.
|
|
M=2 " RECORD FOUND WAS LESS THAN THE
|
|
RECORD SOUGHT.
|
|
;
|
|
READRECS(POINTERS[CURBUFF](0),B,SKIP,L,1,0,RECSIZE);
|
|
IF LESS(A,0,B,0,M) THEN M:=1 ELSE
|
|
IF LESS(B,0,A,0,M) THEN M:=2 ELSE 00009410P11
|
|
M:=0;
|
|
T:=0; IF BOOLEAN(N) THEN
|
|
FOR I:=TYPS[TYPE].AF STEP 1 UNTIL CURPAGE-1 DO
|
|
T:=T+INDX[I,0].CF;
|
|
IF N GTR 1 THEN IF M GEQ 1 THEN
|
|
MEMORY(2,TYPE,A,L+M-1,NR);
|
|
MOVE(B,RECSIZE,A);
|
|
N:=T+L;
|
|
END
|
|
END;
|
|
%------- MODE=8 ------- FILE OVERFLOW, FIX ARRAYS AND PAGES
|
|
BEGIN BOOLEAN TOG;
|
|
ARRAY A[0:PAGESIZE-1]; T:=NPAGES-N+1;
|
|
IF TOG:=(T DIV AREASIZE) LSS (NPAGES DIV AREASIZE ) OR
|
|
(T=NPAGES AND T MOD AREASIZE =0) THEN
|
|
MEMORY(14,TYPE,A,N,M);
|
|
FOR I:=T STEP 1 UNTIL NPAGES DO
|
|
BEGIN WRITE(NEWDISK[I],PAGESIZE,A[*]);INDX[I,P].PAGEF:=I END;
|
|
MARKEOF(SKIP,RECSIZE,NEWDISK(0));
|
|
WRITE(NEWDISK[I]);
|
|
TYPS[0].BF:=FREEPAGE(INDX,TYPS[0]).BF,T,NPAGES);
|
|
UPDATE(TYPS,1,NTYPES,NPAGES-T+1);
|
|
IF TOG THEN CLOSE(NEWDISK);
|
|
END;
|
|
%------- MODE=9 ------- FILE MAINTENANCE ------------------
|
|
BEGIN BOOLEAN ITHPAGEIN;
|
|
INTEGER I,J,K,T1,T2,T3,M,W,Q;
|
|
ARRAY A,B[0:PAGESIZE-1];
|
|
COMMENT
|
|
MONITOR PRINT(Q,W,N, I,J,K,T1,T2,T3,M,A,B);
|
|
IF I:=TYPS[0].BF LEQ NPAGES THEN
|
|
DO
|
|
BEGIN COMMENT OUTER "DO-LOOP" TO FIND TROUBLE WITH
|
|
THE FILE;
|
|
IF T1:=(Q:=INDX[I,0]).CF LSS L THEN COMMENT MAY BE CORRECTABLE;
|
|
IF NOT BOOLEAN((Q:=TYPS[Q.TF]).BOOL) THEN
|
|
COMMENT -- THIS PAGE IS CORRECTABLE;
|
|
IF I NEQ NPAGES THEN
|
|
COMMENT -- THIS IS NOT THE LAST PAGE OF THE FILE;
|
|
IF (J:=I+1) LSS Q.BF THEN
|
|
COMMENT -- THIS IS NOT THE LAST PAGE OF THIS TYPE;
|
|
BEGIN COMMENT -- FIND RECORDS TO MOVE INTO
|
|
THIS PAGE;
|
|
DO IF T2:=INDX[J,0].CF GTR 0 THEN
|
|
COMMENT THIS PAGE HAS RECS TO MOVE;
|
|
BEGIN COMMENT HOW MANY;
|
|
IF T2 LSS K:=PS-T1 THEN K:=T2;
|
|
IF NOT ITHPAGEIN THEN
|
|
BEGIN COMMENT BRING IN PAGE I;
|
|
MOVE(POINTERS[BUFFNUMBER(I)](0),
|
|
PAGESIZE,B); ITHPAGEIN:=TRUE
|
|
END;
|
|
COMMENT -- BRING IN PAGE J;
|
|
CURBUFF:=BUFFNUMBER(CURPAGE:=J);
|
|
COMMENT -- MOVE SOME INTO A;
|
|
READRECS(POINTERS[CURBUFF](0),A,SKIP,0,K,
|
|
T2:=T2-K,RECSIZE); INDX[J,0].CF:=T2;
|
|
IF T2=0 THEN
|
|
COMMENT SET THIS PAGE FREE;
|
|
INDX[J,0]:=0;
|
|
SETNTH(POINTERS[CURBUFF](0),INDX[J,0],0);
|
|
MOVE(POINTERS[CURBUFF](0),RECSIZE+SKIP,INDX[J
|
|
,0]); MARK(CURPAGE);
|
|
COMMENT -- PUT THE RECORDS INTO PAGE I;
|
|
WRITERECS(B,A,SKIP,T1,K,0,RECSIZE);
|
|
END
|
|
ELSE K:=0 COMMENT SINCE NO CONTRI-
|
|
BUTION;
|
|
UNTIL T1:=T1+K GEQ PS OR J:=J+1 GEQ Q.BF;
|
|
INDX[I,0].CF:=T1; B[0]:=INDX[I,0];
|
|
COMMENT -- PUT THE PAGE BACK OUT ON DISK;
|
|
MOVE(B,RECSIZE+SKIP,INDX[I,0]);
|
|
MOVE(B,PAGESIZE,POINTERS[CURBUFF:=BUFFNUMBER
|
|
(I)](0)); SORT(INDX,0,NPAGES,RECSIZE|8);
|
|
MARK(CURPAGE:=I); SETTYPES;
|
|
N:=1;
|
|
END
|
|
ELSE N:=0 COMMENT LAST PAGE OF THIS TYPE;
|
|
ELSE N:=0 COMMENT LAST PAGE OF FILE;
|
|
ELSE N:=0 COMMENT PAGE CANNOT BE CHANGED;
|
|
ELSE N:=0 COMMENT THIS PAGE IS NOT TOO SMALL;
|
|
END UNTIL I:=I+1 GTR NPAGES OR N NEQ 0 ELSE N:=0;
|
|
IF I GTR NPAGES THEN N:=REAL(WRITEBUFFER); 00010240P12
|
|
END OF FILE UPDATE;
|
|
%------- MODE=10 ------EEMERGENCY FILE MAINTENANCE -------
|
|
DO MEMORY(9,TYPE,A,N,M) UNTIL N NEQ 1
|
|
%------- MODE=11 ------- SET THE KIND OF STORAGE FOR TYPE ----------
|
|
;COMMENT TYPE "TYPE" STORAGE IS BEING SET TO SEQUENTIAL;
|
|
IF TYPE=0 THEN MESSAGE(4) ELSE
|
|
IF (T:=TYPS[TYPE]).AF= T.BF THEN TYPS[TYPE].BOOL:=1 ELSE
|
|
MESSAGE(15); COMMENT ATTEMPT TO CHANGE KINDS IN MIDSTREAM;
|
|
%------- MODE=12 ----------- ALTER STORAGE ALLOCATION RESOURCES---
|
|
COMMENT N IS THE "FACTOR" (PERCENT OF RESOURCES | 100),
|
|
AND M IS THE STORAGE "LEVEL" (0 IS THE ONLY ONE THAT
|
|
DOES ANYTHING ON THE B5500);
|
|
BEGIN INTEGER J,K;
|
|
BOOLEAN TOG;
|
|
IF T:=N|(MBUFF-1)/100+1 GTR MAXBUFF THEN
|
|
BEGIN COMMENT ADD TO AVAILABLE LIST;
|
|
FOR I:=CDR(FIRST),CDR(AVAIL) DO
|
|
WHILE NOT NULL(I) DO
|
|
BEGIN BUF[I].FLAGB:=1; I:=CDR(BUF[I]);
|
|
END;
|
|
FOR I:=MAXBUFF+1 STEP 1 UNTIL T DO
|
|
BEGIN WHILE BUF[K:=K+1].FLAGB=1 DO;
|
|
BUF[K]:=0; RPLACD(BUF[K],CDR(AVAIL));
|
|
RPLACD(AVAIL,K)
|
|
END;
|
|
MAXBUFF:=T;
|
|
FOR I:=1 STEP 1 UNTIL MBUFF DO BUF[I].FLAGB:=0;
|
|
END ELSE
|
|
IF T LSS MAXBUFF THEN
|
|
BEGIN COMMENT CUT DOWN ON THE NUMBER OF BUFFERS;
|
|
I:=CDR(FIRST);
|
|
FOR J:=1 STEP 1 UNTIL MAXBUFF DO
|
|
IF TOG THEN
|
|
IF NOT NULL(I) THEN
|
|
IF J GEQ T THEN
|
|
BEGIN K:=CDR(BUF[I]); BUF[I]:=0
|
|
; I:=K END
|
|
ELSE I:=CDR(BUF[I])
|
|
ELSE
|
|
ELSE
|
|
IF TOG:=NULL(I) THEN
|
|
BEGIN J:=J-1; I:=CDR(AVAIL)
|
|
END
|
|
ELSE
|
|
IF J EQL T THEN
|
|
BEGIN K:=CDR(BUF[I]); RPLACD(BUF[I],0);
|
|
I:=K END ELSE
|
|
IF J GTR T THEN
|
|
BEGIN
|
|
IF BOOLEAN(BUF[I].CHANGEDBIT) THEN
|
|
WRITE(POINTERS[I][BUF[I].PAGEF-1);
|
|
K:=CDR(BUF[I]);
|
|
CLOSE(POINTERS[I]);
|
|
BUF[I]:=0; I:=K
|
|
END ELSE I:=CDR(BUF[I])
|
|
;
|
|
MAXBUFF:=T
|
|
END;
|
|
END;
|
|
%------- MODE=13 ------- RELEASE "TYPE" STORAGE TO SYSTEM ----------
|
|
IF (T:=TYPS[TYPE]).BF GTR T.AF THEN
|
|
BEGIN INTEGER J;
|
|
J:=T.BF-1;
|
|
FOR I:=T.AF STEP 1 UNTIL J DO
|
|
BEGIN CURBUFF:=BUFFNUMBER(I);
|
|
SETNTH(POINTERS[CURBUFF](0),0,0); MARK(CURPAGE:=I);
|
|
END;
|
|
TYPS[0].BF:=FREEPAGE(INDX,TYPS[0].BF,T,AF,J);
|
|
UPDATE(TYPS,1,TYPE-1,J-T.AF+1);
|
|
TYPS[TYPE].BF:=T.AF; TYPS[TYPE].BOOL:=0;
|
|
END;
|
|
%------- MODE=14 ------ RELEASE ALL PAGES FOR TRANSITION -----------
|
|
BEGIN INTEGER K;
|
|
I:=CDR(FIRST);
|
|
WHILE NOT NULL(I) DO
|
|
BEGIN IF BOOLEAN(BUF[I].CHANGEDBIT ) THEN WRITE(POINTERS[I]
|
|
[BUF[I].PAGEF-1]); CLOSE(POINTERS[I]);
|
|
K:=CDR(BUF[I]); BUF[I]:=0;
|
|
RPLACD(BUF[I],CDR(AVAIL)); RPLACD(AVAIL,I); I:=K
|
|
END ; CURPAGE:=CURBUFF:=-1; RPLACD(FIRST,0);
|
|
END;
|
|
END OF CASE STMT;
|
|
END OF INNER BLOCK; 00011110P13
|
|
END OF PROCEDURE;
|
|
INTEGER QM,QN;
|
|
ARRAY QA[0:0];
|
|
PROCEDURE NAME(MFID,FID); VALUE MFID,FID; REAL MFID,FID;
|
|
BEGIN INTEGER I; FILL NEWDISK WITH MFID,FID;
|
|
FOR I:=0 STEP 1 UNTIL MBUFF DO
|
|
FILL POINTERS[I] WITH MFID,FID;
|
|
FILL ESTABLISH WITH MFID,FID;
|
|
SETPOINTERNAMES
|
|
END;
|
|
PROCEDURE SEQUENTIAL(UNIT); VALUE UNIT; INTEGER UNIT;
|
|
MEMORY(11,UNIT,QA,QN,QM);
|
|
INTEGER PROCEDURE CONTENTS(UNIT,N,AR); VALUE UNIT,N;
|
|
INTEGER UNIT,N; ARRAY AR[0];
|
|
BEGIN
|
|
MEMORY(4,UNIT,AR,N,QM); CONTENTS:=QM;
|
|
END;
|
|
PROCEDURE DELETE1(UNIT,N); VALUE UNIT,N; INTEGER UNIT,N;
|
|
MEMORY(6,UNIT,QA,N,QM);
|
|
INTEGER PROCEDURE SEARCHORD(UNIT,REC,LOC,M); VALUE UNIT,M;
|
|
INTEGER UNIT,LOC,M; ARRAY REC[0];
|
|
BEGIN LOC:=1;
|
|
MEMORY(7,UNIT,REC,LOC,M);
|
|
SEARCHORD:=M;
|
|
END;
|
|
PROCEDURE STOREORD(UNIT,REC,N); VALUE UNIT,N; INTEGER UNIT,N;
|
|
ARRAY REC[0];
|
|
MEMORY(5,UNIT,REC,N,QM);
|
|
PROCEDURE STOREORDR(UNIT,REC,N); VALUE UNIT,N; INTEGER UNIT,N;
|
|
ARRAY REC[0];
|
|
MEMORY(2,UNIT,REC,N,QM);
|
|
BOOLEAN PROCEDURE MAINTENANCE;
|
|
BEGIN MEMORY(9,0,QA,QN,QM); MAINTENANCE:=QN:=1
|
|
END;
|
|
PROCEDURE WRAPUP; MEMORY(10,0,QA,QN,QM);
|
|
INTEGER PROCEDURE STORESEQ(UNIT,REC,N); VALUE UNIT,N; INTEGER UNIT, N;
|
|
ARRAY REC[0];
|
|
BEGIN
|
|
MEMORY(5,UNIT,REC,QN,N); STORESEQ:=QN;
|
|
END;
|
|
PROCEDURE DELETEN(UNIT,N,M); VALUE UNIT,N,M; INTEGER UNIT,N,M;
|
|
BEGIN M:=M-N;
|
|
DO MEMORY(6,UNIT,QA,N,QM) UNTIL M:=M-1 LSS 0;
|
|
END;
|
|
INTEGER PROCEDURE NEXTUNIT;
|
|
BEGIN MEMORY(1,0,QA,QN,1); NEXTUNIT:=QN
|
|
END;
|
|
INTEGER PROCEDURE SIZE(UNIT); VALUE UNIT; INTEGER UNIT;
|
|
BEGIN MEMORY(3,UNIT,QA,QN,QM); SIZE:=QM
|
|
END;
|
|
PROCEDURE ALLOCATE(J,FACTOR); VALUE J,FACTOR; INTEGER J;
|
|
REAL FACTOR;
|
|
BEGIN
|
|
QN:=ENTIER( ABS( (FACTOR | 100) MOD 101));
|
|
MEMORY(12,0,QA,QN,J)
|
|
END;
|
|
PROCEDURE RELEASEUNIT(UNIT); VALUE UNIT; INTEGER UNIT;
|
|
MEMORY(13,UNIT,QA,QN,QM);
|
|
DEFINE
|
|
ALLOWQUESIZE=4#,
|
|
ACOUNT=ACCUM[0].[1:11]#,
|
|
DATADESC=[1:1]#,
|
|
SCALAR=[4:1]#,
|
|
NAMED=[3:1]#,
|
|
CHRMODE=[5:1]#,
|
|
CHECKT=5#, % NUMBER OF TIMES THRU EXECUTE BEFORE CHECK
|
|
CCIF=18:36:12#,
|
|
CDID=1:43:5#,
|
|
CSPF=30:30:18#,
|
|
CRF=24:42:6#,
|
|
CLOCF=6:30:18#,
|
|
PF=[1:17]#,
|
|
XEQMODE=1#,
|
|
FUNCMODE=2#,
|
|
CALCMODE=0#,
|
|
INPUTMODE=3#,
|
|
ERRORMODE=4#,
|
|
FUNCTION=1#,
|
|
CURRENTMODE = PSRM[0]#,
|
|
VARIABLES = PSRM[1]#,
|
|
VARSIZE = PSRM[2]#,
|
|
FUNCPOINTER = PSRM[3]#, 00013160P14
|
|
FUNCSEQ = PSRM[4]#,
|
|
CURLINE = PSRM[5]#,
|
|
STACKBASE = PSRM[6]#,
|
|
INCREMENT = STACKBASE#, %FUNCMODE/CALCMODE
|
|
SYMBASE = PSRM[7]#,
|
|
FUNCSIZE = SYMBASE#, %FUNCMODE/CALCMODE
|
|
USERMASK = PSRM[8]#,
|
|
SEED = PSRM[10]#,
|
|
ORIGIN = PSRM[11]#,
|
|
FUZZ = PSRM[12]#,
|
|
FSTART = 9#, %PSR[9] IS WHERE NAME OF CURRENTLY EDITED FCN GOES
|
|
PSRSIZE = 13#,
|
|
PSR = PSRM[*]#,
|
|
WF=[18:8]#,
|
|
WDSPERREC=10#,
|
|
WDSPERBLK=30#,
|
|
NAREAS=10#,
|
|
SIZEAREAS=210#,
|
|
LIBF1=[6:15]#,
|
|
LIBF2=[22:16]#,
|
|
LIBF3=[38:10]#,
|
|
LIBSPACES=1#,
|
|
IDENT=RESULT=1#,
|
|
SPECIAL=RESULT=3#,
|
|
NUMERIC=RESULT=2#,
|
|
REPLACELOC=0#,
|
|
REPLACEV=4#,
|
|
SPF=[30:18]#,
|
|
RF=[24:6]#,
|
|
DID=[1:5]#,
|
|
XRF=[12:18]#,
|
|
DDPNSW=30#, % DATA DESC PRESENT NAMED SCALAR WORD
|
|
DDNNVW=20#, %DATA DESC NON-PRES NAMED VECTOR WORD
|
|
DDNUVW=16#, %DATA DESC NONPRES..(POINTS INTO SYM TAB FOR LOCALS)
|
|
DDPUVW=24#, % DATA DESC PRESENT UNNAMED VECTOR WORD
|
|
DDNNSW=22#, % DATA DESC NON-PRES NAMED SCALAR WORD
|
|
PDC=10#, % DROG DESC CALC MODE
|
|
INTO=0#,
|
|
DDPUSW=26#, % DATA DESC PRESENT UNNAMED SCALAR WORK (MODE)
|
|
DDPUSC=27#, % DATA DESC PRESENT UNNAMED SCALAR CHR
|
|
DDPUVC=25#, % DATA DESC PRESENT UNNAMED VECTOR CHR
|
|
DDPNVC=29#, %DATA DESC PRES PERMANENT VECTOR CHAR MODE
|
|
DDPNVW=28#, %DATA DESC PRES NAMED VEC WORD (NAMED=PERMANENT)
|
|
OUTOF=1#,
|
|
NAMEDNULLV=0&7[1:45:3]#, %DLUDGE...NAMED VERSION OF NULLV
|
|
BACKP=[6:18]#,
|
|
SCALARDATA=0#,
|
|
ARRAYDATA=2#,
|
|
DATATYPE=[4:1]#,
|
|
ARRAYTYPE=[5:1]#,
|
|
CHARARRAY=1#,
|
|
NUMERICARRAY=0#,
|
|
BLOCKSIZE=30#, %#WORDS OF CONTIGUOUS DATA IN SEQUENTIAL STORE
|
|
VARTYPE=[42:6]#,
|
|
WS=WORKSPACE#,
|
|
DIMPTR=SPF#,
|
|
INPTR=BACKP#,
|
|
QUADIN=[18:3]#,
|
|
QUADINV=18:45:3#,
|
|
STATEVECTORSIZE=16#,
|
|
SUSPENDED=[5:1]#,
|
|
SUSPENDVAR=[2:1]#,
|
|
CTYPEF=3:45:3#,
|
|
CSUSVAR=2:47:1#,
|
|
CNAMED=3:47:1#,
|
|
MAXWORDSTORE=3960#, %APL PREVENTS CREATION OF ARRAYS BIGGER THAN
|
|
%3960 ELEMENTS. THIS NUMBER IS THE PRODUCT OF
|
|
%4,(NUMBER OF POINTERS TO SEQUENTIAL STORE
|
|
%BLOCKS THAT ARE STORED IN ONE WORD)
|
|
%30, (BLOCKSIZE),
|
|
%AND 33, (SIZE OF ARRAY USED TO STORE THESE
|
|
%POINTERS IN GETARRAY, MOVEARRAY, AND
|
|
%RELEASEARRAY). SUBSCRIPTS ALLOWS 8|3960
|
|
%ELEMENTS IF THEY ARE CHARACTERS.
|
|
%HOWEVER, SP WILL GET FULL BEFORE THAT SINCE
|
|
%BIGGEST SP SIZE IS CURRENTLY 3584
|
|
MAXBUFFSIZE=30#,
|
|
MAXHEADERARGS=30#,
|
|
BUFFERSIZE=BUFFSIZE#,
|
|
LINEBUFFER=LINEBUFF#,
|
|
LINEBUFF = OUTBUFF[*]#,
|
|
APPENDTOBUFFER=APPENDTOBUFF#,
|
|
FOUND=TARRAY[0]#, 00022000P15
|
|
EOB=TARRAY[1]#,
|
|
MANT=TARRAY[2]#,
|
|
MANTLEN=TARRAY[3]#,
|
|
FRAC=TARRAY[4]#,
|
|
FRACLEN=TARRAY[5]#,
|
|
POWER=TARRAY[6]#,
|
|
POWERLEN=TARRAY[7]#,
|
|
MANTSIGN=TARRAY[8]#,
|
|
TABSIZE = 43#,
|
|
LOGINCODES=1#,
|
|
LOGINPHRASE=2#,
|
|
LIBRARY=1#,
|
|
WORKSPACEUNIT=2#,
|
|
RTPAREN=9#,
|
|
MASTERMODE=USERMASK.[1:1]#,
|
|
EDITOG=USERMASK.[2:1]#,
|
|
POLBUG=USERMASK.[3:1]#,
|
|
FPTF=9#, % FUNCTION POINTER FIELD (STARTS AT CHR POS 9)
|
|
FSQF=11#, % FUNCTION SEQNTL FIELD
|
|
FFL=2#, % FUNCTION FIELD LENGTH (2 CHR POSITIONS)
|
|
CRETURN=3:47:1#,
|
|
RETURNVALUE=[3:1]#,
|
|
CNUMBERARGS=4:46:2#,
|
|
NUMBERARGS=[4:2]#,
|
|
RETURNVAL=1#,
|
|
NOSYNTAX=USERMASK.[4:1]#,
|
|
LINESIZE=USERMASK.[41:7]#,
|
|
DIGITS=USERMASK.[37:4]#,
|
|
SUSPENSION=USERMASK.SUSPENDED#,
|
|
SAVEDWS=USERMASK.[7:1]#,
|
|
DELTOG=USERMASK.[6:1]#,
|
|
DELCHR="$"#, %USED IN DELPRESENT (IN FUNCTIONHANDLER)
|
|
MAXMESS=27#,
|
|
USERTOP=21#,
|
|
MARGINSIZE=6#,
|
|
LFTBRACKET=SPECIAL AND ACCUM[0]=11#,
|
|
QUADV=SPECIAL AND ACCUM[0]=10#,
|
|
QUOTEV=ACCUM[0]=20#,
|
|
EXPANDV=38#,
|
|
SLASHV=6#,
|
|
GOTOV=5#,
|
|
DOTV=17#,
|
|
ROTV=37#,
|
|
RGTBRACKET=SPECIAL AND ACCUM[0]=12#,
|
|
DELV=SPECIAL AND ACCUM[0]=13#,
|
|
PLUS = SPECIAL AND ACCUM[0] = 48#,
|
|
MINUS = SPECIAL AND ACCUM[0] = 49#,
|
|
NEGATIVE = SPECIAL AND ACCUM[0] = 51#,
|
|
TIMES = SPECIAL AND ACCUM[0] = 50#,
|
|
LOGS = SPECIAL AND ACCUM[0] = 54#,
|
|
SORTUP = SPECIAL AND ACCUM[0] = 55#,
|
|
SORTDN = SPECIAL AND ACCUM[0] = 56#,
|
|
NAND = SPECIAL AND ACCUM[0] = 58#,
|
|
NOR = SPECIAL AND ACCUM[0] = 59#,
|
|
TAKE = SPECIAL AND ACCUM[0] = 60#,
|
|
DROPIT = SPECIAL AND ACCUM[0] = 61#,
|
|
LFTARROW = SPECIAL AND ACCUM[0] = 04#,
|
|
TRANS = SPECIAL AND ACCUM[0] = 05#,
|
|
SLASH = SPECIAL AND ACCUM[0] = 06#,
|
|
INTDIVIDE = SPECIAL AND ACCUM[0] = 07#,
|
|
LFTPAREN = SPECIAL AND ACCUM[0] = 08#,
|
|
RGTPAREN = SPECIAL AND ACCUM[0] = 09#,
|
|
QUOTEQUAD = SPECIAL AND ACCUM[0] = 14#,
|
|
SEMICOLON = SPECIAL AND ACCUM[0] = 15#,
|
|
COMMA = SPECIAL AND ACCUM[0] = 16#,
|
|
DOT = SPECIAL AND ACCUM[0] = 17#,
|
|
STAR = SPECIAL AND ACCUM[0] = 18#,
|
|
AT = SPECIAL AND ACCUM[0] = 19#,
|
|
QUOTE = SPECIAL AND ACCUM[0] = 20#,
|
|
BOOLAND = SPECIAL AND ACCUM[0] = 21#,
|
|
BOOLOR = SPECIAL AND ACCUM[0] = 22#,
|
|
BOOLNOT = SPECIAL AND ACCUM[0] = 23#,
|
|
LESSTHAN = SPECIAL AND ACCUM[0] = 24#,
|
|
LESSEQ = SPECIAL AND ACCUM[0] = 25#,
|
|
EQUAL = SPECIAL AND ACCUM[0] = 26#,
|
|
GRTEQ = SPECIAL AND ACCUM[0] = 27#,
|
|
GREATER = SPECIAL AND ACCUM[0] = 28#,
|
|
NOTEQ = SPECIAL AND ACCUM[0] = 29#,
|
|
CEILING = SPECIAL AND ACCUM[0] = 30#,
|
|
FLOOR = SPECIAL AND ACCUM[0] = 31#,
|
|
STICK = SPECIAL AND ACCUM[0] = 32#,
|
|
EPSILON = SPECIAL AND ACCUM[0] = 33#,
|
|
RHO = SPECIAL AND ACCUM[0] = 34#, 00030950P16
|
|
IOTA = SPECIAL AND ACCUM[0] = 35#,
|
|
TRACE = SPECIAL AND ACCUM[0] = 36#,
|
|
PHI = SPECIAL AND ACCUM[0] = 37#,
|
|
EXPAND = SPECIAL AND ACCUM[0] = 38#,
|
|
BASVAL = SPECIAL AND ACCUM[0] = 39#,
|
|
EXCLAMATION = SPECIAL AND ACCUM[0] = 40#,
|
|
MINUSLASH = SPECIAL AND ACCUM[0] = 41#,
|
|
QUESTION = SPECIAL AND ACCUM[0] = 42#,
|
|
OSLASH = SPECIAL AND ACCUM[0] = 43#,
|
|
TAU = SPECIAL AND ACCUM[0] = 44#,
|
|
CIRCLE = SPECIAL AND ACCUM[0] = 45#,
|
|
LOCKIT =IDENT AND ACCUM[0]="4LOCK "#,
|
|
COLON = SPECIAL AND ACCUM[0] = 47#,
|
|
QUADLFTARROW=51#,
|
|
REDUCT=52#,
|
|
ROTATE=53#,
|
|
SCANV=57#,
|
|
LINEBUFFSIZE=17#,
|
|
MAXPOLISH=100#, MESSIZE=10#,
|
|
MAXCONSTANT=30#,
|
|
MAXMEMACCESSES=3584#, %MAXSPROWS | SPRSIZE
|
|
MAXSYMBOL=30#,
|
|
MAXSPROWS=28#,
|
|
TYPEFIELD=[3:3]#,
|
|
OPTYPE=[1:2]#,
|
|
LOCFIELD=BACKP#,
|
|
ADDRFIELD=SPF#,
|
|
SYMTYPE=[3:3]#,
|
|
OPERAND=5#,
|
|
CONSTANT=2#,
|
|
OPERATOR=3#,
|
|
LOCALVAR=4#,
|
|
SYMTABSIZE=1#,
|
|
LFTPARENV=8#,
|
|
RGTPARENV=9#,
|
|
LFTBRACKETV=11#,
|
|
RGTBRACKETV=12#,
|
|
SEMICOLONV=15#,
|
|
QUAD=10#,
|
|
QQUAD=14#,
|
|
LFTARROWV=4#,
|
|
SORTUPV=55#,
|
|
SORTDNV=56#,
|
|
ALPHALABEL=1#,
|
|
NUMERICLABEL=2#,
|
|
NEXTLINE=0#,
|
|
ERRORCOND=3#,
|
|
PRESENCE=[2:1]#,
|
|
CHANGE=[1:1]#,
|
|
XEQ=1#,
|
|
CLEARCORE=2#,
|
|
WRITECORE=3#,
|
|
%%%
|
|
%%%
|
|
XEQUTE=1#,
|
|
SLICE=120#, %TIME SLICE IN 60THS OF A SECOND
|
|
ALLOC=2#,
|
|
WRITEBACK=3#,
|
|
LOOKATSTACK=5#,
|
|
|
|
LEN=[1:23]#,
|
|
NEXT=[24:24]#,
|
|
LOC=L.[30:11],L.[41:7]#,
|
|
NOC=N.[30:11],N.[41:7]#,
|
|
MOC=M.[30:11],M.[41:7]#,
|
|
SPRSIZE=128#, % SP ROW SIZE
|
|
NILADIC=0#,
|
|
MONADIC=1#,
|
|
DYADIC=2#,
|
|
TRIADIC=3#,
|
|
DEPTHERROR=1#,
|
|
DOMAINERROR=2#,
|
|
INDEXERROR=4#,
|
|
LABELERROR=5#,
|
|
LENGTHERROR=6#,
|
|
NONCEERROR=7#,
|
|
RANKERROR=8#,
|
|
SYNTAXERROR=9#,
|
|
SYSTEMERROR=10#,
|
|
VALUEERROR=11#,
|
|
SPERROR=12#,
|
|
KITEERROR=13#,
|
|
STREAMBASE=59823125#, 00032200P17
|
|
APLOGGED=[10:1]#,
|
|
APLHEADING=[11:1]#,
|
|
CSTATION = STATION#,
|
|
CAPLOGGED=10:47:1#,
|
|
CAPHEADING=11:47:1#,
|
|
APLCODE = STATIONPARAMS#,
|
|
|
|
|
|
SPECMODE = BOUNDARY.[1:3]#,
|
|
DISPLAYIMG=1#,
|
|
EDITING=2#,
|
|
DELETING=3#,
|
|
RESEQUECING=4#,
|
|
LOWER = BOUNDARY.[4:22]#,
|
|
UPPER = BOUNDARY.[26:22]#,
|
|
OLDBUFFER = OLDINPBUFFER[*]#,
|
|
|
|
ENDEFINES=#;
|
|
REAL ADDRESS, ABSOLUTEADDRESS,
|
|
LADDRESS;
|
|
BOOLEAN LINETOG; %GO TO NEXT LINE IF TRUE WHEN WRITING OUT
|
|
INTEGER BUFFSIZE,ITEMCOUNT,RESULT,
|
|
LOGINSIZE,
|
|
%%%
|
|
ERR,
|
|
NROWS,
|
|
%%%
|
|
CUSER;
|
|
LABEL ENDOFJOB,TRYAGAIN;
|
|
REAL GT1,GT2,GT3;
|
|
DEFINE LINE=PRINT#;
|
|
SAVE ARRAY BUFFER[0:MAXBUFFSIZE];
|
|
ARRAY TARRAY[0:8],
|
|
COMMENT PROGRAM STATE REGISTER;
|
|
PSRM[0:PSRSIZE],
|
|
OLDINPBUFFER[0:MAXBUFFSIZE],
|
|
SP[0:27, 0:SPRSIZE-1],
|
|
IDTABLE[0:TABSIZE],
|
|
MESSTAB[0:MAXMESS],
|
|
JIGGLE[0:0],
|
|
SCR[0:2],
|
|
CORRESPONDENCE[0:7],
|
|
ACCUM[0:MAXBUFFSIZE];
|
|
DEFINE OUTBUFFSIZE=29#,CLOGGED=7:47:1#,STU=15:9:9#;
|
|
ARRAY OUTBUFF[0:OUTBUFFSIZE];
|
|
ALPHA STATION, JOBNUM, STATIONPARAMS, BOUNDARY;
|
|
INTEGER CHRCOUNT, WORKSPACE;
|
|
|
|
STREAM PROCEDURE INITBUFF(B,BUFFSIZE); VALUE BUFFSIZE;
|
|
BEGIN
|
|
DI~B; BUFFSIZE(DS~8LIT" "); DS~LIT"~";
|
|
END;
|
|
STREAM PROCEDURE TRANSFER(A,AS,B,BS,L); VALUE AS,BS,L;
|
|
BEGIN LOCAL T,U,V;
|
|
SI:=LOC AS; DI:=LOC T; DI:=DI+1; DS:=7CHR;
|
|
SI:=LOC BS; DI:=LOC U; DI:=DI+1; DS:=7CHR;
|
|
SI:=LOC L; DI:=LOC V; DI:=DI+1; DS:=7CHR;
|
|
SI:=A; T(2(SI:=SI+32)); SI:=SI+AS;
|
|
DI:=B; U(2(DI:=DI+32)); DI:=DI+BS;
|
|
V(2(DS:=32CHR)); DS:=L CHR;
|
|
END;
|
|
REAL PROCEDURE NUMBER; FORWARD; %LINE 111500
|
|
BOOLEAN PROCEDURE SCAN;
|
|
BEGIN
|
|
REAL STREAM PROCEDURE GNC(ADDR,ACC); VALUE ADDR;
|
|
BEGIN SI:=ADDR; DI:=ACC; DI:=DI+7; DS:=CHR; GNC:=SI;
|
|
DI:=ACC; SKIP DB; DS:=SET; END OF GNC;
|
|
REAL STREAM PROCEDURE RESWD(TAB,BUF,ADDR,EOB,FOUND,K);
|
|
VALUE ADDR,K;
|
|
BEGIN
|
|
LOCAL T,TSI,TDI;
|
|
LABEL TRY,L,KEEPGOING,FINIS,RESTORE;
|
|
LABEL NUMBERFOUND;
|
|
DI:=EOB; DS:=8LIT"0"; DI:=FOUND; DS:=8LIT"0";
|
|
SI:=ADDR;
|
|
L: IF SC NEQ " " THEN GO TO KEEPGOING;
|
|
SI:=SI+1;
|
|
GO TO L;
|
|
KEEPGOING:
|
|
RESWD:=SI;
|
|
ADDR:=SI;
|
|
IF SC GEQ "0" THEN IF SC LEQ "9" THEN GO TO NUMBERFOUND;
|
|
IF SC="#" THEN GO TO NUMBERFOUND; 00059100P18
|
|
IF SC="@" THEN GO TO NUMBERFOUND;
|
|
IF SC="." THEN
|
|
BEGIN SI:=SI+1;
|
|
IF SC GEQ "0" THEN IF SC LEQ "9" THEN
|
|
GO TO NUMBERFOUND; SI:=SI-1;
|
|
END;
|
|
DI:=LOC T; DS:=2RESET; DS:=2SET; DS:=2RESET;
|
|
DI:=LOC T;
|
|
IF SC=DC THEN
|
|
BEGIN DI:=EOB; DI:=DI+7; DS:=LIT"1";
|
|
GO TO FINIS
|
|
END;
|
|
SI:=TAB; TSI:=SI;
|
|
TRY:
|
|
IF SC="0" THEN
|
|
BEGIN SI:=ADDR;
|
|
IF SC=ALPHA THEN
|
|
IF SC GEQ"0" THEN
|
|
IF SC LEQ "9" THEN
|
|
NUMBERFOUND:
|
|
TALLY:=2 ELSE TALLY := 0
|
|
ELSE TALLY:=1
|
|
ELSE TALLY:=3;
|
|
T:=TALLY; SI:=LOC T; SI:=SI+7; DI:=FOUND; DI:=DI+7;
|
|
DS:=CHR; GO FINIS;
|
|
END;
|
|
DI:=LOC T; DI:=DI+7; DS:=CHR;
|
|
DI:=ADDR;
|
|
IF T SC=DC THEN
|
|
BEGIN
|
|
TSI:=SI; TDI:=DI; SI:=SI-1;
|
|
IF SC=ALPHA THEN
|
|
BEGIN DI:=DI+16; SI:=TDI;
|
|
IF SC NEQ " " THEN IF SC =ALPHA THEN ;
|
|
END;
|
|
SI:=TSI;
|
|
END ELSE GO TO RESTORE;
|
|
IF TOGGLE THEN
|
|
RESTORE:
|
|
BEGIN SI:=SI+K; DI:=ADDR; GO TO TRY
|
|
END;
|
|
DI:=FOUND; DS:=K OCT;
|
|
DI:=TDI; RESWD:=DI;
|
|
FINIS:
|
|
END;
|
|
REAL STREAM PROCEDURE ACCUMULATE(ACC,EDB,ADDR); VALUE ADDR;
|
|
BEGIN LOCAL T; LABEL EOBL,E,ON,L;
|
|
DI:=ACC; 9(DS:=8LIT" ");
|
|
DI:=EOB; DS:=8LIT"0"; SI:=ADDR; DI:=LOC T; SKIP 2 DB;
|
|
DS:=2SET; DI:=LOC T;
|
|
63(IF SC=ALPHA THEN TALLY:=TALLY+1 ELSE JUMP OUT TO E;
|
|
SI:=SI+1);
|
|
L: IF SC=ALPHA THEN BEGIN SI:=SI+1; GO L END ELSE GO ON;
|
|
IF SC=" " THEN GO ON;
|
|
E: IF SC = DC THEN ;
|
|
SI:=SI-1; IF TOOGLE THEN GO TO EOBL ELSE GO ON;
|
|
EOBL: DI:=EOB; DI:=DI+7; DS:=LIT"1";
|
|
ON: ACCUMULATE:=SI; DI:=ACC; T:=TALLY; SI:=LOC T; SI:=SI+6;
|
|
DS:=2CHR; SI:=ADDR; DS:=T CHR;
|
|
END OF ACCUMULATE;
|
|
BOOLEAN STREAM PROCEDURE ARROW(ADDR,I); VALUE ADDR,I;
|
|
BEGIN SI:=ADDR; SI:=SI-1; DI:=LOC I; DI:=DI+7;
|
|
IF SC=DC THEN TALLY:=1; ARROW :=TALLY
|
|
END OF ARROW;
|
|
IF NOT BOOLEAN(EOB) THEN BEGIN
|
|
LADDRESS:=ADDRESS;
|
|
ADDRESS:=RESWD(IDTABLE,BUFFER,ADDRESS,EOB,FOUND,2);
|
|
IF RESULT:=FOUND NEQ 0 THEN BEGIN
|
|
IF RESULT=1 THEN ADDRESS:=ACCUMULATE(ACCUM,EOB,ADDRESS)
|
|
ELSE IF RESULT=2 THEN ACCUM[0]:=NUMBER
|
|
ELSE IF RESULT=3 THEN ADDRESS:=GNC(ADDRESS,ACCUM)
|
|
ELSE BEGIN ACCUM[0]:=RESULT; RESULT:=3 END;
|
|
ITEMCOUNT:=ITEMCOUNT+1;
|
|
SCAN:=TRUE;
|
|
IF ARROW(ADDRESS,31) THEN
|
|
BEGIN EOB:=1; SCAN:=FALSE END;
|
|
END ELSE EOB:=1;
|
|
END;
|
|
END OF THE SCAN PROCEDURE;
|
|
PROCEDURE FORMROW(CC,BL,A,S,N); VALUE CC,RL,S,N;
|
|
INTEGER CC,BL,S,N; ARRAY A[0]; FORWARD
|
|
;
|
|
PROCEDURE INDENT(R); VALUE R; REAL R; FORWARD; 00096300P19
|
|
PROCEDURE TERPRINT; FORWARD;
|
|
PROCEDURE PROCESS(MODE);VALUE MODE;INTEGER MODE; FORWARD;
|
|
REAL STREAM PROCEDURE ABSADDR(A);
|
|
BEGIN SI:=A; ABSADDR:=SI
|
|
END;
|
|
BOOLEAN PROCEDURE LIBRARIAN(MFID,FID); VALUE MFID,FID;
|
|
REAL MFID,FID;
|
|
BEGIN
|
|
REAL ARRAY A[0:6]; FILE DF DISK(1,1);
|
|
REAL T;
|
|
COMMENT LIBRARIAN IS TRUE IF MFID/FID IS PRESENT ON DISK;
|
|
FILL DF WITH MFID,FID;
|
|
SEARCH(DF,A[*]);
|
|
LIBRARIAN:=
|
|
A[0]!-1;
|
|
END;
|
|
FILE SPO 11(1,3);
|
|
PROCEDURE SPOUT(K); VALUE K; INTEGER K;
|
|
BEGIN FORMAT ERRF("APL ERROR:",I8,A1);
|
|
WRITE(SPO,ERRF,K,31);
|
|
END;
|
|
PROCEDURE INITIALIZETABLE;
|
|
BEGIN DEFINE STARTSEGMENT= #;
|
|
INTEGER I;
|
|
LADDRESS:=
|
|
ABSOLUTEADDRESS:=ABSADDR(BUFFER);
|
|
BIGGEST := REAL(NOT FALSE) & 0[1:46:2];
|
|
NULLV := 0 & 3[1:46:2];
|
|
STATUSWORD~REAL(BOOLEAN(STATUSWORD) OR BOOLEAN(1));
|
|
JOBNUM~TIME(-1);
|
|
STATION~0&1[CLOGGED]&STATUSWORD[STU];
|
|
FILL JIGGLE[*] WITH OCT5757575757575737;%CARRIAGE RETURNS LEFT ARROW
|
|
FILL IDTABLE[*] WITH
|
|
"1+481-49", "1&501%07", "1.171@19", "1#411(08",
|
|
"1)091/06", "3XEQ623L", "OG541;15", OCT0333777601040177,
|
|
%LAST IN ABOVE LINE IS REALLY 3["]141"
|
|
"202:=042", "[]101[11", "1]123AND", "212OR223",
|
|
"NOT233LS", "S243LEQ2", "53GEQ273", "GTR283NE", "Q292=:05",
|
|
"2GO051=2", "63MAX304", "CEIL303F", "LR313MIN",
|
|
"314RESD3","23ABS323","RHO341*1","84IOTA35",
|
|
"1|384RND", "M425TRAN", "S431$133", "PHI374FA",
|
|
"CT404COM", "B406CIRC", "LE456SOR", "TUP556SO",
|
|
"RTDN561:", "474NAND5", "83NOR594", "TAKE604D",
|
|
"ROP613RE", "P446BASV", "AL393EPS", "331,1600";
|
|
COMMENT IDTABLE IS TABLE OF RESERVED WORDS AND SPECIAL SYMBOLS.
|
|
FORMAT IS NUMBER OF CHARACTERS IN SYMBOL, FOLLOWED BY SYMBOL
|
|
ITSELF, FOLLOWED BY A TWO-DIGIT DECIMAL CODE WHICH APL USES
|
|
FOR THE RESERVED WORD--LIKE IN THE EXECUTION CASE STATEMENT AND
|
|
IN SYNTAX CHECKING. FOR SCAN TO WORK, THE TWO-DIGIT CODE MUST
|
|
BE GREATER THAN 3 AND IDTABLE MUST HAVE AT LEAST ONE "0" AT THE
|
|
END TO MARK THE END. TABSIZE IS THE DEFINE (LINE 30000) GIVING
|
|
THE SIZE OF IDTABLE;
|
|
IF STACKSIZE=0 THEN STACKSIZE:=100 ELSE
|
|
IF STACKSIZE GTR 1022 THEN STACKSIZE:=1022;
|
|
BUFFSIZE:=MAXBUFFSIZE;
|
|
LINETOG := TRUE; %USUALLY GO TO NEXT LINE WHEN WRITING OUT
|
|
|
|
INITBUFF(OUTBUFF, 10);
|
|
INITBUFF(BUFFER,BUFFSIZE);
|
|
NROWS:=-1;
|
|
NAME(LIBJOB,TIME(-1));
|
|
FILL MESSTAB[*] WITH
|
|
"4SAVE ",
|
|
"4LOAD ",
|
|
"5CLEAR ",
|
|
"4COPY ",
|
|
"4VARS ",
|
|
"3FNS ",
|
|
"6LOGGED",
|
|
"3MSG ",
|
|
"5WIDTH ",
|
|
"3OPR ",
|
|
"6DIGITS",
|
|
"3OFF ",
|
|
"6ORIGIN",
|
|
"4SEED ",
|
|
"4FUZZ ",
|
|
"3SYN ",
|
|
"5NOSYN ",
|
|
"5STORE ",
|
|
"5ABORT ",
|
|
"2SI ",
|
|
"3SIV ", 00105360P20
|
|
"5ERASE ",
|
|
%--------------MASTERMODE BELOW HERE...(SEE USERTOP)--------
|
|
"6ASSIGN",
|
|
"6DELETE",
|
|
"4LIST ",
|
|
"5DEBUG ",
|
|
"5FILES ";
|
|
|
|
IF LIBSIZE=-1 THEN
|
|
BEGIN LIBSIZE~1;GTA[0]~" ";STOREORD(LIBRARY,GTA,0);WRAPUP;
|
|
END ELSE BEGIN LIBSIZE~SIZE(LIBRARY);
|
|
FOR I~1 STEP 1 UNTIL LIBSIZE-1 DO
|
|
BEGIN GT1~CONTENTS(LIBRARY,I,ACCUM);
|
|
IF NOT LIBRARIAN(ACCUM[0],TIME(-1)) THEN
|
|
BEGIN DELETE1(LIBRARY,I);LIBSIZE~LIBSIZE-1;END;
|
|
IF (LOGINSIZE:=SIZE(LOGINCODES)=0) THEN
|
|
END;
|
|
END;
|
|
FILL CORRESPONDENCE[*] WITH
|
|
OCT1111111111110311,
|
|
OCT1111111111111111,
|
|
OCT1104111121221113,
|
|
OCT2014151617100706,
|
|
OCT1111111111111112,
|
|
OCT1111111111111100,
|
|
OCT0201111111251111,
|
|
OCT2324111111111111;
|
|
COMMENT CORRESPONDENCE GIVES THE CORRESPONDENCE BETWEEN THE
|
|
APL CODES FOR DYADIC SCALAR OPERATORS (EXCEPT CIRCLE) AND
|
|
THEIR POSITIONS IN THE "CASE STATEMENT" IN "OPERATION".
|
|
E.G. APL CODE 7 IS "OPERATION" CODE 3 IN OCTAL (FOR DIVIDE).
|
|
IF N-TH CHARACTER IN CORRESPONDECE IS OCTAL 11, THEN N
|
|
IS NOT AN APL CODE FOR A DYADIC SCALAR OPERATOR. CHARACTER
|
|
COUNT STARTS AT 1 FOR FIRST CHARACTER. TO MAKE IT COME OUT
|
|
RIGHT, STREAM PROCEDURE GETOP IS ACTUALLY CALLED WITH APL
|
|
OPERATION CODE MINUS 1;
|
|
END;
|
|
REAL STREAM PROCEDURE CONV(ADDR,N);
|
|
VALUE N,ADDR;
|
|
BEGIN SI:=ADDR;
|
|
DI:=LOC CONV;
|
|
DS:=N OCT; END;
|
|
REAL STREAM PROCEDURE BUMP(ADDR,N); VALUE ADDR,N;
|
|
BEGIN SI:=ADDR; SI:=SI+N; BUMP:=SI; END;
|
|
REAL PROCEDURE NUMBER;
|
|
BEGIN REAL NCHR;
|
|
LABEL GETFRAC,GETPOWER,QUIT,KITE;
|
|
MONITOR EXPOVR;
|
|
REAL PROCEDURE INTCON(COUNT); VALUE COUNT;
|
|
REAL COUNT;
|
|
BEGIN REAL TLO,THI,T; INTEGER N;
|
|
BOOLEAN DPTOG; DEFINE ADDR=ADDRESS#;
|
|
COMMENT: VALUE OF INTCON IS THE CONVERSION OF AN INTEGER
|
|
CONSISTING OF COUNT NUMERICAL CHARACTERS STARTING
|
|
AT THE CHARACTER ADDRESS. ADDRESS IS SET TO POINT
|
|
TO THE NEXT CHARACTER DURING INTCON;
|
|
DPTOG:=COUNT GTR 8;
|
|
THI:=T:=CONV(ADDR,N:=COUNT MOD 8);
|
|
ADDR:=BUMP(ADDR,N);
|
|
COUNT:=COUNT DIV 8;
|
|
FOR N:=1 STEP 1 UNTIL COUNT DO BEGIN
|
|
IF DPTOG THEN BEGIN
|
|
DOUBLE(THI,TLO,100000000.0,0,|,CONV(ADDR,8),
|
|
0,+,:=,THI,TLO);
|
|
T:=THI
|
|
END ELSE T:=T|100000000 + CONV(ADDR,8);
|
|
ADDR:=BUMP(ADDR,8); END;
|
|
INTCON:=T;
|
|
END OF INTCON;
|
|
INTEGER STREAM PROCEDURE SUBSCAN(ADDR,NEXT); VALUE ADDR;
|
|
BEGIN SI:=ADDR;
|
|
63(IF SC GEQ "0" THEN
|
|
IF SC LEQ "9" THEN BEGIN SI:=SI+1; TALLY:=TALLY+1;
|
|
END ELSE JUMP OUT);
|
|
DI:=NEXT; DI:=DI+7; DS:=1 CHR; SUBSCAN:=TALLY;
|
|
END;
|
|
COMMENT--VALUE OF SUBSCAN IS NUMBER OF NUMERIC CHARACTERS
|
|
FOUND. NEXT CONTAINS THE FIRST NON-NUMERIC CHARACTER;
|
|
EXPOVR:=KITE;
|
|
MANTSIGN:=1;
|
|
MANT:=MANTLEN:=POWER:=POWERLEN:=FRAC:=FRACLEN:=0;
|
|
MANLEN:=SUBSCAN(ADDRESS,NCHR);
|
|
IF MANTLEN=0 AND NCHR="#" THEN BEGIN 00130500P21
|
|
MANTSIGN:=-1;
|
|
ADDRESS:=BUMP(ADDRESS,1);
|
|
MANTLEN:=SUBSCAN(ADDRESS,NCHR); END;
|
|
IF MANTLEN=0 THEN BEGIN ADDRESS:=BUMP(ADDRESS,1);
|
|
IF NCHR="." THEN GO TO GETFRAC
|
|
ELSE IF NCHR="@" OR NCHR="E" THEN GO TO GETPOWER
|
|
ELSE BEGIN ERR:=SYNTAXERROR;
|
|
GO TO QUIT; END; END;
|
|
MANT:=INTCON(MANTLEN);
|
|
IF NCHR="." THEN BEGIN ADDRESS:=BUMP(ADDRESS,1); GO GETFRAC END;
|
|
IF NCHR="@" OR NCHR="E" THEN BEGIN
|
|
ADDRESS:=BUMP(ADDRESS,1); GO TO GETPOWER END;
|
|
IF NCHR=12 THEN EOB:=1;
|
|
GO TO QUIT;
|
|
GETFRAC: FRACLEN:=SUBSCAN(ADDRESS,NCHR);
|
|
IF FRACLEN=0 THEN BEGIN ERR:=SYNTAXERROR; GO TO QUIT; END;
|
|
FRAC:=INTCON(FRACLEN);
|
|
IF NCHR="@" OR NCHR="E" THEN BEGIN
|
|
ADDRESS:=BUMP(ADDRESS,1); GO TO GETPOWER; END;
|
|
IF NCHR=12 THEN EOB:=1 ELSE
|
|
IF NCHR="." OR NCHR="#" THEN ERR:=SYNTAXERROR;
|
|
GO TO QUIT;
|
|
GETPOWER:
|
|
POWERLEN:=SUBSCAN(ADDRESS,NCHR);
|
|
IF POWERLEN=0 THEN BEGIN
|
|
IF NCHR="-" OR NCHR="#" THEN POWER:=-1
|
|
ELSE IF NCHR="+" THEN POWER:=1
|
|
ELSE BEGIN ERR:=SYNTAXERROR; GO TO QUIT; END;
|
|
POWERLEN:=SUBSCAN(ADDRESS:=BUMP(ADDRESS,1), NCHR);
|
|
END ELSE POWER:=1;
|
|
IF POWERLEN=0 THEN ERR:=SYNTAXERROR
|
|
ELSE BEGIN
|
|
POWER:=INTCON(POWERLEN)|POWER;
|
|
IF NCHR="#" OR NCHR="@" OR NCHR="."
|
|
THEN ERR:=SYNTAXERROR; END;
|
|
GO TO QUIT;
|
|
KITE: ERR:=KITEERROR;
|
|
QUIT: IF ERR=0 THEN
|
|
NUMBER:=IF MANTLEN+FRACLEN=0 THEN
|
|
IF POWERLEN=0 THEN 0
|
|
ELSE MANTSIGN|10*ENTIER(POWER)
|
|
ELSE MANTSIGN|(MANT|10*ENTIER(POWER)
|
|
+ FRAC|10*ENTIER(POWER-FRACLEN)) ELSE EOB:=1;
|
|
END OF NUMBER;
|
|
STREAM PROCEDURE APPENDTOBUFF(BUF,NBUF,NBLANK,A,SA,NA);
|
|
VALUE NBUF,NBLANK,SA,NA;
|
|
BEGIN LOCAL T;
|
|
LOCAL TSI,TDI;
|
|
SI:=LOC NBUF; DI:=LOC T; DI:=DI+1; DS:=7CHR;
|
|
DI:=BUF; T(2(DI:=DI+32)); DI:=DI+NBUF;
|
|
NBLANK(DS:=LIT" "); TDI:=DI;
|
|
SI:=LOC SA; DI:=LOC T; DI:=DI+1; DS:=7CHR;
|
|
SI:=A; T(2(SI:=SI+32)); SI:=SI+SA;
|
|
TSI:=SI; SI:=LOC NA; DI:=LOC T; DI:=DI+1; DS:=7CHR;
|
|
SI:=TSI; DI:=TDI; T(2(DS:=32CHR)); DS:=NA CHR
|
|
END;
|
|
PROCEDURE TERPRINT;
|
|
BEGIN LABEL BK;
|
|
STREAM PROCEDURE FINISHBUFF(BUF,N,TER);VALUE N,TER;
|
|
BEGIN LOCAL T;
|
|
SI:=LOC TER;SI:=SI+7;IF SC="1" THEN;
|
|
SI:=LOC N; DI:=LOC T; DI:=DI+1; DS:=7 CHR;
|
|
DI:=BUF; T(2(DI:=DI+32));DI:=DI+N;
|
|
IF TOOGLE THEN DS:=2 LIT"{!"; %CARRIAGE RETURN/LINE FEED
|
|
DS:=RESET;DS:=5 SET; %END OF MESSAGE LEFT ARROW
|
|
END OF FINISHBUFF;
|
|
IF CHRCOUNT NEQ 0 THEN BEGIN
|
|
FINISHBUFF(OUTBUFF,CHRCOUNT,LINETOG);
|
|
CHRCOUNT:=0;
|
|
IF LINETOG THEN
|
|
WRITE(TWXOUT,9,OUTBUFF[*])[BK:BK] ELSE
|
|
WRITE(TWXOUT[STOP],9,OUTBUFF[*])[BK:BK];
|
|
INITBUFF(OUTBUFF, 10);
|
|
END;
|
|
IF FALSE THEN
|
|
OK: IF CURRENTMODE=XEQMODE THEN BREAKFLAG:=TRUE;
|
|
END OF TERPRINT;
|
|
PROCEDURE FORMWD(CC,WD); VALUE CC,WD; REAL WD; INTEGER CC;
|
|
BEGIN
|
|
INTEGER I,K,L;
|
|
COMMENT CC=-1 STAY ON LINE, OUTPUT, DON"T GO TO NEXT LINE
|
|
COMMENT CC=0 STAY ON THIS LINE, MORE TO COME.
|
|
CC=1 STAY ON THIS LINE BUT TERMINATE PRINT. 00257000P22
|
|
CC=2 SKIP TO NEXT LINE - MORE TO COME.
|
|
CC=3 SKIP TO NEXT LINE - TERMINATE PRINT.;
|
|
REAL STREAM PROCEDURE OCTAL(I); VALUE I;
|
|
BEGIN SI:=LOC I; DI:=LOC OCTAL; DS:=8OCT
|
|
END;
|
|
IF L:=LINESIZE LEQ 9 OR L GTR 72 THEN L:=72; K:=2;
|
|
IF CC GTR 1 AND CHRCOUNT GTR OTHEN TERPRINT;
|
|
IF CHRCOUNT+(I:=OCTAL(WD.[1:11])) GTR L THEN
|
|
|
|
BEGIN APPENDTOBUFF(LINEBUFFER,CHRCOUNT,
|
|
0,WD,2,K:=L-CHRCOUNT);
|
|
CHRCOUNT:=L; TERPRINT;
|
|
|
|
I:=I-K;
|
|
|
|
END;
|
|
APPENDTOBUFF(LINEBUFFER,CHRCOUNT,0,WD,K,I);
|
|
|
|
CHRCOUNT:=CHRCOUNT+I;
|
|
IF BOOLEAN(CC) THEN
|
|
IF CC=-1 THEN BEGIN LINETOG:=FALSE;
|
|
TERPRINT; LINETOG:=TRUE
|
|
END ELSE TERPRINT;
|
|
END;
|
|
BOOLEAN PROCEDURE FUNCTIONHEADER(SPECS,HADDR);
|
|
ARRAY SPECS[0]; REAL HADDR; FORWARD;
|
|
|
|
|
|
|
|
REAL PROCEDURE LINENUMBER(R); VALUE R; REAL R;
|
|
COMMENT STARTS ON 8030000;
|
|
FORWARD;
|
|
|
|
PROCEDURE INDENT(R); VALUE R; REAL R;
|
|
BEGIN
|
|
INTEGER STREAM PROCEDURE FORM(A,I,K);VALUE K,I;
|
|
BEGIN
|
|
LOCAL T1,T2;
|
|
LABEL SHORT,L,M,FINIS;
|
|
TALLY:=K; FORM:=TALLY;
|
|
SI:=LOC I; DI:=LOC T1; IF 8SC=DC THEN
|
|
BEGIN DI:=A; K(DS:=LIT" "); GO FINIS
|
|
END;
|
|
SI:=LOC I; DI:=A; TALLY:=3; DS:=LIT"[";
|
|
IF SC GTR "0" THEN IF SC LSS "0" THEN ;
|
|
3(TALLY:=TALLY+1; IF TOGGLE THEN DS:=CHR ELSE
|
|
IF SC NEQ "0" THEN DS:=CHR ELSE
|
|
BEGIN TALLY:=TALLY+63; SI:=SI+1
|
|
END );
|
|
DS:=CHR; T1:=TALLY; TALLY:=4; SI:=SI+3;
|
|
4(IF SC NEQ "0" THEN JUMP OUT TO M;
|
|
TALLY:=TALLY+63; SI:=SI-1); GO TO L;
|
|
M:
|
|
T2:=TALLY; SI:=LOC I; SI:=SI+4; DS:=LIT"."; DS:=T2 CHR;
|
|
TALLY:=T1; TALLY:=TALLY+T2; TALLY:=TALLY+1; T1:=TALLY;
|
|
L:
|
|
DS:=LIT"]"; TALLY:=K;
|
|
T1(TALLY:=TALLY+63; T2:=TALLY; SI:=LOC T2; SI:=SI+7;
|
|
IF SC="0" THEN JUMP OUT TO SHORT);
|
|
T2(DS:=LIT" "); GO FINIS;
|
|
SHORT:
|
|
TALLY:=T1; TALLY:=TALLY+1; FORM:=TALLY; DS:=LIT" ";
|
|
FINIS:
|
|
DS:=RESET; DS:=5SET;
|
|
END;
|
|
IF R LSS 0 THEN R:=LINENUMBER(-R) ELSE R:=ABS(R); % -0
|
|
CHRCOUNT:=FORM(LINEBUFF,R,MARGINSIZE)+1
|
|
|
|
END;
|
|
INTEGER PROCEDURE HEADER(ADDR1,ADDR2,BUF); VALUE ADDR1,ADDR2;
|
|
INTEGER ADDR1, ADDR2; ARRAY BUF[0];
|
|
BEGIN
|
|
INTEGER STREAM PROCEDURE HEADRR(ADDR1,ADDR2,BUF); VALUE ADDR1,
|
|
ADDR2;
|
|
BEGIN
|
|
LOCAL C,T,TDI;
|
|
LOCAL QM,AR;
|
|
LABEL L,ENDSCAN,M,N;
|
|
DI:=LOC QM; DS:=2RESET; DS:=2SET;
|
|
DI:=LOC AR; DS:=RESET; DS:=5SET;
|
|
DI:=BUF;
|
|
SI:=ADDR1;
|
|
L: T:=SI; TDI:=DI 00287210P23
|
|
DI:=LOC QM; IF SC=DC THEN GO TO ENDSCAN;
|
|
DI:=LOC AR; SI:=SI-1; IF SC=DC THEN GO TO ENDSCAN;
|
|
SI:=LOC T; DI:=LOC ADDR2;
|
|
IF 8SC=DC THEN COMMENT END OF SCAN;
|
|
GO TO ENDSCAN;
|
|
SI:=T; DI:=TDI; DS:=CHR;
|
|
GO TO L;
|
|
ENDSCAN:
|
|
SI:=TDI;
|
|
M: SI:=SI-1;
|
|
IF SC=" " THEN GO TO M;
|
|
SI:=SI+1;
|
|
ADDR2:=SI;
|
|
SI:=BUF;
|
|
N: T:=SI; DI:=LOC ADDR2;
|
|
SI:=LOC T;
|
|
IF 8SC NEQ DC THEN
|
|
BEGIN
|
|
TALLY:=TALLY+1; TDI:=TALLY;
|
|
SI:=LOC TDI; SI:=SI+7;
|
|
IF SC="0" THEN
|
|
BEGIN TALLY:=C; TALLY:=TALLY+1; C:=TALLY;
|
|
TALLY:=0;
|
|
END;
|
|
SI:=T; SI:=SI+1; GO TO N;
|
|
END;
|
|
HEADRR:=TALLY; SI:=LOC C; DI:=LOC HEADRR; SI:=SI+1; DS:=6 CHR;
|
|
END;
|
|
HEADER:=HEADRR(ADDR1,ADDR2,BUF);
|
|
END OF PHONY HEADER;
|
|
PROCEDURE STARTSCAN;
|
|
BEGIN
|
|
|
|
|
|
|
|
LADDRESS:=
|
|
ADDRESS:=ABSOLUTEADDRESS;
|
|
BEGIN TERPRINT;
|
|
END;
|
|
READ(TWXIN[STOP],29,BUFFER[*]);
|
|
BUFFER[30]:=0&31[1:43:5];
|
|
ITEMCOUNT:=0;
|
|
EOB:=0
|
|
END;
|
|
PROCEDURE FORMROW(CC,BL,A,S,N); VALUE CC,BL,S,N; INTEGER CC,BL,
|
|
S,N; ARRAY A[0];
|
|
COMMENT: CC--SAME CODE AS IN FORMWD, LINE 253000
|
|
BL--#BLANKS TO PUT IN FRONT OF IT
|
|
A--ARRAY WHERE THE STUFF TO PUT ON LINE IS STORED
|
|
S--#CHARACTERS TO SKIP AT START OF A
|
|
N--#CHARACTERS TO TAKE FROM A TO PUT ON OUTPUT LINE;
|
|
BEGIN INTEGER K;
|
|
INTEGER T;
|
|
IF CC GTR 1 AND CHRCOUNT GTR 0 THEN TERPRINT;
|
|
IF K:=LINESIZE LEQ 9 OR K GTR 72 THEN K:=72;
|
|
WHILE CHRCOUNT+N+BL GTR K DO
|
|
BEGIN
|
|
APPENDTOBUFFER(LINEBUFFER,CHRCOUNT,BL,A,S,T:=K-CHRCOUNT-BL);
|
|
CHRCOUNT:=K; TERPRINT;
|
|
S:=S+T; N:=N-T;
|
|
BL:=0;
|
|
END;
|
|
APPENDTOBUFFER(LINEBUFFER,CHRCOUNT,BL,A,S,N);
|
|
|
|
CHRCOUNT:=CHRCOUNT+N+BL;
|
|
IF BOOLEAN(CC) THEN
|
|
IF CC=-1 THEN BEGIN LINETOG:=FALSE;
|
|
TERPRINT; LINETOG:=TRUE;
|
|
END ELSE TERPRINT;
|
|
END;
|
|
PROCEDURE NUMBERCON(R,A); VALUE R; REAL R; ARRAY A[0];
|
|
BEGIN FORMAT F(F24.*), G(E24.*);
|
|
REAL S; DEFINE MAXIM = 10@9#;
|
|
|
|
STREAM PROCEDURE ADJUST(A,B);
|
|
BEGIN LOCAL T,FRAC,MANT,T1,TSI,TDI;
|
|
DI:=LOC T; DI:=DI+1; T1:=DI;
|
|
SI:=B; DI:=A; DI:=DI+2;
|
|
24(IF SC=" " THEN SI:=SI+1 ELSE
|
|
BEGIN TSI:=SI; SI:=LOC T;
|
|
IF SC="1" THEN; SI:=TSI;
|
|
IF TOGGLE THEN
|
|
IF SC NEQ "0" THEN 00342000P24
|
|
IF SC="@" THEN BEGIN
|
|
TSI:=SI; DI:=T1; DS:=LIT"1"; JUMP OUT;
|
|
END ELSE FRAC:=TALLY
|
|
ELSE TALLY := TALLY+0
|
|
ELSE
|
|
IF SC="." THEN
|
|
BEGIN MANT:=TALLY; TDI:=DI; DI:=LOC T; DS:=
|
|
LIT"1"; TALLY:=0;DI:=TDI;
|
|
END;
|
|
TALLY:=TALLY+1; DS:=CHR
|
|
END);
|
|
SI:=LOC MANT; SI:=SI+7; IF SC="0" THEN MANT:=TALLY;
|
|
|
|
TALLY:=MANT; SI:=LOC FRAC; SI:=SI+7; IF SC GTR "0"
|
|
THEN TALLY:=TALLY+1; TALLY:=TALLY+FRAC; MANT:=TALLY;
|
|
SI:=T1; IF SC="1" THEN BEGIN
|
|
DI:=A; DI:=DI+MANT; DI:=DI+2;
|
|
SI:=TSI; DS:=4CHR;
|
|
TALLY:=TALLY+4; MANT:=TALLY; END;
|
|
SI:=LOC MANT; SI:=SI+6; DI:=A; DS:=2CHR;
|
|
END;
|
|
IF S:=ABS(R) GEQ MAXIM OR S LEQ 10*(-DIGITS) AND S NEQ 0 THEN
|
|
WRITE(SCR[*],G,DIGITS,R) ELSE
|
|
WRITE(SCR[*],F,DIGITS,R);
|
|
ADJUST(A,SCR)
|
|
END;
|
|
PROCEDURE STOREPSR;
|
|
BEGIN INTEGER I;
|
|
DELETE1(WORKSPACE,0);
|
|
I:=STORESEQ(WORKSPACE,PSR,PSRSIZE|8);
|
|
COMMENT USED TO CALL WRAPUP;
|
|
END;
|
|
PROCEDURE RESCANLINE;
|
|
BEGIN ADDRESS:=ABSOLUTEADDRESS; EOB:=0; END;
|
|
PROCEDURE PROCESS(MODE);VALUE MODE; INTEGER MODE; FORWARD;
|
|
PROCEDURE MESSAGEHANDLER; FORWARD;
|
|
PROCEDURE FUNCTIONHANDLER; FORWARD;
|
|
PROCEDURE ERRORMESS(N,ADDR,R); VALUE N,ADDR,R; REAL R;
|
|
INTEGER N;REAL ADDR;FORWARD; COMMENT LINE 5000000;
|
|
STREAM PROCEDURE SETFIELD(A,S,L,R); VALUE S,L,R;
|
|
BEGIN DI:=A; DI:=DI+S; SI:=LOC R; SI:=SI+8; L(SI:=SI-1);
|
|
DS:=L CHR;
|
|
END;
|
|
COMMENT: VALUE OF GETFIELD IS L CHARACTERS, STARTING AT J-TH
|
|
CHARACTER OF A, RIGHT-ADJUSTED. L MUST BE LEQ 8 AND
|
|
J MUST BE LESS THAT 64;
|
|
REAL STREAM PROCEDURE GETFIELD(A,S,L); VALUE S,L;
|
|
BEGIN SI:=A; SI:=SI+S; DI:=LOC GETFIELD; DI:=DI+8; L(DI:=DI-1);
|
|
DS:=L CHR;
|
|
END;
|
|
REAL PROCEDURE TOPLINE(ORD); VALUE ORD; INTEGER ORD;
|
|
BEGIN
|
|
INTEGER STREAM PROCEDURE CON(A); VALUE A;
|
|
BEGIN SI:=LOC A; DI:=LOC CON; DS:=8OCT END;
|
|
ARRAY A[0:1]; INTEGER I;
|
|
I:=CONTENTS(ORD,SIZE(ORD)-1,A);
|
|
TOPLINE:=CON(A[0])/10000
|
|
END;
|
|
BOOLEAN PROCEDURE FUNCTIONHEADER(SPECS,HADDR);
|
|
ARRAY SPECS[0]; REAL HADDR;
|
|
BEGIN
|
|
LABEL A,B,C;
|
|
INTEGER P;
|
|
DEFINE NOTE=HADDR.[24:24]:=ADDRESS#,P8=8|P+1#;
|
|
ERR:=0;
|
|
SPECS[0]:=SPECS[1]:=SPECS[2]:=SPECS[3]:=0;
|
|
NOTE; HADDR.[1:23]:=GT1:=ADDRESS;
|
|
IF SCAN AND IDENT THEN
|
|
BEGIN
|
|
TRANSFER(ACCUM,2,SPECS,1,7);
|
|
NOTE;
|
|
IF SCAN THEN
|
|
IF LFTARROW THEN
|
|
BEGIN
|
|
SPECS[1]:=1;
|
|
SPECS[3]:=1;
|
|
TRANSFER(SPECS,1,SPECS,33,7);
|
|
GT2:=ADDRESS;
|
|
IF SCAN AND IDENT THEN
|
|
BEGIN
|
|
TRANSFER(ACCUM,2,SPECS,1,7);
|
|
NOTE;
|
|
IF SCAN THEN 00501600P25
|
|
C: IF IDENT THEN
|
|
BEGIN
|
|
P:=(SPECS[3]:=SPECS[3]+1)+3;
|
|
TRANSFER(ACCUM,2,SPECS,P8,7);
|
|
SPECS[2]:=1;
|
|
NOTE;
|
|
IF SCAN THEN IF IDENT THEN
|
|
BEGIN SPECS[2]:=2;
|
|
P:=(SPECS[3]:=SPECS[3]+1)+2;
|
|
TRANSFER(SPECS,1,SPECS,P8+8,7);
|
|
TRANSFER(SPECS,P8,SPECS,1,7);
|
|
TRANSFER(ACCUM,2,SPECS,P8,7);
|
|
|
|
B: NOTE; IF SCAN THEN
|
|
A: IF SEMICOLON THEN IF SCAN THEN
|
|
IF IDENT THEN
|
|
BEGIN
|
|
P:=(SPECS[3]:=SPECS[3]+1)+3;
|
|
TRANSFER(ACCUM,2,SPECS,P8,7);
|
|
GO TO B;
|
|
END ELSE GO TO A
|
|
ELSE ELSE ELSE
|
|
END ELSE GO TO A
|
|
ELSE END
|
|
ELSE GO TO A ELSE
|
|
END ELSE ERRORMESS(ERR:=1,GT2,0)
|
|
END ELSE GO TO C
|
|
ELSE
|
|
END ELSE ERRORMESS(ERR:=SYNTAXERROR,GT1,0);
|
|
FUNCTIONHEADER:=ERR=0;
|
|
ADDRESS:=HADDR.[24:24];
|
|
END FUNCTIONHEADER;
|
|
|
|
INTEGER PROCEDURE DAYTIME(B); ARRAY B[0]; FORWARD;
|
|
COMMENT ON LINE 8014000, ARRAY B MUST HAVE LENGTH
|
|
AT LEAST 3 WDS;
|
|
PROCEDURE EDITLINE; FORWARD;
|
|
INTEGER PROCEDURE LENGTH(A,M);VALUE M; BOOLEAN M; ARRAY A[0];
|
|
FORWARD; COMMENT LINE 8007900;
|
|
BOOLEAN PROCEDURE LABELSCAN(L,K); VALUE K; INTEGER K;
|
|
ARRAY L[0]; FORWARD; COMMENT LINE 8013910;
|
|
|
|
|
|
PROCEDURE CHECKSEQ(SEQ,L,INC); REAL SEQ,L,INC; FORWARD;
|
|
COMMENT ON LINE 8040000;
|
|
PROCEDURE RELEASEARRAY(D);VALUE D; REAL D;
|
|
BEGIN COMMENT RELEASE PERMANENT STORAGE FOR THE ARRAY DESC D;
|
|
INTEGER K,J,PT;
|
|
ARRAY BLOCK[0:32]; %SEE MAXWORDSTORE, LINE 17260
|
|
ARRAY TEMP[0:1];
|
|
IF D.RF NEQ 0 THEN
|
|
BEGIN DELETE1(WS,D.DIMPTR);
|
|
K:=CONTENTS(WS,D.INPTR,BLOCK)-1;
|
|
DELETE1(WS,D,INPTR);
|
|
FOR J:=0 STEP 2 UNTIL K DO
|
|
BEGIN TRANSFER(BLOCK,J,TEMP,6,2);
|
|
PT:=TEMP[0]; DELETE1(WS,PT); END;
|
|
END;
|
|
END;
|
|
PROCEDURE TRANSFERSP(DIR,SP,L,B,M,N); VALUE DIR,N,M,L;
|
|
INTEGER DIR,N,M,L;
|
|
ARRAY SP[0,0],B[0];
|
|
BEGIN COMMENT
|
|
DIR= INTO: TRANSFER N WORDS FROM B[L] INTO SP[M]
|
|
(ACTUALLY SP[*,M] SINCE ARRAY ROW IS USUALLY THE ARG)
|
|
DIR= OUTOF (OPPOSITE);
|
|
STREAM PROCEDURE MOVER(DIR,SP,M,B,L,N); VALUE DIR,
|
|
L,M,N;
|
|
BEGIN LOCAL T;
|
|
SI:=LOC L; DI:=LOC T; DI:=DI+1; DS:=7CHR;
|
|
SI:=SP; T(16(SI:=SI+32)); L(SI:=SI+8); L:=SI;
|
|
SI:=LOC M; DI:=LOC T; DI:=DI+1; DS:=7CHR;
|
|
SI:=B; T(16(SI:=SI+32)); M(SI:=SI+8); M:=SI;
|
|
SI:=LOC N; DI:=LOC T; DI:=DI+1; DS:=7CHR;
|
|
SI:=LOC DIR; SI:=SI+7;
|
|
IF SC="0" THEN
|
|
BEGIN SI:=M; DI:=L
|
|
END ELSE
|
|
BEGIN SI:=L ; DI:=M
|
|
END;
|
|
T(2(DS:=32WDS)); DS:=N WDS;
|
|
END;
|
|
INTEGER K; 03002210P26
|
|
WHILE N:=N-K GTR 0 DO
|
|
MOVER(DIR,SP[(L:=L+K)DIV SPRSIZE,*],
|
|
M:=M+K,B,K:=L MOD SPRSIZE,
|
|
K:=MIN(SPRSIZE-K,N))
|
|
END;
|
|
|
|
PROCEDURE DUMPOLISH(SP,PD); VALUE PD; REAL PD; ARRAY SP[0,0];
|
|
BEGIN INTEGER L;
|
|
LABEL SKIPREST;
|
|
INTEGER I,N,M,U; REAL T;
|
|
L:=PD.SPF;
|
|
I:=SP[LOC]+L;
|
|
FOR L:=L+2 STEP 1 UNTIL I DO
|
|
IF (T:=SP[LOC]).TYPEFIELD=FUNCTION THEN
|
|
BEGIN % OUTPUT MESSAGE AND NAME
|
|
FORMWD(2,"5FUNC: ");
|
|
N:=T.LOCFIELD; % N HAS LOCATION OF DESCRIPTOR
|
|
N:=N-1; % BACK UP ONE TO GET NAME
|
|
GTA[0]:=SP[NOC];
|
|
FORMROW(1,1,GTA,1,7);
|
|
END
|
|
ELSE % MIGHT BE AN OPERATOR
|
|
IF T.TYPEFIELD=OPERATOR THEN
|
|
BEGIN COMMENT OUTPUT MESSAGE AND OP CODE;
|
|
FORMWD(2,"5ATOR: ");
|
|
NUMBERCON(T.OPTYPE,ACCUM);
|
|
FORMROW(0,1,ACCUM,2,ACOUNT);
|
|
NUMBERCON(T.LOCFIELD,ACCUM);
|
|
FORMROW(1,1,ACCUM,2,ACOUNT);
|
|
END ELSE %MAY BE A CONSTANT
|
|
IF T.TYPEFIELD=CONSTANT THEN
|
|
BEGIN COMMENT GET DATA DESCRIPTOR;
|
|
N:=T.LOCFIELD;
|
|
FORMWD(2,"5CONS: ");
|
|
T:=SP[NOC]; %T HAS THE DATA DESCRIPTOR
|
|
IF T.SPF=0 THEN BEGIN % A NULL VECTOR
|
|
FORMWD(1,"4NULL ");
|
|
GO TO SKIPREST; END;
|
|
N:=T.SPF; %N HAS THE SCALAR OR TOP OF VECTOR LOC.
|
|
IF BOOLEAN(T.SCALAR) THEN M:=U:=N ELSE
|
|
BEGIN U:=SP[NOC]+N; M:=N+1; %UPPER AND LOWER BOUNDS
|
|
END;
|
|
IF BOOLEAN(T.CHRMODE) THEN %CHARACTER FORMAT
|
|
BEGIN COMMENT SP[NOC] IS NUMBER OF CHRS;
|
|
TRANSFERSP(OUTOF,SP,M,BUFFER,0,ENTIER(((T:=
|
|
SP[NOC])-1)DIV 8+1));
|
|
FORMROW(1,1,BUFFER,0,T);
|
|
END ELSE % SHOULD TEST FOR NULL...DO IT LATER.
|
|
FOR N:=M STEP 1 UNTIL U DO
|
|
BEGIN NUMBERCON(SP[NOC],ACCUM);
|
|
FORMROW(0,1,ACCUM,2,ACOUNT);
|
|
END;
|
|
TERPRINT;
|
|
SKIPREST:
|
|
END ELSE COMMENT MUST BE AN OPERAND;
|
|
IF T.TYPEFIELD=LOCALVAR THEN
|
|
BEGIN FORMWD(2,"5LOCL: ");
|
|
N:=T.SPF; % N HAS LOCATION OF NAME;
|
|
GTA[0]:=SP[NOC]; % PUT NAME IN GTA
|
|
FORMROW(1,1,GTA,1,7);
|
|
END ELSE
|
|
BEGIN COMMENT TREAT IT AS VARIABLE;
|
|
N:=T.LOCFIELD; COMMENT N HAS LOC OF DESCRIPTOR;
|
|
N:=N-1; COMMENT BACKUP OVER THE DESCRIPTOR;
|
|
GTA[0]:=SP[NOC];
|
|
FORMWD(2,"5AND : ");
|
|
FORMROW(1,1,GTA,1,7);
|
|
END;
|
|
END;
|
|
|
|
PROCEDURE PROCESS(MODE); VALUE MODE; INTEGER MODE;
|
|
BEGIN
|
|
OWN INTEGER J;
|
|
OWN REAL RESULTD;
|
|
LABEL EXPOVRL,INTOVRL,INDEXL,FLAGL,ZEROL;
|
|
MONITOR EXPOVR,INTOVR,INDEX,FLAG,ZERO;
|
|
LABEL DEBUGSP; %DEBUGGING PURPOSES ONLY.
|
|
INTEGER PROCEDURE BUILDCONSTANT(LASTCONSTANT);
|
|
INTEGER LASTCONSTANT; FORWARD;
|
|
INTEGER PROCEDURE GETSPACE(LENGTH); VALUE LENGTH;
|
|
INTEGER LENGTH; FORWARD;
|
|
PROCEDURE OPERANDTOSYMTAB(L);VALUE L;INTEGER L;FORWARD;
|
|
REAL PROCEDURE BUILDALPHA(LASTCONSTANT); 03100440P27
|
|
INTEGER LASTCONSTANT; FORWARD;
|
|
INTEGER PROCEDURE BUILDNULL(LASTCONSTANT);
|
|
INTEGER LASTCONSTANT; FORWARD;
|
|
PROCEDURE SCRATCHDATA(D);VALUE D;REAL D; FORWARD;
|
|
COMMENT LINE 3121400;
|
|
PROCEDURE FORGETPROGRAM(U);VALUE U;REAL U; FORWARD;
|
|
COMMENT ANALYZE IS IN PROCESS BECAUSE OWN ARRAY SP
|
|
IS ADDRESSED INCORRECTLY OTHERWISE;
|
|
REAL PROCEDURE ANALYZE(DISPLAYOP); VALUE DISPLAYOP;BOOLEAN DISPLAYOP;
|
|
BEGIN COMMENT
|
|
BC= BUILDCONSTANT,
|
|
GS= GET SPACE PROCEDURE ;
|
|
ARRAY INFIX[0:MAXPOLISH];
|
|
|
|
INTEGER LASTCONSTANT;
|
|
DEFINE GS=GETSPACE#;
|
|
BOOLEAN STREAM PROCEDURE EQUAL(A,B);
|
|
BEGIN SI:=A; SI:=SI+1; DI:=B; DI:=DI+2;
|
|
IF 7SC=DC THEN TALLY:=1;
|
|
EQUAL:=TALLY;
|
|
END;
|
|
PROCEDURE UNSTACK(DEST,L,ORIG,OTOP,N,CHR1,CHR2);
|
|
VALUE N,CHR1,CHR2;
|
|
INTEGER N,CHR1,CHR2,L,OTOP;
|
|
ARRAY DEST[0,0],ORIG[0];
|
|
BEGIN
|
|
REAL T,U;
|
|
WHILE OTOP GTR 0 AND N GTR 0 AND ERR=0 DO
|
|
IF(IF (T:=ORIG[OTOP]).TYPEFIELD=FUNCTION THEN FALSE ELSE
|
|
U:=T.LOCFIELD=CHR1 OR U=CHR2) THEN %UNSTACK
|
|
BEGIN
|
|
IF N GTR 1 THEN
|
|
IF U=CHR2 THEN ERR:=SYNTAXERROR ELSE
|
|
OTOP:=OTOP-1;
|
|
N:=N-1;
|
|
END ELSE
|
|
COMMENT WE ARE LOOKING AT AN OPERATOR OR A FUNCTION;
|
|
|
|
|
|
BEGIN
|
|
IF J NEQ 0 THEN
|
|
BEGIN L:=L+1;
|
|
DEST[LOC]:=ORIG[OTOP]
|
|
END;
|
|
OTOP:OTOP-1
|
|
END;
|
|
IF N GTR 1 THEN ERR:=SYNTAXERROR;
|
|
END;
|
|
INTEGER ITOP,K,L,I;
|
|
INTEGER M,N,FLOC; REAL T;
|
|
LABEL SKIPSCAN,FILLER;
|
|
LABEL SPFULLAB;
|
|
|
|
PROCEDURE FORGETSPACE(L,LENGTH,SP); VALUE L,LENGTH;
|
|
INTEGER L,LENGTH; ARRAY SP[0,0];
|
|
BEGIN IF LENGTH GTR 0 THEN
|
|
BEGIN SP[LOC]:=SP[0,0];
|
|
SP[LOC].LEN:=LENGTH; SP[0,0]:=L
|
|
END;
|
|
END;
|
|
|
|
IF CURRENTMODE=FUNCMODE OR STACKBASE=0 THEN FLOC:=0 ELSE
|
|
|
|
BEGIN L:=STACKBASE+1;L:=SP[LOC].SPF+1;M:=SP[LOC].SPF+L;
|
|
FLOC:= IF M=L OR BOOLEAN(T:=SP[MOC]).SUSPENDED THEN 0 ELSE T.SPF
|
|
|
|
END;
|
|
|
|
T:=ADDRESS;
|
|
ITOP:=0;
|
|
DO
|
|
SKIPSCAN:
|
|
IF ITOP LSS MAXPOLISH THEN
|
|
BEGIN
|
|
INFIX[ITOP:=ITOP+1].ADDRFIELD:=T;
|
|
IF SPECIAL THEN
|
|
IF QUOTEV THEN % CONSTANT VECTOR
|
|
BEGIN INFIX[ITOP].TYPEFIELD:=CONSTANT;
|
|
IF T:=BUILDALPHA(LASTCONSTANT) NEQ 0 THEN
|
|
INFIX[ITOP].LOCFIELD:=T ELSE ERR:=SYNTAXERROR
|
|
END ELSE % ORDINARY OPERATOR
|
|
BEGIN INFIX[ITOP].TYPEFIELD:=OPERATOR; 03101550P28
|
|
...
|
|
UNTIL NOT(SCAN AND ERR=0); %DROP THRU WHEN INPUT FIN OR ERR 03104040P29
|
|
...
|
|
IF INFIX[I].OPTPE NEQ DYADIC THEN SINFIX[I].OPTYPE:=MONADIC; 03104840P30
|
|
...
|
|
IF OTOP LSS ITOP DIV 2 THEN ELSE ERR:=SYNTAXERROR; 03105087P31
|
|
...
|
|
BEGIN 03105383P32
|
|
...
|
|
T.OPTYPE:=MONADIC; 03106260P33
|
|
...
|
|
GTR MAXPROGS THEN %OFF THE END OF SP 03110920P34
|
|
...
|
|
BUILDCONSTANT:=L:=GS(1); %VECTOR DESCRIPTOR 03114800P35
|
|
...
|
|
BEGIN 03121255P36
|
|
...
|
|
SETFIELD(NEWDESC,7,1, IF BOOLEAN(T.SCALAR) 03124650P37
|
|
...
|
|
END; 03140080P38
|
|
INTEGER C;
|
|
...
|
|
T:=SP[NOC]; SP[NOC.NAMED:=1; N:=T; 03140600P39
|
|
...
|
|
BEGIN SI:=A;SI:=SI+B;DI:=C;DI:=DI+D;DS:=CHR;END; 03150085P40
|
|
...
|
|
L:=GETSPACE(N:=(NUMELEMENTS(D)+D,RF)); 03150650P41
|
|
...
|
|
WHILE TRUE DO % RECURSIVE EVALUATION LOOP 03151310P42
|
|
...
|
|
M := M + NJ; CC := 2; END; 03152646P43
|
|
...
|
|
AND N.QUADIN=4) THEN POPPROGRAM:=TRUE; 03155000P44
|
|
...
|
|
%ELSE WE HAVE AN ERROR (MISSING " ETC) 03210520P45
|
|
...
|
|
OUTER:=(START:=L+RANK+J|MAT) + COL - 1; 03221020P46
|
|
...
|
|
OP APL OPERATOR OP APL OPERATOR 03230015P47
|
|
...
|
|
ANS := IF RIGHT | LEFT = 1 THEN 0 ELSE 1; %NAND 03233400P48
|
|
...
|
|
DESC.SPF:=I; DESC.DID:=DDPUVW; SPCOPY(L,I,RANK1); 03235100P49
|
|
...
|
|
PROCEDURE DYADICRNDM;
|
|
BEGIN INTEGER NUM, KIND; REAL DESC;
|
|
REAL DESC1, DESC2;
|
|
INTEGER START; LABEL INSERT;
|
|
DESC1 := AREG; DESC2 := BREG;
|
|
IF FINDSIZE(DESC1) NEQ 1 OR FINDSIZE(DESC2) NEQ 1;
|
|
THEN BEGIN ERR:=RANKERROR; GO TO QUIT; END;
|
|
IF DESC1.SPF=0 OR DESC2.SPF=0 THEN BEGIN
|
|
ERR:=DOMAINERROR; GO TO QUIT; END;
|
|
L:=DESC1.SPF+DESC1.RF; M:=DESC2.SPF+DESC2.RF;
|
|
NUM := SP[LOC]; KIND := SP[MOC];
|
|
IF KIND LSS ORIGIN
|
|
OR NUM GTR PICK := KIND-ORIGIN+1
|
|
OR DESC1.ARRAYTYPE=1
|
|
OR DESC2.ARRAYTYPE=1 THEN BEGIN ERR:=DOMAINERROR;
|
|
GO TO QUIT; END;
|
|
IF NUM LEQ 0 THEN BEGIN DESC := NULLV; GO TO QUIT; END;
|
|
IF NUM GTR MAXWORDSIZE THEN BEGIN ERR:=KITEERROR; GO TO QUIT; END;
|
|
DESC.SPF := L := GETSPACE(NUM+1);
|
|
SP[LOC] := NUM; L := L+1;
|
|
OUTTOP := L+NUM-1;
|
|
TEMP := GETSPACE(NUM);
|
|
START:=ORIGIN; I:=0;
|
|
FOR L:=L STEP 1 UNTIL OUTTOP DO BEGIN
|
|
PICK:=RANDINT(START,KIND,SEED);
|
|
M:=TEMP;
|
|
IF I = 0 OR PICK LSS SP[MOC] THEN N:=TEMP 03239380P50
|
|
ELSE BEGIN TOP:=TEMP+I-1;
|
|
N:=TEMP+T:=I DIV 2;
|
|
WHILE T GTR 0 DO
|
|
IF PICK GEQ SP[NOC] THEN N:=N+T:=T DIV 2
|
|
ELSE N:=N-T:=T DIV 2;
|
|
|
|
FOR N:=MAX(TEMP,N-1) STEP 1 UNTIL TOP DO
|
|
IF SP[NOC] GTR PICK THEN
|
|
GO TO INSERT;
|
|
END;
|
|
INSERT: IF L LSS OUTTOP THEN BEGIN TOP:=N+1; N:=TEMP+I;
|
|
FOR M:=N STEP -1 UNTIL TOP DO BEGIN
|
|
N:=N-1; SP[MOC] := SP[NOC] - 1; END;
|
|
SP[NOC] := PICK; END;
|
|
SP[LOC] := N - TEMP + PICK;
|
|
KIND:=KIND-1;
|
|
I:=I+1;
|
|
END;
|
|
FORGETSPACE(TEMP,NUM);
|
|
QUIT: RESULTD := DESC;
|
|
END PROCEDURE DYADICRNDM;
|
|
PROCEDURE RHOP;
|
|
BEGIN INTEGER RANK,M,POINT; REAL NEWDESC,DESC1,DESC;
|
|
LABEL QUIT,WORK; BOOLEAN CHARACTER;
|
|
DEFINE TOOBIG=BEGIN ERR:=KITEERROR; GO TO QUIT; END#;
|
|
INTEGER N,TOP,NEWRANK,RANK1, POINT1,SIZE1,L,SIZE2;
|
|
DESC1 := AREG; DESC := BREG;
|
|
IF DESC.SPF = 0 THEN BEGIN ERR:=DOMAINERROR; GO TO QUIT; END;
|
|
IF DESC1.DIF NEQ 0 THEN BEGIN %--DYADIC RHO--RESTRUCTURING---------
|
|
IF L:=DESC1.SPF = 0 THEN BEGIN %NULL LEFT OP MEANS SCA;LAR ANS
|
|
IF DESC.ARRAYTYPE=1 THEN TOOBIG; %NO SCALAR CHARACTERS
|
|
NEWDESC.SPF:=M:=GETSPACE(1);
|
|
NEWDESC.DID:=DDPUSW;
|
|
L:=DESC.SPF+DESC.RF;
|
|
SP[MOC]:=SM[LOC]; GO TO QUIT; END;
|
|
IF DESC1.ARRAYTYPE NEQ 0 THEN BEGIN
|
|
ERR:=DOMAINERROR; GO TO QUIT; END;
|
|
RANK1:=DESC1.RF;
|
|
IF FINDSIZE(DESC1)=1 THEN BEGIN
|
|
N:=L+RANK1;
|
|
IF SIZE1:=ENTIER(SP[NOC]+.5) LSS 0 THEN BEGIN
|
|
ERR:=DOMAINERROR; GO TO QUIT; END;
|
|
NEWRANK:=1; TOP:=N; GO TO WORK; END;
|
|
IF RANK1 NEQ 1 THEN BEGIN ERR:=RANKERROR; GO TO QUIT; END;
|
|
FOR N:=L+RANK1 STEP 1 UNTIL TOP DO
|
|
IF SIZE1:=SIZE1?ENTIER(SP[NOC]+.5) LSS 0 THEN BEGIN
|
|
ERR:=DOMAINERRPOR; GO TO QUIT; END;
|
|
WORK: IF SIZE1=0 THEN BEGIN NEWDESC := NULLV; GO TO QUIT END;
|
|
IF SIZE1 GTR MAXWORDSTORE THEN TOOBIG;
|
|
NEWDESC.SPF := M := GETSPACE(SIZE1+NEWRANK);
|
|
%CANT USE SPCOPY FOR DIM VECTOR AS LEFT OP MAY NOT BE INTEGER
|
|
FOR L:=L+RANK1 STEP 1 UNTIL TOP DO;
|
|
BEGIN SP[NOC]:=ENTIER(SP[LOC]+.5); M:=M+1; END;
|
|
SIZE2:=FINDSIZE(DESC); L:=DESC.SPF; RANK:=DESC.RF;
|
|
IF DESC.ARRAYTYPE=1 THEN BEGIN L:=UNPACK(L,RANK,SIZE2);
|
|
CHARACTER:=TRUE; END; TOP:=SIZE1 DIV SIZE2; POINT:=L+RANK;
|
|
FOR N:=1 STEP 1 UNTIL TOP DO BEGIN SPCOPY(POINT,M,SIZE2);
|
|
M := M+SIZE2; END;
|
|
TOP := SRIZE1 MOD SIZE2; SPCOPY(POINT,M,TOP);
|
|
GO TO QUIT; END ELSE
|
|
%--------MONADIC RHO-----DIMENSION VECTOR----------------------
|
|
RANK := DESC.RG; POINT := DESC.SPF;
|
|
NEWDESC.DID := DDPUVW; NEWDESC.RF := 1;
|
|
IF DESC.DATATYPE = 1 THEN BEGIN
|
|
NEWDESC := NULLV; GO TO QUIT END;
|
|
NEWDESC.SPF := M := GETSPACE(RANK+1);
|
|
SP[MOC] := RANK;
|
|
SPCOPY(POINT,M+1, RANK);
|
|
QUIT: IF CHARACTER THEN BEGIN NEWDESC.ARRAYTYPE:=1;
|
|
FORGETSPACE(L,SIZE2+RANK);
|
|
PACK(NEWDESC.SPF, NEWRANK,SIZE1); END;
|
|
RESULTD := NEWDESC;
|
|
END PROCEDURE RHOP;
|
|
PROCEDURE IOTAP;
|
|
BEGIN INTEGER I,L,M,TOP; REAL DESC;
|
|
REAL LEFTOP, RIGHTOP;
|
|
INTEGER RSIZE,LSIZE,RRANK,LRANK,N,LL,MM,TIP,NIX;
|
|
LABEL QUIT, DONE; 03240800P51
|
|
LEFTOP:=AREG; RIGHTOP:=BREG
|
|
IF L:=RIGHTOP.SPF=0 THEN BEGIN ERR:=DOMAINERROR; GO TO QUIT END;
|
|
RSIZE:=FINDSIZE(RIGHTOP); RRANK:=RIGHTOP.RF;
|
|
DESC.DEIC := DDPUVW; DESC.RF := 1;
|
|
IF LEFTOP.DID NEQ 0 THEN BEGIN %-------DYADIC IOTA------------
|
|
IF LRANK := LEFTOP.RF GTR 1 THEN BEGIN ERR:=RANKERROR;
|
|
GO TO QUIT; END;
|
|
LSIZE := FINDSIZE(LEFTOP);
|
|
IF M:=ALEFTOP.SPF=0 THEN BEGIN %RESULT IS ORIGIN IF IT WAS NULL
|
|
DESC.SPF:=M:=GETSPACE(1); DESC.RF:=0; DESC.SCALAR:=1;
|
|
SP[MOC] := ORIGIN; GO TO QUIT; END;
|
|
IF LEFTOP.ARRAYTYPE=1 THEN M:=UNPACK(M,LRANK,LSIZE);
|
|
IF RIGHTOP.ARRAYTYPE=1 THEN L:=UNPACK(L,RRANK,RSIZE);
|
|
TIP := (NTX:=LSIZE+ORIGIN) - 1;
|
|
DESC.SPF:=N:=GETSPACE(RSIZE+RRANK);
|
|
IF RRANK=0 THEN DESC.SCALAR:=1 ; DESC.RF:=RRANK;
|
|
SPCOPY(L,N,RRANK);
|
|
MM := M+LRANK; LL:=L:=L+RRANK;
|
|
TOP:=N+RRANK+RSIZE-1;
|
|
FOR N:=N+RRANK STEP 1 UNTIAL TOP DO BEGIN
|
|
SP[NOC] := NIX;
|
|
M := MM;
|
|
FOR I:=ORIGIN STEP 1 UNTIL TOP DO BEGIN
|
|
IF OPERATION(SP[MOC],SP[LOC],1,12,LEFTOP) AND LEFTOP=1
|
|
THEN BEGIN SP[NOC]:=I; GO TO DONE;
|
|
END ELSE M:=M+1;
|
|
DONE: L:=L+1; END;
|
|
IF LEFTOP.ARRAYTYPE=1 THEN FORGETSPAZE(MM-LRANK,LRANK+LSIZE);
|
|
IF RIGHTOP.ARRAYTYPE=1 THEN FORGETSPZE(LL-RRANK,RRANK+RSIZE);
|
|
END ELSE BEGIN %-------------MONADIC IOTA------------------
|
|
IF RIGHTOP.ARRAYTYPE=1 THEN
|
|
BEGIN ERR:=DOMAINERROR; GO TO QUIT
|
|
END;
|
|
IF RSIZE NEQ 1 THEN BEGIN ERR:=RANKERROR; GO TO QUIT END;
|
|
|
|
L := L + RRANK;
|
|
IF TOP:=SP[LOC] GTR MAXWORDTORE THEN
|
|
BEGIN ERR:=KITEERROR; GO TO QUIT
|
|
END;
|
|
|
|
IF TOP LSS ORIGIN THEN BEGIN DESC:=NULLV; GO TO QUIT END;
|
|
DESC.SPF := M := GETSPACE(TOP+1);
|
|
SP[MOC] := TOP; M := M+1;
|
|
TOP := TOP _ ORIGIN - 1;
|
|
FOR I := ORIGIN STEP 1 UNTIL TOP DO BEGIN
|
|
SP[MOC] := I; M := M+1; END;
|
|
END;
|
|
QUIT: RESULTD := DESC;
|
|
END PROCEDURE IOTAP;
|
|
PROCEDURE COMMAP;
|
|
BEGIN REAL LDESC, RDESC;
|
|
INTEGER L,M,N,LRANK,RRANK,LSIZE,RSIZE,SIZE;
|
|
REAL DESC; LABEL QUIT; BOOLEAN CHARACTER;
|
|
LDESC := AREG; RDESC := BREAG;
|
|
RRANK := RDESC.RF; LRANK := LDESC.RF;
|
|
LSIZE := IF (L := LDESC.SPF) = 0 THEN 0 ELSE FINDSIZE(LDESC);
|
|
RSIZE := IF (M := RDESC.SPF) = 0 THEN 0 ELSE FINDSIZE(RDESC);
|
|
IF RDESC.ARRAYTYPE = 1 THEN BEGIN
|
|
M := UNPACK(M,RRANK,RSIZE);
|
|
CHARACTER := TRUE; END;
|
|
DESC.DID := DDPUVW; DESC.RF := 1;
|
|
IF LDESC.DID = 0 THEN BEGIN %-----MONADIC COMMA--RAVEL--------
|
|
IF RSIZE=0 THEN BEGIN DESC:=NULLV; GO TO QUIT END;
|
|
DESC.SPF := L := GETSPACE(RSIZE+1);
|
|
SP[LOC] := RSIZE;
|
|
SPCOPY(M+RRANK, L+1, RSIZE);
|
|
N := L; SIZE := RSIZE;
|
|
GO TO QUIT; END
|
|
ELSE BEGIN
|
|
%HERE IS THE CODE FOR DYADIC COMMA, I.E. CATNETATION
|
|
IF RRANK NEQ 1 AND RSIZE GTR 1 OR
|
|
LRANK NEQ 1 AND LSIZE GTR 1 THEN BEGIN
|
|
ERR:= RANKERROR; GO TO QUIT; END;
|
|
IF SIZE:=LSIZE+RSIZE GTR MAXWORDSTORE THEN BEGIN
|
|
ERR:=KITEERROR; GO TO QUIT; END;
|
|
COMMENT CANT MIX NUMBER AND CHARACTERS, HAVE TO JUGGLE
|
|
IF LEFT IS NUMBERS AND RIGHT IS CHARACTERS AS RIGHT
|
|
HAS ALREADY BEEN UNPACKED AND WE DONT WANT TO FORGET
|
|
LEFT AND DONT WANT TO PACK THE NON-RESULT;
|
|
IF CHARACTER THEN
|
|
IF LDESC.ARRAYTYPE=1 OR LSIZE=0 THEN L:=UNPACK(L,LRANK,LSIZE)
|
|
ELSE BEGIN SIZE:=0; LSIZE:=-LRANK; ERR:=DOMAINERROR;
|
|
GO TO QUIT END 03243705P52
|
|
ELSE IF LDESC.ARRAYTYPE=1 THEN
|
|
IF RSIZE NEQ 0 THEN
|
|
BEGIN ERR:=DOMAINERROR; GO TO QUIT END
|
|
ELSE BEGIN CHARACTER:=TRUE;
|
|
L:=UNPACK(L,LRANK,LSIZE); END;
|
|
IF SIZE=0 THEN BEGIN DESC:=NULLV; GO TO QUIT END;
|
|
DESC.SPF := N := GETSPACE(SIZE=1);
|
|
SP[NOC] := SIZE;
|
|
SPCOPY(L+LRANK, N+1, LSIZE);
|
|
SPCOPY(M+RRANK, N+LSIZE+1, RSIZE);
|
|
END;
|
|
QUIT:
|
|
IF CHARACTER THEN BEGIN DESC.ARRAYTYPE := 1;
|
|
PACK(N,1,SIZE);
|
|
FORGETSPACE(L,LSIZE+LRANK);
|
|
FORGETSPACE(M,RSIZE+RRANK);
|
|
END;
|
|
RESULTD := DESC;
|
|
END PROCEDURE COMMAP;
|
|
INTEGER STREAM PROCEDURE GETOP(A,N); VALUE N;
|
|
BEGIN SI := A; SI := SI + N;
|
|
DI := LOC GETOP;
|
|
DS := 7 LIT "0"; DS := CHR;
|
|
END PROCEDURE GETOP;
|
|
REAL PROCEDURE IDENTITY(OP); VALUE OP; INNTEGER DP;
|
|
BEGIN
|
|
CASE OP OF BEGIN
|
|
IDENTITY := 0; %FOR +
|
|
IDENTITY := 1; %FOR |
|
|
IDENTITY := 0; %FOR -
|
|
IDENTITY := 1; %FOR DIV
|
|
IDENTITY := 1; %FOR *
|
|
; %NO REDUCTION ON RNDM
|
|
IDENTITY := 0; %FOR RESQ
|
|
IDENTITY := BIGGEST; %FOR MIN
|
|
IDENTITY := -BIGGEST; %FOR MAX
|
|
; %NOT ISNT DYADIC
|
|
IDENTITY := 1; %FOR COMB
|
|
IDENTITY := 0; %FOR LSS
|
|
IDENTITY := 1; %FOR =
|
|
IDENTITY := 1; %FOR GEQ
|
|
IDENTITY := 0; %FOR GTR
|
|
IDENTITY := 0; %FOR NEQ
|
|
IDENTITY := 1; %FOR LEQ
|
|
IDENTITY := 1; %FOR AND
|
|
IDENTITY := 0; %FOR OR
|
|
END; END PROCEDURE IDENTITY;
|
|
INTEGER PROCEDURE GETT(ALLONG,RANK); VALUE ALONG, RANK;
|
|
INTEGER ALONG, RANK;
|
|
GETT:= IF ALONG=1 THEN 0 ELSE
|
|
IF ALONG=RANK THEN 2 ELSE
|
|
IF ALONG=RANK-1 THEN 1 ELSE 0;
|
|
BOOLEAN PROCEDURE CHECKANDADD(SIZE,L,SUM);
|
|
VALUE SIZE,L; INTEGER SIZE,L,SUM;
|
|
BEGIN LABEL QUIT; INTEGER I,TOP,M,S,T;
|
|
CHECKANDADD:=TRUE;
|
|
SUM := 0;
|
|
TOP := SIZE DIV 2 ? 2 - 1 + L;
|
|
FOR L:=L STEP 2 UNTIL TOP DO BEGIN M:=L+1;
|
|
IF NOT BOOLTYPE(S:=SP[LOC], T:=SP[MOC]) THEN BEGIN
|
|
CHECKANDADD:=FALSE; GO TRO QUIT; END
|
|
ELSE SUM := SUM+S+T; END;
|
|
IF SIZE MOD 2 = 1 THEN BEGIN
|
|
IF NOT BOOLTYPE(T:=SP[LOC],0) THEN
|
|
CHECKANDADD := FALSE ELSE SUM := SUM+T;
|
|
END;
|
|
QUIT: END PROCEDURE CHECKANDADD;
|
|
PROCEDURE COMPRESS(LDESC, RDESC, DIM); VALUE LDESC,RDESC,DIM;
|
|
REAL LDESC, RDESC, DIM;
|
|
BEGIN INTEGER I,J,K,L,M,N,T,RANK,LSIZE,RSIZE,ALONG,TOP,
|
|
FACTOR,SUM,DIMMOD,SIZE,LEFT,RIGHT,S;
|
|
REAL DESC; BOOLEAN CHARACTER;
|
|
LABEL QUIT,RANKE,DOMAIN,IDENT;
|
|
DESC.ID := DDPUVW;
|
|
IF L := LDESC.SPF = 0 THEN GO TO DOMAIN;
|
|
IF M:=RDESC.SPF = 0 THEN BEGIN DESC:=NULLV; GO TO QUIT; END;
|
|
LSIZE := FINDSIZE(LDESC) RSIZE := FINDSIZE(RDESC);
|
|
IF RANK:=LDESC.RF NEQ 1 THEN IF LSIZE NEQ 1
|
|
THEN GO TO DOMAIN;
|
|
LEFT := L := L+RANK;
|
|
RANK := RDESC.RF;
|
|
IF N:=DIM.SPF=0 AND DIM.DID NEQ 0 OR DIM.ARRAYTYPE=1
|
|
OR LDESC.ARRAYTYPE=1 THEN GO TO DOMAIN; 03254510P53
|
|
IF J:=DIM.RF NEQ 0 THEN BEGIN
|
|
IF DINDSIZE(DIM)=1 THEN N:=N+J ELSE GO TO DOMAIN END;
|
|
IF ALONG:=(IF N=J THEN RANK ELSE SP[NOC]-ORIGIN+1) GTR RANK
|
|
OR ALONG LSS 1 AND RANK NEQ 0
|
|
THEN BEGIN ERR:=INDEXERROR; GO TO QUIT; END;
|
|
IF RANK = 0 THEN
|
|
IF LSIZE NEQ 1 THEN GO TO DOAMIN ELSE BEGIN
|
|
IF TOP:=SP[LOC]=0 THEN BEGIN DESC:=NULLV; GO TO QUIT; END;
|
|
IF TOP = 1 THEN BEGIN DESC.SPF := N := GESTAPCES(2);
|
|
DESC.RF := SP[NOC] := 1;
|
|
N:=N+1; SP[NOC]:=SP[MOC]; GO TO QUIT;
|
|
END ELSE GO TO DOMAIN; END;
|
|
IF LSIZE = 1 THEN BEGIN
|
|
COMMENT IF LEFT ARG IS SCALAR, ANSWER IS NULL IF 0,
|
|
RIGHT ARG IF 1;
|
|
SUN:=SP[LOC];
|
|
IF SUM NEQ 0 AND SUM NEQ 1 THEN GO TO DOMAIN
|
|
|
|
ELSE GO TO INDENT; END;
|
|
N := M+ALONG - 1;
|
|
IF LSIZE NEQ (T:=SP[NOC]) THEN BEGIN
|
|
ERR:=LENGTHERROR; GO TO QUIT; END;
|
|
IF NOT CHECKAND ADD(LSIZE,LEFT,SUM) THEN GRO TO DOMAIN;
|
|
IDENT: IF SUM=0 THEN BEGIN DESC:=NULLV; GO TO QUIT END;
|
|
IF SUM = LSIZE THEN BEGIN
|
|
RSIZE:=RSIZE DIV 8 + (IF RSIZE MOD 8 NEQ 0 THEN 1 ELSE 0);
|
|
DESC.CHRMODE:=1; END;
|
|
DESC.SPF:=N:=GETSPACE(TOP:=RSIZE+RANK);
|
|
DESC.RF := RANK; SPCOPY(M,N,TOP); GO TO QUIT; END;
|
|
SIZE := RSIZE DIV T ? SUM;
|
|
DESC.RF:=RANK;
|
|
IF RDESC.ARRAYTYPE = 1 THEN BEGIN M:=UNPACK(M,RANK,RSIZE);
|
|
CHARACTER := TRUE; END;
|
|
RIGHT := M;
|
|
DESC.SPF := S := GESTAPE(SIZE+RANK);
|
|
N := S;
|
|
FOR I:=1 STEP 1 UNTIL RANK DO BEGIN
|
|
IF I=ALONG THEN SP[NOC]:=SUM ELSE SP[NOC]:=SP[MOC];
|
|
N:=N+1; M:=M+1; END;
|
|
T := GETT(ALONG, RANK);
|
|
FACTOR := 1; TOP := RIGHT+ALONG;
|
|
FOR N:=RIGHT+RANK-1 STEP -1 UNTIL TOP DO FACTOR:=
|
|
FACTOR ? SP[NOC];
|
|
N:=RIGHT + RANK - 1; DIM := SP[NOC];
|
|
N := N+1; M:=S+RANK; I:=0;
|
|
DIMMOD := DIM-1;
|
|
WHILE I LSS RSIZE DO BEGIN
|
|
CASE T OF BEGIN
|
|
L := I DIV FACTOR MOD LSIZE;
|
|
L := I DIV FACTOR MOD DIMMOD;
|
|
L := I MODE DIM; END;
|
|
L := L+LEFT;
|
|
IF SP[LOC] = 1 THEN FOR K:=1 STEP 1 UNTIL FACTOR DO BEGIN
|
|
SP[MOC]:=SP[NOC]; I:=I+1; M:=M=1; N:=N+1;
|
|
END ELSE BEGIN I:=I+FACTOR; N:=N+FACTOR; END;
|
|
END;
|
|
GO TO QUIT;
|
|
RANKE: ERR:=RANKERROR; GO TO QUIT;
|
|
DOMAIN: ERR:=DOMAINERROR; GO TO QUIT;
|
|
QUIT: IF CHARACTER THEN BEGIN PACK(S,RANK,SIZE);
|
|
DESC.ARRAYTYPE:=1; FORGETSPACE(RIGHT,RSIZE+RANK); END;
|
|
RESULTD := DESC;
|
|
POP;
|
|
END PROCEDURE COMPRESS;
|
|
PROCEDURE EXPAND(LDESC,RDESC,DIM); VALUE LDESC,RDESC,DIM;
|
|
REAL LDESC,RDESC, DIM;
|
|
BEGIN INTEGER I,J,K,L,M,N,S,T,RANK,LSIZE,RSIZE,SIZE,
|
|
ALONG,TOP,LADDR,MADDR,FACTOR, SUM;
|
|
REAL DESC, INSERT;
|
|
LABEL QUIT, DOMAIN;
|
|
BOOLEAN CHARACTER;
|
|
LSIZE:=FINDSIZE(LDESC); RSIZE:=FINDSIZE(RDESC);
|
|
RANK := RDESC.RF;
|
|
IF M:=RDESC.SPF=0
|
|
OR L:=LDESC.SPF=0
|
|
OR I:=LDESC.RF GTR 1
|
|
|
|
OR N:=DIM.SPF=0 AND DIM.DID NEQ 0
|
|
OR DIM.ARRAYTYPE=1
|
|
OR FINDSIZE(DIM ) NEQ 1
|
|
OR LDESC.ARRAYTYPE=1
|
|
THEN GO TO DOMAIN; 03268280P54
|
|
N:=N + (T:=DIM.RF);
|
|
IF ALONG :=(IF N=T THEN RANK ELSE SP[NOC]-ORIGIN+1) GTR RANK
|
|
OR ALOG LSS 1 AND RANK NEQ 0
|
|
THEN BEGIN ERR:=INDEXERROR; GO TO QUIT; END;
|
|
IF RANK=0 THEN DIM:=1
|
|
ELSE BEGIN N:=M+ALONG-1; DIM:=SP[NOC]; END;
|
|
IF SIZE:=RSIZE DIV DIM ? LSIZE GTR MAXWORDSTORE
|
|
THEN BEGIN ERR:=KITEERROR; GO TO QUIT; END;
|
|
IF NOT CHECKANDADD(LSIZE,LADDR:=L+I, SUM) THEN GO TO DOMAIN;
|
|
IF SUM NEQ DIM THEN BEGIN ERR:=RANKERROR; GO TO QUIT; END;
|
|
IF RANK=0 THEN BEGIN
|
|
DIM:=SP[MOC]; DESC.SPF:=N:=GETSPACE(LSIZE+1);
|
|
DESC.RF:=I; DESC.DIS:=(IF I=0 THEN DDPUSW ELSE DDPUVW);
|
|
SPCOPY(L,N,I); L:=L+I; N:=N+I; TOP:=L+LSIZE-1;
|
|
FOR L:=L STEP 1 UNTIL TOP DO BEGIN
|
|
IF SP[LOC]=1 THEN SP[NOC]:=DIM;
|
|
N:=N+1; END;
|
|
GO TO QUIT END;
|
|
IF RDESC.ARRAYTYPE=1 THEN BEGIN CHARACTER:=TRUE;
|
|
M:=UNPACK(M,RANK,RSIZE);
|
|
INSERT := " "; END;
|
|
FACTOR:=1; TOP:=M+ALONG;
|
|
FOR N:=M+RANK-1 STEP -1 UNTIL TOP DO FACTOR:=FACTOR?SP[NOC];
|
|
T := GETT(ALONG, RANK);
|
|
J:=0; N:=(MADDR:=M) + RANK;
|
|
DESC.SPF:=M:=GETSAPCE(SIZE+RANK);
|
|
I:=M+RANK;
|
|
WHILE J LSS SIZE DO BEGIN
|
|
CASE T OF BEGIN
|
|
S := J DIV FACTOR MOD LSIZE;
|
|
S:=J DIV FACTOR MOD LSIZE;
|
|
S:=J MODE LSIZE; END;
|
|
L:=S + LADDR;
|
|
IF SP[LOC]=1 THEN FOR K:=1 STEP 1 UNTIL FACTOR DO
|
|
BEGIN L:=K+I; SP[LOC] := SP[NOC];
|
|
J:=J+1; N:=N+1;
|
|
END ELSE FOR K:=1 STEP 1 UNTIL FACTOR DO BEGIN
|
|
L:=J+I; SP[LOC]:=INSERT; J:=J+I; END;
|
|
END;
|
|
L := MADDR;
|
|
FOR I:=1 STEP 1 UNTIL RANK DO BEGIN
|
|
IF I = ALONG THEN SP[MOC]:=LSIZE ELSE SP[MOC]:=SP[LOC];
|
|
M:=M+1; L:=L+1; END;
|
|
DESC.DID:=DDPUVW; DESC.RF:=RANK;
|
|
GO TO QUIT;
|
|
DOMAIN: ERR:=DOMAINERROR;
|
|
QUIT: IF CHARACTER THEN BEGIN DESC.ARRAYTYPE:=1;
|
|
FORGETSPACE(MADDR, RSIZE+RANK);
|
|
PACK(DESC.SPF,RANK,SIZE); END;
|
|
RESULTD:=DESC;
|
|
POP;
|
|
END PROCEDURE EXPAND;
|
|
PROCEDURE MEMBER;
|
|
BEGIN REALLDESC, RDESC;
|
|
INTEGER L,M,N,I,S,T,LSIZE,RSIZE,LRANK,RRANK,TOP;
|
|
REAL DESC, TEMP, ANS;
|
|
LABEL QUIT;
|
|
LDESC := AREG; RDESC := BREG;
|
|
LSIZE:=FINDSIZE(LDESC); RSIZE:=FINDSIZE(RDESC);
|
|
LRANK:=LDESC.FR; RRANK:=RDESC.RF;
|
|
IF L:=LDESC.SPF=0 OR M:=RDESC.SPF=0 THEN BEGIN
|
|
ERR:=DOMAINERROR; GO TO QUIT END;
|
|
IF LDESC.ARRAYTYPE=1 THEN L:=UNPACK(L,LRANK,LSIZE);
|
|
IF RDESC.ARRAYTYPE=1 THEN M:=UNPACK(M,RRANK,RSIZE);
|
|
DESC:=LDESC; DESC.NAMED:=0;
|
|
DESC.ARRAYTYPE:=0;
|
|
DESC.SPF:=N:=GETSAPCE(LSIZE+LRANK);
|
|
SPCOPY(L,N,LRANK);
|
|
N:=N+LRANK; L:=(T:=L)+LRANK; M:=(S:=M)+RRANK;
|
|
T:=M+RSIZE-1; TOP := L+LSIZE-1;
|
|
FOR L:=L STEP 1 UNTIL TOP DO BEGIN
|
|
TEMP:=SP[LOC]; M:=S;
|
|
WHILE M LEQ T DO
|
|
IF OPERATION(TEMP,SP[MOC],0,12,ANS) AND ANS=1 THEN BEGIN
|
|
SP[NOC]:=1; M:=M+T; END ELSE M:=M+1;
|
|
N:=N+1; END;
|
|
|
|
IF RDESC.ARRAYTYPE=1 THEN FORGETSPACE(S,RSIZE+RRANK);
|
|
IF LDESC.ARRAYTYPE=1 THEN FORGETSPACE(I,LSIZE+LRANK);
|
|
QUIT: RESULTD:=DESC;
|
|
END PROCEDURE MEMBER;
|
|
REAL PROCEDURE BASEVALUE;
|
|
BEGIN 03269860P55
|
|
COMMENT THIS RETURNS A DESCRIPTOR FOR A SCALAR RESULT;
|
|
LABEL OUTE,BAD;
|
|
REAL E,L,M,LEFT,RIGHT,T,LARG,RARG;
|
|
LARG := AREG; RARG := BREG;
|
|
IF M:=RARG.SPF=0 LARG.CHRMODE=1 OR RARG.CHRMODE=1
|
|
OR L:=LARG.SPF=0 AND LARG.DID NEQ 0
|
|
THEN GO TO BAD;
|
|
RIGHT:=SP[MOC];
|
|
LEFT:=SP[LOC];
|
|
IF FINDSIZE(LARG)=1 THEN % A 1 ELEMENT VECTOR
|
|
BEGIN
|
|
L:=L+LARG.RF;
|
|
LARG.SCALAR:=1;
|
|
LEFT:=SP[LOC];
|
|
END;
|
|
IF FINDSIZE(RARG)=1 THEN % A ONE ELEMENT VECTOR
|
|
BEGIN
|
|
M:=M+RARG.RF;
|
|
RIGHT:=SP[MOC];
|
|
RARG.SCALAR:=1;
|
|
END;
|
|
IF L=0 THEN
|
|
BEGIN % BASEVAL MONADIC
|
|
LEFT:=2; %IF MONADIC, ITS 2 BASVAL X
|
|
LARG.SCALAR:=1;
|
|
END;
|
|
IF BOOLEAN(LARG.SCALAR )THEN %SCALAR
|
|
IF BOOLEN(RARG.SCALAR) THEN
|
|
BEGIN
|
|
T:=RIGHT; %SCALAR-SCALAR
|
|
GO OUTE;
|
|
END
|
|
ELSE
|
|
IF RARG.RF=1 THEN
|
|
BEGIN COMMENT SCALAR-VECTIOR--LEFT IS VALUE OF SCALAR, RIGHT
|
|
IS # OF ELEMENTS;
|
|
IF LEFT=0 THEN GO OUTE
|
|
ELSE E:=1/LEFT;
|
|
FOR L :=M+RIGHT STEP -1 UNTIL M+1 DO
|
|
T:=T+SP[LOC]\(E:=E\LEFT);
|
|
GO OUTE;
|
|
END
|
|
ELSE BAD: ERR:=BOMAINERROR
|
|
ELSE
|
|
IF RARG.SCALAR=0 THEN
|
|
IF LARG.RF NQ 1 OR RARG.RF NEQ 1 THEN
|
|
ERR:=DOMAINERROR
|
|
ELSE
|
|
BEGIN
|
|
GT2:=L; % SAVE FOR LATER TEST
|
|
GT1:=M+2; % WANT TO STOP 2 UP IN LOOP
|
|
L:=L+LEFT; % START AT OTHER END
|
|
E:=1;
|
|
M:=M+RIGHT;
|
|
T:=SP[MOC]; % INITIAL VALUE
|
|
FOR M:=M-1 STEP -1 UNTIL GT1 DO
|
|
BEGIN
|
|
IF L:=L-1 LSS GT2 THEN L:=GT2+LEFT; % START OVER
|
|
E:=E?SP[LOC];
|
|
T:=T+SP[MOC]?E;
|
|
END;
|
|
OUTE:
|
|
L:=GETSPACE(1);
|
|
SP[LOC]:=T;
|
|
T:=0;
|
|
T.DID:=DDPUSW; % BUILD DESCRIPTOR
|
|
T.SPF:=L;
|
|
BASEVALUE:=T;
|
|
END
|
|
ELSE ERR := DOMAINERROR
|
|
END OF BASEVALUE;
|
|
REAL PROCEDURE REPRESENT;
|
|
BEGIN
|
|
COMMENT RETURNS DESCRIPTOR OF VECTOR IF LARG VECTOR AND RARG SCALAR;
|
|
REAL L,M,LEFT,RIGHT,T,E,LARG,RARG;
|
|
LABEL AROUND
|
|
LARG := AREG; RARG := BREG;
|
|
IF (RARG.SCALAR=1 OR FINDSIZE(RARG)=1 AND RARG.CHRMODE=0)
|
|
AND NOT(LARG.SCALAR=1 OR LARG.CHRMODE=1 OR LARG.RF NEQ 1) THEN
|
|
BEGIN
|
|
COMMENT VECTOR-SCALAR;
|
|
IF L:=LARG.SPF=0 OR M:=RARG.SPF=0 THEN GO AROUND;
|
|
IF RARG.SCALAR=0 THEN M:=M+RARG.RF; 03271020P56
|
|
RIGHT:=SP[MOC]; % VALUE OF SCALAR
|
|
LEFT:=SP[LOC]; % LENGTH OF VECTOR
|
|
E:=M:=GETSPACE(LEFT+1); % MAKE ROOM FOR ANSWER
|
|
SP[MOC]:=LEFT; % LENGTH OF ANSWER
|
|
M:=M+LEFT;
|
|
GT1:=L+2;
|
|
FOR L:=L+LEFT STEP -1 UNTIL GT1 DO
|
|
IF T:=SP[LOC] LEQ 0 THEN
|
|
IF T LSS 0 THEN ERR:= DOMAINERROR
|
|
ELSE
|
|
BEGIN
|
|
L:=GT1-1 ; % STOP THE LOOP
|
|
M:=M-1;
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
SP[MOC]:= RIGHT MOD T;
|
|
RIGHT:=RIGHT DIV T;
|
|
M:=M-1;
|
|
IF RIGHT LSS FUZZ THEN L:=GT1-1; % STOP THE LOOP
|
|
END;
|
|
SP[MOC]:=RIGHT; % LEFTOVER GOES HERE
|
|
T.DID:=DDPUVW;
|
|
T.RF:=1;
|
|
T.SPF:=E;
|
|
REPRESENT:=T;
|
|
END;
|
|
ELSE AROUND: ERR:=DOMAINERROR;
|
|
END OF REPRESENT;
|
|
PROCEDURE PERIOD(LDESC,RDESC,LOP,ROP);
|
|
VALUE LDESC,RDESC,LOP,ROP; REAL LDESC,RDESC; INTEGER LOP,ROP;
|
|
BEGIN INTEGER L,M,N,J,LRANK,RRANK,RANK,LSIZE,RSIZE,SIZE,LL,MM,I,
|
|
RROW,RCOL,LROW,LCOL,LJUMP,RJUMP,MSAVE,LSAVE,RSTART;
|
|
REAL DESC, TEMP;
|
|
BOOLEAN CHARACTER, FIRST,LSCALAR, RSCALAR;
|
|
LABEL QUIT, DOMAIN, FORGET, OUTERPROD;
|
|
IF L:=LDESC.SPF = 0 OR M:= RDESC.SPF=0 THEN GO TO DOMAIN;
|
|
LSIZE := FINDSIZE(LDESC); RSIZE:=FINDSIZE(RDESC);
|
|
LRANK:=LDESC.RF; RRANK := RDESC.RF;
|
|
IF LOP NEQ 45 THEN
|
|
IF LRANK GTR 2 AND LSIZE NEQ 1 OR RRANK GTR 2 AND RSIZE NEQ 1 THEN
|
|
BEGIN ERR:=KITEERROR; GO TO QUIT; END;
|
|
IF ROP:=GETOP(CORRESPONDENCE,ROP-1) = 9 THEN BEGIN
|
|
ERR:=SYNTAXERROR; GO TO QUIT; END;
|
|
IF LL:=LDESC.ARRAYTYPE=1 OR MM:=RDESC.ARRAYTYPE=1 THEN
|
|
IF LL ? MM NEQ 1 THEN GO TO DOMAIN
|
|
ELSE BEGIN
|
|
|
|
IF ROP LSS 11 OR ROP GTR 16 THEN GO TO DOMAIN;
|
|
CHARACTER:=TRUE;
|
|
M:=UNPACK(M.RRANK,RSIZE);
|
|
L:=UNPACK(L,LRANK,LSIZE); END;
|
|
MSAVE := M; LSAVE:=L; IF ROP NEQ 45 THEN
|
|
IF LOP=45 THEN GO TO OUTERPROD ELSE
|
|
IF LOP:=GETOP(CORRESPONDENCE,LOP-1)=9 THEN
|
|
BEGIN ERR:=SYNTAXERROR; GO TO QUIT; END;
|
|
IF LRANK=2 THEN BEGIN
|
|
N:=L+LRANK-1; LCOL := SP[NOC];
|
|
N:=N-1; RROW:=SP[NOC]; END;
|
|
IF LRANK=1 THEN BEGIN LROW:=1; LCOL:=SP[LOC]; END;
|
|
IF RRANK=2 THEN BEGIN
|
|
N :=M+RRANK-1; RCOL:=SP[NOC];
|
|
N:=N-1; RROW:=SP[NOC]; END;
|
|
IF RRANK=1 THEN BEGIN RROW:=SP[MOC]; RCOL:=1; END;
|
|
IF LSIZE =1 OR RSIZE=1 THEN BEGIN
|
|
IF LSIZE = 1 AND RSIZE = 1 THEN LROW:=LCOL:=RROW:=RCOL:=1
|
|
ELSE IF LSIZE=1 THEN BEGIN LCOL:=RROW; LRUOW:=1;
|
|
L:=L+LRANK-1; LRANK:=1;
|
|
LSCALAR:=TRUE; END;
|
|
ELSE BEGIN RRROW := LCOL; RCOL := 1;
|
|
M:=M+RRANK-1; RRANK:=1;
|
|
RSCALAR:=TRUE; END;
|
|
END;
|
|
IF LCOL NEQ RROW
|
|
THEN BEGIN ERR:=RANKERROR; GO TO QUIT; END;
|
|
DESC.SPF:=N:=GETSPACE((RANK:=MAX(0,LRANK+RRANK-1))+
|
|
SIZE:=LROW?RCOL);
|
|
SPCOPY(L,N,LRANK-1);
|
|
SPCOPY(M+1,N+LRANK-1,RRANK-1);
|
|
DESC.RF:=RANK; DESC.DID:=(IF RANK=0 THEN DDPUSW ELSE DDPUVW);
|
|
N:=N+RANK;
|
|
LL := L + LRANK - 1;
|
|
MM := M + RRANK - 1; 03272500P57
|
|
LJUMP := LCOL-1; RJUMP := IF RSCALAR THEN 0 ELSE (RROW-1) ? RCO
|
|
FOR J:=1 STEP LCOL UNTIL LSIZE DO
|
|
FOR RSTART:=1 STEP 1 UNTIL RCOL DO BEGIN
|
|
FIRST:=TRUE;
|
|
M := MM + RSTART + RJUMP; RROW := LL + J;
|
|
FOR I:=LL +LJUMP + J STEP -1 UNTIL RROW DO BEGIN
|
|
IF LSCALR THEN L:=LL+1 ELSE L:=I;
|
|
IF FIRST THEN BEGIN
|
|
IF NOT OPERATION(SP[LOC],SP[MOC],1ROP,SP[NOC])
|
|
THEN GO TO FORGET ELSE FIRST := FALSE;
|
|
END ELSE BEGIN
|
|
IF NOT OPERATION(SP[LOC],SP[MOC],1,ROP,TEMP)
|
|
THEN GO TO FORGET;
|
|
IF NOT OPERATION(TEMP,SP[NOC],-1,LOP,SP[NOC])
|
|
THEN GO TO FORGET END;
|
|
IF NOT RSCALAR THEN M:=M-RCOL; END;
|
|
N := N+1;
|
|
END;
|
|
GO TO QUIT;
|
|
OUTERPROD: IF SIZE:=LSIZE?RSIZE GTR MAXWORDSTORE
|
|
OR RANK := LRANK+RRANK GTR 31 THEN BEGIN
|
|
ERR:=KITEERROR; GO TO QUIT; END;
|
|
DESC.SPF:=N:=GETSPACE(SIZE+RANK);
|
|
DESC.DID:=IF RANK=0 THEN DDPUSW ELSE DDPUVW;
|
|
DESC.RF:=RANK;
|
|
SPCOPY(L,N,LRANK);
|
|
SPCOPY(M,N+LRANK,RRANK);
|
|
N:=N+RANK;
|
|
I:=L + LRANK + RSIZE - 1;
|
|
MM := M+RRANK + RSIZE - 1;
|
|
FOR L:=L+LRANK STEP 1 UNTIL I DO
|
|
FOR M:=MSAVE+RRANK STEP 1 UNTIL MM DO
|
|
IF NOT OPERATION(SP[LOC],SP[MOC],1,ROP,SP[NOC]) THEN
|
|
GO TO FORGET ELSE N:=N+1;
|
|
GO TO QUIT;
|
|
FORGET: FORGETSPACE(DESC,SPF,RANK+SIZE);
|
|
DOMAIN: ERR:=DOMAINERROR;
|
|
QUIT: IF CHARACTER THEN BEGIN
|
|
FORGETSPACE(MSAVE , RRANK+RSIZE);
|
|
FORGETSPACE(LSAVE , LRANK+LSIZE); END;
|
|
RESULTD := DESC;
|
|
END PROCEDURE PERIOD;
|
|
PROCEDURE REVERSE(SOURCE,LENGTH,DEST,JUMP); VALUE SOURCE,DEST,
|
|
LENGTH,JUMP; INTEGER SOURCE,LENGTH,DEST,JUMP;
|
|
BEGIN INTEGER L,M,TOP;
|
|
M:=SOURCE + TOP:=(LENGTH-1) ? JUMP; TOP:=DEST+TOP;
|
|
FOR L:=DEST STEP JUMP UNTIL TOP DO BEGIN
|
|
SP[LOC] := SP[MOC]; M:=M-JUMP; END;
|
|
END PROCEDURE REVERSE;
|
|
PROCEDURE ROTATE(SOURCE,LENGTH,DEST,JUMP,ROT); VALUE SOURCE,
|
|
LENGTH,DEST,JUMP,ROT; INTEGER SOURCE,LENGTH,DEST,JUMP,ROT;
|
|
BEGIN INTEGER L,M,TOP;
|
|
TOP := SOURCE + (LENGTH-1) ? JUMP;
|
|
FOR L:=SOURCE STEP JUMP UNTIL TOP DO BEGIN
|
|
M:=DEST+(ROT MOD LENGTH)?JUMP; SP[MOC]:=SP[LOC];
|
|
ROT := ROT + 1; END;
|
|
END PROCEDURE ROTATE;
|
|
INTEGER PROCEDURE GETNUM(TIM,L,SIZE,DIM); VALUE TIM,L,
|
|
SIZE,DIM; INTEGER TIM,L,SIZE,DIM;
|
|
BEGIN INTEGER NUM;
|
|
IF SIZE NEQ 0 THEN L := L + TIM;
|
|
NUM:=SIGN(NUM:=SP[LOC]) ? ENTIER(ABS(NUM)) MOD DIM;
|
|
IF NUM LSS 0 THEN GETNUM := -NUM %FOR RIGHT ROTATION
|
|
ELSE GETNUM:=DIM-NUM; %FOR LEFT ROTATION
|
|
END PROCEDURE GETNUM;
|
|
BOOLEAN PROCEDURE MATCHROT(LDESC,RDESC,ALONG); VALUE LDESC,
|
|
RDESC,ALONG; INTEGER LDESC,RDESC,ALONG;
|
|
BEGIN INTEGER I,L,M,R; LABEL QUIT;
|
|
MATCHROT:=TRUE; L:=DESC.SPF; M:=RDESC.SPF;
|
|
IF R:=LDESC.RF NEQ RDESC.RF-1 THEN BEGIN
|
|
MATCHROT:=FALSE; GO TO QUIT; END;
|
|
FOR I:=1 STEP 1 UNTIL R DO BEGIN IF I=ALONG THNE M:=M+1;
|
|
IF SP[LOC] NEQ SP[MOC] THEN BEGIN MATCHROT:=FALSE;
|
|
GO TO QUIT; END; M:=M+1; L:=L+1; END;
|
|
QUIT: END PROCEDURE MATCHROT;
|
|
PROCEDURE REDUCESORTSCAN(LOP,REDESC,DIM,KIND); VALUE LOP,RDESC,
|
|
DIM,KIND; REAL LOP,RDESC,DIM; INTEGER KIND;
|
|
BEGIN INTEGER L,M,N,I,J,K,ALONG,FACTOR,T,MSAVE,DIFF,SSIZE,
|
|
JUMP,RANK,SIZE,TOP,LASTDIM,INTERVAL,TEMP,HOP;
|
|
INTEGER REMDIM,LRANK,LSAVE,LSIZE,S;
|
|
BOOLEAN CHARACTER,REDUCE,SORT,SCAN,REVERSAL,ROTATION;
|
|
REAL DESC;
|
|
LABEL QUIT, FORGET, RANKERR; 03273620P58
|
|
COMMENT: KIND=1 FOR REDUCTION
|
|
KIND=2 FOR SORTUP OR SORTDN
|
|
KIND=3 FOR SCAN
|
|
KIND=4 FOR REVERSAL
|
|
KIND=5 FOR ROTATION;
|
|
PROCEDURE SORTIT(L,M,SIZE,JUMP,UP); VALUE L,M,SIZE,JUMP,UP;
|
|
INTEGER L,M,SIZE,JUMP; BOOLEAN UP;
|
|
BEGIN INTEGER N.TIP,TOP,LSAVE;
|
|
REAL COMPARE,OUTOFIT;
|
|
OUTOFIT:=IF UP THEN BIGGEST ELSE -BIGGEST;
|
|
TIP := M + (N:=(SIZE-1) ? JUMP); TOP := L + N;
|
|
LSAVE := L;
|
|
FOR M:=M STEP JUMP UNTIL TIP FO BEGIN
|
|
L := LSAVE; COMPARE := SP[LOC]; N:=L;
|
|
FOR L:=L+1 STEP 1 UNTIL TOP DO
|
|
IF UP THEN BEGIN IF SP[LOC] LSS COMPARE THEN BEGIN
|
|
N:=L; COMPARE:=SP[LOC]; END;
|
|
END ELSE IF SP[LOC] GTR COMPARE THEN
|
|
N:=L; COMPARE:=SP[LOC]; END;
|
|
SP[NOC] := OUTOFIT;
|
|
SP[MOC] := (N-LSAVE) + ORIGIN;
|
|
END;
|
|
END PROCEDURE SORTIT;
|
|
CASE KIND OF BEGIN ; REDUCE:=TRUE; SORT:=TRUE; SCAN:=TRUE;
|
|
REVERSAL:=TRUE; ROTATION:=TRUE; END;
|
|
IF LOP GTR 64 AND NOT ROTATION THEN BEGIN
|
|
ERR:=SYSTEMERROR; GO TO QUIT; END;
|
|
IF REDUCE OR SCAN THEN IF LOP NEQ 45 THEN
|
|
LOP := GETOP(CORRESPONDENCE,LOP-1);
|
|
IF M:=RDESC.SPF=0 AND NOT REDUCE
|
|
OR DIM.DID NEQ 0 AND N:=DIM.SPF=0 OR DIM.ARRAYTYPE=1
|
|
OR FINDSIZE(DIM) NEQ 1 THEN BEGIN
|
|
ERR:=DOMAINERROR; GO TO QUIT END;
|
|
IF (REDUCE OR SCAN) AND LOP=9 THEN BEGIN %OP NOT DYADIC SCALAR
|
|
ERR:=SYNTAXERROR; GO TO QUIT END;
|
|
IF M=0 THEN BEGIN
|
|
%FOR REDUCTION, RESULT OF A NULL IS CORRESPONDING IDENTITY
|
|
%EXCEPT THAT NAND, NOR, CIRCLE, AND LOG (LOP GTR 18)
|
|
%HAVE NO IDENTITIES, SO THE RESULT IS A NULL
|
|
DESC.DID := DDPUSW;
|
|
IF LOP LEQ 18 THEN BEGIN DESC.SPF:=N:=GETSPACE(1);
|
|
SP[NOC] := IDENTITY(LOP); END ELSE DESC.RF:=1;
|
|
GO TO QUIT; END;
|
|
IF RDESC.ARRAYTYPE=1 AND (REDUCE OR SCAN) THEN
|
|
BEGIN ARR:=DOMAINERROR; GO TO QUIT; END;
|
|
SIZE:=FINDSIZE(RDESC);
|
|
RANK:=RDESC.RF;
|
|
IF SIZE=1 THEN BEGIN
|
|
%UNLESS SORT, RESULT OF SINGLE-VALUED ARGUMENT IS THAT ARGUMENT
|
|
DESC := RDESC;
|
|
DESC.SPF := N := GETSPACE(RANK+1);
|
|
SPCOPY(M,N,RANK);M:=M+RANK;N:=N+RANK;
|
|
IF SORT THEN BEGIN SP[NOC]:=ORIGIN; DESC.ARRAYTYPE:=0;
|
|
END ELSE SP[NOC]:=SP[MOC];
|
|
GO TO QUIT; END;
|
|
|
|
IF RDESC.ARRAYTYPE=1 THEN BEGIN
|
|
CHARACTER := TRUE;
|
|
M:=UNPACK(M,RANK,SIZE); END;
|
|
MSAVE:=M;
|
|
N:=N+(T:=DIM.RF);
|
|
IF ALONG:=(IF N=T THEN RANK ELSE SP[NOC]-ORIGIN+1) GTR RANK
|
|
OR ALONG LSS 1
|
|
THEN BEGINERR:=INDEXERROR; GO TO QUIT; END;
|
|
IF ROTATION THEN BEGIN
|
|
IF LSAVE:=LOP.SPF=0 OR LOP.ARRAYTYPE=1 THEN
|
|
BEGIN ERR:=DOMAINERROR; GO TO QUIT; END;
|
|
IF LSIZE:=FINDSIZE(LOP) NEQ 1 THEN
|
|
IF NOT MATCHROT(LOP,RDESC,ALONG) THEN BEGIN
|
|
ERR:=RANKERROR; GO TO QUIT; END;
|
|
LSAVE := LSAVE + LRANK := LOP.RF;
|
|
IF LSIZE = 1 THEN LRANK := 0; END;
|
|
N:=M+ALONG-1;
|
|
DIM:=SP[NOC];
|
|
JUMP:=1; I:=M+ALONG;
|
|
FOR L:=M+RANK-1 STEP -1 UNTIL I DO JUMP:=JUMP ? SP[LOC];
|
|
N:=M+RANK-1; LASTDIM:=SP[NOC];
|
|
IF ALONG = RANK-1 THEN BEGIN N:=N-1;
|
|
FACTOR:=LASTDIM ? SP[NOC]; END;
|
|
T := GETT(ALONG, RANK);
|
|
J := M + RANK;
|
|
REMDIM := 1;
|
|
HOP := (DIM-1) | JUMP; 03274600P59
|
|
DESC.DIF := DDPUVW;
|
|
IF ALONG GTR 1 AND ALONG LSS RANK-1 THEN BEGIN TOP:=M+ALONG-2;
|
|
FOR L:=M STEP 1 UNTIL TOP DO REMDIM:=REMDIM?SP[LOC]; END;
|
|
IF REDUCE THEN BEGIN DESC.SPF:=N:=GETSPACE(SSIZE:=SSIZE DIV DIM
|
|
+ RANK - 1);
|
|
IF RANK=1 THEN DESC.SCALER:=1 ELSE DESC.RF:=RANK-1;
|
|
FOR I:=1 STEP 1 UNTIL RANK DO BEGIN
|
|
IF I NEQ ALONG THEN BEGIN SP[NOC]:=SP[MOC]; N:=N+1; END;
|
|
M:=M+1; END;
|
|
JUMP := -JUMP;
|
|
END ELSE BEGIN DESC.SPF:=N:=GETSPACE(SSIZE:=SIZE+RANK);
|
|
INTERVAL := (DIFF := N-M) + HOP;
|
|
SPCOPY(M,N,RANK); DESC.RF:=RANK; END
|
|
IF SORT THEN TEMP:=GETSPACE(DIM);
|
|
TOP := SIZE DIV (DIM ? REMDIM) - 1;
|
|
FOR S:=1 STEP 1 UNTIL REMDIM DO BEGIN
|
|
FOR T:=0 STEP 1 UNTIL TOP DO BEGIN
|
|
CASE T OF BEGIN
|
|
L := I + J;
|
|
L:=I DIV LASTDIM?FACTOR + I MOD LASTDIM + J;
|
|
L:=I?LASTDIM + J; END;
|
|
IF REDUC THEN BEGIN M:=I+N; L:=HOP + (K:=L);
|
|
SP[MOC] := SP[LOC];
|
|
FOR L:=L+JUMP SETP JUMP UNTIL K DO
|
|
IF NOT OPERATION(SP[LOC],SP[MOC],-1,LOP,SP[MOC])
|
|
THEN GO TO FORGET;
|
|
END ELSE
|
|
IF SORT THEN BEGIN K:=L+HOP; N:=TEMP;
|
|
FOR M:=L STEP JUMP UNTIL K DO BEGIN
|
|
SP[NOC] := SP[MOC]; N:=N+1; END;
|
|
IF LOP LSS 0 THEN SORTIT(TEMP,L+DIFF,DIM,JUMP,FALSE)
|
|
ELSE SORTIT(TEMP,L+DIFF,DIM,JUMP,TRUE);
|
|
END ELSE IF SCAN THEN BEGIN
|
|
K:=L+INTERVAL; N:=L+DIFF; SP[NOC] := SP[LOC];
|
|
FOR N:=N+JUMP STEP JUMP UNTIL K DO BEGIN
|
|
M:=N-JUMP; L:=L+JUMP;
|
|
IF NOT OPERATION(SP[MOC],SP[;QOC],-1,LOP,SP[NOC])
|
|
THEN GO TO FORGET; END;
|
|
END ELSE IF REVERSAL THEN REVERSE(L,DIM,L+DIFF,JUMP)
|
|
ELSE IF ROTATION THEN ROTATE(L,DIM,L+DIFF,JUMP,
|
|
GETNUM(I,LSAVE,LRANK,DIM));
|
|
END;
|
|
J := J + ABS(JUMP?DIM);
|
|
N := N + TOP + 1;
|
|
DIFF := DIFF + TOP + 1;
|
|
END;
|
|
GO TO QUIT;
|
|
RANKERR: ERR:=RANKERROR; FORGETSPACE(DESC.SPF,SSIZE);GO QUIT;
|
|
FORGET: ERR:=DOMAINERROR; FORGETSPACE(DESC.SPF, SSIZE);
|
|
QUIT: IF CHARACTER THEN BEGIN
|
|
FORGETSPACE(MSAVE,SIZE+RANK);
|
|
IF (REVERSAL OR ROTATION) AND ERR=0 THEN BEGIN
|
|
DEX.ARRAYTYPE:=1; PACK(DESC.SPF,RANK,SIZE); END; END;
|
|
IF SORT THEN FORGETSPACE(TEMP,DIM);
|
|
RESULTD := DESC;
|
|
IF ROTATION THEN POP;
|
|
END PROCEDURE REDUCESORTSCAN;
|
|
PROCEDURE DYADICTRANS;
|
|
BEGIN REAL LDESC,RDESC;
|
|
INTEGER L,M,N,RANK,NEWRANK,SIZE,TEMP,I,J;
|
|
DEFINE SPTOP=RDESC#,MIN=RDESC#,PTR=REWRANK#,MBASE=LDESC#,TOP=RDESC#
|
|
,RESULT=RESULTD#;
|
|
LABEL QUIT; BOOLEAN CARRY;
|
|
INTEGER ARRAY RVEC,DEL,SUB,OLDEL[0:3];
|
|
LDESC:=AREG; RDESC:=BREG;
|
|
RESULT:=0; L:=LDESC.SPF; J:=LDESC.RF; RANK:=RDESC.RF;
|
|
IF M:=RDESC.SPF=0 OR L=0 OR LDESC.ARRAYTYPE=1 THEN BEGIN
|
|
ERR:=DOMAINERROR; GO TO QUIT; END;
|
|
IF NUMELEMENTS(LDESC)=1 THEN BEGIN N:=L+J;
|
|
IF SP[NOC] NEQ ORIGIN OR RANK GTR 1 THEN BEGIN
|
|
ERR:=DOMAINERROR; GO TO QUIT END;
|
|
%IF WE GET HERE, THE ANSWER IS ITSELF
|
|
RESULT:=RDESC; I:=NUMELEMENTS(RDESC);
|
|
RESULT..SPF:=N:=GETSPACE(SIZE:=RANK+1); RESULT.NAMED:=0;
|
|
SPCOPY(M,N,SIZE); GO TO QUIT END;
|
|
IF J GTR 1 THEN BEGIN ERR:=RANKERROR; GO TO QUIT END;
|
|
IF SP[LOC] NEQ RANK THEN BEGIN ERR:=LENGTHERROR; GO TO QUIT END;
|
|
% FIND MAX OF LDESC FOR NOW- DO THE REST LATER
|
|
%LDESC W/R/T ORIGIN 0 GETS STORED IN SUB[I]
|
|
SPTOP:=L+RANK; NEWRANK:=0; I:=0;
|
|
FOR N:=1 STEP 1 UNTIL SPTOP DO BEGIN
|
|
IF TEMP:=SP[NOC]-ORIGIN+1 GTR NEWRANK THEN NEWRANK:=TEMP;
|
|
SUB[I]:=TEMP-1; I:=I+1 END; 03277000P60
|
|
IF NEWRANK GTR TANK THEN BEGIN ERR:=DOMAINERROR;GO TO QUIT END;
|
|
% CALCULATE THE OLD DEL VECTOR, OLDEL
|
|
PLDEL[RANK-1]:=1; N:=M+RANK-1;
|
|
FOR I:=RANK-2 STEP -1 UNTIL 0 DO BEGIN
|
|
OLDEL[I]:=OLDEL[I+1]?SP[NOC]; N:=N-1 END;
|
|
MBASE:=M; SIZE:=1;
|
|
%FIX UP THE NEW RVAC AND DEL
|
|
FOR I:=NEWRANK-1 STEP -1 UNTIL 0 FO BEGIN
|
|
% FIND SMALLEST EL. OF RHO RDESC [J] S.T. A[J]=I
|
|
% AND SUM OF OLDEL[J] S.T. A[J]=1
|
|
MIN:=31; TEMP:=0;
|
|
FOR J:=RANK-1 STEP -1 UNTIL 0 DO
|
|
IF SUB[J]=1 THEN BEGIN
|
|
M:=MBASE+J;
|
|
IF SP[MOC] LSS MIN THEN MIN:=SP[MOC];
|
|
TEMP:=TEMP+OLDEAL[J] END;
|
|
RVEC[I]:=MIN; DEL[I]:=TEMP; SIZE:=SIZE?RVEC[I];
|
|
IF TEMP=0 THEN BEGIN %IT DOESN7T EXHAUSE IOTA NEWRANK
|
|
ERR:=DOMAINERROR; GO TO QUIT END;
|
|
END;
|
|
RESULT:=M:=GETSPACE(NEWRANK+SIZE);
|
|
RESULT.RF:=NEWRANK; RESULT.DID:=DDPUVW;
|
|
IF BOOLEAN(BREG.ARRAY) THEN BEGIN
|
|
RESULT.ARRAYTYPE:=1; N:=MBASE;
|
|
MBASE:=UNPACK(MBASE,RANK,N:=OLDEL[0]?SP[NOC]);
|
|
FORGETSPACE(MBASE,N+RANK) END;
|
|
FOR I:=1 STEP 1 UNTILNEWRANK DO BEGIN
|
|
SUB[I]:=0; OLDEL[I]:=RVEC[I]?DEL[I] END;
|
|
%INTIALIZE FOR STEPPING THRU NEW ARRAY
|
|
FOR I:=NEWRANK-1 STEP -1 UNTIL 0 DO BEGIN
|
|
SUB[I]:=0; OLDEL[I]:=RVEC[I]?DEL[I] ENND;
|
|
L:=MBASE+RANK;
|
|
%STEP THRU THE SUBSCRIPTS OF THE ANSWER TO PICK UP THE ELEMENTS
|
|
% IN ROW ORDER ACCORDING TO THE MAPPING GIVEN BY DEL
|
|
PTR:=TOP:=NEWRANK-1;
|
|
FOR I:=1 STEP 1 UNTIL SIZE DO BEGIN
|
|
SP[MOC] :=SP[LOC];
|
|
M:=M+1;
|
|
%GET NEXT SUBSCRIPT FOR NEW ARRAY AND SET NEXT L;
|
|
SUB[PTR]:=SUB[PTR]+1;
|
|
L:=L+DEL[TOP];
|
|
CARRY:=TRUE;
|
|
WHILE CARRY AND I NEQ SIZE DO
|
|
IF SUB[PTR] GEQ RVEC[PTR] THEN BEGIN
|
|
SUB[PTR]:=0;
|
|
L:=L-OLDEL[PTR]+DEL[PTR:=PTR-1];
|
|
SUB[PTR]:=SUB[PTR]+1
|
|
END ELSE CARRY:=FALSE;
|
|
PTR:=TUOP;
|
|
END;
|
|
IF BOOLEAN(RESULT.ARRAYTYPE) THEN PACK(RESULT.SPF,TOP+1,SIZE);
|
|
QUIT: END OF DYADICTRANS;
|
|
INTEGER PROCEDURE LOCATE(L,M); VALUE L,M; REAL L,M;
|
|
BEGIN
|
|
COMMENT L IS THE DIMENSION OF THE VECTOR(DESCRIPTOR),
|
|
M IS THE INDEX VECTOR;
|
|
INTEGER P,I,UB;
|
|
L:=I:=L.SPF; M:=I:=M.SPF;
|
|
UB:=SP[MOC]-1;
|
|
M:=M+1;
|
|
FOR I:=1 STEP 1 UNTIL UB DO
|
|
BEGIN
|
|
L:=L+1;
|
|
P:=(P+SP[MOC]-1)?SP[LOC];
|
|
M:=M+1;
|
|
END;
|
|
P:=P+SP[MOC];
|
|
LOCATE:=P+L;
|
|
END;
|
|
PROCEDURE DISPLAY(A,B); VALUE A,B; REAL A,B;
|
|
BEGIN
|
|
PROCEDURE PRINTMATRIX(L,ROW,COL);VALUE L,ROW,COL;
|
|
INTEGER L,ROW,COL;
|
|
BEGIN INTEGER I,J,CC,FOLD; DEFINE WIDE=GT2#;
|
|
WIDE:=LINESIZE;
|
|
FOR I:=1 STEP 1 UNTIL ROW DO
|
|
BEGIN CC:=0; %NO BLANKS AT BEGINNING OF LINE
|
|
FOLD:=0;
|
|
FOR J:=1 STEP 1 UNTIL COL DO
|
|
BEGIN NUMBERCON(SP[LOC],ACCUM);
|
|
IF FOLD:=FOL+ACOUNT+CC GTR WIDE AND ACOUNT+CC
|
|
LEQ WIDE THEN BEGIN TERPRINT;
|
|
FORMROW(0,2,ACCUM,2,ACOUNT); FOLD:=ACOUNT+2; END ELSE 03500140P61
|
|
FORMROW(0,CC,ACCUM,2,ACOUNT); L:=L+1;
|
|
CC:=2; %PUT 2 BLANKS AFTER FIRST ITEM.
|
|
END;
|
|
TERPRINT;
|
|
END;
|
|
END;
|
|
INTEGER L,M,N,BOTTOM,ALOC,BLOC;
|
|
INTEGER ROW,COL;
|
|
ALOC:=A.SPF; BLOC:=B.SPF-1;
|
|
L:=(M:=B.RF)+ BLIOC; COL:=SP[LOC];
|
|
L:=L-1;
|
|
ROW:=(IF M GTR 1 THEN SP[LOC] ELSE 1);
|
|
L:=BOTTOM:=M-2;
|
|
PRINTMATRIX(LOCATE(B,A),ROW,COL);
|
|
WHILE L GTR 0 DO
|
|
BEGIN
|
|
M:=ALOC+L; N:=BLOC+1;
|
|
IF SP[MOC]:=SP[MOC]+1 GTR SP[NOC] THEN
|
|
BEGIN SP[MOC]:=1; L:=L-1; END
|
|
ELSE BEGIN FORMWD(3,"1 ");
|
|
PRINTMATRIX(LOCATE(B,A),ROW,COL);
|
|
L:=BOTTOM;
|
|
END;
|
|
END;
|
|
FORMWD(3,"1 ");
|
|
END;
|
|
PROCEDURE MAKEFUNCTIONPRESENT(L); VALUE L ; REAL L; %LOC DESC
|
|
BEGIN
|
|
INTEGER I;
|
|
REAL M,N,SEQ,ORD,D;
|
|
BOOLEAN NUMERIC;
|
|
REAL STREAM PROCEDURE CON(A);VALUE A;
|
|
BEGIN SI:=LOC A; DI:=LOC CON; DS:=8OCT
|
|
END;
|
|
D:=SP[LOC]; %DESCRIPTOR FOR FUNCTION IS IN D
|
|
SEQ:=GETFIELD(D,FSQF-8,FFL); ORD:=GETFIELD(D,FPTF-8,FFL);
|
|
N:=GETSPACE(M:=SIZE(ORD)?2+6); %GET SPACE FOR TABLE
|
|
SP[NOC]:=M?2+5; %SIZE OF THE VECTOR WHICH FQOLLOWS
|
|
D:=D&N[CSPF]&1[CRF]&0[BACKUP]; S.PRESENCE:=1;
|
|
SP[LOC]:=D; %THIS SETS UP THE FUNCTION DESCRIPTOR.
|
|
N:=N+1; SP[NOC]:=SEQ;
|
|
COMMENT
|
|
SP[N] = SIZE OF THE VECTOR
|
|
SP[N+1] = SEQUENTIAL STORAGE UNIT FOR THE TEXT
|
|
SP[N+2] = SP LOC OF FIRST NUMERIC POINTER TO TEXT
|
|
|
|
SP[N+3] = REL LOC (TO N+5) OF THE FIRST ARG
|
|
SP[N+4] = REL LOC TO THE SECOND ARG
|
|
SP[N+5] = REL LOC OF RESULT . IF ANY ARE ZERO, THEN
|
|
THEY ARE NOT THERE.;
|
|
D:=M; M:=N:=N+4)+1; %D IS #ITEMS, M IS LOC 1ST., N=M-1
|
|
FOR I:=1 STEP 1 UNTIL D DO %GET LABELS FORM STORAGE
|
|
BEGIN L:=CONTENTS(ORD,I-1,GTA);
|
|
IF NOT NUMERIC THEN %RESULT, ARGS, OR LOCALS/LABELS
|
|
IF NUMERIC:=GTA[0]=0 THEN %FIRST NUMERIC POINTER
|
|
BEGIN L:=N-3; SP[LOC]:=N+I?2-1;
|
|
END;
|
|
SP[MOC]:=GTA[0]; M:=M+1;
|
|
IF NUMERIC THEN SP[MOC]:=GTA[1] ELSE
|
|
BEGIN
|
|
IF SEQ:=GTA[1] LSS 0 THEN %RESULT OR OARG
|
|
BEGIN DL:=N+SEQ+1; SP[LOC]:=I;
|
|
SEQ:=0;
|
|
END ELSE SEQ:=CDN(SEQ)/10000;
|
|
SP[MOC]:=SEQ
|
|
END
|
|
M:=M+1;
|
|
END;
|
|
COMMENT WE HAVE TO SET UP THE FUNCTION LABEL TABLE, LET
|
|
SOMEONE ELSE FIGURE OUT HOW TO EXECUTE IT;
|
|
END;
|
|
PROCEDURE PUSHINTOSYMTAB(FPTR);VALUE FPTR;REAL FPTR;
|
|
BEGIN COMMENT ...PUT THE LOCAL VARIABLES FORM THIS SUSPENDED
|
|
FUNCTION INTO THE SYMBOL TABLE TO BE TREATED AS GLOBAL VARIABLES
|
|
WHILE THE FUNCTION IS SUSPENDED. FPTR IS THE ENTRY FROM THE
|
|
STATE INDICATOR VECTOR FOR TEH FUNCTION.;
|
|
|
|
REAL T,U;
|
|
LABEL COPY;
|
|
INTEGER K,L,M,N;
|
|
M:=FPTR.LOCFIELD+1;%LOCATE FMKS TO FIND LOCAL VALUES IN STACK
|
|
N:=FPTR.SPF+2;T:=SP[NOC]-2;%FIND LOCAL NAMES
|
|
FOR N:=N+4 STEP 2 UNTIL T DO %ONCE FOR EACH LOCAL 03507100P62
|
|
BEGIN GT1:=SP[NOC] .[6:42];%PICK UP THE LOCAL NAME
|
|
L:=SYMBASE;K:=L+SP[LOC];% LOOK IN SYMBOL TABLE
|
|
FOR L:=L+1 STEP 2 UNTIL K DO % CHECK EACH NAME
|
|
IF GT1=SP[LOC].[6:42] THEN % WE FOUND A MATCH
|
|
BEGIN GT1:=M;K:=M:=GETSPACE(1);L:=L+1;
|
|
SP[MOC]:=SP[ALOC]; %PUSH CURRENT DESCRIPTOR DOWN
|
|
M:=GT1; GO TO COPY;
|
|
END;
|
|
COMMENT GET HERE IF NO MATCH...MUST MAKE A NEW ENTRY IN
|
|
SYMBOL TABLE;
|
|
IF K LSS MAXSYMBOL?2 THEN % THERE IS ROOM IN SYMBOL TABLE
|
|
BEGIN L:=SYMBASE;SP[LOC]:=SP[LOC]+2; L:=K+1;
|
|
SP[LOC]:=GT1&OPERAND[CTYPE]&1[CSUSVAR];L:=L+1;K:=0;
|
|
COPY: COMMENT L IS LOC IN SYMBOL TABLE FOR DESC. K WILL BE
|
|
CONTENTS OF BACKF. NOW SET UP THE NEW DESCRIPTOR AND
|
|
SAVE ITS LOCATION IN THE STACK. M IS THE STACK LOCATION
|
|
OF THE LOCAL;
|
|
|
|
SP[LOC]:=SP[MOC]&K[CLOCP]&1[CNAMED];
|
|
SP[MOC]:=L&DDNUVW[CDID];M:=M+1;
|
|
END ELSE % THERE IS NO ROOM IN THE SYMBEOL TABLE
|
|
BEGIN N:=T;ERR:=SPERROR;END;
|
|
END;% OF FOR LOOP STEPPING THROGH THE LOCALS
|
|
END; % OF PUSHINTOSYMTAB PROCEDURE
|
|
PROCEDURE FORGETPROGRAM(U);VALUE U; REAL U;
|
|
BEGIN REAL L,M;
|
|
COMMENT U IS A PROGRAMMKS...THE SP STORAGE FPOR THIS LINE
|
|
SHOULD BE RELEASED;
|
|
M:=U.SPF;SCRATCHAIN(SP[MROC].LOCFIELD);%CONSTANT CHAIN
|
|
L:=SP[MOC].SPF;FORGETSPACE(M,1);%FORGET PROGRAM DESC.
|
|
M:=FL+1;SCRATCHDATA(SP[MOC]);%FORGET BUFFER
|
|
FORGETSPACE(L,SP[LOC]+1);%FORGET THE POLISH
|
|
END;
|
|
EXPOVR:=EXPOVRL;
|
|
UINTOVR:=INTOVRL;
|
|
INDEX:=INDEXL;
|
|
FLAG:=FLAGL;
|
|
ZERO:=ZEROL;
|
|
CASE MODE OF
|
|
BEGIN ;%--------------------------------------------------------
|
|
%---------------- CASE 1....MODE=XEQUTE------------------------
|
|
CASE CURRENTMODE OF
|
|
BEGIN%-----------------------------------------------------
|
|
%------------- SUB-CASE 0....CURRENTMODE=CALCMODE----------
|
|
IF T:=ANALYZE(TRUE) NEQ 0 THEN % WE HAVE A PROGRAM DESC
|
|
BEGIN COMMENT SET-UP THE STACK;
|
|
IF STACKBASE=0 THEN BEGIN
|
|
STACKBASE:=L:=GETSPACE(STACKSIZE+1);
|
|
IF ERR NEQ 0 THEN BEGIN STACKBASE:=0;
|
|
ERRORMESS(ERR,0,0); GO TO PROCESSEXIT;END;
|
|
SP[LOC]:=2;
|
|
L:=L+1;
|
|
M:=GETSPACE(STATEVECTORSIZE+1);
|
|
SP[LOC]:=M&1[CRF]&DDPNVW[CDID];
|
|
SP[MOC]:=STATEVECTORSIZE;
|
|
M:=M+1; SP[MOC]:=0; % THE STATE VECTOR IS INITIALIZED NOW
|
|
FUNCLOC:=M;
|
|
N:=0;
|
|
L:=L+1; COMMENT READY FOR A PROG MKS;
|
|
END ELSE % THERE IS ALREADY A STACK...USE IT
|
|
BEGIN L:=STACKBASE;
|
|
ST:=SP[LOC]+L;
|
|
WHILE M:=AREG.DID NEQ IMKS AND M NEQ PROGMKS AND
|
|
ERR=0 DO POP;%STRIP BACK TO LASTMARKSTACK
|
|
IF M=IMKS THEN BEGIN N:=ST-STACKBASE;PUSH;
|
|
END ELSE N:=AREG.BACKF;
|
|
SP[LOC]:=ST-STACKBASE;L:=ST;
|
|
END;
|
|
CURLINE:=0;
|
|
M:=GETSPACE(1); SP[MOC]:=T; %STORE PROG DESCRIPTOR
|
|
SP[LOC]:=M&PROGMKS[CDID]&N[BACKPT]&1[CI];
|
|
COMMENT JUST BUILT A PROGRAM MARKSTACK;
|
|
GO TO EXECUTION;
|
|
END;
|
|
%------------SUB-CASE 1....CURRENTMODE=XEQMODE---------------
|
|
COMMENT RECOVERY FORM A TIME-OUT;
|
|
GO TO EXECUTION;
|
|
%----------- SUB-CASE 2....CURRENTMODE=FUNCMODE--------------
|
|
COMMENT SYNTAX CHECK ONLY;
|
|
IF ANALYZE(TRUE)=0 THEN;
|
|
%------- END OF SUB CASES-----------------------------------
|
|
END;
|
|
%------------------ CASE 2.....MODE=ALLOC------------------------ 03702300P63
|
|
COMMENT NOTHING TO DO;
|
|
;
|
|
%----------------- CASE 3.... MODE=WRITEBACK-------------------
|
|
COMMENT HAVE TO WRITE BACK ALL THE NAMED VARIABLES;
|
|
IF SYMBASE NEW 0 THEN
|
|
WRITEBACK;
|
|
|
|
%----------------- CASE 4.... MODE=DEALLOC---------------------
|
|
;
|
|
|
|
%----------------- CASE 5 .... MODE=INTERROGATE----------------
|
|
COMMENT PRINT OUT THE PROGRAM STATUS VECTOR HERE;
|
|
IF L:=STACKBASE+1 NEW 1 THEN
|
|
BEGIN COMMENT GT1=1 FOR SIV...=0 FOR SI;
|
|
U:=GT1;
|
|
L:=SP[LOC].SPF+1;M:=SP[LOC].SPF+L;
|
|
WHILE M GTR L DO
|
|
BEGIN N:=SP[MOC].LOCFIELD;N:=SP[NOC].SPF-1;
|
|
% N IS LOCATION OF THE FUNCTION NAME
|
|
ACCUM[0]:=SP[NOC];
|
|
FORMRIOW(2,6,ACCUM,1,7);
|
|
IF BOOLEAN(SP[MOC].SUSPENDED) THEN FORMWD(0,"3 S ")
|
|
ELSE FORMWD(0,"3 ");
|
|
IF BOOLEAN(U) THEN % PRINT LOCAL VARIABLE NAMES
|
|
BEGIN
|
|
N:=SP[MOC].SPF+2;T:=SP[NOC]-2;
|
|
FOR N:=N+4 STEP 2 UNTIL T DO
|
|
BEGIN ACUM[0]:=SP[NOC];
|
|
FORMROW(0,1,ACCUM,1,7);
|
|
END;
|
|
END;
|
|
TERPRINT; M:=M-1;
|
|
END;
|
|
END;
|
|
END;% OF THE CASE STATMENT
|
|
%--------------END OF CASES---------------------------------------
|
|
IF FALSE THEN EXECUTION:
|
|
BEGIN COMMENT EXECUTION LOOP;
|
|
INTEGER LO+OP;
|
|
INTEGER INPUTIMS;
|
|
LABEL BREAKKEY;
|
|
LABEL SKIPPOP,XEQPS;
|
|
BOOLEAN XIT, JUMP;
|
|
REAL POLWORD;
|
|
DEFINE RESULT=RESULTD#;
|
|
LABEL EXECEXIT, EVALQ, EVALQQ;
|
|
%%%
|
|
COMMENT THERE IS A PROGRAM DESCRIPTOR AT THE TOP OF THE STACK;
|
|
ERR:=0;
|
|
L:=STACKBASE; ST:=L+SP[LOC];
|
|
L:=L+1;FUNCLOC:=SP[LOC]SPF+1;
|
|
T:=AREG;
|
|
IF CURRENTMODE=XEQMODE THEN %AREG IS INTERRUPT MARK STACK
|
|
BEGIN LASKMKS:=STACKBASE+T.BACKF;
|
|
OLDDATA:=T.SPF; INPUTIMS:=T.QUADIN; POP;
|
|
COMMENT MAY BE CURRENTLY EXECUTING A FUNCTION;
|
|
L:=STACKBASE+1; L:=SP[LOC].SPF+1;
|
|
IF (M:=SP[LOC].SPF) NEQ 0 THEN
|
|
BEGIN ML=M+L; L:=SP[MOC].LOCFIELD;
|
|
CURLINE:=SP[LOC].CIF;
|
|
|
|
END;
|
|
END
|
|
EDLSE LASTMKS:=ST;%AREG IS PROGRAM MARK STACK
|
|
CURRENTMODE:=XEQMODE;
|
|
L:=LASTMKS; T:=SP[LOC]; % T IS PROGRAM MARK STACK
|
|
CINDEX:=T.CIF; % CONTROL INDEX IN POLISH
|
|
IF L:=T.SPF =0 THEN %PHONEY PROG DESC FROM FUNCTION CALL
|
|
N:=POLTOP:=POLLOC:=0 ELSE
|
|
BEGIN
|
|
N:=POLLOC:=SP[LOC].SPF;
|
|
POLTOP:=SP[NOC]
|
|
END;
|
|
IF ERR = 0 THEN % POP WORKED
|
|
IF INPUTIMS=2 THEN BEGIN JUMP:=TRUE; GO TO EVALQ END ELSE
|
|
IF INPUTIMS = 1 THEN BEGIN JUMP:=TRUE; GO TO EVALQQ; END ELSE
|
|
DO BEGIN COMMENT EXECUTE UNTIL DONE OR TIME-OUT;
|
|
BEGIN COMMENT GET NEXT POLISH TO EXECUTE;
|
|
M:=(CINDEX:=CINDEX+1)+POLLOC;
|
|
POLWORD:=T:=SP[MOC];
|
|
CASE T.TYPEFIELD OF 03752700P64
|
|
BEGIN %-------TF=0 (REPLACEMENT)--------------
|
|
BEGIN %MAY BE A LOCAL OR A GLOBAL VARIABLE
|
|
DEFINE STARTSEGMENT=#; %/////////////////////
|
|
PUSH; IF ERR NEQ 0 THEN GO TO SKIPPOP;
|
|
N:=T.LOCFIELD;
|
|
IF BOOLEAN(T.OPTYPE) THEN %A LOCAL VARIABLE
|
|
BEGIN M:=FUNCLOC;%FIND LAST MKS
|
|
M:=SP[MOC].SPF+M;
|
|
N:=SP[MOC].LOCFIELD+N; END;
|
|
U:=SP[NOC]; U.LOCFIELD:=N; AREG:=U;
|
|
IF U.DATADES=0 THEN ERR:=NONCEERROR;
|
|
COMMENT PROBABLY MIXUP WITH FUNCTION NAMES
|
|
AND NAMES OF LOCAL SUSPENDED VARIABLES;
|
|
END;
|
|
%-------------FUNCTION CALL-----------------
|
|
%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
|
|
BEGIN COMMENT SET UP STACK FOR A FUNCTION CALLL;
|
|
EAL U,V,NARGS,D;
|
|
INTEGER I,FLOC;
|
|
LABEL TERMINATE;
|
|
COMMENT
|
|
MONITOR PRINT(D,L,M,N,FLOC,SP,LASTMKS);%::::::::::::::::::::
|
|
FLOC:=N:=T.LOCFIELD;
|
|
IF BOOLEAN(SP[NOC].DATADESC) THEN BEGIN ERR:=NONCEERROR;
|
|
FO TO TERMINATE;END;%SUSPENDED VAR CONFUSED WITH FUNCTION
|
|
IF NOT BOOLEAN(SP[NOC].PRESENCE) THEN MAKEFUNCTIONPRESENT(N);
|
|
D:=SP[NOC]; L:=LASTMKS; %D IS TEH DESC, L IS THE PROG MKS
|
|
SP[LUOC].CIF:=CINDEX; %SAVE CURRENT POLISH LOCATION
|
|
L:=STACKBASE+1; L:=SP[LOC].SPF+1;
|
|
M:=SP[LOC].SPF;
|
|
IF N:=M+L NEQ L THEN %THERE IS A NESTED CALL
|
|
IF NOT BOOLEAN(SP[NOC].SUSPENDED) THEN
|
|
BEGIN N:=SP[NOC].LOCFIELD;SP[NOC].CIF:=CURLINE;END;
|
|
|
|
|
|
SETFIELD(GTA,0,8,0); SETFIELD(GTA,8,8,0); %INITIALIZE GTA
|
|
NARGS:=D.NUMBERARGS;
|
|
FOR I:=1 STEP 1 UNTIL NARGS DO
|
|
IF BOOLEAN((T:=AREG).DATADESC) THEN
|
|
BEGIN
|
|
IF BOOLEAN(T.NAMED) THEN %MAKE A COPY
|
|
COMMENT YOU COULD MAKE A CALL BY NAME HERE;
|
|
BEGIN U:=GETSPACE(V:=(NUMELEMENTS(T)+1,RF));
|
|
SPCOPY(T,SPF,U,V); T.NAMED:=0; T.SPF:=U;
|
|
T.BACKP:=0;
|
|
END ELSE %NO NEED TO MAKE A COPY
|
|
AREG.PRESENCE:=0;
|
|
POP; GTA[I-1]:=T; %SAVE THE DESCRIPTOR FOR LATER USE
|
|
END ELSE ERR:=SYSTEMERROR;
|
|
IF (N:=M+1) GEQ STATEVECTORSIZE THEN ERR:=DEPTHERROR;
|
|
IF ERR NEQ 0 THEN GO TO TERMINATE;
|
|
SP[LOC].SPF:=N;
|
|
PUSH;AREG:=OLDDATA&(LASTMKS-STACKBASE)[BACKPT]&IMKS[CDID];
|
|
OLDDATA:=0; %REINITIALIZE OLDDATA CHAIN FOR THIS FUNCTION
|
|
%NOW SET UP THE FUNCTION MARK STACK.
|
|
|
|
M:=N+L;PUSH;SP[MOC]:=D.SPF&ST[CLOCF];
|
|
M:=D.SPF; M:=M+2; % M IS LOC OF LOC OF FIRST LINE
|
|
AREG:=0&FLOC[CSPF]&((LASTMKS:=ST)-STACKBASE-1)[BACKPT]&
|
|
(U:=SP[MOC]-D.SPF)[CCIF]&FMKS[CDID]; % FUNCTION MKS
|
|
CURLINE:=U;
|
|
|
|
U:=(U-6)/2; % U IS THE NUMBER OF LOCALS, LABELS, AND ARGS
|
|
M:=M+5; % M IS ON TEH FIRST DESC IOF THE FIRST LAB, LOC,...
|
|
FOR I:=1 STEP 1 UNTIL U DO % GET DESCRIPTORS INTO THE STACK
|
|
BEGIN IF SP[MOC] NNEQ 0 THEN %MAKE UP THE DESC
|
|
BEGIN L:=GETSPACE(1); SP[LOC]:=SP[MOC];
|
|
T:=L&DDPUSW[CDID]&0[CCIF]
|
|
END ELSE
|
|
T:=NULLV;
|
|
PUSH; M:=M+2;
|
|
AREG:=T; %A SINGLE LOCAL
|
|
END;
|
|
%COPY OVER THE ARGUMENTS
|
|
FOR I:=1 STEP 1 UNTIL NARGS DO %COPY OVER
|
|
BEGIN M:=D.SPF; %M IS THE LOACTION OF THE LABEL TABLE.
|
|
M:=M+2+I; %M IS LOCATION OF REL LOCATION OF VARIABLE
|
|
M:=SP[MOC];
|
|
N:=LASTMKS+MM;
|
|
SP[NOC]:=GTA[I-1];
|
|
END;
|
|
%PUT IN A PHONEY PROG DESC TO START THINGS OFF
|
|
PUSH; IF ERR NEQ 0 THEN GO TO TERMINATE; 03753400P65
|
|
ARFG:=0&4094[CCIF]&(LASKMKS-STACKBASE)[BACKU[];
|
|
LASTMKS:=ST; POLTOP:=POLLOC:=0;
|
|
TERMINATE:
|
|
END;
|
|
%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
|
|
%-------END OF LOAD FUNCTION FOR CALL-----
|
|
%-------------TF=2 (CONSTANT)---------------------
|
|
BEGIN PUSH; IF ERR=0 THEN BEGIN
|
|
N:=POLWORD.LOCFIELD;AREG:=SP[NOC];END;
|
|
END;
|
|
%-------------TF=3 (OPERATOR)-----------------
|
|
COMMENT SEQUENCE NUMBERS CORRESPOND TO OPERATOR
|
|
ASSIGNMENT NUMBER;
|
|
BEGIN IF T.OPTYPE=MONADIC THEN
|
|
BEGIN PUSH;IF ERR=0 THEN AREG:=0; END;
|
|
CASE T.LOCFIELD OF
|
|
BEGIN %--------------- OPERATE ON STACK ---------------------
|
|
COMMENT EACH EXECUTION PROCEDURE SETS RESULT TO THE
|
|
DESCRIPTOR OF THE RESULT OF THE OPERATION.
|
|
AREG AND BREG ARE THE LEFT AND RIGHT-HAND OPERANDS AND
|
|
ARE ACTUALLY THE TOP TWO DESCRIPTORS ON THE STACK.
|
|
IF AREG IS ZERO, THE OPERATOR IS TAKEN TO BE MONADIC.;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
%---------------------REPLACEMENT OPERATOR---------------
|
|
BEGIN DEFINE STARTSEGMENT=#; %///////////////////////////////
|
|
IF NOT BOOLEAN(L:=AREG.NAMED) THEN % SHOULD BE LOCAL VARIABLE
|
|
AREG.NAMED:=1; % DONT LET IT BE FORGOTTEN.
|
|
|
|
IF BOOLAN(T:=AREG).PRESENCE) AND T.SPF NEQ 0 THEN
|
|
OLDDATA:=CHAIN(T,OLDATA);
|
|
M:=T.LOCFIELD;
|
|
|
|
IF(RESUT:=BREG).SPF = 0 THEN U:=T:=0 ELSE
|
|
U:=GETSPACE(T:=NUMELEMENTS(RESULT)+RESULT.RF);
|
|
SPCOPY(RESULT,SPF,U,T);
|
|
RESULT.SPF:=U; RESULT.NAMED:=L; %L IS 0 FOR LOCJLS
|
|
GT1:=IF BOOLEAN(U:=SP[MOC]).PRESENCE) THEN U.BACKP ELSE 0;
|
|
SP[MOC]:=RESULT>1[CLOCF];
|
|
IF BOOLEAN(L) AND GT1=0 THEN %CHECK FOR GLOBAL
|
|
BEGIN M:=M-1;IF(SP[MOC].SUSPENDVAR=0)THEN SP[MOC].CHANGE:=1;
|
|
|
|
END;
|
|
RESULT.NAMED:=1; %KEEP "PUSH" FROM TOSSING THE DATA
|
|
END
|
|
%-------TRANSFER OPERATOR---------------------------------
|
|
BEGIN DEFINE STARTSEGMENT=#; %////////////////////////////////
|
|
SCRATCHAIN(OLDDATA);ODDATA:=0;
|
|
IF BOOLEAN(D.DPTYPE) THEN ST:=ST-1; %GET RID OF PH7ONEY TOP
|
|
L:=FUNCLOC;
|
|
IF SP[LOC] NEQ 0 THEN STEPLINE(TRUE) ELSE
|
|
ERR:=SYNTAXERROR;
|
|
GO TO SKIPPOP;
|
|
END;
|
|
BEGIN %--------------COMPRESSION------------------------------------
|
|
DEFINE STARTSEGMENT=#; %/////////////////////////////////////
|
|
L:=ST-2; IF T.OPTYPE=MONADIC THEN COMPRESS(BREG,SP[LOC],AREG)
|
|
ELSE COMPRESS(AREG,S[]LOC],BREG); COMMENT A/B HAS BEEN
|
|
STACKAED AS B,A,NULL...A/[I] B HAS BEEN STACKED AS B,I,A;
|
|
END;
|
|
ARITH(3); %OPERATION IS DIVIDE
|
|
;
|
|
;
|
|
%-------------QUAD INPUT--------------------------------
|
|
EVALQ: BEGIN LABEL EVALQUAD;
|
|
IF JUMP THEN BEGIN JUMP:=FALSE; GO TO EVALQQUAD END;
|
|
CURRENTMODE:=INPUTMODE;
|
|
FORMWD(3,"3[]: "); INDENT(0);
|
|
|
|
IMS(2); % SETUP MARKSTACK FOR QUAD EXIT
|
|
IF ERR NEQ 0 THEN GOTO SKIPPOP;
|
|
GO TO EXECEXIT; % EXIT TO MONITOR TILL INPUT IS COMPLETE
|
|
EVALQUAD: %LO7OK AT BUFFER TO SEE WHAT CAME IN
|
|
BEGIN
|
|
IF NOT SCAN THEN BEGIN CINDEX:=CINDEX-1;GO TO SKIPPOP;END;
|
|
IF NOT SETUPLINE THEN CINDEX:=CINDEX-1;%MAKE THEM REDO IT
|
|
GO TO SKIPPOP;
|
|
END;
|
|
END;
|
|
BEGIN % -----EVALUATE SUBSCRIPTS---------------
|
|
DEFINE STARTSEGMENT=#; %///////////////////////////////////// 03811002P66
|
|
T:=AREG; L:=BREG.SPPF;
|
|
IF BOOLEAN(T.SCALAR) THEN BEGIN ERR:=DOMAINERROR; GO TO SKIPPOP;END;
|
|
U:=SP[LOC]; % GET # OF SUBSCRIPTS
|
|
IF U GTR 32 THEN ERR:=INDEXERROR ELSE
|
|
BEGIN
|
|
IF U GTR 0 THEN BEGIN
|
|
IF T.PRESENCE NQ 1 THEN % GET ARRAY INTO SP
|
|
BEGIN N:=T.LOCFIELD;
|
|
IF (T:=SP[NOC]).PRESENCE NEQ 1 THEN
|
|
BEGIN T:=GETARRAY(T); SP[NOC]:=T END;
|
|
T.LOCFIELD:= N;
|
|
END;
|
|
IF ERR=0 THEN % NOW EVAVLUATE
|
|
|
|
RESULT:=SUBSCRIPTS(L:=(IF T.LOCFIELD=0 THEN OUTOF
|
|
ELSE INTO),T,U);
|
|
IF L=INTO THEN BEGIN
|
|
|
|
CINDEX:=CINDEX+1;END; % SKIP OVER REPLACE OP
|
|
END ELSE % NO SUBSCRIPTS
|
|
BEGIN BREG:=T; ST:=ST-1; GO TO SKIPPOP;
|
|
END; % DON{T LET TEH DESC. IN T BE POPPED.
|
|
U:=U+2; % # OF THINGS TO POP
|
|
FOR N:=1 STEP 1 UNTIKL U DO POP;
|
|
IF L=OUTOF THEN PUSH; AREG:=RESULT;
|
|
|
|
GO TO SKIPPOP;
|
|
END;
|
|
END;
|
|
;
|
|
;
|
|
%-------------QQUAD INPUT-------------------------------
|
|
EVALQQ: BEGIN LABEL EVALQQUAD;
|
|
IF JUMP THEN BEGIN JUMP:=FALSE; GO TO EVALQQUAD END;
|
|
CURRENTMODE:=INPUTMODE;
|
|
IMS(1); %SET UP MARKSTACKS FOR QQUAD EXIT
|
|
IF ERR NEQ 0 THEN GO TO SKIPPOP;
|
|
GO TO EXECEXIT;
|
|
EVALQQUAD: % BUFFER CONTAINS THE INPUT STRING
|
|
IF (L:=LENGTH(BUFFER,TRUE))NEQ 0 THEN BEGIN %L IS # CHAR INPUT
|
|
N:=ENTIER((3L+7) DIV 8); % FIND NUMBER OF WORDS
|
|
M:=GETSPACE(N+1); % GET SPACE FOR EACH VECTOR IN SP
|
|
TRANSFERSP(INTO,SP,M+1,BUFFER,0,N);
|
|
SP[MOC]:=L; % STORE LENGTH OF VECTOR
|
|
RESULT:=M&1[CRF]&DDPUVC[CDID]; % SET UP DESCRIPTOR
|
|
END ELSE RESULT:=NULLV;% NOTHING WAS INPUT
|
|
PUSH; IF ERR=0 THEN AREG:=RESULT;
|
|
GO TO SKIPPOP;
|
|
END;
|
|
RESULTD := SEMICOL; %CONVERSIEON CONCATENATION
|
|
COMMAP; %CATENATE
|
|
BEGIN%----------INNER PRODUCR (PERIOD)---------------------
|
|
M:=(CINDEX:=CINDEX+2) + POLLOC; T:=SP[MOC];M:=M-1;U:=SP[MOC];
|
|
PERIOD(AREG,BREG,U.LOCFIELD,T.LOCFIELD);
|
|
END;
|
|
ARITH(4); %*
|
|
;
|
|
;
|
|
ARITH(17); %AND
|
|
ARITH(18); %OR
|
|
ARITH(9); %NOT
|
|
ARITH(11); %LESS:THAN
|
|
ARITH(16); %LEQ
|
|
ARITH(13); %=
|
|
ARITH(14); %GREATER-THAN
|
|
ARITH(15); %NEQ
|
|
ARITH(8); %MAX/CEIL
|
|
ARITH(7); %MIN/FLOOR
|
|
ARITH(6); %RESD/AAAABS
|
|
IF T.OPTYPE=MONADIC THEN GO TO XEQEPS ELSE MEMBER; %MEMBERSHIP
|
|
RHOP; %RHO
|
|
IOTAP; %IOTA
|
|
;
|
|
REDUCESORTSCAN(0,BREG,AREG,4); %REVERSAL;
|
|
BEGIN %-----------EXPANSION-------------------------
|
|
DEFINE STARTSEGMENT=#; %///////////////////////////////////
|
|
L:=ST-2; IF T.OPTYPE=MONADIC THEN EXPAND(BREG,SP[LOC],AREG)
|
|
ELSE EXPAND(REG,SP[LOC],BREG); COMMENTS A EXPN B HAS BEEN
|
|
STACKED AS B,A,NULL WHILE A EXPN [I] B IS STACKED AS B,I,A;
|
|
END;
|
|
RESULTD:=BASEVALUE; %BASE VALUE
|
|
ARITH(10); %COMB/FACT 03840000P67
|
|
;
|
|
IF T.EOPTYPE=MONADIC THEN ARITH(5) ELSE
|
|
DYADICRNDM; %RNDM
|
|
IF T.OPTYPE=MONADIC THEN TRANSPOSE ELSE DYADICTRANS;%GUESS WHAT
|
|
RESULTID := REPRESENT; %REPRESENTATION
|
|
ARITH(45); %CIRCLE--TRIGONOMETRIC FUNCTIONS
|
|
;
|
|
;
|
|
ARITH(0); %ADD
|
|
ARITH(2); %SUBTRACT
|
|
ARITH(1); %MULTIPLY
|
|
%-------------------DISPLAY---------------------------------------
|
|
|
|
BEFIN DEFINE STRATSEGMENT=#; %/////////////////////////////////
|
|
IF BREG.SPF=0 THEN FORMROW(3,0,ACCUM,2,0) ELSE %FOR A NULL
|
|
IF BOOLEAN((RESULT:=BREG).DATADESC)THEN %THIS IS A DATA DESC
|
|
IF BOOLEAN(RESULT,PRESENCE) AND M:=RESULT.SPF NEQ 0 THEN
|
|
IF BOOLEAN(RESULT.SCALAR) THEN
|
|
BEGIN NUMBERCON(SP[MOC],ACCUM);
|
|
FORMROW(3,0,ACCUM,2,ACOUNT)
|
|
END
|
|
ELSE %A VECTOR
|
|
IF L:=RESULT.RF NEQ 0 THEN % SOMETHING TO PRINT
|
|
IF BOOLEAN(RESULT.CHRMEODE) THEN DISPLAYCHARV(RESULT)
|
|
ELSE
|
|
BEGIN RESULT:=M:=GETSPACE(L+1);
|
|
SP[MOC]:=L; RESULT.DF:=1; RESULT.DIS:=DDPUVW;
|
|
AREG:=RESULT;
|
|
FOR T:=1 STEP 1 UNTIL 1L DO
|
|
BEGIN M:=M+1; SP[MEOC]:=1
|
|
END;
|
|
DISPLAY(AREG,BREG);
|
|
RESULT:=BREG;
|
|
END ELSE TERPRQINT
|
|
ENS TERPRINT
|
|
ELSE ; %PROBABLY AN FUNCTION....DONT DO ANYTHING
|
|
IF BREAKFLAG THEN %USER HIT BREAK DURING OUTPUT
|
|
GO TO BREAKKEY;
|
|
POP; GO TO SKIPPOP;
|
|
END;
|
|
BEGIN % ---------------REDUCTION------------------------------------
|
|
M:=(CINDEX:= CINDEX+1) + POLLOC; % FIND OPERATION IN POLISH
|
|
IF (T:=SP[MOC]).TYPEFIELD NEQ 3 THEN ERR:=SYSTEMERROR
|
|
ELSE REDUCESORTSCAN(T.LOCFIELD,BREG,AREG,1);
|
|
END;
|
|
BEGIN %--------ROTATION----------------------------
|
|
DEFINE STARTSEGMENT=#; %////////////////////////////////////
|
|
L:=ST-2; IF T.OPTYPE=MONADIC THEN
|
|
REDUCESORTSCAN(BREG,SP[LOC],AREG,5) ELSE
|
|
REDUCESORTSCAN(AREG,SP[LOC],BREG,5); COMMENT A ROT B IS
|
|
STACKED AS R,A,NULL WHILE A ROT [I] B IS STACKED AS B,I,A;
|
|
END;
|
|
ARITH(21); %LOG
|
|
REDUCESORTSCAN(0,BREG,AREG,2); % SORTUP
|
|
REDUCESORTSCAN(-1,BREG,AREG,2); %SORTDN
|
|
BEGIN%--------------SCAN-------LIKE REDUCTION----------------
|
|
DEFINE STARTSEGMENT=#; %//////////////////////////////////////
|
|
M:=(CINDEX:=CINDEX+1) + POLLOC; %FIND OPERATOR IN POLISH
|
|
IF (T:=SP[MOC]).TYPEFIELD NEW 3 THEN ERR:=SYSTEMERROR
|
|
ELSE REDUCESORTSCAN(T.LOCFIELD,BREG,AREG,3);
|
|
END;
|
|
ARITH(19); %NAND
|
|
RITH(20) %NOR
|
|
IF (T:=BREG).RF NEQ 0 THEN RESULT:=SUBSCRIPTS(3,T,T,RF)
|
|
ELSE ERR:=RANKERROR; % OPERATION IS TAKE
|
|
IF (T:=BREG).RF NEQ 0 THEN RESULT:=SUBSCRIPTS(3,T,T,RF)
|
|
ELSE ERR:=RANKERROR; % OPERATION IS DROP
|
|
%------------------------XEQ---------------------------------
|
|
XEQEPS: BEGIN DEFINE STARTSEGMENT=#; %////////////////
|
|
IF AREG NEQ 0 THEN ERR:=SYNTAXERROR %MUST BE MONADIC ONLY
|
|
EFLSE IF (T:=BREG).RF NEQ 1 OR %MUST BE A VECTOR
|
|
NOT BOOLEAN(T.CHRMODE) THEN ERR:=DOMAINERROR %MUST BE CHAR STRING
|
|
ELSE IF U:=NUMELEMENTS(T) GTR MAXBUFFSIZE THEN ERR:=LENGTHERROR
|
|
ELSE BEGIN
|
|
M:=GT1; % # OF CHARACTERS SET BY NUMELEMENTS
|
|
INITBUFF(BUFFER.MAXBUFFSIZE);RESCANLINE;
|
|
TRANSFERSP(QUTOF,SP,T,SPF+1,BUFFER,0,U);
|
|
IF(U:=U|8-M) GTR 0 THEN SETFIELD(BUFFER,M,U," ");
|
|
IF T.SPF=0 OR NOT SCAN THEN RESULT:=0&1[CRF]&DDPUVW[CDID]% NULL
|
|
ELSE BEGIN POP;IF SETUPLINE THEN; GO TO SKIPPOP;END
|
|
END; END;
|
|
END; %--------------EN OF OPERATION ON STACK---------------------
|
|
POP;POP;PUSH;IF ERR=0 THEN AREG:=RESULT; 03869970P68
|
|
SKIPPOP: END OF TYPEFIELD EQUALS OPERATOR;
|
|
%-------TF=4 (LOCAL VARIABLE)------------
|
|
BEGIN COMMENT MOVE DESCRIPTOR UP TO TOP;
|
|
DEFINE STARTSEGMENT=#; %/////////////////
|
|
N:=T.LOCFIELD;M:=FUNCLOC;M:=SP[MOC]+M;
|
|
|
|
N:=SP[MOC].LOCFIELD+N;
|
|
T:=SP[NOC]; T.NAMED:=1; %KEEP FROM THROWING AWAY
|
|
PUSH; AREG:=T;
|
|
END;
|
|
%-------TF=5 (OPERAND)-----------------------
|
|
BEGIN PUSH; IF ERR=0 THEN BEGIN
|
|
N:=POLWORD.LOCFIELD; U:=SP[NOC];
|
|
IF U.DATADESC=0 THEN ERR:=NONCEERROR ELSE
|
|
IF U.PRESENCE NEQ 1 THEN BEGIN
|
|
U:=GETARRAY(U); SP[NOC]:=U END;
|
|
U.LOCFIELD:=0;
|
|
AREG:=U; END;
|
|
END;
|
|
END; % OF CASE STATEMENT TESTING TYPEFILED
|
|
END % OF TEST FOR CINDEX LEQ POLTOP
|
|
ELSE % WE ARE AT THE END OF THE POLISH
|
|
BEGIN COMMENT LASKMKS CONTAINS THE LOCATION
|
|
OF THE LAST WARK STACK. GET MARK STACK AND CONTINUE;
|
|
|
|
SCRATCHCHAIN(OLDDDATA); OLDDATE:=0;
|
|
L:=LASTMKS;M:=(U:=SP[LOC]).BACKF+STACKBASE;T:=SP[MOC];
|
|
IF T.DIF=IMKS AND T.QUADIN=3 THEN %SINGLE LINE DONE
|
|
IF (RESULT:=AREG)=T THEN ERR:=SYNTAXERROR%NIO RESULT
|
|
ELSE BEGIN RESULT.NAMED:=0;%MAKE NEW COPY
|
|
IF BOOLEAN(RESULT.SCALAR) THEN
|
|
BEGIN M:=GETSPACE(2);L:=RESULT.SPF;
|
|
RESULT.SPF:=M+1;SP[MOC]:=RESULT;
|
|
M:=M+1;SP[MOC]:=SP[LOC];
|
|
END ELSE % MAKE COPY OF A VECTOR
|
|
BEGIN M:=GETSPACE(1+(N:=RESULT.RF+NUMELEMENTS(
|
|
RESULT)));
|
|
L:=RESULT.SPF;RESULT.SPF:=M+1;
|
|
SP[MOC]:=RESULT; SPCOPY(L,M+1,N); END;
|
|
|
|
|
|
FORGETPROGRAM(U);
|
|
|
|
DO POP UNTIL ST LSS 2LASTMKS;%CUT BACK STACK TO IMS
|
|
OLDDATA:=T.SPF;L:=LASTMKS:=T.BACKF+STACKBASE;
|
|
AREG:=RESULT; % STORE EXECUTION RESULT OVER IMS
|
|
CINDEX:=SP[LOC].CIF; M:= SP[LOC].SPF;
|
|
POLLOC:=M:=SP[MOC].SPF; POLTOP:=SP[MOC];
|
|
END ELSE
|
|
BEGIN L:=FUNCLOC;M:=SP[LOC.SPF+L;
|
|
IF M NEQ L AND NOT BOOLEAN(SP[MOC].SUSPENDED)THEN
|
|
BEGIN
|
|
IF O=(LOOP:=LOOP+1) MOD 5) THEN
|
|
WRITE(TWXOUT,1,JIGG1LE[*])[BREAKKEY:BREAKKEY];
|
|
%THAT WAS TO CHECK FOR A BREAK TO INTERRUT A PROG
|
|
STEPLINE(FALSE);
|
|
END;
|
|
ELSE BEGIN XIT:=TRUE;CURRENTMODE:=CALCMODE;
|
|
WHILE POPROGRAM(OLDDATA,LASTMKS) DO;
|
|
END;
|
|
END;
|
|
END; %COMPLETION OF ONE POLISH EVALUATION (1 CELL)
|
|
IF ERR NEQ 0 THEN % PUT OUT ERROR MESSAGE
|
|
BEGIN
|
|
DEFINE STARTSEGMENT=#; %/////////////////////////////
|
|
COMMENT
|
|
MONITOR PRINT(ST,L,M,SP,GTA,T);%::::::::::::::::::::::
|
|
XIT:=TRUE;CURRENTMODE:=ERRORMODE;
|
|
|
|
L:=POLLOC+1;
|
|
TRANSFERSP(OUTOF,SP,(L:=SP[LOC],SPF)+1,BUFFER,
|
|
0,MIN(MAXBUFFSIZE,ENTIER((SP[LOC]+7)DIV 8)));
|
|
L:=FUNCLWOC;M:=SP[LOC].SPF+1;
|
|
GT1:=1;N:=SP[MOC].LOCFIELD;%LOCATION OF FMKS
|
|
WHILE LASTMKS GTR N AND BOOLEAN (GT1) DO GT1:=IF
|
|
POPPROGRAM(OLDDATA.LASTMKS)THEN 1 ELSE 0;
|
|
IF M NEQ L AND NOT BOOLEAN(SP[MOC]).SUSPENDED)THEN%GET LINE#
|
|
BEGIN SP[LOC].RF:=SP[LOC].RF+1;%UP SUSPENDED COUNT
|
|
L:=SP[NOC].SPF-1;%LOCATION WOF FUNCTION NAME
|
|
SETFIELD(GTA,0,1,0);
|
|
GTA(0):=SP(LOC);
|
|
FORMROW(3,0,GTA,1,7);
|
|
L:=SP[MOC].SPF; %BASE OF LABEL TABLE 03918475P69
|
|
L:=L+CURLINE;
|
|
T:=SP[LOC];
|
|
|
|
%ALSO PUT THE FUNCTION INTO SUSPENSION
|
|
IMS(4);SP[MOC].SUSPENDED:=1;SUSPENSION:=1;
|
|
PUSHINTOSYMTAB(SP[MOC]);
|
|
END ELSE T:=0;
|
|
ERRORMESS(ERR,POLWORD,SPF,T);
|
|
END;
|
|
END UNTIL XIT;
|
|
BREAKKEY: BEGIN BREAKFLAG:=FALSE;
|
|
XIT:=TRUE;CURRENTMODE:=CASLCMODE;
|
|
L:=FUNCJLOC;M:=SP[LOC].SPF+L;
|
|
IF M NEW L AND NOT BOOLEAN(SP[MOC].SUSPENDED) THEN
|
|
BEGIN SP[MOC].SUSPENDED:=1;SUSPENSION:=1;
|
|
PUSHINTOSYMTAB(SP[MOC]);SP[KLOC].RG:=SP[LOC].RF+1;
|
|
M:=SP[MOC].LOCFIELD;%LOCATION OF FMKS IN STACK
|
|
WHILE LASTMKS GTR M DO IF POPPROGRAM(OLDDATA,LASTMKS)
|
|
THEN; LASTMKS:=M;IMS(4);
|
|
END
|
|
IF FALSE THEN
|
|
END;
|
|
EXECEXIT:
|
|
IF STACKBASE NEQ 0 THEN BEGIN
|
|
L:=STACKBASE; SP[LOC]:=ST-L; %UPDATE SIZE OF STACK
|
|
|
|
END;
|
|
END OF EXECUTION LOOP;
|
|
PROCESSEXIT:
|
|
IF BOOLEAN(POLBUG) THEN % DUMP SP
|
|
IF MODE=EQUTE OR MODE=3 OR MODE=6 THEN GO TO DEBUGSP;
|
|
IF FALSE THEN
|
|
BEGIN CASE O OF BEGIN
|
|
EXPOVRL: SPOUT(3951200);
|
|
INTOVRL: SPOUT(3591300);
|
|
INDEXL: SPOUT(3951500);
|
|
ZEROL: SPOUT(3951600);
|
|
END;
|
|
REALLYERROR:=1;
|
|
DEBUGSP:
|
|
WRITE(PRINT,MIN(15,PSRSIZE),PSR);
|
|
BEGIN
|
|
STREAM PROCEDURE FORM(A,B,N); VALUE N;
|
|
BEGIN
|
|
DI:=B; 15(DS:=BLIT(" ");
|
|
SI:=LOC N; DI:=B; DS:=8DEC; DI:=DI+3;
|
|
SI:=A; 10(DS:=8CHR; DI:=DI+1);
|
|
END;
|
|
M:=MIN(NROWS+1|SPRSIZE-1,MAXMEMACCESSES);
|
|
FOR N:=0 STEP 10 UNTIL M DO
|
|
BEGIN TRANSFERSP(OUTOF,SP,N,ACCUM,0,MIN(M*N,10));
|
|
FORM(ACCUM,BUFFER,N);
|
|
WRITE(PRINT,15,BUFFER[*]);
|
|
END;
|
|
END;
|
|
IF POLBUG=0 OR BOOLEAN(REALLYERROR) THEN
|
|
BEGIN
|
|
ERRORMESS(IF ERR NEQ SPERROR THEN SYSTEMERROR ELSE ERR,0,0);
|
|
SUSPENSION:=0;
|
|
CURRENTMODE:=CALCMODE;
|
|
REALLYERROR:=ERR:=0;
|
|
END;
|
|
END;
|
|
END OF PROCESS PROCEDURE;
|
|
PROCEDURE ERRORMESS(N,ADDR,R); VALUE N,ADDR,R; REAL R;
|
|
INTEGER N; REAL ADDR;
|
|
BEGIN
|
|
INTEGER STREAM PROCEDURE FORM(A,B); VALUE A;
|
|
BEGIN LOCAL T,U;
|
|
LABEL L,M;
|
|
SI:=A;
|
|
L: IF SC=" " THEN
|
|
BEGIN SI:=SI+1; GO TO L;
|
|
END;
|
|
DI:=LOC I; DS:=2RESET; DS:=2SET;
|
|
DI:=8; MESSIZEU:=DI; DI:=LOC T; IF SC=DC THEN JUMP OUT TO M;
|
|
SI:=SI-1; DI:=U; DS:=CHR; TALLY:=TALLY+1); M:
|
|
FORM:=TALLY;
|
|
END;
|
|
ARRAY ERMES[0:13],B[0:MESSIZE/8];
|
|
FILL ERMES[*] WITH
|
|
"1 ", 05001510P70
|
|
"5DEPTH ",
|
|
"6DOMAIN ",
|
|
"7EDITING",
|
|
"5INDEX ",
|
|
"5LABEL ",
|
|
"6LENGTH ",
|
|
"5NONCE ",
|
|
"4RANK ",
|
|
"6SYNTAX ",
|
|
"6SYSTEM ",
|
|
"5VALUE ",
|
|
"7SP FULL",
|
|
"7FLYKITE";
|
|
IF R NEQ 0 THEN
|
|
BEGIN INDENT(R);CHRCOUNT:=CHRCOUNT-1;
|
|
END;
|
|
FORMROW((IF R=0 THEN 2 ELSE 0),0,ERMES,N|8+1,
|
|
ERMES[N].[1:5]);
|
|
FORMWORD(0,"6 ERROR");
|
|
IF ADDR.[33:15] GEQ 512 THEN
|
|
BEGIN
|
|
FORMD(D,"4 AT ");
|
|
FORMROW(1,1,B,0,FORM(ADDR,B))
|
|
END;
|
|
FORMWD(3,"1 ");
|
|
END;
|
|
PROCEDURE LOADWORKSPACE(JOBNUM,NAME,IDENT); VALUE JOBNUM,NAME;
|
|
REAL JOBNUM,NAME; ARRAY IDENT[0]; FORWARD;
|
|
PROCEDURE LOGINAPLUSER;
|
|
BEGIN
|
|
COMMENT LOG:IN THE CURRENT USER;
|
|
COMMENT INPUT LINE IS THE BUFFER;
|
|
LABEL EXEC, GUESS;
|
|
DEFINE T=GT1#, J=GT2#,I=GT3#;
|
|
PROCEDURE INITIALIZEPSR;
|
|
BEGIN FOR I:=0 STEP 1 UNTIL PSRSIZE-1 DO
|
|
PSRM[I] := 0;
|
|
SEED:=STREAMBASE; ORIGIN:=1;
|
|
FUZZ:-1@-11;
|
|
LINESIZE:=72; DIGITS:=9;
|
|
END;
|
|
LADDRESS := ADDRESS := ABSOLUTEADDRESS;
|
|
WORKSPACE:=WORKSPACEUNIT;
|
|
ITEMCOUNT := EOB := 0;
|
|
IF NEXTUNIT=WORKSPACEUNIT THEN % ESTABLISH A WORKSPACE
|
|
BEGIN
|
|
WORKSPACE:=NEXTUNIT;
|
|
SEQUENTIAL(WORKSPACE);
|
|
INITIALIZEPSR;
|
|
I=STORESEQ(WORKSPACE,PSR,PSRSIZE|8);
|
|
INITBUFF(OLDBUFFER,BUFFSIZE);
|
|
|
|
END ELSE % WORKSPACE ASSIGNED
|
|
I:=CONTENTS(WORKSPACE,0,PSR);
|
|
FILL ACCUM[*] WITH "LOGGED 1", "N ";
|
|
FORMROW(0,1,ACCUM,0,RI);
|
|
SYMBASE:=STAKCBASE:=0;
|
|
CSTATION.APLOGGED:=1;
|
|
CASE CURRENTMODE OF
|
|
BEGIN %--------CALCMODE--------------
|
|
;COMMENT NOTHING TO DO ANYMORE;
|
|
%--------------XEQUTEMODE----------------------
|
|
EXEC:
|
|
BEGIN F9ILL ACCUM[*] WITH "LAST RUN"," STOPPED";
|
|
FORMROW(3,0,ACCUM,0,16);
|
|
CURRENTMODE:=CALCMODE;
|
|
END;
|
|
%-------------FUNCMODE-----------------
|
|
BEGIN FILL ACCUM[*]WITH "CONTINUE"," DEFINIT",
|
|
"ION OF ";
|
|
FORMROW(2,0,ACCUM,0,23); FORMROW(1,0,PSR,
|
|
FSTART|8,7);
|
|
CURLINE:=GT3:=TOPLINE(GT1:=FUNCPOINTER);
|
|
CHECKSEQ(CURLINE,GT3,INCREMENT); %GET INCREMENT
|
|
CURLINE:=CURLINE+INCRMENT; INDENT(-CURLINE);
|
|
FUNCSIZE:=SIZE(GT1);
|
|
END;
|
|
%------------INPUTMODE-------------ERRORMODE----
|
|
GOTOEXEC; GO TO EXEC;
|
|
END;
|
|
GUESS: %SHOULD BE BETTER PLACE BUT HERE IS WHERE OTHERS COME OUT 07044001P71
|
|
STOREPSR;
|
|
IF CURRENTMODE NEQ FUNCMODE THEN
|
|
INDENT(0); TERPRINT;
|
|
VARSIE:=IF VARPIABLES=0 THEN 0 ELSE SIZE(VARIABLES);
|
|
END;
|
|
PROCEDURE APLMONITOR;
|
|
BEGIN
|
|
REAL T;
|
|
INTEGER I;
|
|
BOOLEAN WORK;
|
|
LABEL AROUND, NEWUSER;
|
|
LABEL CALULATE,EXECITEIT,FUNCTIONSTART,BACKAGAIN;
|
|
LABEL CALCULATEDIT;
|
|
I := CUSER := 1;
|
|
T := STATION;
|
|
BEGIN FILL ACCUM[*] WITH "APL/B550","0 UW COM"
|
|
,"PUTER SC","IENCE #",VERSIONDATE;
|
|
WORK:=TRUE;
|
|
FORMROW(3,MARGINSIZE,ACCUM,0,40);
|
|
INDENT(0); TERPRINT; CSTATION.APLHEADING:=1
|
|
; LOGINAPLUSER;
|
|
END;
|
|
AROUND:
|
|
BEGIN
|
|
IF MAINTENANCE THEN;
|
|
CASE CURRENTMODE OF
|
|
BEGIN %-------CALCMODE--------------------------------
|
|
COMMENT HE MUST BE READ READY FOR THE CALCMODE STUFF;
|
|
|
|
GO CALCULATE;
|
|
%--------XEQUTE MODE--------------------------------
|
|
GO TO EXECUTEIT;
|
|
%----------FUNCMODE-----------------------------------
|
|
GO TO FUNCTIONSTART;
|
|
%-----------INPUTMODE---------------------------------
|
|
COMMENT REQUIRES INPUT;
|
|
|
|
BEGIN COMMENT GET HT ELINE AND GO BACK;
|
|
STARTSCAN;
|
|
CURRENTMODE:=XEQM+ODE;
|
|
GO TO EXECUTEIT;
|
|
END;
|
|
%----------ERRORMODE---------------------------------
|
|
GO TO BACKAGAIN;
|
|
|
|
END; %OF CASES
|
|
END;
|
|
COMMENT GET HERE IF NOTHING TO DO;
|
|
|
|
GO TO AROUND;
|
|
CALCULATE:
|
|
STARTSCAN;
|
|
CALCULATEDIT:
|
|
ERR:=0; %AND DON"T RESET IT IN SCAN OR IN ANALYZE
|
|
IF SCAN THEN
|
|
IF RGTPAREN THEN MESSAGEHANDLER EALSE
|
|
IF DELV THEN FUNCTIONHANDLER ELSE
|
|
BEGIN COMMENT PROCESS CAJLCULATOR MODE REQUEST;
|
|
MOVE(OLDBUFFER,BUFFERSIZE,BUFFER);
|
|
IF NOT BOOLEAN(SUSPENSION) THEN BEGIN %INITIALIZE USER
|
|
%%%
|
|
%%%
|
|
SYMBASE:=STACKBASE:=0;
|
|
END;
|
|
PROCESS(XEQUTE);
|
|
IF CURRENTMODE=CALCMODE THEN
|
|
BACKAGAIN: BEGIN INDENT(0); TERPRINT;
|
|
IF NOT BOOLEAN(SUSPENSION) THEN
|
|
BEGIN IF CURRENTMODE NEQ ERRORMODE THEN
|
|
PROCESS(WRITEBACK);
|
|
SP[0,0]:=0;NROWS:=-1;
|
|
%%%
|
|
END;
|
|
CURRENTMODE:=CALCMODE;
|
|
END;
|
|
IF EDITOG=1 THEN
|
|
BEGIN MOVE(OLDBUFFER,BUFFERSIZE,BUFFER);
|
|
RESCANLINE; EDITOG:=0; GO TO CALCULATEDIT;
|
|
END;
|
|
I:=0;
|
|
GO AROUND; 07127000P72
|
|
EXECUTEIT:
|
|
POECESS(XEQUTE); %GO BACK TO PROCESS FOR AWHILE
|
|
IF CURRENTMODE=CALCMODE THEN GO TO BACKAGAIN;
|
|
I:=0;
|
|
GO AROUND;
|
|
FUNCTIONSTART:
|
|
IF SPECMODE = 0 THEN
|
|
BEGIN %SEE IF A SPECIAL FUNCTION.
|
|
STARTSCAN;
|
|
IF SCAN AND RGTPAREN THEN MESSAGEHANDLER ELSE
|
|
FUNCTIONHANDLER
|
|
END ELSE
|
|
FUNCTIONHANDLER;
|
|
I:=0;
|
|
GO AROUND
|
|
END;
|
|
INTEGER PROCEDURE LENGTH(A,M);VLUE M; BOOLEAN M; ARRAY A[0];
|
|
BEGIN
|
|
INTEGER STREAM PROCEDURE LENGT(A,M,L); VALUE M,L;
|
|
BEGIN LOCAL T;
|
|
LOCAL C,CC,TST; LABEL LAB;
|
|
LOCAL AR; LABEL LAB2;
|
|
SI:=LOC M; SI:=SI+7;
|
|
IF SC'"1" THEN
|
|
BEGIN COMMENT LOOK FOR LEFT ARROW.;
|
|
DI:=LOC AR; DS:=RESET; DS:=5SET;
|
|
SI:=LOCL; DI:=LOC T; DI:=DI+1; DS:=7CHR;
|
|
SI:=A;
|
|
T(2(32(DI:=LOC AR; IF SC=DC THEN JUMP OUT 3 TO LAB;
|
|
TALLY:=TALLY+1;
|
|
C:=TALLY; TSI:=SI; SI:=L9OC C;
|
|
SI:=SI+7; IF SI="0" THEN
|
|
BEGIN TALLY:=CC; TALLY:=TALLY+1; CC:=TALLY;
|
|
TALLY:=0;
|
|
END; SI:=TSI)));
|
|
L(DI:=LOC AR; IF SC=DC THEN JUMP OUT TO LAB;
|
|
TALLY:=TALLY+1; C:=TALLY; TSI:=SI; SI:=LOC C; SI:=SI+7;
|
|
IF SC="0" THEN
|
|
BEGIN TALLY:=CC; TALLY:=TALLY+1; CC:=TALLY; TALLY:=0;
|
|
END; SI:=TSI);
|
|
LAB: SI:=LOC CC; DI:=LOC LENGT; DI:=DI+6; SI:=SI+7;
|
|
DS:=CHR; SI:=LOC C; SI:=SI+7; DS:=CHR;
|
|
END ELSE
|
|
BEGIN
|
|
SI:=LOC L; DI:=LOC T; DI:=DI+1; DS:=7CHR;
|
|
SI:=A; T(2(SI:=SI+32)); SI:=SI+L;
|
|
T(2(32(SI:=SI-1; IF SC NEQ " " THEN JUMP OUT 3 TO LAB2;
|
|
TALLY:=TALLY+1; C:=TALLY; SI:=SI; SI:=LOC C; SI:=SI+7;
|
|
IF SC="0" THEN
|
|
BEGIN TALLY:=CC; TALLY:=TALLY+1; CC:=TALLY; TALLY:=0
|
|
END; SI:=TSI)));
|
|
LAB2: GO TO LAB
|
|
END
|
|
END;
|
|
INTEGER I;
|
|
I:=LENGT(A,M,BUFFSIZE|8);
|
|
LENGTH:=IF M THEN I ELSE BUFFSIZE|8-I
|
|
END
|
|
BOOLEAN PRUOCEDURE LABELSCAN(L,K); VALUE K; INTEGER K; ARRAY L[0];
|
|
BEGIN REAL T;
|
|
T:=ADDRSS;
|
|
IF SCAN AND IDENT THEN
|
|
BEGIN SETFIELD(ACCUM,1,1,0); TRANSFER(ACCUM,1,L,K|8,8);
|
|
IF NOT(LABELSCAN:=(SCAN AND COLON)) THEN
|
|
BEGIN ADDRESS:=T; EOB:=0; IF SCAN THEN;
|
|
END;
|
|
END
|
|
END;
|
|
STREAM PROCEDURE MOVEWDS(A,N,B); VALUE N;
|
|
BEGIN SI:=A; DT:=8; DS:=N WDS END;
|
|
INTEGER PROCEURE DAYTIME(B); ARRAY B[0];
|
|
BEGIN
|
|
|
|
INTEGER D,H,M,MIN,Q,P,Y,TIME1;
|
|
LABEL OWT;
|
|
STREAM PROCEDURE FORM(A,DAY,MD,DA,YR,HR,MIN,AP);
|
|
VALUE DAY,MD,DA,YR,HR,MIN,AP;
|
|
BEGIN DI:=A; 08014064P73
|
|
SI:=LOC DAY; SI:=SI+7;
|
|
IF SC="0" THEN DS:=3LIT"SUN" ELSE
|
|
IF SC="1" THEN DS:=3LIT"MON" ELSE
|
|
IF SC="2" THEN DS:=4LIT"TUES" ELSE
|
|
IF SC="3" THEN DS:=6LIT"WEDNES" ELSE
|
|
IF SC="4" THEN DS:=5LIT"THURS" ELSE
|
|
IF SC="5" THEN DS:=3LIT"FRI" ELSE DS:=5LIT"SATUR";
|
|
DS:=4LIT"DAY "; SI:=LOC MO; DS:=2DEC;
|
|
DS:=LIT"-"; SI:=LOC DA; DS:=2DEC; DS:=LIT"-";
|
|
SI:=LOC YR; DS:=2DEC; DS:=2LIT" ";
|
|
SI:=LOC HR; DS:=2DEC; DS:=LIT":"; SI:=LOC MIN;
|
|
SI:=SI+6; DS:=2CHR; SI:=LOC AP; SI:=SI+7; DS:=LIT" ";
|
|
DS:=CHR; DS:=LIT"M"
|
|
END;
|
|
TIME1:=TIME(1);
|
|
Y:=TIME(0);
|
|
D:=Y.[30:1]|100+Y.[36:6]|10+Y.[42:6];
|
|
Y:=Y.[18:6]|10+Y.[24:6];
|
|
FOR H:=31,IF Y MOD 4=0 THEN 29 ELSE 28,31,30,
|
|
31,30,31,31,30,31,30 DO
|
|
IF D LEQ H THEN GO OWT ELSE
|
|
BEGIN D:=D-H; M:=M+1;
|
|
END;
|
|
OWT:
|
|
H:=TIME1 DIV 216000;
|
|
MIN:=(TIME1 DIV 3600) MOD 60;
|
|
IF M LSS 2 THEN
|
|
BEGIN Q:=M+11; P:=Y-1;
|
|
END ELSE
|
|
BEGIN Q:=M-1; P:=Y
|
|
END;
|
|
M:=M+1;
|
|
FORM(B,TIME1:=((Q|26-2)DIV 10+D+P+P.[36:10]+1)MOD 7,
|
|
M,D,Y,Q:= H MOD 12, Q:=MIN MOD 10+(MIN DIV 10)|64,
|
|
IF H GEQ 12 THEN "P" ELSE 17);
|
|
DAYTIME:=(IF TIME1=6 THEN 5 ELSE
|
|
IF TIME1=5 THEN 3 ELSE
|
|
IF TIME2=2 THEN 4 ELSE 3)+22;
|
|
|
|
|
|
END;
|
|
PROCEDURE LOADWORKSPACE(NAME1,NAME2,IDENT); VALUE NAME1,NAME2;
|
|
REAL NAME1,NAME2; ARRAY IDENT[0];
|
|
BEGIN
|
|
FILE DISK DISK(2,WDSPERREC,WDSPERBLK);
|
|
INTEGER PROCEDURE RD(D,N,A);
|
|
VALUE N; INTEGER N; FILE D; ARRAY A[0];
|
|
BEGIN READ(D[N],WDSPERREC,A[*]);
|
|
RD:=N+1;
|
|
END;
|
|
PROCEDURE LOADITEM(RD,D,ITEM);
|
|
INTEGER PR+OCEDURE RD; FILE D;
|
|
ARRAY ITEM[0];
|
|
BEGIN
|
|
DEFINE T=ITEM#;
|
|
PROCEDURE GETALINE(C,S,L,R,RD,D,LEN);
|
|
VALUE LEN; INTEGER C,S,L,LEN;
|
|
ARRAY A[0]; INTEGER PROCEDURE RD; FILE D;
|
|
BEGIN % GET 2 CHRS GIVING ENSUING CHAR COUNT
|
|
INTEGER P;
|
|
IF C GTR LEN-2 THEN
|
|
IF C GTR LEN-1 THEN % READ A NEW RECORD AND TAKE 2 CHRS
|
|
BEGIN
|
|
S:=RD(D,S,R);
|
|
C:=2;
|
|
TRANSFER(B,0,L,6,2);
|
|
END
|
|
ELSE % 1 CHR LEFT ON LINE
|
|
BEGIN
|
|
TRANSFER(B,C,L,6,1);
|
|
S:=RD(D,S,B);
|
|
TRANSFER(B,0,L,7,1);
|
|
C:=1;
|
|
END
|
|
ELSE % AT LEAST 2 CHARS REMAINING ON LINE
|
|
BEGIN
|
|
TRANSFER(B,C,L,6,2);
|
|
C:=C+2;
|
|
END;
|
|
P:=0;
|
|
+IF L NEQ 0 THEN % SOMETHING LEFT IN FUNCTION
|
|
BEGIN
|
|
WHILE P LSS L DO 08014459P74
|
|
IF (L-P) GTR (LEN-C) THEN % # OF CHARS IN LINE
|
|
% EXTENDS INTO NEXT RECORD
|
|
BEGIN
|
|
TRANSFER(B,C,BUFFER,P,LEN-C); % FINISH OUT RECORD
|
|
S:=RD(D,S,R);
|
|
P:=P+(LEN-C); % AMOUNT READ SO FAR
|
|
C:=0;
|
|
END
|
|
ELSE % ALL ON ONE RECORD
|
|
BEGIN
|
|
TRANSFER(B,C,BUFFER,P,L-P);
|
|
C:=C_L-P;
|
|
P:=L; % FINISHED
|
|
END;
|
|
END;
|
|
END OF GETALINE;
|
|
INTEGER S,K,L,M,C,LEN,SQ,PT,G,I,SIZE;
|
|
INTEGER HOLD;
|
|
LABEL SCALARL;
|
|
ARRAY U[0:1],B[0:WDSPERREC-1];
|
|
BOOLEAN TOG;
|
|
TRANSFER(T,0,U,0,7);
|
|
G:=GETFIELD(T,7,1);
|
|
IF VARSRSIZE GTR 0 THEN
|
|
IF K+;SEARCHORD(VARIABLES,U,HOLD,7)=0 THEN
|
|
IF K:=GETFIELD(U,7,1)=FUNCTION THEN TOG:=TRUE
|
|
ELSE % NOT A FUNCTION IN THE SYMBOL TABLE
|
|
IF G=FUNCTION THEN
|
|
BEGIN
|
|
DELETE1(VARIABLES,HOLD);
|
|
IF K=ARRAYDATA THEN RELEASEARRAY(U[1]);
|
|
END;
|
|
ELSE TOG:=TRUE % DON-T CHANGE
|
|
ELSE % NOT IN VARIABLES
|
|
BEGIN
|
|
VARSIZE:=VARSIZE+1;
|
|
HOLD:=HOLD+K-1;
|
|
END;
|
|
ELSE VARSIZE:=1;
|
|
LEN:=(WDSPERREC-1)|8;
|
|
IF NOT TOG THEN % OK TO PUT INTO VARIABLES
|
|
IF G=FUNCTION THEN % READ A FUNCTION INTO VARIABLES
|
|
BEGIN
|
|
TRANSFER(T,0,U,0,9); % U HOLDS FUNCTION NAME,
|
|
%NUMBER OF ARGUMENTS, AND WHETHER FN RETURNS A VALUE
|
|
S:=T[1].LIBF1; % RECORD NUMBER
|
|
M:=T[1].LIBF2; % WORD WITHIN RECORD
|
|
SIZE:=T[1].LIBF3; % SIZE OF POINTERS TABLE
|
|
PR:=NEXTUNIT;
|
|
S:=RD(D,S,B);
|
|
FOR I:=0 STEP 1 UNTIL SIZE-1 DO
|
|
BEGIN
|
|
TRANSFER(M,M|8,T,0,16);
|
|
M:=M+2;
|
|
IF M GEQ WDSPERREC-1 THEN
|
|
BEGIN
|
|
S:=RD(D,S,R);
|
|
IF M GEQ WDSPERREC THEN
|
|
BEGIN
|
|
TRANSFER(B,0,T,8,8);
|
|
M:=1;
|
|
END
|
|
ELSE M:=0;
|
|
END;
|
|
STOREORD(PT,T,I);
|
|
END; % HAV FINISHED FILLIN G POINTERS TABLE
|
|
IF VARIABLES=0 THEN BEGIN
|
|
VARIABLES:=NEXTUNIT; TOG:=TRUE; %KEEP THE UNIT OPEN
|
|
STOREORD(VARIABLES,U,HOLD); END;
|
|
SEQUENTIAL (SQ:=MEXTUNIT);
|
|
SETFIELD(U,FPTF,FFL,PT);
|
|
SETFIELD(U,FSQF,FFL,SQ);
|
|
STOREORD(VARIABLES,U,HOLD);
|
|
IF TOC THEN DELETE1(VARIABLES,HOSLD+1);%REMOVE 1 EXTRA
|
|
COMMENT NOW FILL IN SEQ STORAGE;
|
|
IF M NEQ 0 THEN BEGIN
|
|
M:=C:=0;
|
|
S:=RD(D,S,B); % TEXT STARTS AT BEG. OF NEW RECORD
|
|
END;
|
|
L:=1;
|
|
|
|
WHILE L NEQ 0 DO
|
|
BEGIN 08014747P75
|
|
GETALINE(C,S,L,B,RD,D,LEN);
|
|
GT1:=STORESEQ(SQ,BUFFER,L);
|
|
END
|
|
END
|
|
ELSE
|
|
IF G=ARRAYDATA THEN
|
|
IF T[1].INTPTR=0 THEN % NULL VECTOR
|
|
GOTO SCALARL
|
|
ELSE
|
|
BEGIN
|
|
ARRAY DIMVECT[0,MAXBUFFSIZE];
|
|
S:=T[1].INPTR; % RECORD NUMBER
|
|
M:=T[1].DIMPTR; % LOC WITHIN RECORD
|
|
C:=M|8;
|
|
SIZE:=RD(D,S,B);
|
|
GETALINE(C,S,L,B,RD,D,LEN);
|
|
T[1].DIMPTR:=STORESEQ(WS,BUFFER,L);
|
|
% PUTS DIMVECT INTO WORKSPACE
|
|
GETALINE(C,S,L,B,RD,D,LEN); % # BLOCKS
|
|
SIZE:=L-1;
|
|
FOR K:=0 STEP 2 UNTIL SIZE DO
|
|
BEGIN
|
|
GETALINE(C,S,L,B,RD,D,LEN);
|
|
SETFIELD(DIMVECT,K,S,STORESEQ(WS,BUFFER,L));
|
|
END; COMMENT THIS STORES THE VALUES OF THE
|
|
ARRAY INTO THE W+ORKSPACE, AND ALSO RECORDS
|
|
THE LOCATION WITHIN WS IN DIMVECT,TO BE STORED;
|
|
T[1].INPTR:=STORESEQ(WS,DIMVECT,SIZE+1);
|
|
IF VARIABLES=0 THEN VARIABLES:=NECTUNIT;
|
|
STOREORD(VARIABLES,T,HOLD);
|
|
END
|
|
ELSE % MUST BE A SCALER
|
|
SCALARL:
|
|
BEGIN
|
|
IF VARIABLES=0 THEN VARIABLES:=NEXTUNIT;
|
|
STOREORD(VARIABLES,T,HOLD);
|
|
END
|
|
ELSE % WILL NOT REPLACE IN SYMBOL TABLE
|
|
BEGIN
|
|
FILL BUFFER[*] WITH " ","NOT REPL","ACED ";
|
|
TRANSFER(T,0,BUFFER,0,7);
|
|
FORMROW(3,0,BUFFER,0,20);
|
|
END;
|
|
END LOADITEM;
|
|
BOOLEAN STREAM PROCEDURE EQUAL(A,B);
|
|
BEGIN SI:=A; DI:=B; SI:=SI+2; IF 7SC=DC THEN TALLY:=1;
|
|
EQUAL:=TALLY
|
|
END;
|
|
INTEGER I,J,L,NDIR,N;
|
|
LABEL MOVEVAR,SKIP;
|
|
ARRAY T,U[0:1],D[0:WDSPERREC-1];
|
|
FILL DISK WITH NAME1,NAME2; L:=RD(DISK,L,D);
|
|
IF D[1] NEQ JOBNUM AND D[1] NEQ 0 THEN GO SKIP; % FILE LOCKED
|
|
FOR I:=2 STEP 1 UNTIL 9 DO IF GETFIELD(D[I],1,7) NEQ C THEN GO SKIP;
|
|
IF NDIR:=D[0] NEQ 0 THEN
|
|
BEGIN N:=LIBSPACES+ENTIER(NDIR|2/(J:=WDSPERREC-1));
|
|
IF(NDIR|2) MOD J NEQ 0 THEN N:=N+1;
|
|
FOR I:=1 STEP 1 UNTIL NDIR DO
|
|
BEGIN COMMENT GET FUNCTION OR VARIABLE NAME FROM LIB;
|
|
IF WDSPERREC-J LSS 3 THEN
|
|
IF WDSPERREC-J=1 THEN
|
|
BEGIN L:=RD(DISK,L,D); J:=0; GO MOVEVAR
|
|
END ELSE
|
|
BEGIN TRANSFER(D,J|8,T,08); L:=RD(DISK,L,D);
|
|
TRANSFER(D,0,T,8,8); J:=1
|
|
END ELSE MOVEVAR:
|
|
BEGIN TRANSFER(D,J|8,T,0,16); J:=J+2
|
|
END;
|
|
IF(IF IDENT[0]=0 THEN TRUE ELSE EQUAL(IDENT,T)) THEN
|
|
BEGIN IF IDENT[0] NEQ 0 THEN I:=NDIR+1;
|
|
LOADITEM(RD,DISK,T);
|
|
END
|
|
END;
|
|
STOREPSR; % UPDATE SINCE HAVE ADDED TO VARIABLES
|
|
END;
|
|
IF FALS THEN SKIP; FORMWD(1,"6BADFIL");
|
|
EOB:=1;
|
|
END OF LIBRARY LOAD;
|
|
PROCEDURE PURGEWORKSPACE(WS); VALUE WS; INTEGER WS;
|
|
IF WORKSPACE NEQ 0 THEN
|
|
BEGIN
|
|
INTEGER I,J,K,V,L,G; 08015020P76
|
|
ARRAY T[0,1];
|
|
J:=SIZE(V:=VARIABLES)-1;
|
|
FOR I:=0 STEP 1 UNTIL J DO
|
|
BEGIN K:=CONTENTS(V,I,T);
|
|
IF GETFIELD(T,7,1)=FUNCTION THEN
|
|
FOR L:=FPTF,FSQF DO % GET RID OF STORAGE
|
|
IF G:=GETFIELD(T,L,FFL) NEQ 0 THEN RELEASEUNIT(G);
|
|
END;
|
|
RELEASEUNIT(V);
|
|
VARIABLES:=0; VARSIZE:=0;
|
|
CURRENTMODE:=0; J:=SIZE(WS)-1;
|
|
FOR I:=1 STEP 1 UNTIL J DO DELETE1(WS,I);
|
|
STORESPR;
|
|
END;
|
|
PROCEDURE ELIMWORKSPACE(WS); VALUE WS; INTEGER WS;
|
|
BEGIN LABEL QQQ; QQQ:
|
|
IF WORKSPACE NEQ 0 THEN
|
|
BEGIN
|
|
PURGEWORKSPACE(WS); RELEASEUNIT(WS);
|
|
%
|
|
END ELSE SPOUT(8015222);
|
|
END;
|
|
PROCEDURE SAVEWORKSPACE(NAME1,NAME2,LOCKFILE);
|
|
VALUE NAME1,NAME2,LOCKFILE;
|
|
REAL NAME1,NAME2,LOCKFILE;
|
|
BEGIN
|
|
SAVE FILE DISK [NAREAS:SIZEAREAS]
|
|
(2,WDSPERREC,WDSPERBLK,SAVE 100);
|
|
INTEGER PROCEDURE WR(D,N,A); VALUE N; INTEGER N;
|
|
F+ILE D; ARRAY A[0];
|
|
BEGIN REAL STREAM PROCEDURE CON(A); VALUE A;
|
|
BEGIN SI:=LOCA; DI:=LOC C9ON; DS:=8DEC END;
|
|
STREAM PROCEDURE CLEANER(A);
|
|
BEGIN DI:=A; WDSPERREC(DS:=BLIT".") END;
|
|
A[WDSPERREC-1]:=CON(N);
|
|
WRITE(D[N],WDSPERREC,A[*]);
|
|
WR:=N+1; CLEANER(A);
|
|
END;
|
|
PROCEDURE PUTAWAY(C,J,WR,D,N,M,B,L); VALUE L,J;
|
|
INTEGER L,C,J,N,M;
|
|
ARRAY B[0]; INTEGER PROCEDURE WR; FILE D;
|
|
BEGIN INTEGER P,K;
|
|
IF C+2 GTR L THEN
|
|
BEGIN TRANSFER(J,6,B,C,1); N:=WR(D,N,B); C:=1;
|
|
TRANSFER(J,7,B,0,1);
|
|
END ELSE
|
|
BEGIN TRANSFER(J,6,B,C,2); C:=C+2;
|
|
END;
|
|
WHILE J NEW 0 DO
|
|
IF J GTR K:=(L-C) THEN
|
|
BEGIN TRANSFER(BUFFER,P,B,C,K);
|
|
N:=WR(D.N.B); J:=J-K; C:=0; P:=P+K
|
|
END ELSE
|
|
BEGIN TRANSFER(BUFFER,P,B,C,J); C:=C+J; J:=0
|
|
END;
|
|
IF C=L THEN
|
|
BEGIN N:=WR(D,N,B); C:=0
|
|
END;
|
|
END;
|
|
|
|
PROCEDURE MOVETWO(U,B,M,WR,L,D);
|
|
ARRAY U,B[0]; INTEGER M,L; INTEGER PROCEDURE WR; FILE D;
|
|
BEGIN
|
|
COMMENT PUTS 2 WORDS OF U IN B AND WRITES ON D IF A FULLRECORD;
|
|
TRANSFER(U,0,B,M|8,16); % CONTENTS OF U INTO B
|
|
M:=M+2;
|
|
IF M GEQ WDSPERREC-1 THEN % FULL RECORD
|
|
BEGIN
|
|
L:=WR(D,L,B);
|
|
IF M GEQ WDSPERREC THEN % 1 OVER FULL RECORD
|
|
|
|
BEGIN
|
|
TRANSFER(U,8,B,0,8);
|
|
M:=1;
|
|
END
|
|
ELSE M:=D;
|
|
END;
|
|
END OF MOVETWO;
|
|
INTEGER H,Q,M,N,I,L,S,J,K,LINE,MAX,PT,SQ,C,LEN,W;
|
|
REAL LSD,STP;
|
|
LABEL SKIP;
|
|
ARRAY T,U[0:1],DIR,B,SEX[0:WDSPERREC];
|
|
N:=LIBSPACES+ENTIER((S:=SIZE(VARIABLES))|2/(WDSPERREC-1)); 08015575P77
|
|
IF (S|) MOD (WDSPERREC-1) NEQ 0 THEN N:=N+1; % ADJUST
|
|
LEN:=(WDSPERREC-1)|8;
|
|
FILLS DISK WITH NAME1,NAME2;
|
|
DIR[0]:=S; % SIZE OF SYMBOL TABLE
|
|
IF BOOLEAN (LOCKFILE) THEN DIR[1]:=JOBNUM;
|
|
S:=S-1;
|
|
L:=WR(DISK,L,DIR); % FIRST LINE CONTAINS # OF ENTRIES IN
|
|
COMMENT SYMBOL TABLE AND LOCK INFORMATION;
|
|
FOR I:=0 STEP 1 UNTIL 5 DO
|
|
BEGIN
|
|
J:=CONTENTS(VARIABLES,T,T); % RETURNS VALUE OF I-TH LOC
|
|
% IN VARIABLES INTO T
|
|
IF GT2:=GETFIELD(T,7,1)=FUNCTION THEN
|
|
BEGIN
|
|
PT:=GETFIELD(T,FPTF,FFL); % FUNCTION POINTER FIELD
|
|
SQ:=GETFIELD(T,FSQF,FFL); % FUNCTION SEQUENTIAL FIELD
|
|
%PT=# OF ORDERED STORAGE UNIT CONTAINING HEADER&POINTE
|
|
%SQ=# OF SEQ STORAGE UNIT CPONTAINING TEXT
|
|
MAX:=SIZE(PT);
|
|
T[1].LIBF1:=N; % RECORD #
|
|
T[1].LIBF2:=M; % LOC WITHIN RECORD
|
|
T[1].LIBF3:=MAX; % SIZE OF POINTERS TABLE;
|
|
% SAVE ENOUGH ROOM FOR THE ENTIRE POINTERS TABLE
|
|
H:=ENTIER(GT1:=(M+MAX|2)/(WDSPERREC-1));
|
|
H:=IF GT1 NEQ H THEN H+N+1 ELSE H+N;
|
|
U[0]:=0;
|
|
J:=SEARCHORD(PT,U,LINE,8); % LOOK FOR ALL ZEROS
|
|
IF J=2 THEN GO SKIP;
|
|
FOR W:=0 STEP 1 UNTIL LINE-1 DO
|
|
%MOVE LOCALS AND LABELS INTO THE SAVE FILE
|
|
BEGIN
|
|
J:=CONTENTS(PT,W,U);
|
|
MOVETWO(U,B,M,WR,N,DISK);
|
|
END;
|
|
FOR LINE:=LINE STEP 1 UNTIL MAX-1 DO
|
|
BEGIN
|
|
|
|
J:=CONTENTS(PT,LINE,U);
|
|
GT1:=U[1];
|
|
U[1]:=LINE-W;
|
|
MOVETWO(U,B,M,WR,N,DISK); % POINTERS TABLE
|
|
J:=CONTENTS(SQ,GT1,BUFFER);
|
|
PUTAWAY(C,J,WR,DISK,H,Q,SEX,LEN); % TEXT
|
|
END;
|
|
PUTAWAY(C,0,WR,DISK,H,Q,SEX,LEN);
|
|
SKIP:
|
|
Q:=C DIV 8;
|
|
IF C MOD 8 NEQ 0 THEN Q:=Q+1;
|
|
IF Q=WDSPERREC-1 THEN
|
|
BEGIN
|
|
H:=WR(DISK,H,SEX);
|
|
Q:=0;
|
|
END;
|
|
IF M GTR 0 THEN N:=WR(DISK,N,B);
|
|
M:=Q; N:=H;
|
|
TRANSFER(SEX,0,B,0,C); % MOVE BACK TO B
|
|
C:=0;
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
T[1].INPTR:=N; T[1].DIMPTR:=M;
|
|
C:=M|8;
|
|
J:=CONTENTS(WS,LSD,DIMPTR,BUFFER); % DIM VECT
|
|
PUTAWAY(C,J,WR,DISK,N,M,B,LEN); % STD DIM VECT
|
|
J:=CONTENTS(WS,LSD,INPTR,DIMVECT);
|
|
TRANSFER(DIMVECT,0,BUFFER,0,J);
|
|
PUTAWAY(C,J,WR,DISK,N,M,B,LEN);
|
|
J:=J-1;
|
|
FOR LINE:=0 STEP 2 UNTIL J DO
|
|
BEGIN
|
|
PT:=GETFIELD(DIMVECT,LINE,2);
|
|
STP:=CONTENTS(WS,PT,BUFFER);
|
|
PUTAWAY(C,STP,WR,DISK,N,M,B,LEN);
|
|
END;
|
|
M:=C DIV A; IF C MOD A NEQ 0 THEN M:=M+1; C:=0;
|
|
IF M=WDSPERREC-1 THEN BEGIN N:=WR(DISK,N,8);
|
|
M:=0; END; 08015888P78
|
|
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 MESSAGEHANDLER;
|
|
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);
|
|
08017970P80
|
|
%-----------------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:=GETFIELD(GTA,7,1)=FUNCTION THEN
|
|
BEGIN
|
|
RELEASEUNIT(GETFIELD(GTA,FPTF,FFL));
|
|
RELEASEUNIT(GETFIELD(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 COMMAND,CHAR,WORD; INTEGER COMMAND,CHAR,WORD;
|
|
ARRAY OLD, NEWEDIT; BEGIN
|
|
BOOLEAN STREAM PROCEDURE WITHINALINE(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; NEWLINE:=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; 09003000P82
|
|
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;
|
|
OLDLABELCONFLICT:=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 NOSYNTAX=0 THEN 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(VARIABLES,GTA,GT1,7)=0 THEN
|
|
BEGIN DELETE1(VARIABLES,GT1);
|
|
IF VARSIZE:=VARSIZE-1=0 THEN VARIABLES:=0;
|
|
END ELSE SPOUT(9198260);
|
|
END; 09198270P85
|
|
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 TOGGLE 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 DIRECTORY, 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, FOLLOWED 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)));
|
|
SETFIELD(GTA,0,8,0);
|
|
STOREORD(F:=FUNCPOINTER:=NEXTUNIT,GTA,0);
|
|
SETFIELD(GTA,0,8,0); SETFIELD(GTA,8,8,0); 09229004P86
|
|
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;
|
|
GO 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);
|
|
FINISHUP
|
|
END
|
|
ELSE ERR:=9
|
|
ELSE ERR:=DELETE(L,L,FPT,FSQ)
|
|
ELSE
|
|
IF LFTBRACKET THEN 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 09310000P88
|
|
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 THEN
|
|
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 LOGICAL RECORDS= 7273
|
|
END OF JOB.
|
|
|