1
0
mirror of https://github.com/retro-software/B5500-software.git synced 2026-01-13 15:17:03 +00:00

7274 lines
582 KiB
Plaintext

BEGIN 00000100
% THIS APL/B5500 PROGRAM WAS DEVELOPED BY THE COMPUTER SCIENCE GROUP 00000200
% AT THE UNIVERSITY OF WASHINGTON UNDER THE SPONSORSHIP OF PROFESSOR 00000300
% HELLMUT GOLDE. THE PROGRAM MAY BE NOT BE OFFERED FOR SALE OR LEASE 00000400
% IN ITS ORIGINAL OR ANY MODIFIED FORM. ANY PUBLICATION RELATING TO 00000500
% THIS PROGRAM OR ANY MODIFICATION OF THE PROGRAM MUST EXPLICITLY CREDIT00000600
% THE COMPUTER SCIENCE GROUP OF THE UNIVERSITY OF WASHINGTON AND THE 00000700
% PRINCIPAL IMPLEMENTORS, GARY KILDALL, LEROY SMITH, SALLY SWEDINE, 00000800
% AND MARY ZOSEL. COMPUTER RESOURCES FOR THE DEVELOPMENT OF THE 00000900
% PROGRAM WERE MADE AVAILABLE BY THE UNIVERSITY OF WASHINGTON COMPUTER 00001000
% CENTER. 00001100
DEFINE VERSIONDATE="1-11-71"# ; 00001200
%MODIFICATIONS FOR B-5500 TIME-SHARING MCP MADE BY: 00001300
% JOSE HERNANDEZ, BURROUGHS CORPORATION. 00001400
BOOLEAN BREAKFLAG; 00001500
ARRAY GTA[0:1]; 00001600
LABEL FINIS; %GO THERE WHEN YOU ARE IN TROUBLE (SPOUT A MESSAGE) 00001700
BOOLEAN PROCEDURE LIBRARIAN(A,B); VALUE A,B; REAL A,B; FORWARD; 00001800
LABEL FAULTL; % FAULT LABEL 00001900
MONITOR EXPOVR,INTOVR,INDEX:=INDEXF,FLAG,ZERO; 00002000
REAL BIGGEST, NULLV; 00002100
INTEGER STACKSIZE,LIBSIZE; 00002200
REAL STATUSWORD,CORELOC; 00002300
BOOLEAN RETURN; 00002400
BOOLEAN MEMBUG,DEBUG; 00002500
COMMENT MEMBUG SWITCHES ---------------------- 00002600
BIT FUNCTION BIT FUNCTION 00002700
----------------------------------------------------------------- 00002800
1 25 00002900
2 26 00003000
3 27 00003100
4 28 00003200
5 DUMP TYPES @ INSERT 30 00003300
6 DUMP TYPES @ DELETE 30 00003400
7 31 00003500
8 32 00003600
9 33 00003700
10 34 00003800
11 35 00003900
12 36 00004000
13 37 00004100
14 38 00004200
15 39 00004300
16 40 00004400
17 41 00004500
18 42 00004600
19 43 00004700
20 DUMP INDEX 44 00004800
21 45 00004900
22 DUMP TYPES 46 00005000
23 CHECK TYPES 47 00005100
24 DUMP BUFFER #S 00005200
; 00005300
FILE PRINT 4 "SYSTEMS" " BOX " (1,15); 00005400
FILE TWXIN 19(2,30),TWXOUT 19(2,10); 00005500
% 00005600
DEFINE 00005700
PAGESIZE=120#, 00005800
AREASIZE=40#, 00005900
CF=[26:13]#, COMMENT COUNT FIELD -- NUMBER OF ITEMS ON PAGE; 00006000
TF=[39:9] #, COMMENT T-FIELD (TYPE FIELD); 00006100
FF=[9:1]#, COMMENT FULL FIELD FOR SEQUENTIAL STORAGE; 00006200
AF=[1:23] #, COMMENT A-FIELD; 00006300
BF=[24:23]#, COMMENT B-FIELD; 00006400
MF=[1:1]#, COMMENT METHOD OF STORAGE FIELD; 00006500
SF=[13:13]#, COMMENT SEQUENTIAL STORAGE SIZE FIELD (#CHRS); 00006600
BOOL=[47:1]#, 00006700
SKIP=1#, COMMENT --AMOUNT OF SPACE RESERVED AT THE 00006800
START OF EACH PAGE; 00006900
ALLOWANCE=10#, COMMENT --DEVIATION FROM THE AVERAGE PAGE SIZE 00007000
ALLOWED BEFORE CORRECTION; 00007100
RECSIZE=2#, 00007200
MAXPAGES=20#, 00007300
PAGESPACE=20#, 00007400
NEXTP=[42:6]#, 00007500
LASTP=[36:6]#, 00007600
PAGEF=[19:11]#, 00007700
BUFF=[12:6]#, 00007800
CHANGEDBIT=[1:1]#, 00007900
MBUFF=8#, 00008000
SBUFF=4#, 00008100
FLAGB=[18:1]#, COMMENT FLAG BIT FOR BUFFER MAINTENANCE; 00008200
EXTRAROOM=1#, 00008300
LIBJOB="/APLIBE"#,%MFID FOR APL SYSTEM FILE 00008400
ENDOFDEFINES=#; 00008500
REAL PROCEDURE CDR(X); VALUE X; REAL X; CDR:=X.NEXTP; 00008600
PROCEDURE RPLACD(X,Y); VALUE Y;REAL X,Y; X.NEXTP:=Y; 00008700
BOOLEAN PROCEDURE NULL(X); VALUE X; REAL X; NULL:=X.NEXTP=0; 00008800
BOOLEAN STREAM PROCEDURE EOFMARK(SK,RS,A); VALUE SK,RS; 00008900
BEGIN LABEL NO; SI:=A; SK(SI:=SI+8); 00009000
RS(8( 2(IF SB THEN JUMP OUT 3 TO NO; SKIP SB); 00009100
3(IF SB THEN SKIP SB ELSE JUMP OUT 3 TO NO); IF SB THEN 00009200
JUMP OUT 2 TO NO; SKIP SB));TALLY:=1;EOFMARK:=TALLY; 00009300
NO: 00009400
END; 00009500
STREAM PROCEDURE MARKEOF(SK,RS,A); VALUE SK,RS; 00009600
BEGIN DI:=A; 00009700
SK(DI:=DI+8); 00009800
RS(8(DS:=2RESET; DS:=3SET; DS:=RESET)); 00009900
END; 00010000
SAVE FILE ESTABLISH DISK [MAXPAGES:AREASIZE] 00010100
(1,PAGESIZE,SAVE 100); 00010200
FILE NEWDISK DISK (1,PAGESIZE); 00010300
FILE DISK1 DISK (1,PAGESIZE), 00010400
DISK2 DISK (1,PAGESIZE), 00010500
DISK3 DISK (1,PAGESIZE), 00010600
DISK4 DISK (1,PAGESIZE), 00010700
DISK5 DISK (1,PAGESIZE), 00010800
DISK6 DISK (1,PAGESIZE), 00010900
DISK7 DISK (1,PAGESIZE), 00011000
DISK8 DISK (1,PAGESIZE); 00011100
SWITCH FILE POINTERS:=DISK1,DISK1,DISK2,DISK3,DISK4,DISK5,DISK6,DISK7, 00011200
DISK8; 00011300
PROCEDURE SETPOINTERNAMES; 00011400
BEGIN 00011500
IF NOT LIBRARIAN(LIBJOB,TIME(-1)) THEN 00011600
BEGIN 00011700
WRITE(ESTABLISH); 00011800
MARKEOF(SKIP,RECSIZE,ESTABLISH(0)); 00011900
WRITE(ESTABLISH[1]); 00012000
WRITE(ESTABLISH[MAXPAGES|AREASIZE-1]); 00012100
LOCK(ESTABLISH); 00012200
CLOSE(ESTABLISH) 00012300
;LIBSIZE~-1; 00012400
END 00012500
END; 00012600
DEFINE 00012700
LIBMAINTENANCE=0#, 00012800
MESSDUM=#; 00012900
PROCEDURE MEMORY(MODE,TYPE,A,N,M);VALUE MODE,TYPE; 00013000
INTEGER MODE,TYPE,N,M; ARRAY A[0]; FORWARD; 00013100
STREAM PROCEDURE MOVE(A,N,B); VALUE N; 00013200
BEGIN SI:=A; DI:=B; DS:=N WDS; 00013300
END; 00013400
PROCEDURE MESSAGE(I); VALUE I; INTEGER I; 00013500
BEGIN 00013600
FORMAT F("MEMORY ERROR",I5); 00013700
COMMENT CHANGE LINE 3050 TO WRITE(PRINT,SF[I]) FOR MEMORY ERROR PROBS. 00013800
THIS FORMAT IS NOW EXCLUDED SINCE MEMORY IS SEEMINGLY WELL DEBUGED 00013900
SWITCH FORMAT SF:= 00014000
("LIBRARY MAINTENANCE IN PROGRESS."), 00014100
("SYSTEM ERROR--MEMORY ACCESS WITH EXPRESSION FOR N OR M."), 00014200
("SYSTEM ERROR--IMPROPER ARGUMENTS TO FREEPAGE."), 00014300
("SYSTEM ERROR--TOO LARGE A SUBSCRIPT FOR TYPE SPECIFIED."), 00014400
("SYSTEM ERROR--TYPE CANNOT BE ZERO WHEN INSERTING OR DELETING."), 00014500
("SYSTEM ERROR--CHARACTER STTRING TOO LONG TO STORE."), 00014600
("SYSTEM ERROR--ATTEMPT TO INSERT NON-SEQUENTIAL ELEMENT", 00014700
"IN TYPE A STORAGE."), 00014800
("SYSTEM ERROR--NO BLANKS IN PAGES."), 00014900
("SYSTEM ERROR--ATTEMPTED BINARY SEARCH OF UNORDERED DATA."), 00015000
("SYSTEM ERROR--BINARY SEARCH OF UNALLOCATED DATA ATTEMPTED."), 00015100
("SYSTEM ERROR--BINARY SEARCH FOUND A BLANK PAGE."), 00015200
("SYSTEM ERROR--DELETION OF TYPE B STORAGE NOT IMPLEMENTED."), 00015300
("SYSTEM ERROR--ATTEMPT TO DELETE FROM NON-EXISTENT STORAGE."), 00015400
("SYSTEM ERROR--ATTEMPT TO DELETE RECORD FROM OUTSIDE", 00015500
" ALLOCATED STORAGE."), 00015600
("SYSTEM ERROR--ATTEMPTED MEMORY SEARCH WITH -N- TOO LARGE."), 00015700
("SYSTEM ERROR--ATTEMPT TO CHANGE PREVIOUSLY DESIGNATED STORAGE", 00015800
" KIND"), 00015900
("SYSTEM ERROR--POINTERS TO DATA TYPES OVERLAP."), 00016000
(" "); 00016100
WRITE(PRINT,SF[I]); 00016200
IF I GTR 0 THEN 00016300
BEGIN 00016400
INTEGER GT1,GT2,GT3; 00016500
MEMORY(10,GT1,GTA,GT2,GT3); 00016600
GO TO FINIS; 00016700
END; 00016800
END; 00016900
PROCEDURE MEMORY(MODE,TYPE,A,N,M); VALUE MODE,TYPE; 00017000
INTEGER MODE,TYPE,N,M; ARRAY A[0]; 00017100
BEGIN 00017200
DEFINE T64= DI:=LOC T; DI:=DI+1; DS:=7 CHR#; 00017300
STREAM PROCEDURE WRITERECS(PAGE,A,SKP,NB,NR,NS,RL); 00017400
VALUE SKP,NB,NR,NS,RL; 00017500
BEGIN 00017600
COMMENT -- NS IS THE NUMBER OF WORDS TO SAVE (ON THE 00017700
TAIL OF THE PAGE); 00017800
LOCAL T,T1,T2,TT; 00017900
COMMENT -- MOVE TO POSITION FOR WRITE; 00018000
SI:=LOC NB; T64; SI:=PAGE; SKP(SI:=SI+8); 00018100
T(2(32(RL(SI:=SI+8)))); NB(RL(SI:=SI+8)); 00018200
T1:=SI; COMMENT -- RECORDS WILL BE WRITTEN HERE; 00018300
COMMENT -- SKIP OVER TO END OF RECORDS TO BE SAVED; 00018400
DI:=LOC TT; SI:=LOC NS; DI:=DI+1; DS:=7CHR; 00018500
SI:=T1; COMMENT MOVE TO THE END OF THE FIELD TO BE SAVED; 00018600
TT(2(32(RL(SI:=SI+8)))); NS(RL(SI:=SI+8)); 00018700
T2:=SI; COMMENT -- END OF FIELD TO BE SAVED; 00018800
SI:=LOC NR; T64; DI:=T2; 00018900
T(2(32(RL(DI:=DI+8)))); NR(RL(DI:=DI+8)); 00019000
SI:=T2; SI:=SI-8; DI:=DI-8; 00019100
TT(2(32(RL(DS:=WDS; SI:=SI-16; DI:=DI-16)))); 00019200
NS(RL(DS:=WDS; SI:=SI-16; DI:=DI-16)); 00019300
COMMENT -- HAVE ACCOMPLISHED THE "SAVE", NOW DO THE WRITE; 00019400
SI:=A; DI:=T1; 00019500
T(2(32(DS:=RL WDS))); NR(DS:=RL WDS) 00019600
END; 00019700
STREAM PROCEDURE READRECS(PAGE,A,SKP,NB,NR,NM,RL); 00019800
VALUE SKP,NB,NR,NM,RL; 00019900
BEGIN 00020000
COMMENT 00020100
SKP = "SKIP" - - THE NUMBER OF WORDS TO JUMP OVER 00020200
NB = "NUMBER BEFORE" -- " " RECORDS TO SKIP BEFORE 00020300
READING THE RECORD, 00020400
NR = "NUMBER OF RECORDS" " " " " READ FROM THE 00020500
BUFFER, 00020600
NM ="NUMBER TO MOVE" - - " " " " MOVE OVER TO 00020700
THE PREVIOUSLY READ AREA, 00020800
RL ="RECORD LENGTH" - - THE LENGTH OF EACH ITEM 00020900
; 00021000
LOCAL T,T1,T2; 00021100
SI:=LOC NB; T64; SI:=PAGE; SKP(SI:=SI+8); 00021200
T(2(32(RL(SI:=SI+8)))); NB(RL(SI:=SI+8)); 00021300
T1:=SI; 00021400
COMMENT - - T1 NOW HAS THE STARTING POSITION FOR THE READ; 00021500
SI:=LOC NR; T64; SI:=T1; DI:=A; 00021600
T(2(32(DS:=RL WDS))); NR(DS:=RL WDS); 00021700
T2:=SI; COMMENT T2 CONTAINS THE END OF THE READ; 00021800
SI:=LOC NM; T64; SI:=T2; DI:=T1; 00021900
T(2(32(DS:=RL WDS))); NM(DS:=RL WDS) 00022000
END READRECS; 00022100
DEFINE MOVEALONG= 00022200
DI:=LOC C; DI:=DI+6; DS:=2CHR; DI:=LOC Z; 00022300
TSI:=SI; TALLY:=TALLY+1; 00022400
IF TOGGLE THEN 00022500
BEGIN SI:=LOC C; SI:=SI+6; 00022600
IF 2 SC NEQ DC THEN 00022700
BEGIN TAL:=TALLY; SI:=LOC TAL; SI:=SI+7; 00022800
IF SC="0" THEN 00022900
BEGIN TALLY:=TMP; TALLY:=TALLY+1; TMP:=TALLY; 00023000
TALLY:=0; 00023100
END ELSE 00023200
BEGIN SI:=LOC Z; IF SC LEQ"9" THEN ; 00023300
END 00023400
END ELSE 00023500
BEGIN DI:=TDI; SI:=LOC SIZE; SI:=SI+6; DS:=2CHR; 00023600
TDI:=DI; SI:=SI-2; DI:=LOC C64; DI:=DI+7 ; DS:=CHR; 00023700
SI:=NEW; DI:=TDI; C64(2(DS:=32CHR)); DS:=SIZE CHR; 00023800
TDI:=DI; SI:=TSI; DI:=LOC C; DI:=DI+6; 00023900
DS:=2CHR; TSI:=SI; 00024000
TALLY:=TAL;CHRSTORE:=TALLY; SI:=LOC TMP; SI:=SI+7; 00024100
DI:=LOC CHRSTORE; DI:=DI+6; DS:=CHR END 00024200
END; 00024300
SI:=LOC C; DI:=LOC C64; DI:=DI+1; DS:=7CHR; DI:=TDI; SI:=SI-1; 00024400
DS:=2CHR; SI:=TSI; 00024500
C64(2(DS:=32CHR)); DS:=C CHR; TDI:=DI; TSI:=SI#; 00024600
INTEGER STREAM PROCEDURE CHRSTORE(A,SKP,B,NEW,NB,SIZE,NA,MODE, 00024700
PAGESIZE); VALUE SKP,NB,SIZE,NA,MODE,PAGESIZE; 00024800
BEGIN LOCAL T,C,TSI,TDI, 00024900
Z,C64,TMP,TAL; 00025000
LABEL DONE; 00025100
SI:=LOC NB; T64; 00025200
SI:=LOC MODE; SI:=SI+7; 00025300
IF SC="0" THEN ; COMMENT SET TOGGLE; 00025400
SI:=A; DI:=B; SKP(DS:=8CHR); 00025500
TSI:=SI; TDI:=DI; 00025600
T(2(32(MOVEALONG))); NB(MOVEALONG); 00025700
COMMENT NOW HAVE MOVED UP TO NB; 00025800
IF TOGGLE THEN 00025900
BEGIN TALLY:=TAL; CHRSTORE:=TALLY; SI:=LOC TMP; SI:=SI+7; 00026000
DI:=LOC CHRSTORE; DI:=DI+6; DS:=CHR; 00026100
SI:=LOC SIZE; SI:=SI+6; DI:=TDI; DS:=2CHR; TDI:=DI; 00026200
SI:=LOC SIZE; DI:=LOC C64; DI:=DI+1; DS:=7CHR; SI:=NEW; 00026300
DI:=TDI; C64(2(DS:=32CHR)); DS:=SIZE CHR; 00026400
END ELSE 00026500
BEGIN TSI:=SI; TDI:=DI; 00026600
SI:=LOC MODE; SI:=SI+7; 00026700
IF SC="1" THEN 00026800
COMMENT REMOVE AN ENTRY HERE; 00026900
BEGIN DI:=LOC C; DI:=DI+6; SI:=TSI; DS:=2CHR; 00027000
TSI:=SI; DI:=LOC C64; DI:=DI+1; SI:=LOC C; 00027100
DS:=7CHR; SI:=TSI; C64(2(SI:=SI+32)); SI:=SI+C; 00027200
TSI:=SI; DI:=LOC CHRSTORE; SI:=LOC C; DS:=WDS; 00027300
DI:=TDI; DS:=2LIT"0"; TDI:=DI; 00027400
END ELSE 00027500
IF SC="2" THEN 00027600
COMMENT READ OUT AND ENTRY; 00027700
BEGIN DI:=LOC C; DI:=DI+6; SI:=TSI; DS:=2CHR; 00027800
TSI:=SI; DI:=LOC C64; DI:=DI+1; SI:=LOC C; 00027900
DS:=7CHR; SI:=TSI; DI:=NEW; 00028000
C64(2(DS:=32CHR)); DS:=C CHR; 00028100
SI:=LOC C; DI:=LOC CHRSTORE; DS:=WDS; GO DONE END; 00028200
SI:=LOC NA; T64; SI:=TSI; DI:=TDI; 00028300
T(2(32(TDI:=DI; DI:=LOC C; DI:=DI+6; DS:=2CHR; 00028400
TSI:=SI; SI:=LOC C; DI:=LOC C64; DI:=DI+1; DS:=7CHR; 00028500
SI:=SI-1;DI:=TDI;DS:=2CHR;SI:=TSI;C64(2(DS:=32CHR));DS:=C CHR))); 00028600
NA( TDI:=DI; DI:=LOC C; DI:=DI+6; DS:=2CHR; TSI:=SI; 00028700
SI:=LOC C;DI:=LOC C64;DI:=DI+1;DS:=7CHR;SI:=SI-1; 00028800
DI:=TDI;DS:=2CHR;SI:=TSI;C64(2(DS:=32CHR));DS:=C CHR); 00028900
END; 00029000
SI:=LOC PAGESIZE; T64; SI:=B; DI:=A; 00029100
%CARD LIST UNSAFE 00029200
COMMENT $CARD LIST UNSAFE; 00029300
T(2(DS:=32WDS)); DS:=PAGESIZE WDS; 00029400
%CARD LIST SAFE 00029500
COMMENT $CARD LIST SAFE; 00029600
DONE: 00029700
END; 00029800
STREAM PROCEDURE SETNTH(P,K,N); VALUE K,N; 00029900
BEGIN DI:=P; SI:=LOC K; N(DI:=DI+8); DS:=WDS END; 00030000
BOOLEAN STREAM PROCEDURE LESS(A,AN,B,BN,K); VALUE K,AN,BN; 00030100
BEGIN 00030200
SI:=A; DI:=B; SI:=SI+AN; DI:=DI+BN; 00030300
IF K SC LSS DC THEN TALLY:=1; 00030400
LESS:=TALLY; 00030500
END; 00030600
REAL STREAM PROCEDURE ADDD(A,B); VALUE A,B; 00030700
BEGIN SI:=LOC A; DI:=LOC B; DS:=8ADD; SI:=LOC B; 00030800
DI:=LOC ADDD; DS:=WDS 00030900
END; 00031000
INTEGER PROCEDURE FREEPAGE(INDEX,TYPEZERO,START,FINISH); 00031100
VALUE TYPEZERO,START,FINISH; INTEGER TYPEZERO,START,FINISH; 00031200
ARRAY INDEX[0,0]; 00031300
IF START GTR FINISH THEN MESSAGE(2) ELSE 00031400
BEGIN ARRAY T[0:RECSIZE+EXTRAROOM+SKIP-1],P[0:FINISH-START]; 00031500
INTEGER I,J,K,R; 00031600
R:=RECSIZE+EXTRAROOM+SKIP; 00031700
J:=START-(FINISH+1); 00031800
FOR I:=FINISH STEP -1 UNTIL TYPEZERO DO 00031900
IF K:=(I+J) LSS TYPEZERO THEN 00032000
BEGIN T[R-1]:=P[TYPEZERO-K-1]; 00032100
MOVE(T,R,INDEX[I,0]) 00032200
END ELSE 00032300
BEGIN IF I GEQ START THEN P[FINISH-I]:=INDEX[I,R-1]; 00032400
MOVE(INDEX[K,0],R,INDEX[I,0]); 00032500
END; 00032600
FREEPAGE:=TYPEZERO-J; 00032700
END; 00032800
INTEGER PROCEDURE SEARCHL(A,B,N,MIN,MAX,NP); VALUE N,MIN,MAX; 00032900
INTEGER N,MIN,MAX,NP; 00033000
ARRAY A[0,0]; REAL B; 00033100
BEGIN 00033200
INTEGER I,T; 00033300
FOR I:=MIN STEP 1 WHILE T:=T+A[I,0].CF LEQ B AND I LSS MAX-1 DO; 00033400
IF T LSS B THEN 00033500
BEGIN MESSAGE(3); SEARCHL:=NP:=0; 00033600
END ELSE 00033700
BEGIN SEARCHL:=I; NP:=B-T+A[I,0].CF 00033800
END 00033900
END; 00034000
PROCEDURE SORT(A,P,N,C); VALUE P,N,C; INTEGER P,N,C; 00034100
ARRAY A[0,0]; 00034200
BEGIN INTEGER R; 00034300
BEGIN 00034400
ARRAY T[0:R:=RECSIZE+EXTRAROOM+SKIP-1]; 00034500
LABEL ENDJ; 00034600
INTEGER I,J,L,K,M,SK; R:=R+1; 00034700
SK:=SKIP TIMES 8; 00034800
K:=N-P+1; I:=1; DO UNTIL (I:=I TIMES 2) GTR K; 00034900
M:=I-1; 00035000
WHILE (M:=M DIV 2) NEQ 0 DO 00035100
BEGIN K:=N-M; J:=P; 00035200
DO BEGIN 00035300
L:=(I:=J)+M; 00035400
DO BEGIN 00035500
IF A[L,0].TF GTR A[I,0].TF THEN GO ENDJ; 00035600
IF A[L,0].TF EQL A[I,0].TF THEN 00035700
IF NOT(LESS(A[L,0],SK,A[I,0],SK,C)) THEN 00035800
GO ENDJ; 00035900
MOVE(A[L,0],R,T); MOVE(A[I,0],R,A[L,0]); 00036000
MOVE(T,R,A[I,0]) 00036100
END UNTIL (I:=(L:=I)-M) LSS P; 00036200
ENDJ: 00036300
END UNTIL (J:=J+1) GTR K; 00036400
END 00036500
END 00036600
END SORT; 00036700
COMMENT - - - - - - - - - - - - - - - - - - - - - - - - - - 00036800
MODE MEANING 00036900
---- ------- 00037000
1 = INTERROGATE TYPE 00037100
2 = INSERT RECORD REL ADDRS N 00037200
(RELATIVE TO START OF LAST PAGE) 00037300
3 = RETURN THE NUMBER OF RECORDS (M) 00037400
4 = " ITEM AT RECORD # N 00037500
5 = INSERT " " " " " 00037600
6 = DELETE " " " " " 00037700
7 = SEARCH FOR THE RECORD -A- 00037800
8 = FILE OVERFLOW, INCREASE BY N 00037900
9 = FILE MAINTENANCE 00038000
10 = EMERGENCY FILE MAINTENANCE 00038100
11 SET STORAGE KIND 00038200
12= ALTER STORAGE ALLOCATION RESOURCES 00038300
13= RELEASE "TYPE" STORAGE TO SYSTEM 00038400
14= CLOSE ALL PAGES FOR AREA TRANSITION 00038500
NOTE THAT WHEN SEQUENTIAL STORAGE MAINTENANCE IS DONE, N 00038600
WILL ALWAYS INDICATE THE ADDRESS OF THE STRING RELATIVE TO 00038700
THE TYPE SPECIFIED, AND M WILL ALWAYS BE THE LENGTH OF THE 00038800
STRING IN -A- (EITHER AS INPUT OR OUTPUT) 00038900
; 00039000
PROCEDURE UPDATE(T,L,U,D); VALUE L,U,D; INTEGER L,U,D; 00039100
ARRAY T[0]; 00039200
BEGIN INTEGER I,J,K; 00039300
FOR I:=L STEP 1 UNTIL U DO 00039400
BEGIN J:=T[I].AF+D; T[I].AF:=J; 00039500
J:=T[I].BF+D; T[I].BF:=J 00039600
END 00039700
END; 00039800
OWN INTEGER CURPAGE,NPAGES,NTYPES,P,PS,U,L; 00039900
OWN INTEGER FIRST,AVAIL,MAXBUFF,CURBUFF; 00040000
REAL GT1; 00040100
LABEL MOREPAGES; 00040200
COMMENT 00040300
IF MEMBUG.[21:1] THEN DUMPMEMORY(MODE,TYPE,N,M); 00040400
IF MODE=8 THEN NPAGES:=NPAGES+N; 00040500
MOREPAGES: 00040600
BEGIN 00040700
OWN BOOLEAN POINTERSET, TYPESET; 00040800
INTEGER I, T, NR; 00040900
OWN ARRAY BUF[0:MBUFF], TYPS[0:511]; 00041000
OWN ARRAY INDX[0:NPAGES,0:RECSIZE+EXTRAROOM+SKIP-1]; 00041100
PROCEDURE SETTYPES; 00041200
BEGIN INTEGER I, T; 00041300
FOR I := 0 STEP 1 UNTIL NPAGES DO 00041400
IF INDX[I,0].TF NEQ T THEN 00041500
BEGIN 00041600
TYPS[T].BF := I; TYPS[T:=INDX[I,0].TF].AF := I; 00041700
TYPS[T].BOOL := INDX[I,0].MF; 00041800
END; 00041900
TYPS[T].BF := I; 00042000
END SETTYPES; 00042100
REAL PROCEDURE BUFFNUMBER(I); VALUE I; INTEGER I; 00042200
BEGIN INTEGER K,L,M; 00042300
LABEL D; 00042400
DEFINE B=BUF#; 00042500
IF( IF K:=INDX[I,P].BUFF=0 THEN TRUE ELSE BUF[K].PAGEF 00042600
NEQ INDX[I,P].PAGEF+1) THEN 00042700
BEGIN IF NULL(K:=CDR(AVAIL)) THEN 00042800
BEGIN K:=CDR(FIRST); 00042900
WHILE M:=CDR(B[K]) NEQ 0 DO 00043000
BEGIN L:=K; K:=M; END; 00043100
RPLACD(B[L],0); 00043200
IF BOOLEAN(B[K].CHANGEDBIT) THEN 00043300
WRITE(POINTERS[K][B[K].PAGEF-1]); 00043400
B[K].CHANGEDBIT:=0; 00043500
END ELSE RPLACD(AVAIL,CDR(B[K])); 00043600
B[K].PAGEF:=INDX[I,P].PAGEF+1; 00043700
INDX[I,P].BUFF:=K; 00043800
READ(POINTERS[K][INDX[I,P].PAGEF]); 00043900
END ELSE 00044000
IF CDR(FIRST)=K THEN GO TO D ELSE 00044100
BEGIN L:=CDR(FIRST); 00044200
WHILE M:=CDR(B[L]) NEQ K DO L:=M; 00044300
RPLACD(B[L],CDR(B[M])); 00044400
END; 00044500
RPLACD(B[K],CDR(FIRST)); RPLACD(FIRST,K); 00044600
D: BUFFNUMBER:=K 00044700
END; 00044800
PROCEDURE MARK(I); VALUE I; INTEGER I; 00044900
BUF[INDX[I,P].BUFF].CHANGEDBIT:=1; 00045000
BOOLEAN PROCEDURE WRITEBUFFER; 00045100
BEGIN INTEGER I; 00045200
I:=CDR(FIRST); 00045300
WHILE NOT NULL(I) DO 00045400
IF BOOLEAN(BUF[I].CHANGEDBIT) THEN 00045500
BEGIN WRITEBUFFER:=TRUE; 00045600
BUF[I].CHANGEDBIT:=0; 00045700
WRITE(POINTERS[I][BUF[I].PAGEF-1]); 00045800
RPLACD(I,0); 00045900
END ELSE I:=CDR(BUF[I]); 00046000
END; 00046100
IF NOT POINTERSET THEN 00046200
BEGIN LABEL EOF; 00046300
READ(POINTERS[1][NPAGES])[EOF]; 00046400
IF EOFMARK(SKIP,RECSIZE,POINTERS[1](0))THEN GO TO EOF; 00046500
MOVE(POINTERS[1](0),1,T); 00046600
COMMENT -- USE T TO DETERMIN THE VARIABLE REC SIZE LATER; 00046700
MOVE(POINTERS[1](0),RECSIZE+SKIP,INDX[NPAGES,0]); 00046800
INDX[NPAGES,RECSIZE+1].PAGEF:=NPAGES; 00046900
NPAGES:=NPAGES+1; 00047000
GO TO MOREPAGES; 00047100
COMMENT - - INITIALIZE VARIABLES; 00047200
EOF: POINTERSET:=TRUE; 00047300
U:=PAGESIZE-SKIP-PAGESPACE; 00047400
L:=(U-ALLOWANCE)/RECSIZE; 00047500
U:=(U+ALLOWANCE+RECSIZE/2)/RECSIZE; 00047600
PS:=(U+L)/2; 00047700
CURPAGE:=NPAGES:=NPAGES-1; 00047800
CURBUFF:=1; 00047900
P:=RECSIZE+SKIP; 00048000
FOR T:=1 STEP 1 UNTIL SBUFF DO RPLACD(BUF[T],T+1); 00048100
RPLACD(BUF[SBUFF],0); RPLACD(AVAIL,1); 00048200
MAXBUFF:=SBUFF; 00048300
T:=0; 00048400
SORT(INDX,0,NPAGES,RECSIZE TIMES 8); 00048500
FOR I:=0 STEP 1 UNTIL NPAGES DO 00048600
IF INDX[I,0].TF GTR T THEN T:=INDX[I,0].TF; 00048700
NTYPES:=T; 00048800
END; 00048900
IF TYPE GTR NTYPES THEN NTYPES:=TYPE; 00049000
IF NOT TYPESET THEN 00049100
BEGIN TYPESET:=TRUE; SETTYPES; 00049200
COMMENT 00049300
IF MEMBUG THEN DUMPINDEX(TYPS,NTYPES,INDX,RECSIZE, 00049400
P); 00049500
END; 00049600
COMMENT --- DECIDE WHETHER TO SAVE CURRENT PAGE BEFORE GOING ON; 00049700
IF MODE=2 THEN 00049800
BEGIN MODE:=5; NR:=N 00049900
END ELSE 00050000
IF MODE GEQ 4 THEN %MAY BE FILE MAINTENANCE 00050100
IF MODE GEQ 8 THEN %IS FILE MAINTENANCE 00050200
ELSE %WE MAY BE GOING TO 00050300
IF MODE NEQ 7 THEN %ANOTHER PAGE 00050400
BEGIN 00050500
IF TYPE=0 THEN BEGIN MESSAGE(4); MODE:=0 END ELSE 00050600
IF TYPS[TYPE].AF=TYPS[TYPE].BF THEN 00050700
IF TYPS[0].BF GTR 0 THEN 00050800
BEGIN INTEGER J,K; REAL PG; 00050900
K:=TYPS[0].BF-1; TYPS[0].BF:=K; PG:=INDX[K,P]; 00051000
FOR I:=1 STEP 1 UNTIL TYPE-1 DO 00051100
IF (T:=TYPS[I]).AF NEQ T.BF THEN 00051200
BEGIN FOR K:=T.AF STEP 1 UNTIL T.BF -1 DO 00051300
MOVE(INDX[K,0],P+EXTRAROOM,INDX[K-1,0]); 00051400
TYPS[I].AF:=T.AF-1; TYPS[I].BF:=K:=T.BF-1 00051500
END; 00051600
IF CURPAGE GTR TYPS[0].BF THEN 00051700
IF CURPAGE LEQ K THEN CURPAGE:=CURPAGE-1; 00051800
TYPS[TYPE].BF:=K+1; TYPS[TYPE].AF:=K; 00051900
INDX[K,P]:=PG; INDX[K,0]:=0; INDX[K,0].TF:=TYPE; 00052000
IF TYPS[TYPE].BOOL=1 THEN 00052100
BEGIN SETNTH(INDX[K,0],0,1); INDX[K,0].MF:=1 00052200
END; 00052300
COMMENT 00052400
IF MEMBUG.[22:1] THEN DUMPTYPES(MODE,TYPS,NTYPES); 00052500
MEMORY(MODE,TYPE,A,N,M); MODE:=0 00052600
END ELSE 00052700
BEGIN T:=1; MEMORY(8,TYPE,A,T,M); MEMORY(MODE,TYPE,A,N,M);00052800
MODE:=0 00052900
END ELSE 00053000
IF NOT( BOOLEAN(TYPS[TYPE].BOOL) AND MODE=5) THEN 00053100
CURBUFF:=BUFFNUMBER(CURPAGE:= 00053200
SEARCHL(INDX,N,NPAGES,TYPS[TYPE].AF,TYPS[TYPE].BF, 00053300
NR) ); 00053400
COMMENT 00053500
IF MEMBUG.[23:1] THEN CHECKTYPES(TYPS,NTYPES); 00053600
END; 00053700
COMMENT 00053800
IF MEMBUG.[20:1] THEN DUMPINDEX(TYPS,NTYPES,INDX,RECSIZE,P); 00053900
COMMENT 00054000
IF MEMBUG.[24:1] THEN DUMPBUFF(BUF,FIRST,AVAIL); 00054100
CASE MODE OF 00054200
BEGIN 00054300
%------- MODE=0 ------- RESERVED --------------- 00054400
; 00054500
%------- MODE=1 --------------------------------------------------00054600
IF M=0 THEN N:=TYPS[TYPE].BOOL ELSE 00054700
IF M=1 THEN 00054800
BEGIN FOR I:=1 STEP 1 UNTIL NTYPES DO 00054900
IF (T:=TYPS[I]).AF=T.BF THEN 00055000
BEGIN N:=I; I:=NTYPES+1 00055100
END; 00055200
IF I=NTYPES+1 THEN N:=NTYPES+1 00055300
END; 00055400
%------- MODE=2 ------- RESERVED --------------- 00055500
; 00055600
%------- MODE=3 ------- RETURN THE NUMBER OF RECORDS---- 00055700
BEGIN COMMENT IF TYPE LSS 0 THEN THE TOTAL NUMBER 00055800
OF PAGES IS GIVEN, OTHERWISE THE NUMBER OF "TYPE" PAGES IS 00055900
GIVEN; 00056000
FOR I:=0 STEP 1 UNTIL NPAGES DO 00056100
IF INDX[I,0].TF=TYPE OR TYPE LSS 0 THEN 00056200
NR:=NR+INDX[I,0].CF; 00056300
M:=NR 00056400
END; 00056500
%------- MODE=4 ------- RETURN ITEM AT SUBSCRIPT N ----- 00056600
IF NR GEQ INDX[CURPAGE,0].CF THEN MESSAGE(3) ELSE 00056700
IF BOOLEAN (TYPS[TYPE].BOOL) THEN COMMENT SEQUENTIAL STORAGE; 00056800
BEGIN ARRAY B[0:PAGESIZE]; 00056900
M:=CHRSTORE(POINTERS[CURBUFF](0),2,B,A,NR,0,0,2,0); 00057000
END ELSE 00057100
BEGIN 00057200
M:=RECSIZE|8; 00057300
READRECS(POINTERS[CURBUFF](0),A,SKIP,NR,1,0,RECSIZE); 00057400
END; 00057500
%------- MODE=5 ------- INSERT ITEM AT SUBSCRIPT N; 00057600
BEGIN INTEGER K,J,S; REAL PG; 00057700
IF BOOLEAN(TYPS[TYPE].BOOL) THEN 00057800
COMMENT FIND A PLACE FOR THE CHARACTER STRING OF LENGTH 00057900
M; 00058000
IF M GTR (PAGESIZE-SKIP-1)|8-2 THEN MESSAGE(5) COMMENT 00058100
THIS CHARACTER STRING IS TOO LONG ; ELSE 00058200
BEGIN ARRAY C[0:PAGESIZE]; 00058300
STREAM PROCEDURE ADDZERO(CHARS,POINTER); VALUE CHARS; 00058400
BEGIN LOCAL T; 00058500
SI:=LOC CHARS; DI:=LOC T; DI:=DI+1; DS:=7CHR; 00058600
DI:=POINTER; T(2(DI:=DI+32)); CHARS(DI:=DI+1); 00058700
DS:=2LIT"0"; 00058800
END; 00058900
BOOLEAN B,NOTLASTPAGE; 00059000
LABEL TRYITAGAIN; 00059100
TRYITAGAIN: 00059200
FOR I:=(T:=TYPS[TYPE]).AF STEP 1 WHILE I LSS T.BF AND 00059300
NOT B DO 00059400
IF NOT(B:=((PAGESIZE-SKIP-1)|8-(GT1:=INDX[I,0]).SF)GEQ M+2 00059500
AND NOT BOOLEAN(GT1.FF)) THEN S:=S+GT1.CF ELSE I:=I-1; 00059600
NOTLASTPAGE:=B AND I NEQ T.BF-1; 00059700
COMMENT IF B IS TRUE, THEN A PAGE HAS BEEN FOUND; 00059800
IF NOT B THEN COMMENT GET A PAGE THAT IS FREE; 00059900
BEGIN 00060000
COMMENT 00060100
IF MEMBUG.[5:1] THEN DUMPTYPES(5,1,TYPS,NTYPES); 00060200
IF TYPS[0].BF=0 THEN BEGIN K:=CURPAGE; T:=1; 00060300
MEMORY(8,TYPE,A,T,M); CURPAGE:=K+1 00060400
END 00060500
ELSE 00060600
IF (PAGESIZE-SKIP-1)|8-INDX[(I:=I-1)-1,0].SF GTR 2 THEN 00060700
BEGIN 00060800
CURBUFF:=BUFFNUMBER(CURPAGE:=I-1); 00060900
ADDZERO((GT1:=INDX[CURPAGE,0].SF)+8|(SKIP+1),POINTERS 00061000
[CURBUFF](0)); 00061100
INDX[CURPAGE,0].SF:=GT1+2; 00061200
INDX[CURPAGE,0].CF:=INDX[CURPAGE,0].CF+1; 00061300
COMMENT SINCE ALLOCATING A NEW PAGE, SET COUNT TO 00061400
ONE MORE AND FREEZE THE COUNT; 00061500
S:=S+1; % SINCE THE COUNT INCREASED 00061600
MOVE(INDX[CURPAGE,0],SKIP+1,POINTERS[CURBUFF](0)); 00061700
MARK(CURPAGE); 00061800
END; 00061900
T:=TYPS[0].BF; TYPS[0].BF:=T:=T-1; 00062000
COMMENT T IS THE SUBSCRIPT INTO THE NEW PAGE; 00062100
PG:=INDX[T,P]; COMMENT PG HOLDS THE NEW PAGE #; 00062200
FOR K:=T+1 STEP 1 UNTIL I DO 00062300
MOVE(INDX[K,0],RECSIZE+SKIP+EXTRAROOM,INDX[K-1,0]); 00062400
T:=TYPS[TYPE].AF; TYPS[TYPE].AF:=T-1; 00062500
INDX[I,P]:=PG; UPDATE(TYPS,1,TYPE-1,-1); 00062600
IF CURPAGE GTR TYPS[0].BF THEN IF CURPAGE LEQ 00062700
I THEN CURPAGE:=CURPAGE-1; 00062800
INDX[I,0]:=0; INDX[I,0].MF:=1; INDX[I,0].TF:=TYPE; 00062900
COMMENT MUST ALSO ASSIGN A NUMBER TO THIS PAGE 00063000
(TO BE STORED IN THE PAGE) TO KEEP IT IN SEQUENCE 00063100
WITHIN THIS TYPE; 00063200
IF (T:=TYPS[TYPE]).AF LSS T.BF-1 THEN 00063300
T:=INDX[T.BF-1,1] ELSE T:=0; 00063400
SETNTH(INDX[I,0],ADDD(1,T),1); 00063500
COMMENT END OF THE INITIALIZATION OF THE INDEX ARRAY, 00063600
WE STILL HAVE TO MAKE SOME ENTRIES INTO THE PAGE 00063700
WHICH WE WILL DO BELOW; 00063800
END OF TEST FOR NEW PAGE; 00063900
COMMENT I IS SET TO THE PROPER SUBSCRIPT FOR THE CHR STORE; 00064000
CURBUFF:=BUFFNUMBER(CURPAGE:=I); 00064100
COMMENT NOW THE CORRECT PAGE IS IN CORE. 00064200
------------------------------ 00064300
M= NUMBER OF CHARACTERS IN A (ON INPUT) 00064400
N= ADDRESS OF A WITHIN IN THIS TYPE (ON OUTPUT 00064500
------------------------------; 00064600
K:=INDX[I,0]; 00064700
T:=CHRSTORE(POINTERS[CURBUFF](0),SKIP+1,C,A,K.CF,M,0,0, 00064800
PAGESIZE); 00064900
COMMENT K.CF IS THE NUMBER OF ITEMS ALREADY IN THIS 00065000
PAGE. IF THERE IS A SEGMENT WHICH IS NULL, IT WILL 00065100
BE FOUND AND ASSIGNED AS THE SEG NUMBER FOR 00065200
THIS CHARACTER STRING (T). IF NOT, IT WILL STICK THE 00065300
STRING ON THE END (WE KNOW THERE IS ENOUGH ROOM 00065400
SINCE WE CHECKED INDX[I,0].SF -- THE NUMBER OF CHRS USED 00065500
IN THIS PAGE, OR WE CREATED A NEW PAGE); 00065600
N:=S+T; S:=K.SF; COMMENT S CONTAINS THE # OF CHRS USED UP; 00065700
IF T:=T+1 GTR K.CF THEN COMMENT ADDED THE STRING ON THE END; 00065800
IF NOTLASTPAGE THEN % PAGE ALREADY FULL 00065900
BEGIN S:=0; B:=FALSE; INDX[I,0].FF:=1; 00066000
MOVE(INDX[I,0],SKIP+1,POINTERS[CURBUFF](0)); 00066100
MARK(CURPAGE); GO TRYITAGAIN; END ELSE 00066200
BEGIN K.CF:=T; S:=S+2; 00066300
END 00066400
ELSE IF T=K.CF AND NOTLASTPAGE THEN INDX[I,0].FF:=1; 00066500
00066600
INDX[I,0].CF:=K.CF; INDX[I,0].SF:=S+M; 00066700
MOVE(INDX[I,0],SKIP+1,POINTERS[CURBUFF](0)); 00066800
MARK(CURPAGE); 00066900
COMMENT THE PAGE DESCRIPTOR HAS BEEN UPDATED; 00067000
COMMENT 00067100
IF MEMBUG.[5:1] THEN DUMPTYPES(5,2,TYPS,NTYPES); 00067200
END ELSE COMMENT KIND OF STORAGE IS SORTED; 00067300
IF NR GTR (T:=INDX[CURPAGE,0].CF) THEN 00067400
COMMENT SUBSCRIPT IS NOT IN THE MIDDLE OF THE PAGE; 00067500
MESSAGE(6) ELSE 00067600
BEGIN 00067700
IF T GEQ U THEN COMMENT WILL EXCEED UPPER PAGE BOUND; 00067800
BEGIN ARRAY B[0:RECSIZE TIMES 00067900
(T-PS+(I:=(IF NR GEQ PS THEN 0 ELSE 1)))-1]; 00068000
COMMENT B IS JUST BIG ENOUGH TO CARRY THE 00068100
EXCESS FROM THE OLD PAGE; 00068200
READRECS(POINTERS[CURBUFF](0),B,SKIP,PS-I, 00068300
J:=(T-PS+I),0,RECSIZE); 00068400
COMMENT -- B NOW HAS THE EXCESS; 00068500
INDX[CURPAGE,0].CF:=T-J; SETNTH(POINTERS[CURBUFF](0), 00068600
INDX[CURPAGE,0],0); 00068700
MARK(CURPAGE); 00068800
IF TYPS[0].BF=0 THEN 00068900
BEGIN K:=CURPAGE; T:=1; 00069000
MEMORY(8,TYPE,A,T,M); CURPAGE:=K+1; 00069100
END; 00069200
COMMENT -- ASSIGN A FREE PAGE (SUBS T); 00069300
T:=TYPS[0].BF; TYPS[0].BF:=T:=T-1; 00069400
00069500
PG:=INDX[T,P]; 00069600
FOR K:=T+1 STEP 1 UNTIL CURPAGE DO 00069700
MOVE(INDX[K,0],RECSIZE+SKIP+EXTRAROOM,INDX[K-1,0]); 00069800
INDX[CURPAGE,P]:=PG; 00069900
T:=0;T.CF:=J;T.TF:=TYPE; 00070000
CURBUFF:=BUFFNUMBER(CURPAGE); 00070100
WRITERECS(POINTERS[CURBUFF](0),B,SKIP,0,J,0,RECSIZE); 00070200
SETNTH(POINTERS[CURBUFF](0),T,0); 00070300
MOVE(POINTERS[CURBUFF](0),RECSIZE+SKIP,INDX[CURPAGE,0]); 00070400
MARK(CURPAGE); 00070500
T:=TYPS[TYPE].AF; TYPS[TYPE].AF:=T-1; 00070600
UPDATE(TYPS,1,TYPE-1,-1); 00070700
IF J=0 THEN MESSAGE(7); 00070800
IF BOOLEAN (I) THEN 00070900
COMMENT I=0 IMPLIES THE RECORD GOES TO NEW PAGE, 00071000
I=1 IMPLIES THE RECORD GOES TO NOOLD PAGE; 00071100
BEGIN 00071200
T:=INDX[CURPAGE:=CURPAGE-1,0].CF; 00071300
CURBUFF:=BUFFNUMBER(CURPAGE); 00071400
; COMMENT OLD PAGE IS NOW BACK; 00071500
END ELSE 00071600
BEGIN T:=J; NR:=NR-PS 00071700
END 00071800
END; 00071900
WRITERECS(POINTERS[CURBUFF](0),A,SKIP,NR,1,T-NR,RECSIZE); 00072000
T:=INDX[CURPAGE,0].CF; INDX[CURPAGE,0].CF:=T+1; 00072100
SETNTH(POINTERS[CURBUFF](0),INDX[CURPAGE,0],0); 00072200
IF NR=0 THEN MOVE(POINTERS[CURBUFF](0),RECSIZE+SKIP,INDX 00072300
[CURPAGE,0]); MARK(CURPAGE); 00072400
END; 00072500
END; 00072600
%------- MODE=6 ------- DELETE A RECORD FROM THE FILE ---- 00072700
IF (T:=TYPS[TYPE]).AF=T.BF THEN MESSAGE(12) COMMENT 00072800
ATTEMPT TO DELETE NON-EXISTENT STORAGE; 00072900
ELSE 00073000
IF NR GEQ(T:=INDX[CURPAGE,0].CF) THEN MESSAGE(13) COMMENT 00073100
ATTEMPT TO DELETE OUTSIDE STORAGE RANGE; ELSE 00073200
IF BOOLEAN(T.BOOL) THEN COMMENT SEQUENTIAL STORAGE; 00073300
BEGIN COMMENT NR IS THE RECORD TO DELETE; 00073400
ARRAY B[0:PAGESIZE-1]; 00073500
COMMENT PAGESIZE -1 SHOULD BE COMPUTED TO THE EXACT 00073600
NUMBER OF WORDS TO MOVE -- IT WOULD SPEED THINGS UP; 00073700
INTEGER L; 00073800
T:=INDX[CURPAGE,0]; COMMENT T.CF IS THE NUMBER OF 00073900
RECORDS ON THIS PAGE, T.SF IS THE NUMBER OF CHRS; 00074000
L:=CHRSTORE(POINTERS[CURBUFF](0),SKIP+1,B,A,NR,0,T.CF 00074100
-NR-1,1,PAGESIZE); 00074200
COMMENT WE WILL BRING BACK THE NUMBER OF CHRS IN M; 00074300
M:=L; 00074400
MARK(CURPAGE); 00074500
COMMENT MAKE CHANGES TO THE CHARACTER COUNT; 00074600
INDX[CURPAGE,0].SF:=T.SF-L; 00074700
INDX[CURPAGE,0].FF:=0; % PAGE IS CERTAINLY NOT FULL NOW 00074800
COMMENT AND WE ARE DONE WITH THE DELETION; 00074900
MOVE(INDX[CURPAGE,0],SKIP+1,POINTERS[CURBUFF](0)); 00075000
END 00075100
ELSE 00075200
BEGIN ARRAY A[0:RECSIZE-1]; 00075300
INDX[CURPAGE,0].CF:=I-1; 00075400
SETNTH(POINTERS[CURBUFF](0),INDX[CURPAGE,0],0); 00075500
IF I GTR 1 THEN 00075600
BEGIN 00075700
READRECS(POINTERS[CURBUFF](0),A,SKIP,NR,1,I-NR-1,RECSIZE); 00075800
MARK(CURPAGE); 00075900
IF NR=0 THEN 00076000
MOVE(POINTERS[CURBUFF](0),RECSIZE+SKIP,INDX[CURPAGE,0]) 00076100
END ELSE COMMENT FREE THE EMPTY PAGE; 00076200
BEGIN MARK(CURPAGE); 00076300
;TYPS[0].BF:=FREEPAGE(INDX,TYPS[0].BF,CURPAGE,CURPAGE); 00076400
UPDATE(TYPS,1,TYPE-1,1); TYPS[TYPE].AF:=T.AF+1; 00076500
COMMENT 00076600
IF MEMBUG.[6:1] THEN DUMPTYPES(MODE,TYPS,NTYPES); 00076700
END 00076800
END; 00076900
%------- MODE=7 ------- SEARCH FOR A RECORD FROM THE FILE --- 00077000
IF N GTR 3 THEN MESSAGE(14) ELSE 00077100
COMMENT RETURN RECORD CLOSEST (BUT LESS THAN OR EQUAL TO) TO 00077200
THE CONTENT OF -A-. A WILL BE REPLACED BY THE RECORD FOUND; 00077300
IF BOOLEAN((I:=TYPS[TYPE]).BOOL) THEN 00077400
MESSAGE(8) COMMENT BINARY SEARCH OF NON-SEQUENTIAL DATA; 00077500
ELSE 00077600
IF I.AF=I.BF THEN MESSAGE(9) COMMENT --NO STORAGE OF 00077700
THIS TYPE ALLOCATED AS YET; 00077800
ELSE BEGIN 00077900
INTEGER F,U,L; 00078000
ARRAY B[0:RECSIZE-1]; 00078100
U:=TYPS[TYPE].BF; L:=TYPS[TYPE].AF; 00078200
WHILE U-L GTR 1 DO 00078300
IF LESS(A,0,INDX[F:=(U+L) DIV 2,0],8,M) THEN U:=F ELSE L:=F; 00078400
CURBUFF:=BUFFNUMBER(CURPAGE:=L); 00078500
L:=0; U:=INDX[CURPAGE,0].CF; 00078600
IF L-U=0 THEN MESSAGE(10) COMMENT BINARY SEARCH FOUND 00078700
A PAGE WITH NO RECORDS; 00078800
ELSE BEGIN 00078900
WHILE U-L GTR 1 DO 00079000
BEGIN READRECS(POINTERS[CURBUFF](0),B,SKIP, 00079100
F:=(U+L) DIV 2,1,0,RECSIZE); 00079200
IF LESS(A,0,B,0,M) THEN U:=F ELSE L:=F 00079300
END; 00079400
COMMENT ----------------------------------- 00079500
ON INPUT: 00079600
N=0 IMPLIES DO NOT PLACE RECORD INTO FILE 00079700
IF RECORD IS FOUND. RETURN RELA- 00079800
TIVE POSITION OF THE CLOSEST RECORD 00079900
IN THIS PAGE. 00080000
N=1 " DO NO PLACE IN FILE. RETURN ABSO- 00080100
LUTE SUBSCRIPT OF CLOSSEST RECORD. 00080200
N=2 " PLACE RECORD INTO FILE IF NOT FOUND. 00080300
RETURN RELATIVE POSITION OF RECORD. 00080400
N=3 " PLACE RECORD INTO FILE, IF NOT 00080500
FOUND, RETURN ABS SUBSCRIPT OF 00080600
THE RECORD. 00080700
ON OUTPUT: 00080800
M=0 " RECORD FOUND WAS EQUAL TO RECORD 00080900
SOUGHT. 00081000
M=1 " RECORD FOUND WAS GREATER THAN THE 00081100
SOUGHT. 00081200
M=2 " RECORD FOUND WAS LESS THAN THE 00081300
RECORD SOUGHT. 00081400
; 00081500
READRECS(POINTERS[CURBUFF](0),B,SKIP,L,1,0,RECSIZE); 00081600
IF LESS(A,0,B,0,M) THEN M:=1 ELSE 00081700
IF LESS(B,0,A,0,M) THEN M:=2 ELSE 00081800
M:=0; 00081900
T:=0; IF BOOLEAN(N) THEN 00082000
FOR I:=TYPS[TYPE].AF STEP 1 UNTIL CURPAGE-1 DO 00082100
T:=T+INDX[I,0].CF; 00082200
IF N GTR 1 THEN IF M GEQ 1 THEN 00082300
MEMORY(2,TYPE,A,L+M-1,NR); 00082400
MOVE(B,RECSIZE,A); 00082500
N:=T+L; 00082600
END 00082700
END; 00082800
%------- MODE=8 ------- FILE OVERFLOW, FIX ARRAYS AND PAGES 00082900
BEGIN BOOLEAN TOG; 00083000
ARRAY A[0:PAGESIZE-1]; T:=NPAGES-N+1; 00083100
IF TOG:=(T DIV AREASIZE) LSS (NPAGES DIV AREASIZE ) OR 00083200
(T=NPAGES AND T MOD AREASIZE =0) THEN 00083300
MEMORY(14,TYPE,A,N,M); 00083400
FOR I:=T STEP 1 UNTIL NPAGES DO 00083500
BEGIN WRITE(NEWDISK[I],PAGESIZE,A[*]);INDX[I,P].PAGEF:=I END; 00083600
MARKEOF(SKIP,RECSIZE,NEWDISK(0)); 00083700
WRITE(NEWDISK[I]); 00083800
TYPS[0].BF:=FREEPAGE(INDX,TYPS[0].BF,T,NPAGES); 00083900
UPDATE(TYPS,1,NTYPES,NPAGES-T+1); 00084000
IF TOG THEN CLOSE(NEWDISK); 00084100
END; 00084200
%------- MODE=9 ------- FILE MAINTENANCE ------------------ 00084300
BEGIN BOOLEAN ITHPAGEIN; 00084400
INTEGER I,J,K,T1,T2,T3,M,W,Q; 00084500
ARRAY A,B[0:PAGESIZE-1]; 00084600
COMMENT 00084700
MONITOR PRINT(Q,W,N, I,J,K,T1,T2,T3,M,A,B); 00084800
IF I:=TYPS[0].BF LEQ NPAGES THEN 00084900
DO 00085000
BEGIN COMMENT OUTER "DO-LOOP" TO FIND TROUBLE WITH 00085100
THE FILE; 00085200
IF T1:=(Q:=INDX[I,0]).CF LSS L THEN COMMENT MAY BE CORRECTABLE;00085300
IF NOT BOOLEAN((Q:=TYPS[Q.TF]).BOOL) THEN 00085400
COMMENT -- THIS PAGE IS CORRECTABLE; 00085500
IF I NEQ NPAGES THEN 00085600
COMMENT -- THIS IS NOT THE LAST PAGE OF THE FILE; 00085700
IF (J:=I+1) LSS Q.BF THEN 00085800
COMMENT -- THIS IS NOT THE LAST PAGE OF THIS TYPE; 00085900
BEGIN COMMENT -- FIND RECORDS TO MOVE INTO 00086000
THIS PAGE; 00086100
DO IF T2:=INDX[J,0].CF GTR 0 THEN 00086200
COMMENT THIS PAGE HAS RECS TO MOVE; 00086300
BEGIN COMMENT HOW MANY; 00086400
IF T2 LSS K:=PS-T1 THEN K:=T2; 00086500
IF NOT ITHPAGEIN THEN 00086600
BEGIN COMMENT BRING IN PAGE I; 00086700
MOVE(POINTERS[BUFFNUMBER(I)](0), 00086800
PAGESIZE,B); ITHPAGEIN:=TRUE 00086900
END; 00087000
COMMENT -- BRING IN PAGE J; 00087100
CURBUFF:=BUFFNUMBER(CURPAGE:=J); 00087200
COMMENT -- MOVE SOME INTO A; 00087300
READRECS(POINTERS[CURBUFF](0),A,SKIP,0,K, 00087400
T2:=T2-K,RECSIZE); INDX[J,0].CF:=T2; 00087500
IF T2=0 THEN 00087600
COMMENT SET THIS PAGE FREE; 00087700
INDX[J,0]:=0; 00087800
SETNTH(POINTERS[CURBUFF](0),INDX[J,0],0); 00087900
MOVE(POINTERS[CURBUFF](0),RECSIZE+SKIP,INDX[J 00088000
,0]); MARK(CURPAGE); 00088100
COMMENT -- PUT THE RECORDS INTO PAGE I; 00088200
WRITERECS(B,A,SKIP,T1,K,0,RECSIZE); 00088300
END 00088400
ELSE K:=0 COMMENT SINCE NO CONTRI- 00088500
BUTION; 00088600
UNTIL T1:=T1+K GEQ PS OR J:=J+1 GEQ Q.BF; 00088700
INDX[I,0].CF:=T1; B[0]:=INDX[I,0]; 00088800
COMMENT -- PUT THE PAGE BACK OUT ON DISK; 00088900
MOVE(B,RECSIZE+SKIP,INDX[I,0]); 00089000
MOVE(B,PAGESIZE,POINTERS[CURBUFF:=BUFFNUMBER 00089100
(I)](0)); SORT(INDX,0,NPAGES,RECSIZE|8); 00089200
MARK(CURPAGE:=I); SETTYPES; 00089300
N:=1; 00089400
END 00089500
ELSE N:=0 COMMENT LAST PAGE OF THIS TYPE; 00089600
ELSE N:=0 COMMENT LAST PAGE OF FILE; 00089700
ELSE N:=0 COMMENT PAGE CANNOT BE CHANGED; 00089800
ELSE N:=0 COMMENT THIS PAGE IS NOT TOO SMALL; 00089900
END UNTIL I:=I+1 GTR NPAGES OR N NEQ 0 ELSE N:=0; 00090000
IF I GTR NPAGES THEN N:=REAL(WRITEBUFFER); 00090100
END OF FILE UPDATE; 00090200
%------- MODE=10 ------EEMERGENCY FILE MAINTENANCE ------- 00090300
DO MEMORY(9,TYPE,A,N,M) UNTIL N NEQ 1 00090400
%------- MODE=11 ------- SET THE KIND OF STORAGE FOR TYPE ----------00090500
;COMMENT TYPE "TYPE" STORAGE IS BEING SET TO SEQUENTIAL; 00090600
IF TYPE=0 THEN MESSAGE(4) ELSE 00090700
IF (T:=TYPS[TYPE]).AF= T.BF THEN TYPS[TYPE].BOOL:=1 ELSE 00090800
MESSAGE(15); COMMENT ATTEMPT TO CHANGE KINDS IN MIDSTREAM; 00090900
%------- MODE=12 ----------- ALTER STORAGE ALLOCATION RESOURCES--- 00091000
COMMENT N IS THE "FACTOR" (PERCENT OF RESOURCES | 100), 00091100
AND M IS THE STORAGE "LEVEL" (0 IS THE ONLY ONE THAT 00091200
DOES ANYTHING ON THE B5500); 00091300
BEGIN INTEGER J,K; 00091400
BOOLEAN TOG; 00091500
IF T:=N|(MBUFF-1)/100+1 GTR MAXBUFF THEN 00091600
BEGIN COMMENT ADD TO AVAILABLE LIST; 00091700
FOR I:=CDR(FIRST),CDR(AVAIL) DO 00091800
WHILE NOT NULL(I) DO 00091900
BEGIN BUF[I].FLAGB:=1; I:=CDR(BUF[I]); 00092000
END; 00092100
FOR I:=MAXBUFF+1 STEP 1 UNTIL T DO 00092200
BEGIN WHILE BUF[K:=K+1].FLAGB=1 DO; 00092300
BUF[K]:=0; RPLACD(BUF[K],CDR(AVAIL)); 00092400
RPLACD(AVAIL,K) 00092500
END; 00092600
MAXBUFF:=T; 00092700
FOR I:=1 STEP 1 UNTIL MBUFF DO BUF[I].FLAGB:=0; 00092800
END ELSE 00092900
IF T LSS MAXBUFF THEN 00093000
BEGIN COMMENT CUT DOWN ON THE NUMBER OF BUFFERS; 00093100
I:=CDR(FIRST); 00093200
FOR J:=1 STEP 1 UNTIL MAXBUFF DO 00093300
IF TOG THEN 00093400
IF NOT NULL(I) THEN 00093500
IF J GEQ T THEN 00093600
BEGIN K:=CDR(BUF[I]); BUF[I]:=0 00093700
; I:=K END 00093800
ELSE I:=CDR(BUF[I]) 00093900
ELSE 00094000
ELSE 00094100
IF TOG:=NULL(I) THEN 00094200
BEGIN J:=J-1; I:=CDR(AVAIL) 00094300
END 00094400
ELSE 00094500
IF J EQL T THEN 00094600
BEGIN K:=CDR(BUF[I]); RPLACD(BUF[I],0); 00094700
I:=K END ELSE 00094800
IF J GTR T THEN 00094900
BEGIN 00095000
IF BOOLEAN(BUF[I].CHANGEDBIT) THEN 00095100
WRITE(POINTERS[I][BUF[I].PAGEF-1]); 00095200
K:=CDR(BUF[I]); 00095300
CLOSE(POINTERS[I]); 00095400
BUF[I]:=0; I:=K 00095500
END ELSE I:=CDR(BUF[I]) 00095600
; 00095700
MAXBUFF:=T 00095800
END; 00095900
END; 00096000
%------- MODE=13 ------- RELEASE "TYPE" STORAGE TO SYSTEM ----------00096100
IF (T:=TYPS[TYPE]).BF GTR T.AF THEN 00096200
BEGIN INTEGER J; 00096300
J:=T.BF-1; 00096400
FOR I:=T.AF STEP 1 UNTIL J DO 00096500
BEGIN CURBUFF:=BUFFNUMBER(I); 00096600
SETNTH(POINTERS[CURBUFF](0),0,0); MARK(CURPAGE:=I); 00096700
END; 00096800
TYPS[0].BF:=FREEPAGE(INDX,TYPS[0].BF,T.AF,J); 00096900
UPDATE(TYPS,1,TYPE-1,J-T.AF+1); 00097000
TYPS[TYPE].BF:=T.AF; TYPS[TYPE].BOOL:=0; 00097100
END; 00097200
%------- MODE=14 ------ RELEASE ALL PAGES FOR TRANSITION -----------00097300
BEGIN INTEGER K; 00097400
I:=CDR(FIRST); 00097500
WHILE NOT NULL(I) DO 00097600
BEGIN IF BOOLEAN(BUF[I].CHANGEDBIT ) THEN WRITE(POINTERS[I] 00097700
[BUF[I].PAGEF-1]); CLOSE(POINTERS[I]); 00097800
K:=CDR(BUF[I]); BUF[I]:=0; 00097900
RPLACD(BUF[I],CDR(AVAIL)); RPLACD(AVAIL,I); I:=K 00098000
END ; CURPAGE:=CURBUFF:=-1; RPLACD(FIRST,0); 00098100
END; 00098200
END OF CASE STMT; 00098300
00098400
END OF INNER BLOCK; 00098500
END OF PROCEDURE; 00098600
INTEGER QM,QN; 00098700
ARRAY QA[0:0]; 00098800
PROCEDURE NAME(MFID,FID); VALUE MFID,FID; REAL MFID,FID; 00098900
BEGIN INTEGER I; FILL NEWDISK WITH MFID,FID; 00099000
FOR I:=0 STEP 1 UNTIL MBUFF DO 00099100
FILL POINTERS[I] WITH MFID,FID; 00099200
FILL ESTABLISH WITH MFID,FID; 00099300
SETPOINTERNAMES 00099400
END; 00099500
PROCEDURE SEQUENTIAL(UNIT); VALUE UNIT; INTEGER UNIT; 00099600
MEMORY(11,UNIT,QA,QN,QM); 00099700
INTEGER PROCEDURE CONTENTS(UNIT,N,AR); VALUE UNIT,N; 00099800
INTEGER UNIT,N; ARRAY AR[0]; 00099900
BEGIN 00100000
MEMORY(4,UNIT,AR,N,QM); CONTENTS:=QM; 00100100
END; 00100200
PROCEDURE DELETE1(UNIT,N); VALUE UNIT,N; INTEGER UNIT,N; 00100300
MEMORY(6,UNIT,QA,N,QM); 00100400
INTEGER PROCEDURE SEARCHORD(UNIT,REC,LOC,M); VALUE UNIT,M; 00100500
INTEGER UNIT,LOC,M; ARRAY REC[0]; 00100600
BEGIN LOC:=1; 00100700
MEMORY(7,UNIT,REC,LOC,M); 00100800
SEARCHORD:=M; 00100900
END; 00101000
PROCEDURE STOREORD(UNIT,REC,N); VALUE UNIT,N; INTEGER UNIT,N; 00101100
ARRAY REC[0]; 00101200
MEMORY(5,UNIT,REC,N,QM); 00101300
PROCEDURE STOREORDR(UNIT,REC,N); VALUE UNIT,N; INTEGER UNIT,N; 00101400
ARRAY REC[0]; 00101500
MEMORY(2,UNIT,REC,N,QM); 00101600
BOOLEAN PROCEDURE MAINTENANCE; 00101700
BEGIN MEMORY(9,0,QA,QN,QM); MAINTENANCE:=QN=1 00101800
END; 00101900
PROCEDURE WRAPUP; MEMORY(10,0,QA,QN,QM); 00102000
INTEGER PROCEDURE STORESEQ(UNIT,REC,N); VALUE UNIT,N; INTEGER UNIT, N; 00102100
ARRAY REC[0]; 00102200
BEGIN 00102300
MEMORY(5,UNIT,REC,QN,N); STORESEQ:=QN; 00102400
END; 00102500
PROCEDURE DELETEN(UNIT,N,M); VALUE UNIT,N,M; INTEGER UNIT,N,M; 00102600
BEGIN M:=M-N; 00102700
DO MEMORY(6,UNIT,QA,N,QM) UNTIL M:=M-1 LSS 0; 00102800
END; 00102900
INTEGER PROCEDURE NEXTUNIT; 00103000
BEGIN MEMORY(1,0,QA,QN,1); NEXTUNIT:=QN 00103100
END; 00103200
INTEGER PROCEDURE SIZE(UNIT); VALUE UNIT; INTEGER UNIT; 00103300
BEGIN MEMORY(3,UNIT,QA,QN,QM); SIZE:=QM 00103400
END; 00103500
PROCEDURE ALLOCATE(J,FACTOR); VALUE J,FACTOR; INTEGER J; 00103600
REAL FACTOR; 00103700
BEGIN 00103800
QN:=ENTIER( ABS( (FACTOR | 100) MOD 101)); 00103900
MEMORY(12,0,QA,QN,J) 00104000
END; 00104100
PROCEDURE RELEASEUNIT(UNIT); VALUE UNIT; INTEGER UNIT; 00104200
MEMORY(13,UNIT,QA,QN,QM); 00104300
DEFINE 00104400
ALLOWQUESIZE=4#, 00104500
ACOUNT=ACCUM[0].[1:11]#, 00104600
DATADESC=[1:1]#, 00104700
SCALAR=[4:1]#, 00104800
NAMED=[3:1]#, 00104900
CHRMODE=[5:1]#, 00105000
CHECKT=5#, % NUMBER OF TIMES THRU EXECUTE BEFORE CHECK 00105100
CCIF=18:36:12#, 00105200
CDID=1:43:5#, 00105300
CSPF=30:30:18#, 00105400
CRF=24:42:6#, 00105500
CLOCF=6:30:18#, 00105600
PF=[1:17]#, 00105700
XEQMODE=1#, 00105800
FUNCMODE=2#, 00105900
CALCMODE=0#, 00106000
INPUTMODE=3#, 00106100
ERRORMODE=4#, 00106200
FUNCTION=1#, 00106300
CURRENTMODE = PSRM[0]#, 00106400
VARIABLES = PSRM[1]#, 00106500
VARSIZE = PSRM[2]#, 00106600
FUNCPOINTER = PSRM[3]#, 00106700
FUNCSEQ = PSRM[4]#, 00106800
CURLINE = PSRM[5]#, 00106900
STACKBASE = PSRM[6]#, 00107000
INCREMENT = STACKBASE#, %FUNCMODE/CALCMODE 00107100
SYMBASE = PSRM[7]#, 00107200
FUNCSIZE = SYMBASE#, %FUNCMODE/CALCMODE 00107300
USERMASK = PSRM[8]#, 00107400
SEED = PSRM[10]#, 00107500
ORIGIN = PSRM[11]#, 00107600
FUZZ = PSRM[12]#, 00107700
FSTART = 9#, %PSR[9] IS WHERE NAME OF CURRENTLY EDITED FCN GOES 00107800
PSRSIZE = 13#, 00107900
PSR = PSRM[*]#, 00108000
WF=[18:8]#, 00108100
WDSPERREC=10#, 00108200
WDSPERBLK=30#, 00108300
NAREAS=10#, 00108400
SIZEAREAS=210#, 00108500
LIBF1=[6:15]#, 00108600
LIBF2=[22:16]#, 00108700
LIBF3=[38:10]#, 00108800
LIBSPACES=1#, 00108900
IDENT=RESULT=1#, 00109000
SPECIAL=RESULT=3#, 00109100
NUMERIC=RESULT=2#, 00109200
REPLACELOC=0#, 00109300
REPLACEV=4#, 00109400
SPF=[30:18]#, 00109500
RF=[24:6]#, 00109600
DID=[1:5]#, 00109700
XRF=[12:18]#, 00109800
DDPNSW=30#, % DATA DESC PRESENT NAMED SCALAR WORD 00109900
DDNNVW=20#, %DATA DESC NON-PRES NAMED VECTOR WORD 00110000
DDNUVW=16#, %DATA DESC NONPRES..(POINTS INTO SYM TAB FOR LOCALS) 00110100
DDPUVW=24#, % DATA DESC PRESENT UNNAMED VECTOR WORD 00110200
DDNNSW=22#, % DATA DESC NON-PRES NAMED SCALAR WORD 00110300
PDC=10#, % DROG DESC CALC MODE 00110400
INTO=0#, 00110500
DDPUSW=26#, % DATA DESC PRESENT UNNAMED SCALAR WORK (MODE) 00110600
DDPUSC=27#, % DATA DESC PRESENT UNNAMED SCALAR CHR 00110700
DDPUVC=25#, % DATA DESC PRESENT UNNAMED VECTOR CHR 00110800
DDPNVC=29#, %DATA DESC PRES PERMANENT VECTOR CHAR MODE 00110900
DDPNVW=28#, %DATA DESC PRES NAMED VEC WORD (NAMED=PERMANENT) 00111000
OUTOF=1#, 00111100
NAMEDNULLV=0&7[1:45:3]#, %DLUDGE...NAMED VERSION OF NULLV 00111200
BACKP=[6:18]#, 00111300
SCALARDATA=0#, 00111400
ARRAYDATA=2#, 00111500
DATATYPE=[4:1]#, 00111600
ARRAYTYPE=[5:1]#, 00111700
CHARARRAY=1#, 00111800
NUMERICARRAY=0#, 00111900
BLOCKSIZE=30#, %#WORDS OF CONTIGUOUS DATA IN SEQUENTIAL STORE 00112000
VARTYPE=[42:6]#, 00112100
WS=WORKSPACE#, 00112200
DIMPTR=SPF#, 00112300
INPTR=BACKP#, 00112400
QUADIN=[18:3]#, 00112500
QUADINV=18:45:3#, 00112600
STATEVECTORSIZE=16#, 00112700
SUSPENDED=[5:1]#, 00112800
SUSPENDVAR=[2:1]#, 00112900
CTYPEF=3:45:3#, 00113000
CSUSVAR=2:47:1#, 00113100
CNAMED=3:47:1#, 00113200
MAXWORDSTORE=3960#, %APL PREVENTS CREATION OF ARRAYS BIGGER THAN 00113300
%3960 ELEMENTS. THIS NUMBER IS THE PRODUCT OF 00113400
%4,(NUMBER OF POINTERS TO SEQUENTIAL STORE 00113500
%BLOCKS THAT ARE STORED IN ONE WORD) 00113600
%30, (BLOCKSIZE), 00113700
%AND 33, (SIZE OF ARRAY USED TO STORE THESE 00113800
%POINTERS IN GETARRAY, MOVEARRAY, AND 00113900
%RELEASEARRAY). SUBSCRIPTS ALLOWS 8|3960 00114000
%ELEMENTS IF THEY ARE CHARACTERS. 00114100
%HOWEVER, SP WILL GET FULL BEFORE THAT SINCE 00114200
%BIGGEST SP SIZE IS CURRENTLY 3584 00114300
MAXBUFFSIZE=30#, 00114400
MAXHEADERARGS=30#, 00114500
BUFFERSIZE=BUFFSIZE#, 00114600
LINEBUFFER=LINEBUFF#, 00114700
LINEBUFF = OUTBUFF[*]#, 00114800
APPENDTOBUFFER=APPENDTOBUFF#, 00114900
FOUND=TARRAY[0]#, 00115000
EOB=TARRAY[1]#, 00115100
MANT=TARRAY[2]#, 00115200
MANTLEN=TARRAY[3]#, 00115300
FRAC=TARRAY[4]#, 00115400
FRACLEN=TARRAY[5]#, 00115500
POWER=TARRAY[6]#, 00115600
POWERLEN=TARRAY[7]#, 00115700
MANTSIGN=TARRAY[8]#, 00115800
TABSIZE = 43#, 00115900
LOGINCODES=1#, 00116000
LOGINPHRASE=2#, 00116100
LIBRARY=1#, 00116200
WORKSPACEUNIT=2#, 00116300
RTPAREN=9#, 00116400
MASTERMODE=USERMASK.[1:1]#, 00116500
EDITOG=USERMASK.[2:1]#, 00116600
POLBUG=USERMASK.[3:1]#, 00116700
FPTF=9#, % FUNCTION POINTER FIELD (STARTS AT CHR POS 9) 00116800
FSQF=11#, % FUNCTION SEQNTL FIELD 00116900
FFL=2#, % FUNCTION FIELD LENGTH (2 CHR POSITIONS) 00117000
CRETURN=3:47:1#, 00117100
RETURNVALUE=[3:1]#, 00117200
CNUMBERARGS=4:46:2#, 00117300
NUMBERARGS=[4:2]#, 00117400
RETURNVAL=1#, 00117500
NOSYNTAX=USERMASK.[4:1]#, 00117600
LINESIZE=USERMASK.[41:7]#, 00117700
DIGITS=USERMASK.[37:4]#, 00117800
SUSPENSION=USERMASK.SUSPENDED#, 00117900
SAVEDWS=USERMASK.[7:1]#, 00118000
DELTOG=USERMASK.[6:1]#, 00118100
DELCHR="$"#, %USED IN DELPRESENT (IN FUNCTIONHANDLER) 00118200
MAXMESS=27#, 00118300
USERTOP=21#, 00118400
MARGINSIZE=6#, 00118500
LFTBRACKET=SPECIAL AND ACCUM[0]=11#, 00118600
QUADV=SPECIAL AND ACCUM[0]=10#, 00118700
QUOTEV=ACCUM[0]=20#, 00118800
EXPANDV=38#, 00118900
SLASHV=6#, 00119000
GOTOV=5#, 00119100
DOTV=17#, 00119200
ROTV=37#, 00119300
RGTBRACKET=SPECIAL AND ACCUM[0]=12#, 00119400
DELV=SPECIAL AND ACCUM[0]=13#, 00119500
PLUS = SPECIAL AND ACCUM[0] = 48#, 00119600
MINUS = SPECIAL AND ACCUM[0] = 49#, 00119700
NEGATIVE = SPECIAL AND ACCUM[0] = 51#, 00119800
TIMES = SPECIAL AND ACCUM[0] = 50#, 00119900
LOGS = SPECIAL AND ACCUM[0] = 54#, 00120000
SORTUP = SPECIAL AND ACCUM[0] = 55#, 00120100
SORTDN = SPECIAL AND ACCUM[0] = 56#, 00120200
NAND = SPECIAL AND ACCUM[0] = 58#, 00120300
NOR = SPECIAL AND ACCUM[0] = 59#, 00120400
TAKE = SPECIAL AND ACCUM[0] = 60#, 00120500
DROPIT = SPECIAL AND ACCUM[0] = 61#, 00120600
LFTARROW = SPECIAL AND ACCUM[0] = 04#, 00120700
TRANS = SPECIAL AND ACCUM[0] = 05#, 00120800
SLASH = SPECIAL AND ACCUM[0] = 06#, 00120900
INTDIVIDE = SPECIAL AND ACCUM[0] = 07#, 00121000
LFTPAREN = SPECIAL AND ACCUM[0] = 08#, 00121100
RGTPAREN = SPECIAL AND ACCUM[0] = 09#, 00121200
QUOTEQUAD = SPECIAL AND ACCUM[0] = 14#, 00121300
SEMICOLON = SPECIAL AND ACCUM[0] = 15#, 00121400
COMMA = SPECIAL AND ACCUM[0] = 16#, 00121500
DOT = SPECIAL AND ACCUM[0] = 17#, 00121600
STAR = SPECIAL AND ACCUM[0] = 18#, 00121700
AT = SPECIAL AND ACCUM[0] = 19#, 00121800
QUOTE = SPECIAL AND ACCUM[0] = 20#, 00121900
BOOLAND = SPECIAL AND ACCUM[0] = 21#, 00122000
BOOLOR = SPECIAL AND ACCUM[0] = 22#, 00122100
BOOLNOT = SPECIAL AND ACCUM[0] = 23#, 00122200
LESSTHAN = SPECIAL AND ACCUM[0] = 24#, 00122300
LESSEQ = SPECIAL AND ACCUM[0] = 25#, 00122400
EQUAL = SPECIAL AND ACCUM[0] = 26#, 00122500
GRTEQ = SPECIAL AND ACCUM[0] = 27#, 00122600
GREATER = SPECIAL AND ACCUM[0] = 28#, 00122700
NOTEQ = SPECIAL AND ACCUM[0] = 29#, 00122800
CEILING = SPECIAL AND ACCUM[0] = 30#, 00122900
FLOOR = SPECIAL AND ACCUM[0] = 31#, 00123000
STICK = SPECIAL AND ACCUM[0] = 32#, 00123100
EPSILON = SPECIAL AND ACCUM[0] = 33#, 00123200
RHO = SPECIAL AND ACCUM[0] = 34#, 00123300
IOTA = SPECIAL AND ACCUM[0] = 35#, 00123400
TRACE = SPECIAL AND ACCUM[0] = 36#, 00123500
PHI = SPECIAL AND ACCUM[0] = 37#, 00123600
EXPAND = SPECIAL AND ACCUM[0] = 38#, 00123700
BASVAL = SPECIAL AND ACCUM[0] = 39#, 00123800
EXCLAMATION = SPECIAL AND ACCUM[0] = 40#, 00123900
MINUSLASH = SPECIAL AND ACCUM[0] = 41#, 00124000
QUESTION = SPECIAL AND ACCUM[0] = 42#, 00124100
OSLASH = SPECIAL AND ACCUM[0] = 43#, 00124200
TAU = SPECIAL AND ACCUM[0] = 44#, 00124300
CIRCLE = SPECIAL AND ACCUM[0] = 45#, 00124400
LOCKIT =IDENT AND ACCUM[0]="4LOCK "#, 00124500
COLON = SPECIAL AND ACCUM[0] = 47#, 00124600
QUADLFTARROW=51#, 00124700
REDUCT=52#, 00124800
ROTATE=53#, 00124900
SCANV=57#, 00125000
LINEBUFFSIZE=17#, 00125100
MAXPOLISH=100#, MESSIZE=10#, 00125200
MAXCONSTANT=30#, 00125300
MAXMEMACCESSES=3584#, %MAXSPROWS | SPRSIZE 00125400
MAXSYMBOL=30#, 00125500
MAXSPROWS=28#, 00125600
TYPEFIELD=[3:3]#, 00125700
OPTYPE=[1:2]#, 00125800
LOCFIELD=BACKP#, 00125900
ADDRFIELD=SPF#, 00126000
SYMTYPE=[3:3]#, 00126100
OPERAND=5#, 00126200
CONSTANT=2#, 00126300
OPERATOR=3#, 00126400
LOCALVAR=4#, 00126500
SYMTABSIZE=1#, 00126600
LFTPARENV=8#, 00126700
RGTPARENV=9#, 00126800
LFTBRACKETV=11#, 00126900
RGTBRACKETV=12#, 00127000
SEMICOLONV=15#, 00127100
QUAD=10#, 00127200
QQUAD=14#, 00127300
LFTARROWV=4#, 00127400
SORTUPV=55#, 00127500
SORTDNV=56#, 00127600
ALPHALABEL=1#, 00127700
NUMERICLABEL=2#, 00127800
NEXTLINE=0#, 00127900
ERRORCOND=3#, 00128000
PRESENCE=[2:1]#, 00128100
CHANGE=[1:1]#, 00128200
XEQ=1#, 00128300
CLEARCORE=2#, 00128400
WRITECORE=3#, 00128500
%%% 00128600
%%% 00128700
XEQUTE=1#, 00128800
SLICE=120#, %TIME SLICE IN 60THS OF A SECOND 00128900
ALLOC=2#, 00129000
WRITEBACK=3#, 00129100
LOOKATSTACK=5#, 00129200
00129300
LEN=[1:23]#, 00129400
NEXT=[24:24]#, 00129500
LOC=L.[30:11],L.[41:7]#, 00129600
NOC=N.[30:11],N.[41:7]#, 00129700
MOC=M.[30:11],M.[41:7]#, 00129800
SPRSIZE=128#, % SP ROW SIZE 00129900
NILADIC=0#, 00130000
MONADIC=1#, 00130100
DYADIC=2#, 00130200
TRIADIC=3#, 00130300
DEPTHERROR=1#, 00130400
DOMAINERROR=2#, 00130500
INDEXERROR=4#, 00130600
LABELERROR=5#, 00130700
LENGTHERROR=6#, 00130800
NONCEERROR=7#, 00130900
RANKERROR=8#, 00131000
SYNTAXERROR=9#, 00131100
SYSTEMERROR=10#, 00131200
VALUEERROR=11#, 00131300
SPERROR=12#, 00131400
KITEERROR=13#, 00131500
STREAMBASE=59823125#, 00131600
APLOGGED=[10:1]#, 00131700
APLHEADING=[11:1]#, 00131800
CSTATION = STATION#, 00131900
CAPLOGGED=10:47:1#, 00132000
CAPHEADING=11:47:1#, 00132100
APLCODE = STATIONPARAMS#, 00132200
00132300
00132400
SPECMODE = BOUNDARY.[1:3]#, 00132500
DISPLAYING=1#, 00132600
EDITING=2#, 00132700
DELETING=3#, 00132800
RESEQUENCING=4#, 00132900
LOWER = BOUNDARY.[4:22]#, 00133000
UPPER = BOUNDARY.[26:22]#, 00133100
OLDBUFFER = OLDINPBUFFER[*]#, 00133200
00133300
ENDEFINES=#; 00133400
REAL ADDRESS, ABSOLUTEADDRESS, 00133500
LADDRESS; 00133600
BOOLEAN LINETOG; %GO TO NEXT LINE IF TRUE WHEN WRITING OUT 00133700
INTEGER BUFFSIZE,ITEMCOUNT,RESULT, 00133800
LOGINSIZE, 00133900
%%% 00134000
ERR, 00134100
NROWS, 00134200
%%% 00134300
CUSER; 00134400
LABEL ENDOFJOB,TRYAGAIN; 00134500
REAL GT1,GT2,GT3; 00134600
DEFINE LINE=PRINT#; 00134700
SAVE ARRAY BUFFER[0:MAXBUFFSIZE]; 00134800
ARRAY TARRAY[0:8], 00134900
COMMENT PROGRAM STATE REGISTER; 00135000
PSRM[0:PSRSIZE], 00135100
OLDINPBUFFER[0:MAXBUFFSIZE], 00135200
SP[0:27, 0:SPRSIZE-1], 00135300
IDTABLE[0:TABSIZE], 00135400
MESSTAB[0:MAXMESS], 00135500
JIGGLE[0:0], 00135600
SCR[0:2], 00135700
CORRESPONDENCE[0:7], 00135800
ACCUM[0:MAXBUFFSIZE]; 00135900
DEFINE OUTBUFFSIZE=29#,CLOGGED=7:47:1#,STU=15:9:9#; 00136000
ARRAY OUTBUFF[0:OUTBUFFSIZE]; 00136100
ALPHA STATION, JOBNUM, STATIONPARAMS, BOUNDARY; 00136200
INTEGER CHRCOUNT, WORKSPACE; 00136300
00136400
STREAM PROCEDURE INITBUFF(B,BUFFSIZE); VALUE BUFFSIZE; 00136500
BEGIN 00136600
DI~B; BUFFSIZE(DS~8LIT" "); DS~LIT"~"; 00136700
END; 00136800
STREAM PROCEDURE TRANSFER(A,AS,B,BS,L); VALUE AS,BS,L; 00136900
BEGIN LOCAL T,U,V; 00137000
SI:=LOC AS; DI:=LOC T; DI:=DI+1; DS:=7CHR; 00137100
SI:=LOC BS; DI:=LOC U; DI:=DI+1; DS:=7CHR; 00137200
SI:=LOC L; DI:=LOC V; DI:=DI+1; DS:=7CHR; 00137300
SI:=A; T(2(SI:=SI+32)); SI:=SI+AS; 00137400
DI:=B; U(2(DI:=DI+32)); DI:=DI+BS; 00137500
V(2(DS:=32CHR)); DS:=L CHR; 00137600
END; 00137700
REAL PROCEDURE NUMBER; FORWARD; %LINE 111500 00137800
BOOLEAN PROCEDURE SCAN; 00137900
BEGIN 00138000
REAL STREAM PROCEDURE GNC(ADDR,ACC); VALUE ADDR; 00138100
BEGIN SI:=ADDR; DI:=ACC; DI:=DI+7; DS:=CHR; GNC:=SI; 00138200
DI:=ACC; SKIP DB; DS:=SET; END OF GNC; 00138300
REAL STREAM PROCEDURE RESWD(TAB,BUF,ADDR,EOB,FOUND,K); 00138400
VALUE ADDR,K; 00138500
BEGIN 00138600
LOCAL T,TSI,TDI; 00138700
LABEL TRY,L,KEEPGOING,FINIS,RESTORE; 00138800
LABEL NUMBERFOUND; 00138900
DI:=EOB; DS:=8LIT"0"; DI:=FOUND; DS:=8LIT"0"; 00139000
SI:=ADDR; 00139100
L: IF SC NEQ " " THEN GO TO KEEPGOING; 00139200
SI:=SI+1; 00139300
GO TO L; 00139400
KEEPGOING: 00139500
RESWD:=SI; 00139600
ADDR:=SI; 00139700
IF SC GEQ "0" THEN IF SC LEQ "9" THEN GO TO NUMBERFOUND; 00139800
IF SC="#" THEN GO TO NUMBERFOUND; 00139900
IF SC="@" THEN GO TO NUMBERFOUND; 00140000
IF SC="." THEN 00140100
BEGIN SI:=SI+1; 00140200
IF SC GEQ "0" THEN IF SC LEQ "9" THEN 00140300
GO TO NUMBERFOUND; SI:=SI-1; 00140400
END; 00140500
DI:=LOC T; DS:=2RESET; DS:=2SET; DS:=2RESET; 00140600
DI:=LOC T; 00140700
IF SC=DC THEN 00140800
BEGIN DI:=EOB; DI:=DI+7; DS:=LIT"1"; 00140900
GO TO FINIS 00141000
END; 00141100
SI:=TAB; TSI:=SI; 00141200
TRY: 00141300
IF SC="0" THEN 00141400
BEGIN SI:=ADDR; 00141500
IF SC=ALPHA THEN 00141600
IF SC GEQ"0" THEN 00141700
IF SC LEQ "9" THEN 00141800
NUMBERFOUND: 00141900
TALLY:=2 ELSE TALLY := 0 00142000
ELSE TALLY:=1 00142100
ELSE TALLY:=3; 00142200
T:=TALLY; SI:=LOC T; SI:=SI+7; DI:=FOUND; DI:=DI+7; 00142300
DS:=CHR; GO FINIS; 00142400
END; 00142500
DI:=LOC T; DI:=DI+7; DS:=CHR; 00142600
DI:=ADDR; 00142700
IF T SC=DC THEN 00142800
BEGIN 00142900
TSI:=SI; TDI:=DI; SI:=SI-1; 00143000
IF SC=ALPHA THEN 00143100
BEGIN DI:=DI+16; SI:=TDI; 00143200
IF SC NEQ " " THEN IF SC =ALPHA THEN ; 00143300
END; 00143400
SI:=TSI; 00143500
END ELSE GO TO RESTORE; 00143600
IF TOGGLE THEN 00143700
RESTORE: 00143800
BEGIN SI:=SI+K; DI:=ADDR; GO TO TRY 00143900
END; 00144000
DI:=FOUND; DS:=K OCT; 00144100
DI:=TDI; RESWD:=DI; 00144200
FINIS: 00144300
END; 00144400
REAL STREAM PROCEDURE ACCUMULATE(ACC,EOB,ADDR); VALUE ADDR; 00144500
BEGIN LOCAL T; LABEL EOBL,E,ON,L; 00144600
DI:=ACC; 9(DS:=8LIT" "); 00144700
DI:=EOB; DS:=8LIT"0"; SI:=ADDR; DI:=LOC T; SKIP 2 DB; 00144800
DS:=2SET; DI:=LOC T; 00144900
63(IF SC=ALPHA THEN TALLY:=TALLY+1 ELSE JUMP OUT TO E; 00145000
SI:=SI+1); 00145100
L: IF SC=ALPHA THEN BEGIN SI:=SI+1; GO L END ELSE GO ON; 00145200
IF SC=" " THEN GO ON; 00145300
E: IF SC = DC THEN ; 00145400
SI:=SI-1; IF TOGGLE THEN GO TO EOBL ELSE GO ON; 00145500
EOBL: DI:=EOB; DI:=DI+7; DS:=LIT"1"; 00145600
ON: ACCUMULATE:=SI; DI:=ACC; T:=TALLY; SI:=LOC T; SI:=SI+6; 00145700
DS:=2CHR; SI:=ADDR; DS:=T CHR; 00145800
END OF ACCUMULATE; 00145900
BOOLEAN STREAM PROCEDURE ARROW(ADDR,I); VALUE ADDR,I; 00146000
BEGIN SI:=ADDR; SI:=SI-1; DI:=LOC I; DI:=DI+7; 00146100
IF SC=DC THEN TALLY:=1; ARROW :=TALLY 00146200
END OF ARROW; 00146300
IF NOT BOOLEAN(EOB) THEN BEGIN 00146400
LADDRESS:=ADDRESS; 00146500
ADDRESS:=RESWD(IDTABLE,BUFFER,ADDRESS,EOB,FOUND,2); 00146600
IF RESULT:=FOUND NEQ 0 THEN BEGIN 00146700
IF RESULT=1 THEN ADDRESS:=ACCUMULATE(ACCUM,EOB,ADDRESS) 00146800
ELSE IF RESULT=2 THEN ACCUM[0]:=NUMBER 00146900
ELSE IF RESULT=3 THEN ADDRESS:=GNC(ADDRESS,ACCUM) 00147000
ELSE BEGIN ACCUM[0]:=RESULT; RESULT:=3 END; 00147100
ITEMCOUNT:=ITEMCOUNT+1; 00147200
SCAN:=TRUE; 00147300
IF ARROW(ADDRESS,31) THEN 00147400
BEGIN EOB:=1; SCAN:=FALSE END; 00147500
END ELSE EOB:=1; 00147600
END; 00147700
END OF THE SCAN PROCEDURE; 00147800
PROCEDURE FORMROW(CC,BL,A,S,N); VALUE CC,BL,S,N; 00147900
INTEGER CC,BL,S,N; ARRAY A[0]; FORWARD 00148000
; 00148100
PROCEDURE INDENT(R); VALUE R; REAL R; FORWARD; 00148200
PROCEDURE TERPRINT; FORWARD; 00148300
PROCEDURE PROCESS(MODE);VALUE MODE;INTEGER MODE; FORWARD; 00148400
REAL STREAM PROCEDURE ABSADDR(A); 00148500
BEGIN SI:=A; ABSADDR:=SI 00148600
END; 00148700
BOOLEAN PROCEDURE LIBRARIAN(MFID,FID); VALUE MFID,FID; 00148800
REAL MFID,FID; 00148900
BEGIN 00149000
REAL ARRAY A[0:6]; FILE DF DISK(1,1); 00149100
REAL T; 00149200
COMMENT LIBRARIAN IS TRUE IF MFID/FID IS PRESENT ON DISK; 00149300
FILL DF WITH MFID,FID; 00149400
SEARCH(DF,A[*]); 00149500
LIBRARIAN:= 00149600
A[0]!-1; 00149700
END; 00149800
FILE SPO 11(1,3); 00149900
PROCEDURE SPOUT(K); VALUE K; INTEGER K; 00150000
BEGIN FORMAT ERRF("APL ERROR:",I8,A1); 00150100
WRITE(SPO,ERRF,K,31); 00150200
END; 00150300
PROCEDURE INITIALIZETABLE; 00150400
BEGIN DEFINE STARTSEGMENT= #; 00150500
INTEGER I; 00150600
LADDRESS:= 00150700
ABSOLUTEADDRESS:=ABSADDR(BUFFER); 00150800
BIGGEST := REAL(NOT FALSE) & 0[1:46:2]; 00150900
NULLV := 0 & 3[1:46:2]; 00151000
STATUSWORD~REAL(BOOLEAN(STATUSWORD) OR BOOLEAN(1)); 00151100
JOBNUM~TIME(-1); 00151200
STATION~0&1[CLOGGED]&STATUSWORD[STU]; 00151300
FILL JIGGLE[*] WITH OCT5757575757575737;%CARRIAGE RETURNS LEFT ARROW00151400
FILL IDTABLE[*] WITH 00151500
"1+481-49", "1&501%07", "1.171@19", "1#411(08", 00151600
"1)091/06", "3XEQ623L", "OG541;15", OCT0333777601040177, 00151700
%CAST IN ABOVE LINE IS REALLY 3["]141" 00151800
"202:=042", "[]101[11", "1]123AND", "212OR223", 00151900
"NOT233LS", "S243LEQ2", "53GEQ273", "GTR283NE", "Q292=:05", 00152000
"2GO051=2", "63MAX304", "CEIL303F", "LR313MIN", 00152100
"314RESD3","23ABS323","RHO341*1","84IOTA35", 00152200
"1|384RND", "M425TRAN", "S431$133", "PHI374FA", 00152300
"CT404COM", "B406CIRC", "LE456SOR", "TUP556SO", 00152400
"RTDN561:", "474NAND5", "83NOR594", "TAKE604D", 00152500
"ROP613RE", "P446BASV", "AL393EPS", "331,1600"; 00152600
COMMENT IDTABLE IS TABLE OF RESERVED WORDS AND SPECIAL SYMBOLS. 00152700
FORMAT IS NUMBER OF CHARACTERS IN SYMBOL, FOLLOWED BY SYMBOL 00152800
ITSELF, FOLLOWED BY A TWO-DIGIT DECIMAL CODE WHICH APL USES 00152900
FOR THE RESERVED WORD--LIKE IN THE EXECUTION CASE STATEMENT AND 00153000
IN SYNTAX CHECKING. FOR SCAN TO WORK, THE TWO-DIGIT CODE MUST 00153100
BE GREATER THAN 3 AND IDTABLE MUST HAVE AT LEAST ONE "0" AT THE 00153200
END TO MARK THE END. TABSIZE IS THE DEFINE (LINE 30000) GIVING 00153300
THE SIZE OF TDTABLE; 00153400
IF STACKSIZE=0 THEN STACKSIZE:=100 ELSE 00153500
IF STACKSIZE GTR 1022 THEN STACKSIZE:=1022; 00153600
BUFFSIZE:=MAXBUFFSIZE; 00153700
LINETOG := TRUE; %USUALLY GO TO NEXT LINE WHEN WRITING OUT 00153800
00153900
INITBUFF(OUTBUFF, 10); 00154000
INITBUFF(BUFFER,BUFFSIZE); 00154100
NROWS:=-1; 00154200
NAME(LIBJOB,TIME(-1)); 00154300
FILL MESSTAB[*] WITH 00154400
"4SAVE ", 00154500
"4LOAD ", 00154600
"5CLEAR ", 00154700
"4COPY ", 00154800
"4VARS ", 00154900
"3FNS ", 00155000
"6LOGGED", 00155100
"3MSG ", 00155200
"5WIDTH ", 00155300
"3OPR ", 00155400
"6DIGITS", 00155500
"3OFF ", 00155600
"6ORIGIN", 00155700
"4SEED ", 00155800
"4FUZZ ", 00155900
"3SYN ", 00156000
"5NOSYN ", 00156100
"5STORE ", 00156200
"5ABORT ", 00156300
"2SI ", 00156400
"3SIV ", 00156500
"5ERASE ", 00156600
%--------------MASTERMODE BELOW HERE...(SEE USERTOP)-------- 00156700
"6ASSIGN", 00156800
"6DELETE", 00156900
"4LIST ", 00157000
"5DEBUG ", 00157100
"5FILES "; 00157200
00157300
IF LIBSIZE=-1 THEN 00157400
BEGIN LIBSIZE~1;GTA[0]~" ";STOREORD(LIBRARY,GTA,0);WRAPUP; 00157500
END ELSE BEGIN LIBSIZE~SIZE(LIBRARY); 00157600
FOR I~1 STEP 1 UNTIL LIBSIZE-1 DO 00157700
BEGIN GT1~CONTENTS(LIBRARY,I,ACCUM); 00157800
IF NOT LIBRARIAN(ACCUM[0],TIME(-1)) THEN 00157900
BEGIN DELETE1(LIBRARY,I);LIBSIZE~LIBSIZE-1;END; 00158000
IF (LOGINSIZE:=SIZE(LOGINCODES)=0) THEN 00158100
END; 00158200
END; 00158300
FILL CORRESPONDENCE[*] WITH 00158400
OCT1111111111110311, 00158500
OCT1111111111111111, 00158600
OCT1104111121221113, 00158700
OCT2014151617100706, 00158800
OCT1111111111111112, 00158900
OCT1111111111111100, 00159000
OCT0201111111251111, 00159100
OCT2324111111111111; 00159200
COMMENT CORRESPONDENCE GIVES THE CORRESPONDENCE BETWEEN THE 00159300
APL CODES FOR DYADIC SCALAR OPERATORS (EXCEPT CIRCLE) AND 00159400
THEIR POSITIONS IN THE "CASE STATEMENT" IN "OPERATION". 00159500
E.G. APL CODE 7 IS "OPERATION" CODE 3 IN OCTAL (FOR DIVIDE). 00159600
IF N-TH CHARACTER IN CORRESPONDECE IS OCTAL 11, THEN N 00159700
IS NOT AN APL CODE FOR A DYADIC SCALAR OPERATOR. CHARACTER 00159800
COUNT STARTS AT 1 FOR FIRST CHARACTER. TO MAKE IT COME OUT 00159900
RIGHT, STREAM PROCEDURE GETOP IS ACTUALLY CALLED WITH APL 00160000
OPERATION CODE MINUS 1; 00160100
END; 00160200
REAL STREAM PROCEDURE CONV(ADDR,N); 00160300
VALUE N,ADDR; 00160400
BEGIN SI:=ADDR; 00160500
DI:=LOC CONV; 00160600
DS:=N OCT; END; 00160700
REAL STREAM PROCEDURE BUMP(ADDR,N); VALUE ADDR,N; 00160800
BEGIN SI:=ADDR; SI:=SI+N; BUMP:=SI; END; 00160900
REAL PROCEDURE NUMBER; 00161000
BEGIN REAL NCHR; 00161100
LABEL GETFRAC,GETPOWER,QUIT,KITE; 00161200
MONITOR EXPOVR; 00161300
REAL PROCEDURE INTCON(COUNT); VALUE COUNT; 00161400
REAL COUNT; 00161500
BEGIN REAL TLO,THI,T; INTEGER N; 00161600
BOOLEAN DPTOG; DEFINE ADDR=ADDRESS#; 00161700
COMMENT: VALUE OF INTCON IS THE CONVERSION OF AN INTEGER 00161800
CONSISTING OF COUNT NUMERICAL CHARACTERS STARTING 00161900
AT THE CHARACTER ADDRESS. ADDRESS IS SET TO POINT 00162000
TO THE NEXT CHARACTER DURING INTCON; 00162100
DPTOG:=COUNT GTR 8; 00162200
THI:=T:=CONV(ADDR,N:=COUNT MOD 8); 00162300
ADDR:=BUMP(ADDR,N); 00162400
COUNT:=COUNT DIV 8; 00162500
FOR N:=1 STEP 1 UNTIL COUNT DO BEGIN 00162600
IF DPTOG THEN BEGIN 00162700
DOUBLE(THI,TLO,100000000.0,0,|,CONV(ADDR,8), 00162800
0,+,:=,THI,TLO); 00162900
T:=THI 00163000
END ELSE T:=T|100000000 + CONV(ADDR,8); 00163100
ADDR:=BUMP(ADDR,8); END; 00163200
INTCON:=T; 00163300
END OF INTCON; 00163400
INTEGER STREAM PROCEDURE SUBSCAN(ADDR,NEXT); VALUE ADDR; 00163500
BEGIN SI:=ADDR; 00163600
63(IF SC GEQ "0" THEN 00163700
IF SC LEQ "9" THEN BEGIN SI:=SI+1; TALLY:=TALLY+1; 00163800
END ELSE JUMP OUT); 00163900
DI:=NEXT; DI:=DI+7; DS:=1 CHR; SUBSCAN:=TALLY; 00164000
END; 00164100
COMMENT--VALUE OF SUBSCAN IS NUMBER OF NUMERIC CHARACTERS 00164200
FOUND. NEXT CONTAINS THE FIRST NON-NUMERIC CHARACTER; 00164300
EXPOVR:=KITE; 00164400
MANTSIGN:=1; 00164500
MANT:=MANTLEN:=POWER:=POWERLEN:=FRAC:=FRACLEN:=0; 00164600
MANTLEN:=SUBSCAN(ADDRESS,NCHR); 00164700
IF MANTLEN=0 AND NCHR="#" THEN BEGIN 00164800
MANTSIGN:=-1; 00164900
ADDRESS:=BUMP(ADDRESS,1); 00165000
MANTLEN:=SUBSCAN(ADDRESS,NCHR); END; 00165100
IF MANTLEN=0 THEN BEGIN ADDRESS:=BUMP(ADDRESS,1); 00165200
IF NCHR="." THEN GO TO GETFRAC 00165300
ELSE IF NCHR="@" OR NCHR="E" THEN GO TO GETPOWER 00165400
ELSE BEGIN ERR:=SYNTAXERROR; 00165500
GO TO QUIT; END; END; 00165600
MANT:=INTCON(MANTLEN); 00165700
IF NCHR="." THEN BEGIN ADDRESS:=BUMP(ADDRESS,1); GO GETFRAC END; 00165800
IF NCHR="@" OR NCHR="E" THEN BEGIN 00165900
ADDRESS:=BUMP(ADDRESS,1); GO TO GETPOWER END; 00166000
IF NCHR=12 THEN EOB:=1; 00166100
GO TO QUIT; 00166200
GETFRAC: FRACLEN:=SUBSCAN(ADDRESS,NCHR); 00166300
IF FRACLEN=0 THEN BEGIN ERR:=SYNTAXERROR; GO TO QUIT; END; 00166400
FRAC:=INTCON(FRACLEN); 00166500
IF NCHR="@" OR NCHR="E" THEN BEGIN 00166600
ADDRESS:=BUMP(ADDRESS,1); GO TO GETPOWER; END; 00166700
IF NCHR=12 THEN EOB:=1 ELSE 00166800
IF NCHR="." OR NCHR="#" THEN ERR:=SYNTAXERROR; 00166900
GO TO QUIT; 00167000
GETPOWER: 00167100
POWERLEN:=SUBSCAN(ADDRESS,NCHR); 00167200
IF POWERLEN=0 THEN BEGIN 00167300
IF NCHR="-" OR NCHR="#" THEN POWER:=-1 00167400
ELSE IF NCHR="+" THEN POWER:=1 00167500
ELSE BEGIN ERR:=SYNTAXERROR; GO TO QUIT; END; 00167600
POWERLEN:=SUBSCAN(ADDRESS:=BUMP(ADDRESS,1), NCHR); 00167700
END ELSE POWER:=1; 00167800
IF POWERLEN=0 THEN ERR:=SYNTAXERROR 00167900
ELSE BEGIN 00168000
POWER:=INTCON(POWERLEN)|POWER; 00168100
IF NCHR="#" OR NCHR="@" OR NCHR="." 00168200
THEN ERR:=SYNTAXERROR; END; 00168300
GO TO QUIT; 00168400
KITE: ERR:=KITEERROR; 00168500
QUIT: IF ERR=0 THEN 00168600
NUMBER:=IF MANTLEN+FRACLEN=0 THEN 00168700
IF POWERLEN=0 THEN 0 00168800
ELSE MANTSIGN|10*ENTIER(POWER) 00168900
ELSE MANTSIGN|(MANT|10*ENTIER(POWER) 00169000
+ FRAC|10*ENTIER(POWER-FRACLEN)) ELSE EOB:=1; 00169100
END OF NUMBER; 00169200
STREAM PROCEDURE APPENDTOBUFF(BUF,NBUF,NBLANK,A,SA,NA); 00169300
VALUE NBUF,NBLANK,SA,NA; 00169400
BEGIN LOCAL T; 00169500
LOCAL TSI,TDI; 00169600
SI:=LOC NBUF; DI:=LOC T; DI:=DI+1; DS:=7CHR; 00169700
DI:=BUF; T(2(DI:=DI+32)); DI:=DI+NBUF; 00169800
NBLANK(DS:=LIT" "); TDI:=DI; 00169900
SI:=LOC SA; DI:=LOC T; DI:=DI+1; DS:=7CHR; 00170000
SI:=A; T(2(SI:=SI+32)); SI:=SI+SA; 00170100
TSI:=SI; SI:=LOC NA; DI:=LOC T; DI:=DI+1; DS:=7CHR; 00170200
SI:=TSI; DI:=TDI; T(2(DS:=32CHR)); DS:=NA CHR 00170300
END; 00170400
PROCEDURE TERPRINT; 00170500
BEGIN LABEL BK; 00170600
STREAM PROCEDURE FINISHBUFF(BUF,N,TER);VALUE N,TER; 00170700
BEGIN LOCAL T; 00170800
SI:=LOC TER;SI:=SI+7;IF SC="1" THEN; 00170900
SI:=LOC N; DI:=LOC T; DI:=DI+1; DS:=7 CHR; 00171000
DI:=BUF; T(2(DI:=DI+32));DI:=DI+N; 00171100
IF TOGGLE THEN DS:=2 LIT"{!"; %CARRIAGE RETURN/LINE FEED 00171200
DS:=RESET;DS:=5 SET; %END OF MESSAGE LEFT ARROW 00171300
END OF FINISHBUFF; 00171400
IF CHRCOUNT NEQ 0 THEN BEGIN 00171500
FINISHBUFF(OUTBUFF,CHRCOUNT,LINETOG); 00171600
CHRCOUNT:=0; 00171700
IF LINETOG THEN 00171800
WRITE(TWXOUT,9,OUTBUFF[*])[BK:BK] ELSE 00171900
WRITE(TWXOUT[STOP],9,OUTBUFF[*])[BK:BK]; 00172000
INITBUFF(OUTBUFF, 10); 00172100
END; 00172200
IF FALSE THEN 00172300
BK: IF CURRENTMODE=XEQMODE THEN BREAKFLAG:=TRUE; 00172400
END OF TERPRINT; 00172500
PROCEDURE FORMWD(CC,WD); VALUE CC,WD; REAL WD; INTEGER CC; 00172600
BEGIN 00172700
INTEGER I,K,L; 00172800
COMMENT CC=-1 STAY ON LINE, OUTPUT, DON"T GO TO NEXT LINE 00172900
COMMENT CC=0 STAY ON THIS LINE, MORE TO COME. 00173000
CC=1 STAY ON THIS LINE BUT TERMINATE PRINT. 00173100
CC=2 SKIP TO NEXT LINE - MORE TO COME. 00173200
CC=3 SKIP TO NEXT LINE - TERMINATE PRINT.; 00173300
REAL STREAM PROCEDURE OCTAL(I); VALUE I; 00173400
BEGIN SI:=LOC I; DI:=LOC OCTAL; DS:=8OCT 00173500
END; 00173600
IF L:=LINESIZE LEQ 9 OR L GTR 72 THEN L:=72; K:=2; 00173700
IF CC GTR 1 AND CHRCOUNT GTR 0THEN TERPRINT; 00173800
IF CHRCOUNT+(I:=OCTAL(WD.[1:11])) GTR L THEN 00173900
00174000
BEGIN APPENDTOBUFF(LINEBUFFER,CHRCOUNT, 00174100
0,WD,2,K:=L-CHRCOUNT); 00174200
CHRCOUNT:=L; TERPRINT; 00174300
00174400
I:=I-K; 00174500
00174600
END; 00174700
APPENDTOBUFF(LINEBUFFER,CHRCOUNT,0,WD,K,I); 00174800
00174900
CHRCOUNT:=CHRCOUNT+I; 00175000
IF BOOLEAN(CC) THEN 00175100
IF CC=-1 THEN BEGIN LINETOG:=FALSE; 00175200
TERPRINT; LINETOG:=TRUE 00175300
END ELSE TERPRINT; 00175400
END; 00175500
BOOLEAN PROCEDURE FUNCTIONHEADER(SPECS,HADDR); 00175600
ARRAY SPECS[0]; REAL HADDR; FORWARD; 00175700
00175800
00175900
00176000
REAL PROCEDURE LINENUMBER(R); VALUE R; REAL R; 00176100
COMMENT STARTS ON 8030000; 00176200
FORWARD; 00176300
00176400
PROCEDURE INDENT(R); VALUE R; REAL R; 00176500
BEGIN 00176600
INTEGER STREAM PROCEDURE FORM(A,I,K);VALUE K,I; 00176700
BEGIN 00176800
LOCAL T1,T2; 00176900
LABEL SHORT,L,M,FINIS; 00177000
TALLY:=K; FORM:=TALLY; 00177100
SI:=LOC I; DI:=LOC T1; IF 8SC=DC THEN 00177200
BEGIN DI:=A; K(DS:=LIT" "); GO FINIS 00177300
END; 00177400
SI:=LOC I; DI:=A; TALLY:=3; DS:=LIT"["; 00177500
IF SC GTR "0" THEN IF SC LSS "0" THEN ; 00177600
3(TALLY:=TALLY+1; IF TOGGLE THEN DS:=CHR ELSE 00177700
IF SC NEQ "0" THEN DS:=CHR ELSE 00177800
BEGIN TALLY:=TALLY+63; SI:=SI+1 00177900
END ); 00178000
DS:=CHR; T1:=TALLY; TALLY:=4; SI:=SI+3; 00178100
4(IF SC NEQ "0" THEN JUMP OUT TO M; 00178200
TALLY:=TALLY+63; SI:=SI-1); GO TO L; 00178300
M: 00178400
T2:=TALLY; SI:=LOC I; SI:=SI+4; DS:=LIT"."; DS:=T2 CHR; 00178500
TALLY:=T1; TALLY:=TALLY+T2; TALLY:=TALLY+1; T1:=TALLY; 00178600
L: 00178700
DS:=LIT"]"; TALLY:=K; 00178800
T1(TALLY:=TALLY+63; T2:=TALLY; SI:=LOC T2; SI:=SI+7; 00178900
IF SC="0" THEN JUMP OUT TO SHORT); 00179000
T2(DS:=LIT" "); GO FINIS; 00179100
SHORT: 00179200
TALLY:=T1; TALLY:=TALLY+1; FORM:=TALLY; DS:=LIT" "; 00179300
FINIS: 00179400
DS:=RESET; DS:=5SET; 00179500
END; 00179600
IF R LSS 0 THEN R:=LINENUMBER(-R) ELSE R:=ABS(R); % -0 00179700
CHRCOUNT:=FORM(LINEBUFF,R,MARGINSIZE)+1 00179800
00179900
END; 00180000
INTEGER PROCEDURE HEADER(ADDR1,ADDR2,BUF); VALUE ADDR1,ADDR2; 00180100
INTEGER ADDR1, ADDR2; ARRAY BUF[0]; 00180200
BEGIN 00180300
INTEGER STREAM PROCEDURE HEADRR(ADDR1,ADDR2,BUF); VALUE ADDR1, 00180400
ADDR2; 00180500
BEGIN 00180600
LOCAL C,T,TDI; 00180700
LOCAL QM,AR; 00180800
LABEL L,ENDSCAN,M,N; 00180900
DI:=LOC QM; DS:=2RESET; DS:=2SET; 00181000
DI:=LOC AR; DS:=RESET; DS:=5SET; 00181100
DI:=BUF; 00181200
SI:=ADDR1; 00181300
L: T:=SI; TDI:=DI; 00181400
DI:=LOC QM; IF SC=DC THEN GO TO ENDSCAN; 00181500
DI:=LOC AR; SI:=SI-1; IF SC=DC THEN GO TO ENDSCAN; 00181600
SI:=LOC T; DI:=LOC ADDR2; 00181700
IF 8SC=DC THEN COMMENT END OF SCAN; 00181800
GO TO ENDSCAN; 00181900
SI:=T; DI:=TDI; DS:=CHR; 00182000
GO TO L; 00182100
ENDSCAN: 00182200
SI:=TDI; 00182300
M: SI:=SI-1; 00182400
IF SC=" " THEN GO TO M; 00182500
SI:=SI+1; 00182600
ADDR2:=SI; 00182700
SI:=BUF; 00182800
N: T:=SI; DI:=LOC ADDR2; 00182900
SI:=LOC T; 00183000
IF 8SC NEQ DC THEN 00183100
BEGIN 00183200
TALLY:=TALLY+1; TDI:=TALLY; 00183300
SI:=LOC TDI; SI:=SI+7; 00183400
IF SC="0" THEN 00183500
BEGIN TALLY:=C; TALLY:=TALLY+1; C:=TALLY; 00183600
TALLY:=0; 00183700
END; 00183800
SI:=T; SI:=SI+1; GO TO N; 00183900
END; 00184000
HEADRR:=TALLY; SI:=LOC C; DI:=LOC HEADRR; SI:=SI+1; DS:=6 CHR; 00184100
END; 00184200
HEADER:=HEADRR(ADDR1,ADDR2,BUF); 00184300
END OF PHONY HEADER; 00184400
PROCEDURE STARTSCAN; 00184500
BEGIN 00184600
00184700
00184800
00184900
LADDRESS:= 00185000
ADDRESS:=ABSOLUTEADDRESS; 00185100
BEGIN TERPRINT; 00185200
END; 00185300
READ(TWXIN[STOP],29,BUFFER[*]); 00185400
BUFFER[30]:=0&31[1:43:5]; 00185500
ITEMCOUNT:=0; 00185600
EOB:=0 00185700
END; 00185800
PROCEDURE FORMROW(CC,BL,A,S,N); VALUE CC,BL,S,N; INTEGER CC,BL, 00185900
S,N; ARRAY A[0]; 00186000
COMMENT: CC--SAME CODE AS IN FORMWD, LINE 253000 00186100
BL--#BLANKS TO PUT IN FRONT OF IT 00186200
A--ARRAY WHERE THE STUFF TO PUT ON LINE IS STORED 00186300
S--#CHARACTERS TO SKIP AT START OF A 00186400
N--#CHARACTERS TO TAKE FROM A TO PUT ON OUTPUT LINE; 00186500
BEGIN INTEGER K; 00186600
INTEGER T; 00186700
IF CC GTR 1 AND CHRCOUNT GTR 0 THEN TERPRINT; 00186800
IF K:=LINESIZE LEQ 9 OR K GTR 72 THEN K:=72; 00186900
WHILE CHRCOUNT+N+BL GTR K DO 00187000
BEGIN 00187100
APPENDTOBUFFER(LINEBUFFER,CHRCOUNT,BL,A,S,T:=K-CHRCOUNT-BL); 00187200
CHRCOUNT:=K; TERPRINT; 00187300
S:=S+T; N:=N-T; 00187400
BL:=0; 00187500
END; 00187600
APPENDTOBUFFER(LINEBUFFER,CHRCOUNT,BL,A,S,N); 00187700
00187800
CHRCOUNT:=CHRCOUNT+N+BL; 00187900
IF BOOLEAN(CC) THEN 00188000
IF CC=-1 THEN BEGIN LINETOG:=FALSE; 00188100
TERPRINT; LINETOG:=TRUE; 00188200
END ELSE TERPRINT; 00188300
END; 00188400
PROCEDURE NUMBERCON(R,A); VALUE R; REAL R; ARRAY A[0]; 00188500
BEGIN FORMAT F(F24.*), G(E24.*); 00188600
REAL S; DEFINE MAXIM = 10@9#; 00188700
00188800
STREAM PROCEDURE ADJUST(A,B); 00188900
BEGIN LOCAL T,FRAC,MANT,T1,TSI,TDI; 00189000
DI:=LOC T; DI:=DI+1; T1:=DI; 00189100
SI:=B; DI:=A; DI:=DI+2; 00189200
24(IF SC=" " THEN SI:=SI+1 ELSE 00189300
BEGIN TSI:=SI; SI:=LOC T; 00189400
IF SC="1" THEN; SI:=TSI; 00189500
IF TOGGLE THEN 00189600
IF SC NEQ "0" THEN 00189700
IF SC="@" THEN BEGIN 00189800
TSI:=SI; DI:=T1; DS:=LIT"1"; JUMP OUT; 00189900
END ELSE FRAC:=TALLY 00190000
ELSE TALLY := TALLY+0 00190100
ELSE 00190200
IF SC="." THEN 00190300
BEGIN MANT:=TALLY; TDI:=DI; DI:=LOC T; DS:= 00190400
LIT"1"; TALLY:=0;DI:=TDI; 00190500
END; 00190600
TALLY:=TALLY+1; DS:=CHR 00190700
END); 00190800
SI:=LOC MANT; SI:=SI+7; IF SC="0" THEN MANT:=TALLY; 00190900
00191000
TALLY:=MANT; SI:=LOC FRAC; SI:=SI+7; IF SC GTR "0" 00191100
THEN TALLY:=TALLY+1; TALLY:=TALLY+FRAC; MANT:=TALLY; 00191200
SI:=T1; IF SC="1" THEN BEGIN 00191300
DI:=A; DI:=DI+MANT; DI:=DI+2; 00191400
SI:=TSI; DS:=4CHR; 00191500
TALLY:=TALLY+4; MANT:=TALLY; END; 00191600
SI:=LOC MANT; SI:=SI+6; DI:=A; DS:=2CHR; 00191700
END; 00191800
IF S:=ABS(R) GEQ MAXIM OR S LEQ 10*(-DIGITS) AND S NEQ 0 THEN 00191900
WRITE(SCR[*],G,DIGITS,R) ELSE 00192000
WRITE(SCR[*],F,DIGITS,R); 00192100
ADJUST(A,SCR) 00192200
END; 00192300
PROCEDURE STOREPSR; 00192400
BEGIN INTEGER I; 00192500
DELETE1(WORKSPACE,0); 00192600
I:=STORESEQ(WORKSPACE,PSR,PSRSIZE|8); 00192700
COMMENT USED TO CALL WRAPUP; 00192800
END; 00192900
PROCEDURE RESCANLINE; 00193000
BEGIN ADDRESS:=ABSOLUTEADDRESS; EOB:=0; END; 00193100
PROCEDURE PROCESS(MODE);VALUE MODE; INTEGER MODE; FORWARD; 00193200
PROCEDURE MESSAGEHANDLER; FORWARD; 00193300
PROCEDURE FUNCTIONHANDLER; FORWARD; 00193400
PROCEDURE ERRORMESS(N,ADDR,R); VALUE N,ADDR,R; REAL R; 00193500
INTEGER N;REAL ADDR;FORWARD; COMMENT LINE 5000000; 00193600
STREAM PROCEDURE SETFIELD(A,S,L,R); VALUE S,L,R; 00193700
BEGIN DI:=A; DI:=DI+S; SI:=LOC R; SI:=SI+8; L(SI:=SI-1); 00193800
DS:=L CHR; 00193900
END; 00194000
COMMENT: VALUE OF GETFIELD IS L CHARACTERS, STARTING AT J-TH 00194100
CHARACTER OF A, RIGHT-ADJUSTED. L MUST BE LEQ 8 AND 00194200
J MUST BE LESS THAT 64; 00194300
REAL STREAM PROCEDURE GETFIELD(A,S,L); VALUE S,L; 00194400
BEGIN SI:=A; SI:=SI+S; DI:=LOC GETFIELD; DI:=DI+8; L(DI:=DI-1); 00194500
DS:=L CHR; 00194600
END; 00194700
REAL PROCEDURE TOPLINE(ORD); VALUE ORD; INTEGER ORD; 00194800
BEGIN 00194900
INTEGER STREAM PROCEDURE CON(A); VALUE A; 00195000
BEGIN SI:=LOC A; DI:=LOC CON; DS:=8OCT END; 00195100
ARRAY A[0:1]; INTEGER I; 00195200
I:=CONTENTS(ORD,SIZE(ORD)-1,A); 00195300
TOPLINE:=CON(A[0])/10000 00195400
END; 00195500
BOOLEAN PROCEDURE FUNCTIONHEADER(SPECS,HADDR); 00195600
ARRAY SPECS[0]; REAL HADDR; 00195700
BEGIN 00195800
LABEL A,B,C; 00195900
INTEGER P; 00196000
DEFINE NOTE=HADDR.[24:24]:=ADDRESS#,P8=8|P+1#; 00196100
ERR:=0; 00196200
SPECS[0]:=SPECS[1]:=SPECS[2]:=SPECS[3]:=0; 00196300
NOTE; HADDR.[1:23]:=GT1:=ADDRESS; 00196400
IF SCAN AND IDENT THEN 00196500
BEGIN 00196600
TRANSFER(ACCUM,2,SPECS,1,7); 00196700
NOTE; 00196800
IF SCAN THEN 00196900
IF LFTARROW THEN 00197000
BEGIN 00197100
SPECS[1]:=1; 00197200
SPECS[3]:=1; 00197300
TRANSFER(SPECS,1,SPECS,33,7); 00197400
GT2:=ADDRESS; 00197500
IF SCAN AND IDENT THEN 00197600
BEGIN 00197700
TRANSFER(ACCUM,2,SPECS,1,7); 00197800
NOTE; 00197900
IF SCAN THEN 00198000
C: IF IDENT THEN 00198100
BEGIN 00198200
P:=(SPECS[3]:=SPECS[3]+1)+3; 00198300
TRANSFER(ACCUM,2,SPECS,P8,7); 00198400
SPECS[2]:=1; 00198500
NOTE; 00198600
IF SCAN THEN IF IDENT THEN 00198700
BEGIN SPECS[2]:=2; 00198800
P:=(SPECS[3]:=SPECS[3]+1)+2; 00198900
TRANSFER(SPECS,1,SPECS,P8+8,7); 00199000
TRANSFER(SPECS,P8,SPECS,1,7); 00199100
TRANSFER(ACCUM,2,SPECS,P8,7); 00199200
00199300
B: NOTE; IF SCAN THEN 00199400
A: IF SEMICOLON THEN IF SCAN THEN 00199500
IF IDENT THEN 00199600
BEGIN 00199700
P:=(SPECS[3]:=SPECS[3]+1)+3; 00199800
TRANSFER(ACCUM,2,SPECS,P8,7); 00199900
GO TO B; 00200000
END ELSE GO TO A 00200100
ELSE ELSE ELSE 00200200
END ELSE GO TO A 00200300
ELSE END 00200400
ELSE GO TO A ELSE 00200500
END ELSE ERRORMESS(ERR:=1,GT2,0) 00200600
END ELSE GO TO C 00200700
ELSE 00200800
END ELSE ERRORMESS(ERR:=SYNTAXERROR,GT1,0); 00200900
FUNCTIONHEADER:=ERR=0; 00201000
ADDRESS:=HADDR.[24:24]; 00201100
END FUNCTIONHEADER; 00201200
00201300
INTEGER PROCEDURE DAYTIME(B); ARRAY B[0]; FORWARD; 00201400
COMMENT ON LINE 8014000, ARRAY B MUST HAVE LENGTH 00201500
AT LEAST 3 WDS; 00201600
PROCEDURE EDITLINE; FORWARD; 00201700
INTEGER PROCEDURE LENGTH(A,M);VALUE M; BOOLEAN M; ARRAY A[0]; 00201800
FORWARD; COMMENT LINE 8007900; 00201900
BOOLEAN PROCEDURE LABELSCAN(L,K); VALUE K; INTEGER K; 00202000
ARRAY L[0]; FORWARD; COMMENT LINE 8013910; 00202100
00202200
00202300
PROCEDURE CHECKSEQ(SEQ,L,INC); REAL SEQ,L,INC; FORWARD; 00202400
COMMENT ON LINE 8040000; 00202500
PROCEDURE RELEASEARRAY(D);VALUE D; REAL D; 00202600
BEGIN COMMENT RELEASE PERMANENT STORAGE FOR THE ARRAY DESC D; 00202700
INTEGER K,J,PT; 00202800
ARRAY BLOCK[0:32]; %SEE MAXWORDSTORE, LINE 17260 00202900
ARRAY TEMP[0:1]; 00203000
IF D.RF NEQ 0 THEN 00203100
BEGIN DELETE1(WS,D.DIMPTR); 00203200
K:=CONTENTS(WS,D.INPTR,BLOCK)-1; 00203300
DELETE1(WS,D.INPTR); 00203400
FOR J:=0 STEP 2 UNTIL K DO 00203500
BEGIN TRANSFER(BLOCK,J,TEMP,6,2); 00203600
PT:=TEMP[0]; DELETE1(WS,PT); END; 00203700
END; 00203800
END; 00203900
PROCEDURE TRANSFERSP(DIR,SP,L,B,M,N); VALUE DIR,N,M,L; 00204000
INTEGER DIR,N,M,L; 00204100
ARRAY SP[0,0],B[0]; 00204200
BEGIN COMMENT 00204300
DIR= INTO: TRANSFER N WORDS FROM B[L] INTO SP[M] 00204400
(ACTUALLY SP[*,M] SINCE ARRAY ROW IS USUALLY THE ARG) 00204500
DIR= OUTOF (OPPOSITE); 00204600
STREAM PROCEDURE MOVER(DIR,SP,M,B,L,N); VALUE DIR, 00204700
L,M,N; 00204800
BEGIN LOCAL T; 00204900
SI:=LOC L; DI:=LOC T; DI:=DI+1; DS:=7CHR; 00205000
SI:=SP; T(16(SI:=SI+32)); L(SI:=SI+8); L:=SI; 00205100
SI:=LOC M; DI:=LOC T; DI:=DI+1; DS:=7CHR; 00205200
SI:=B; T(16(SI:=SI+32)); M(SI:=SI+8); M:=SI; 00205300
SI:=LOC N; DI:=LOC T; DI:=DI+1; DS:=7CHR; 00205400
SI:=LOC DIR; SI:=SI+7; 00205500
IF SC="0" THEN 00205600
BEGIN SI:=M; DI:=L 00205700
END ELSE 00205800
BEGIN SI:=L ; DI:=M 00205900
END; 00206000
T(2(DS:=32WDS)); DS:=N WDS; 00206100
END; 00206200
INTEGER K; 00206300
WHILE N:=N-K GTR 0 DO 00206400
MOVER(DIR,SP[(L:=L+K)DIV SPRSIZE,*], 00206500
M:=M+K,B,K:=L MOD SPRSIZE, 00206600
K:=MIN(SPRSIZE-K,N)) 00206700
END; 00206800
00206900
PROCEDURE DUMPOLISH(SP,PD); VALUE PD; REAL PD; ARRAY SP[0,0]; 00207000
BEGIN INTEGER L; 00207100
LABEL SKIPREST; 00207200
INTEGER I,N,M,U; REAL T; 00207300
L:=PD.SPF; 00207400
I:=SP[LOC]+L; 00207500
FOR L:=L+2 STEP 1 UNTIL I DO 00207600
IF (T:=SP[LOC]).TYPEFIELD=FUNCTION THEN 00207700
BEGIN % OUTPUT MESSAGE AND NAME 00207800
FORMWD(2,"5FUNC: "); 00207900
N:=T.LOCFIELD; % N HAS LOCATION OF DESCRIPTOR 00208000
N:=N-1; % BACK UP ONE TO GET NAME 00208100
GTA[0]:=SP[NOC]; 00208200
FORMROW(1,1,GTA,1,7); 00208300
END 00208400
ELSE % MIGHT BE AN OPERATOR 00208500
IF T.TYPEFIELD=OPERATOR THEN 00208600
BEGIN COMMENT OUTPUT MESSAGE AND OP CODE; 00208700
FORMWD(2,"5ATOR: "); 00208800
NUMBERCON(T.OPTYPE,ACCUM); 00208900
FORMROW(0,1,ACCUM,2,ACOUNT); 00209000
NUMBERCON(T.LOCFIELD,ACCUM); 00209100
FORMROW(1,1,ACCUM,2,ACOUNT); 00209200
END ELSE %MAY BE A CONSTANT 00209300
IF T.TYPEFIELD=CONSTANT THEN 00209400
BEGIN COMMENT GET DATA DESCRIPTOR; 00209500
N:=T.LOCFIELD; 00209600
FORMWD(2,"5CONS: "); 00209700
T:=SP[NOC]; %T HAS THE DATA DESCRIPTOR 00209800
IF T.SPF=0 THEN BEGIN % A NULL VECTOR 00209900
FORMWD(1,"4NULL "); 00210000
GO TO SKIPREST; END; 00210100
N:=T.SPF; %N HAS THE SCALAR OR TOP OF VECTOR LOC. 00210200
IF BOOLEAN(T.SCALAR) THEN M:=U:=N ELSE 00210300
BEGIN U:=SP[NOC]+N; M:=N+1; %UPPER AND LOWER BOUNDS 00210400
END; 00210500
IF BOOLEAN(T.CHRMODE) THEN %CHARACTER FORMAT 00210600
BEGIN COMMENT SP[NOC] IS NUMBER OF CHRS; 00210700
TRANSFERSP(OUTOF,SP,M,BUFFER,0,ENTIER(((T:= 00210800
SP[NOC])-1)DIV 8+1)); 00210900
FORMROW(1,1,BUFFER,0,T); 00211000
END ELSE % SHOULD TEST FOR NULL...DO IT LATER. 00211100
FOR N:=M STEP 1 UNTIL U DO 00211200
BEGIN NUMBERCON(SP[NOC],ACCUM); 00211300
FORMROW(0,1,ACCUM,2,ACOUNT); 00211400
END; 00211500
TERPRINT; 00211600
SKIPREST: 00211700
END ELSE COMMENT MUST BE AN OPERAND; 00211800
IF T.TYPEFIELD=LOCALVAR THEN 00211900
BEGIN FORMWD(2,"5LOCL: "); 00212000
N:=T.SPF; % N HAS LOCATION OF NAME; 00212100
GTA[0]:=SP[NOC]; % PUT NAME IN GTA 00212200
FORMROW(1,1,GTA,1,7); 00212300
END ELSE 00212400
BEGIN COMMENT TREAT IT AS VARIABLE; 00212500
N:=T.LOCFIELD; COMMENT N HAS LOC OF DESCRIPTOR; 00212600
N:=N-1; COMMENT BACKUP OVER THE DESCRIPTOR; 00212700
GTA[0]:=SP[NOC]; 00212800
FORMWD(2,"5AND : "); 00212900
FORMROW(1,1,GTA,1,7); 00213000
END; 00213100
END; 00213200
00213300
PROCEDURE PROCESS(MODE); VALUE MODE; INTEGER MODE; 00213400
BEGIN 00213500
OWN INTEGER J; 00213600
OWN REAL RESULTD; 00213700
LABEL EXPOVRL,INTOVRL,INDEXL,FLAGL,ZEROL; 00213800
MONITOR EXPOVR,INTOVR,INDEX,FLAG,ZERO; 00213900
LABEL DEBUGSP; %DEBUGGING PURPOSES ONLY. 00214000
INTEGER PROCEDURE BUILDCONSTANT(LASTCONSTANT); 00214100
INTEGER LASTCONSTANT; FORWARD; 00214200
INTEGER PROCEDURE GETSPACE(LENGTH); VALUE LENGTH; 00214300
INTEGER LENGTH; FORWARD; 00214400
PROCEDURE OPERANDTOSYMTAB(L);VALUE L;INTEGER L;FORWARD; 00214500
REAL PROCEDURE BUILDALPHA(LASTCONSTANT); 00214600
INTEGER LASTCONSTANT; FORWARD; 00214700
INTEGER PROCEDURE BUILDNULL(LASTCONSTANT); 00214800
INTEGER LASTCONSTANT; FORWARD; 00214900
PROCEDURE SCRATCHDATA(D);VALUE D;REAL D; FORWARD; 00215000
COMMENT LINE 3121400; 00215100
PROCEDURE FORGETPROGRAM(U);VALUE U;REAL U; FORWARD; 00215200
COMMENT ANALYZE IS IN PROCESS BECAUSE OWN ARRAY SP 00215300
IS ADDRESSED INCORRECTLY OTHERWISE; 00215400
REAL PROCEDURE ANALYZE(DISPLAYOP); VALUE DISPLAYOP;BOOLEAN DISPLAYOP; 00215500
BEGIN COMMENT 00215600
BC= BUILDCONSTANT, 00215700
GS= GET SPACE PROCEDURE ; 00215800
ARRAY INFIX[0:MAXPOLISH]; 00215900
00216000
INTEGER LASTCONSTANT; 00216100
DEFINE GS=GETSPACE#; 00216200
BOOLEAN STREAM PROCEDURE EQUAL(A,B); 00216300
BEGIN SI:=A; SI:=SI+1; DI:=B; DI:=DI+2; 00216400
IF 7SC=DC THEN TALLY:=1; 00216500
EQUAL:=TALLY; 00216600
END; 00216700
PROCEDURE UNSTACK(DEST,L,ORIG,OTOP,N,CHR1,CHR2); 00216800
VALUE N,CHR1,CHR2; 00216900
INTEGER N,CHR1,CHR2,L,OTOP; 00217000
ARRAY DEST[0,0],ORIG[0]; 00217100
BEGIN 00217200
REAL T,U; 00217300
WHILE OTOP GTR 0 AND N GTR 0 AND ERR=0 DO 00217400
IF(IF (T:=ORIG[OTOP]).TYPEFIELD=FUNCTION THEN FALSE ELSE 00217500
U:=T.LOCFIELD=CHR1 OR U=CHR2) THEN %UNSTACK 00217600
BEGIN 00217700
IF N GTR 1 THEN 00217800
IF U=CHR2 THEN ERR:=SYNTAXERROR ELSE 00217900
OTOP:=OTOP-1; 00218000
N:=N-1; 00218100
END ELSE 00218200
COMMENT WE ARE LOOKING AT AN OPERATOR OR A FUNCTION; 00218300
00218400
00218500
BEGIN 00218600
IF J NEQ 0 THEN 00218700
BEGIN L:=L+1; 00218800
DEST[LOC]:=ORIG[OTOP] 00218900
END; 00219000
OTOP:=OTOP-1 00219100
END; 00219200
IF N GTR 1 THEN ERR:=SYNTAXERROR; 00219300
END; 00219400
INTEGER ITOP,K,L,I; 00219500
INTEGER M,N,FLOC; REAL T; 00219600
LABEL SKIPSCAN,FILLER; 00219700
LABEL SPFULLAB; 00219800
00219900
00220000
PROCEDURE FORGETSPACE(L,LENGTH,SP); VALUE L,LENGTH; 00220100
INTEGER L,LENGTH; ARRAY SP[0,0]; 00220200
BEGIN IF LENGTH GTR 0 THEN 00220300
BEGIN SP[LOC]:=SP[0,0]; 00220400
SP[LOC].LEN:=LENGTH; SP[0,0]:=L 00220500
END; 00220600
END; 00220700
00220800
IF CURRENTMODE=FUNCMODE OR STACKBASE=0 THEN FLOC:=0 ELSE 00220900
00221000
BEGIN L:=STACKBASE+1;L:=SP[LOC].SPF+1;M:=SP[LOC].SPF+L; 00221100
FLOC:= IF M=L OR BOOLEAN(T:=SP[MOC]).SUSPENDED THEN 0 ELSE T.SPF00221200
00221300
END; 00221400
00221500
T:=ADDRESS; 00221600
ITOP:=0; 00221700
DO 00221800
SKIPSCAN: 00221900
IF ITOP LSS MAXPOLISH THEN 00222000
BEGIN 00222100
INFIX[ITOP:=ITOP+1].ADDRFIELD:=T; 00222200
IF SPECIAL THEN 00222300
IF QUOTEV THEN % CONSTANT VECTOR 00222400
BEGIN INFIX[ITOP].TYPEFIELD:=CONSTANT; 00222500
IF T:=BUILDALPHA(LASTCONSTANT) NEQ 0 THEN 00222600
INFIX[ITOP].LOCFIELD:=T ELSE ERR:=SYNTAXERROR 00222700
END ELSE % ORDINARY OPERATOR 00222800
BEGIN INFIX[ITOP].TYPEFIELD:=OPERATOR; 00222900
INFIX[ITOP].LOCFIELD:=ENTIER(ACCUM[0]); 00223000
END ELSE 00223100
IF NUMERIC THEN 00223200
IF ERR NEQ 0 THEN COMMENT NOTHING; ELSE 00223300
BEGIN INFIX[ITOP].TYPEFIELD:=CONSTANT; 00223400
IF CURRENTMODE=FUNCMODE THEN 00223500
COMMENT DO NOT STORE NUMERIC IN SCRATCH PAD; 00223600
DO UNTIL NOT SCAN OR NOT NUMERIC %THE NULL STATEMENT 00223700
ELSE 00223800
BEGIN 00223900
T:=BUILDCONSTANT(LASTCONSTANT); 00224000
IF T=0 THEN ERR:=IF ERR=0 THEN VALUEERROR ELSE ERR ELSE 00224100
INFIX[ITOP].LOCFIELD:=T; 00224200
END; 00224300
IF EOB=0 AND ERR=0 THEN GO TO SKIPSCAN; 00224400
END ELSE 00224500
IF IDENT THEN 00224600
BEGIN INFIX[ITOP].DID:=OPERAND; %SET OPTYPE=NILADIC 00224700
IF NOT(FUNCMODE EQL CURRENTMODE) THEN 00224800
BEGIN J:=0; 00224900
IF FLOC GTR 0 THEN %CHECK LOCAL NAMES 00225000
BEGIN L:=FLOC+2; 00225100
K:=SP[LOC]-2;%LAST ALPHA POINTER IN TABLE 00225200
%SHOULD CONVERT TO BINARY SEARCH 00225300
T:=L+4; 00225400
FOR L:=T STEP 2 UNTIL K DO 00225500
IF EQUAL(SP[LOC],ACCUM) THEN 00225600
BEGIN J:=L;L:=K;I:=0; 00225700
INFIX[ITOP].SPF:=J; 00225800
INFIX[ITOP].RF:=M-FLOC; 00225900
J:=(J-T+2)/2; 00226000
END; 00226100
END; 00226200
00226300
00226400
IF J EQL 0 THEN 00226500
BEGIN COMMENT LOOK IN SP SYMBOL TABLE; 00226600
IF L:=SYMBASE NEQ 0 THEN COMMENT OK TO LOOK; 00226700
BEGIN T:=SP[LOC];K:=L+T; 00226800
COMMENT T=N VARS TIMES 2. K IS TOP LIMIT; 00226900
FOR L:=L +1 STEP 2 UNTIL K DO 00227000
IF EQUAL(SP[LOC],ACCUM) THEN 00227100
BEGIN 00227200
INFIX[ITOP].TYPEFIELD:=I:=SP[LOC].TYPEFIELD; 00227300
L:=J:=L+1; 00227400
IF I=FUNCTION THEN BEGIN 00227500
INFIX[ITOP].RF:=SP[LOC].RETURNVALUE; 00227600
INFIX[ITOP].OPTYPE:=SP[LOC].NUMBERARGS;END; 00227700
L:=K; 00227800
END; 00227900
IF J EQL 0 THEN 00228000
IF T LSS MAXSYMBOL|2 THEN %INSERT ID 00228100
BEGIN L:=K+1; %NEXT AVAILABLE. 00228200
FILLER: SETFIELD(GTA,0,1,0); 00228300
TRANSFER(ACCUM,2,GTA,1,7); 00228400
SP[LOC]:=GTA[0];%STORE VARIABLE NAME 00228500
OPERANDTOSYMTAB(L);%SET TYPEFIELD AND DESC. 00228600
IF GT1=FUNCTION THEN%FUNCTION-FIX INFIX 00228700
BEGIN 00228800
INFIX[ITOP].OPTYPE:=GTA[1].NUMBERARGS; 00228900
INFIX[ITOP].TYPEFIELD:=FUNCTION; 00229000
INFIX[ITOP].RF:=GTA[1].RETURNVALUE; 00229100
END; 00229200
J:=L+1; 00229300
L:=SYMBASE;SP[LOC]:=T+2;%UPDATE SYM TAB # 00229400
END ELSE SPFULLAB: ERR:=SPERROR;%TAB FULL 00229500
END ELSE %CREATE SYMBOL TABLE 00229600
BEGIN 00229700
SYMBASE:=L:=GS(MAXSYMBOL|2+1); 00229800
IF ERR NEQ 0 THEN 00229900
BEGIN SYMBASE:=0; 00230000
GO TO SPFULLAB; 00230100
END; 00230200
T:=0; L:=L+1; 00230300
GO TO FILLER; 00230400
END 00230500
END ELSE INFIX[ITOP].DID:=LOCALVAR&1[44:47:1]; 00230600
INFIX[ITOP].LOCFIELD:=J 00230700
END 00230800
END ELSE ERR:=SYSTEMERROR; 00230900
IF ERR EQL 0 THEN T:=ADDRESS 00231000
END ELSE ERR:=SPERROR 00231100
UNTIL NOT(SCAN AND ERR=0); %DROP THRU WHEN INPUT FIN OR ERR 00231200
COMMENT NOW LOOK FOR THE POLISH; 00231300
IF ERR NEQ 0 THEN 00231400
BEGIN ERRORMESS(ERR,INFIX[ITOP].ADDRFIELD,0); 00231500
END ELSE 00231600
BEGIN COMMENT MAKE UP THE POLISH; 00231700
ARRAY OPERATORS[0:ITOP]; 00231800
BOOLEAN PROCEDURE ANDORATOR (VAR,TYPE); 00231900
VALUE VAR, TYPE; 00232000
REAL VAR,TYPE; 00232100
BEGIN 00232200
REAL T; 00232300
LABEL OPERAN, ATOR; 00232400
COMMENT PROCEDURE TRUE IF VAR IS OF TYPE SPECIFIED; 00232500
IF T:=VAR.TYPEFIELD=OPERATOR THEN 00232600
IF T:=VAR.LOCFIELD NEQ RGTPARENV AND T NEQ 00232700
QQUAD AND T NEQ QUAD AND T NEQ 00232800
RGTBRACKETV THEN GO ATOR 00232900
ELSE GO OPERAN 00233000
ELSE 00233100
IF T=FUNCTION THEN 00233200
IF VAR.OPTYPE GTR NILADIC THEN 00233300
ATOR: ANDORATOR:=TYPE=OPERATOR 00233400
ELSE GO OPERAN 00233500
ELSE 00233600
OPERAN: ANDORATOR:=TYPE=OPERAND; 00233700
END OF ANDORATOR; 00233800
BOOLEAN PROCEDURE RGTOPERAND(VAR); VALUE VAR; REAL VAR; 00233900
BEGIN REAL T; DEFINE RT=RGTOPERAND:=TRUE#; 00234000
IF T:=VAR.TYPEFIELD=OPERAND OR T=CONSTANT OR T=LOCALVAR THEN RT 00234100
ELSE IF T=OPERATOR AND VAR.LOCFIELD=LFTPARENV THEN RT 00234200
ELSE IF T=FUNCTION AND VAR.OPTYPE LEQ MONADIC THEN RT; 00234300
END OF RGTOPERAND; 00234400
BOOLEAN VALID; 00234500
INTEGER OTOP; 00234600
INTEGER BCT,N; REAL COLONCTR; 00234700
LABEL STACKOPERAND, STACKFUNCTION; 00234800
DEFINE PTOP=L#; 00234900
LABEL AROUND, NOK, OK, LFTARROWL, LFTPARENL, RGTPARENL, 00235000
SLASHL,EXPL,ROTL,MONADICL,DYADICL,ERRL,SORTL, 00235100
SEMICOLONL, QUADL, DOTL, RELATIONL, 00235200
LFTBRACKETL, RGTBRACKETL, QUOTEQUADL; 00235300
SWITCH OPERATORSWITCH:= % IN GROUPS OF 5, STARTING AT 1 00235400
NOK, NOK, NOK, LFTARROWL, % 1-4 00235500
MONADICL, SLASHL, OK, LFTPARENL,RGTPARENL, %5-9 00235600
QUADL,LFTBRACKETL,RGTBRACKETL,ERRL,QUOTEQUADL, %10-14 00235700
SEMICOLONL, OK, DOTL, OK, OK, % 15-19 00235800
OK,DYADICL,DYADICL,MONADICL,RELATIONL, % 20-24 00235900
RELATIONL, RELATIONL, RELATIONL, RELATIONL, 00236000
RELATIONL, % 25-29 00236100
OK, OK, OK, OK, OK, %30-34 00236200
OK, OK, ROTL, EXPL, OK, % 35-39 00236300
OK,OK,OK,OK,DYADICL, %40-44 00236400
OK, OK, ERRL, OK, OK, %45-49 00236500
OK, NOK, NOK, NOK, OK, % 50-54 00236600
SORTL,SORTL,OK,OK,OK, % 55-59 00236700
DYADICL, DYADICL, MONADICL; % 60-62 00236800
%----------------------------------------------- 00236900
COMMENT GET AN AREA OF SCRATCH PAD IF WE ARE NOT IN 00237000
THE SYNTAX CHECKING MODE; 00237100
J:=(IF CURRENTMODE=FUNCMODE THEN 0 ELSE 00237200
GS(ITOP+3)); 00237300
I:=ITOP+1; 00237400
COMMENT A QUICK SYNTAX CHECK; 00237500
IF ANDORATOR(INFIX[ITOP],OPERATOR) THEN ERR:=SYNTAXERROR; 00237600
L:=J+1; COMMENT POLISH WILL START TWO UP IN ARRAY; 00237700
WHILE ERR=0 AND I GTR 1 DO 00237800
IF T:=INFIX[I:=I-1].TYPEFIELD=OPERATOR THEN 00237900
BEGIN 00238000
GO OPERATORSWITCH[INFIX[I].LOCFIELD]; 00238100
ROTL: 00238200
IF I=1 OR NOT ANDORATOR(INFIX[I-1],OPERAND) THEN GO OK; 00238300
T:=INFIX[I]; 00238400
T.LOCFIELD:=ROTATE; 00238500
T.OPTYPE:=IF INFIX[I].OPTYPE NEQ DYADIC THEN MONADIC ELSE DYADIC; 00238600
INFIX[I]:=T; GO TO STACKFUNCTION; 00238700
EXPL: 00238800
SLASHL: BEGIN DEFINE STARTSEGMENT= #; %///////////////////// 00238900
IF INFIX[I-1].TYPEFIELD=FUNCTION THEN GO ERRL ELSE 00239000
IF ANDORATOR(INFIX[I-1],OPERATOR) THEN 00239100
BEGIN 00239200
INFIX[I].LOCFIELD:=IF INFIX[I].LOCFIELD=SLASHV THEN 00239300
REDUCT ELSE SCANV; 00239400
00239500
IF INFIX[I].OPTYPE NEQ DYADIC THEN INFIX[I].OPTYPE:=MONADIC; 00239600
GO OK; 00239700
END 00239800
ELSE 00239900
00240000
IF INFIX[I].OPTYPE NEQ DYADIC THEN INFIX[I].OPTYPE:=MONADIC; 00240100
IF I=1 THEN 00240200
00240300
BEGIN 00240400
ERR:=SYNTAXERROR; 00240500
GO AROUND; 00240600
END; 00240700
GO OK; END; 00240800
SORTL: 00240900
IF I=1 OR ANDORATOR(INFIX[I-1],OPERATOR) THEN GO OK ELSE GO ERRL; 00241000
LFTPARENL: 00241100
K:=I; 00241200
UNSTACK(SP,PTOP,OPERATORS,OTOP,2,RGTPARENV,RGTBRACKETV); 00241300
GO AROUND; 00241400
RELATIONL: 00241500
DYADICL: 00241600
IF I GTR 1 THEN 00241700
IF ANDORATOR(INFIX[I-1],OPERAND) THEN 00241800
BEGIN 00241900
INFIX[I].OPTYPE:=DYADIC; 00242000
GO STACKFUNCTION; 00242100
END; 00242200
IF (GT3:=(T:=INFIX[I+1]).LOCFIELD=REDUCT OR GT3=SCANV) 00242300
AND T.TYPEFIELD=OPERATOR THEN GO OK; 00242400
IF(T:=INFIX[I-1]).LOCFIELD=DOTV AND T.TYPEFIELD=OPERATOR THEN GO OK;00242500
GO TO ERRL; 00242600
MONADICL: 00242700
IF I=1 OR ANDORATOR(INFIX[I-1],OPERATOR) 00242800
THEN BEGIN 00242900
INFIX[I].OPTYPE:=MONADIC; 00243000
GO TO STACKFUNCTION; 00243100
END 00243200
ELSE 00243300
GO ERRL; 00243400
LFTBRACKETL: 00243500
IF BCT:=BCT-1 LSS 0 THEN ERR:=SYNTAXERROR; 00243600
UNSTACK(SP,PTOP,OPERATORS,OTOP,1,RGTBRACKETV,RGTPARENV); 00243700
IF OTOP=1 THEN BEGIN 00243800
ERR:=SYNTAXERROR; GO AROUND; END 00243900
ELSE IF J NEQ 0 THEN 00244000
BEGIN 00244100
IF T:=INFIX[I-1].TYPEFIELD=OPERAND OR T=LOCALVAR THEN 00244200
BEGIN DEFINE STARTSEGMENT= #; %/////////////////////////// 00244300
%LFTBRACKET PART OF SUBSCRIPTED VARIABLE 00244400
IF OPERATORS[OTOP].OPTYPE=0 THEN GO TO ERRL; 00244500
COMMENT IF ABOVE TRUE THEN THERE WAS AN OPERAND TO THE RITE;00244600
L:=L+1; 00244700
N:=GT1:=GETSPACE(1); 00244800
SP[NOC]:=COLONCTR+1; % STORE NUMBER OF DIMENSIONS 00244900
N:=GETSPACE(1); % BUILD A DESCRIPTOR FOR # OF DIMENSIONS 00245000
T.SPF:=GT1; 00245100
T.DID:=DDPNSW; 00245200
T.BACKP:=LASTCONSTANT; 00245300
SP[NOC]:=T; 00245400
T:=INFIX[I]; 00245500
T.LOCFIELD:=LASTCONSTANT:=N; % LINK TO CONSTANT CHAIN 00245600
T.TYPEFIELD:=CONSTANT; 00245700
SP[LOC]:=T; % PUT ON POLISH 00245800
L:=L+1; 00245900
IF OPERATORS[OTOP].OPTYPE=3 THEN % LEFT SIDE OF REPLACEOP 00246000
INFIX[I-1].TYPEFIELD:=REPLACELOC; 00246100
SP[LOC]:=INFIX[I-1]; % PLACE OPERAND ON POLISH 00246200
L:=L+1; 00246300
SP[LOC]:=INFIX[I]; % COLLAPSE OPERATOR TO POLISH 00246400
I:=I-1; 00246500
END 00246600
ELSE IF T:=INFIX[I-1].LOCFIELD=SLASHV OR 00246700
T=EXPANDV OR T=ROTV OR T=SORTUPV OR T=SORTDNV THEN 00246800
IF INFIX[I-1].TYPEFIELD=OPERATOR AND OPERATORS[OTOP] 00246900
.OPTYPE=0 THEN INFIX[I-1].OPTYPE:=DYADIC 00247000
ELSE ERR:=SYNTAXERROR 00247100
ELSE ERR:=SYNTAXERROR; 00247200
END; 00247300
COLONCTR:=OPERATORS[OTOP:=OTOP-1]; 00247400
IF OTOP:=OTOP-1 LSS 0 THEN ERR:=SYNTAXERROR; 00247500
GO AROUND; 00247600
RGTPARENL: 00247700
IF OTOP LSS ITOP DIV 2 THEN ELSE ERR:=SYNTAXERROR; 00247800
OPERATORS[OTOP:=OTOP+1]:=INFIX[I]; 00247900
GO AROUND; 00248000
RGTBRACKETL: BEGIN DEFINE STARTSEGMENT= #; %/////////////////// 00248100
BCT:=BCT+1; 00248200
IF OTOP+2 GEQ ITOP THEN 00248300
BEGIN 00248400
ERR:=SYNTAXERROR; 00248500
GO AROUND; 00248600
END; 00248700
OPERATORS[OTOP:=OTOP+1]:=COLONCTR; 00248800
GT1:=OPERATORS[OTOP:=OTOP+1]:=INFIX[I]; COLONCTR:=0; 00248900
IF I NEQ ITOP THEN 00249000
IF GT1.OPTYPE NEQ 3 THEN 00249100
OPERATORS[OTOP].OPTYPE:=IF RGTOPERAND(INFIX[I+1]) THEN 00249200
0 ELSE 2 00249300
ELSE 00249400
ELSE OPERATORS[OTOP].OPTYPE:=2; 00249500
IF J NEQ 0 AND INFIX[I-1].LOCFIELD=SEMICOLONV THEN 00249600
BEGIN 00249700
T.LOCFIELD:=BUILDNULL(LASTCONSTANT); 00249800
T.TYPEFIELD:=CONSTANT; 00249900
L:=L+1; K:=I; 00250000
SP[LOC]:=T; 00250100
END; 00250200
GO AROUND; END; 00250300
LFTARROWL: 00250400
IF I=1 THEN ERR:=SYNTAXERROR 00250500
ELSE 00250600
IF T:=INFIX[I-1].TYPEFIELD=OPERAND OR T=LOCALVAR THEN 00250700
INFIX[I-1].TYPEFIELD:=REPLACELOC 00250800
ELSE 00250900
IF T=OPERATOR THEN 00251000
IF T:=INFIX[I-1].LOCFIELD=QUAD OR T=QUADLFTARROW THEN 00251100
INFIX[I:=I-1].LOCFIELD:=QUADLFTARROW 00251200
ELSE IF T=RGTBRACKETV THEN INFIX[I-1].OPTYPE:=3 00251300
%WILL TEST LATER TO INDICATE REPLACEMENT IN MATRIX 3105154 00251400
ELSE ERR:=SYNTAXERROR 00251500
ELSE ERR:=SYNTAXERROR; 00251600
IF ERR=0 THEN GO OK ELSE GO AROUND; 00251700
QUOTEQUADL: 00251800
QUADL: 00251900
COMMENT INPUT IS BEING REQUESTED; 00252000
GO TO STACKOPERAND; 00252100
DOTL: BEGIN DEFINE STARTSEGMENT=#; %//////////////////////////// 00252200
IF I GTR 2 THEN 00252300
IF (T:=INFIX[I-1]).TYPEFIELD=OPERATOR AND 00252400
ANDORATOR(T,OPERATOR) THEN 00252500
IF (T:=INFIX[I+1]).TYPEFIELD=OPERATOR AND 00252600
ANDORATOR(T,OPERATOR) THEN 00252700
IF ANDORATOR(INFIX[I-2],OPERAND) THEN 00252800
COMMENT THEN SYNTAX OK; 00252900
BEGIN 00253000
COMMENT STACK OPERATORS SO THAT IF GIVEN A+.XB 00253100
POLISH IS BA.+X; 00253200
OPERATORS[OTOP].OPTYPE:=TRIADIC; 00253300
OPERATORS[OTOP:=OTOP+1]:=INFIX[I-1]; 00253400
INFIX[I].OPTYPE:=TRIADIC; 00253500
OPERATORS[OTOP:=OTOP+1]:=INFIX[I]; 00253600
I:=I-1; 00253700
VALID:=TRUE; 00253800
END; 00253900
IF NOT VALID THEN ERR:=SYNTAXERROR; 00254000
VALID:=FALSE; 00254100
GO AROUND; END; 00254200
SEMICOLONL: BEGIN DEFINE STARTSEGMENT=#; %////////////////////// 00254300
IF BCT NEQ 0 THEN 00254400
BEGIN 00254500
COLONCTR:=COLONCTR+1; 00254600
IF I-1=0 THEN ERR:=SYNTAXERROR 00254700
ELSE 00254800
BEGIN 00254900
UNSTACK(SP,PTOP,OPERATORS,OTOP,1,RGTBRACKETV,RGTPARENV); 00255000
IF J NEQ 0 AND (T:=INFIX[I-1].LOCFIELD=SEMICOLONV 00255100
OR T =LFTBRACKETV) THEN BEGIN 00255200
T.LOCFIELD:=BUILDNULL(LASTCONSTANT); 00255300
T.TYPEFIELD:=CONSTANT; 00255400
L:=L+1; K:=I; 00255500
SP[LOC]:=T; 00255600
END; 00255700
END 00255800
END 00255900
ELSE COMMENT MUST BE MIXED MODE EXPRESSION; 00256000
BEGIN 00256100
IF ANDORATOR(T:=INFIX[I-1],OPERATOR) THEN 00256200
IF T.LOCFIELD NEQ SEMICOLONV THEN GO ERRL; 00256300
UNSTACK(SP,PTOP,OPERATORS,OTOP,1,RGTPARENV,RGTBRACKETV); 00256400
OPERATORS[OTOP:=OTOP+1]:=INFIX[I]; 00256500
END; 00256600
GO AROUND; 00256700
END; 00256800
NOK: 00256900
ERR:=SYNTAXERROR; 00257000
GO AROUND; 00257100
ERRL: 00257200
ERR:=SYNTAXERROR; 00257300
GO AROUND; 00257400
OK: 00257500
IF INFIX[I].OPTYPE NEQ 0 THEN GO TO STACKFUNCTION ELSE 00257600
IF I LSS 2 THEN INFIX[I].OPTYPE:=MONADIC ELSE 00257700
INFIX[I].OPTYPE:=IF ANDORATOR(INFIX[I-1],OPERATOR) THEN 00257800
MONADIC ELSE DYADIC; 00257900
00258000
00258100
STACKFUNCTION: 00258200
IF I=K-1 THEN OPERATORS[OTOP:=OTOP+1]:=INFIX[I] 00258300
ELSE 00258400
BEGIN 00258500
UNSTACK(SP,PTOP,OPERATORS,OTOP,1,RGTPARENV,RGTBRACKETV); 00258600
OPERATORS[OTOP:=OTOP+1]:=INFIX[I]; 00258700
END; 00258800
GO AROUND; 00258900
AROUND: 00259000
END % OF PROCESSING AN OPERATOR---- 00259100
ELSE % COULD BE A FUNCTION 00259200
IF INFIX[I].TYPEFIELD=FUNCTION THEN 00259300
IF (T:=INFIX[I]).OPTYPE GEQ MONADIC THEN 00259400
GO TO STACKFUNCTION 00259500
ELSE 00259600
IF T.RF=RETURNVAL THEN GO TO STACKOPERAND 00259700
ELSE % MUST NOT RETURN A VALUE 00259800
IF I=1 THEN GO TO STACKOPERAND 00259900
ELSE ERR:=SYNTAXERROR 00260000
ELSE % MUST BE AN OPERAND, CONSTANT OR LOCAL 00260100
STACKOPERAND: 00260200
BEGIN DEFINE STARTSEGMENT=#; %/////////////////////////////// 00260300
IF ITOP=1 THEN ELSE 00260400
IF I=ITOP AND I NEQ 1 THEN 00260500
IF ANDORATOR(INFIX[I-1],OPERAND) THEN 00260600
IF INFIX[I-1].LOCFIELD=RGTBRACKETV THEN 00260700
ELSE GO ERRL 00260800
ELSE 00260900
ELSE 00261000
IF I=1 AND I NEQ ITOP THEN 00261100
IF RGTOPERAND(INFIX[I+1]) THEN GO ERRL 00261200
ELSE 00261300
ELSE 00261400
IF ANDORATOR(INFIX[I-1],OPERAND) OR RGTOPERAND(INFIX[I+1]) 00261500
THEN 00261600
IF INFIX[I-1].LOCFIELD=RGTBRACKETV THEN 00261700
ELSE GO ERRL; 00261800
IF J NEQ 0 THEN 00261900
BEGIN L:=L+1; 00262000
SP[LOC]:=INFIX[I]; 00262100
END; K:=I; 00262200
UNSTACK(SP,PTOP,OPERATORS,OTOP,1,RGTPARENV,RGTBRACKETV); 00262300
END; % OF GOING THROUGH INFIX 00262400
IF ERR NEQ 0 THEN ERRORMESS(ERR,INFIX[I].ADDRFIELD,0) ELSE 00262500
WHILE OTOP GTR 0 AND ERR=0 DO 00262600
BEGIN IF T:=OPERATORS[OTOP].LOCFIELD=RGTPARENV OR 00262700
T=RGTBRACKETV THEN 00262800
IF OPERATORS[OTOP].TYPEFIELD=OPERATOR THEN 00262900
ERRORMESS(ERR:=SYNTAXERROR,OPERATORS[OTOP].ADDRFIELD 00263000
,0); 00263100
IF J NEQ 0 THEN 00263200
BEGIN L:=L+1; 00263300
SP[LOC]:=OPERATORS[OTOP] 00263400
END; OTOP:=OTOP-1; 00263500
END; 00263600
IF J NEQ 0 AND DISPLAYOP THEN 00263700
IF SP[LOC].TYPEFIELD NEQ OPERATOR OR 00263800
T:=SP[LOC].LOCFIELD NEQ LFTARROWV 00263900
AND T NEQ QUADLFTARROW AND T NEQ GOTOV THEN 00264000
BEGIN COMMENT ADD DIISPLAY OPERATOR TO POLISH; 00264100
L:=L+1; 00264200
T.TYPEFIELD:=OPERATOR; 00264300
T.OPTYPE:=MONADIC; 00264400
T.LOCFIELD:=QUADLFTARROW; 00264500
SP[LOC]:=T; 00264600
END; 00264700
IF J NEQ 0 THEN 00264800
IF ERR NEQ 0 THEN FORGETSPACE (J,ITOP+3,SP) ELSE 00264900
COMMENT STORE POLISH AND BUFFER; 00265000
BEGIN COMMENT SAVE LENGTH OF POLISH; 00265100
DEFINE STARTSEGMENT=#; %//////////////////////////////////// 00265200
T:=L-J; % DELETE ANY EXTRA SPACE ALLOCATED FOR POLISH 00265300
IF T LSS ITOP+2 THEN FORGETSPACE(L+1,2+ITOP-T,SP); 00265400
COMMENT THEN GETSPACE FOR BUFFER; 00265500
L:=GS(((K:=LENGTH(BUFFER, CURRENTMODE= 00265600
CALCMODE))-1) DIV 8 +2); 00265700
COMMENT L IS THE ADDRESS OF THE BUFFER; 00265800
SP[LOC]:=K; %NUMBER OF CHARACTERS IN THE BUFFER; 00265900
TRANSFERSP(INTO,SP,L+1,BUFFER,0,ENTIER((K+7)DIV 8)); 00266000
COMMENT WE HAVE MOVED IN THE BUFFER; 00266100
K:=L; %SAVE THE ADDRESS OF THE BUFFER; 00266200
L:=J+1; % ONE WORD UP IN THE POLISH 00266300
SP[LOC].SPF:=K; %STORE ADDRESS OF BUFFER 00266400
SP[LOC].RF:=1; % SET THE RANK TO 1 00266500
SP[LOC].DID:=DDPNVC; 00266600
L:=L-1; %SET THE LENGTH OF POLISH 00266700
SP[LOC]:=T; %STORE THE LENGTH OF THE POLISH 00266800
T:=0; T.SPF:=J; T.RF:=1; %SET UP PROG DESC IN T 00266900
T.BACKP:=LASTCONSTANT; 00267000
T.DID:=PDC; ANALYZE:=T; 00267100
COMMENT DEBUG THE POLISH IF NECESSARY; 00267200
IF POLBUG=1 THEN DUMPOLISH(SP,T); 00267300
END; 00267400
%-------------------------------------------------- 00267500
END; 00267600
END; 00267700
PROCEDURE OPERANDTOSYMTAB(L);VALUE L;INTEGER L; 00267800
BEGIN 00267900
INTEGER N; 00268000
TRANSFER(ACCUM,2,GTA,0,7); 00268100
IF(IF VARIABLES=0 THEN FALSE ELSE 00268200
SEARCHORD(VARIABLES,GTA,GT1,7)=0) THEN 00268300
BEGIN 00268400
SP[LOC].TYPEFIELD:=GT1:=GETFIELD(GTA,7,1); 00268500
IF GT1=FUNCTION THEN 00268600
BEGIN 00268700
L:=L+1;SP[LOC]:=GTA[1] 00268800
END ELSE %MUST BE AN OPERAND 00268900
BEGIN 00269000
SP[LOC].TYPEFIELD:=OPERAND; 00269100
L:=L+1; 00269200
IF GT1=0 THEN % THIS IS THE SCALAR CASE 00269300
BEGIN N:=GETSPACE(1); 00269400
SP[LOC]:=N&DDPNSW[CDID]; 00269500
SP[NOC]:=GTA[1]; 00269600
END ELSE %IT MUST BE A VECTOR 00269700
SP[LOC]:=GTA[1]; 00269800
END; 00269900
END ELSE % NOT IN THE SYMBOL TABLE 00270000
BEGIN 00270100
SP[LOC].TYPEFIELD:=GT1:=OPERAND; 00270200
L:=L+1; SP[LOC]:=NAMEDNULLV; 00270300
% THE UNDEFINED SYMBOL IS A NULL 00270400
00270500
END; 00270600
END; %OF PROCEDURE OPERANDTOSYMTAB 00270700
INTEGER PROCEDURE GETSPACE(LENGTH); VALUE LENGTH; 00270800
INTEGER LENGTH; 00270900
BEGIN 00271000
LABEL ENDGETSPACE,SPOVERFLOW; 00271100
MONITOR INDEX; 00271200
INTEGER L,NEXTAREA,LASTAREA,OLDROW,K; 00271300
INTEGER MEMCHECK; 00271400
REAL LINK; 00271500
INDEX:=SPOVERFLOW; 00271600
NEXTAREA:=SP[0,0]; 00271700
LASTAREA:=0; 00271800
DO BEGIN COMMENT FIND A LARGE ENOUGH AREA; 00271900
IF MEMCHECK:=MEMCHECK+1 GTR MAXMEMACCESSES THEN %ERR 00272000
BEGIN GETSPACE:=-1@10; ERR:=SPERROR; 00272100
GO TO ENDGETSPACE END; 00272200
IF NEXTAREA =0 THEN COMMENT END OF STORAGE; 00272300
BEGIN 00272400
IF NROWS:=(OLDROW:=NROWS)+K:=ENTIER(LENGTH/ 00272500
SPRSIZE+1) 00272600
GTR MAXSPROWS THEN %OFF THE END OF SP 00272700
BEGIN COMMENT TAKE EASY WAY IOUT FOR NOW; 00272800
GETSPACE:=-1@10; %CAUSE INVALID INDEX 00272900
NROWS:=OLDROW; ERR:=SPERROR; 00273000
GO TO ENDGETSPACE; 00273100
END; 00273200
K:=K|SPRSIZE; 00273300
00273400
L:=LASTAREA; 00273500
IF OLDROW = -1 THEN COMMENT FORST RQOW OF SP; 00273600
BEGIN SP[0,0].NEXT:=L:=1; K:=K-1 00273700
END ELSE 00273800
BEGIN SP[LOC].NEXT:=(OLDROW+1)|SPRSIZE; 00273900
L:=(OLDROW+1)|SPRSIZE; 00274000
END; 00274100
SP[LOC].LEN:=K; SP[LOC].NEXT:=0; 00274200
NEXTAREA:=L 00274300
END ELSE L:=NEXTAREA; 00274400
LINK:=SP[LOC]; 00274500
K:=LINK.LEN-LENGTH; 00274600
IF K LSS 0 THEN COMMENT NOT ENOUGH ROOM; 00274700
BEGIN L:=LASTAREA:=NEXTAREA; 00274800
NEXTAREA:=LINK.NEXT 00274900
END; 00275000
END UNTIL K GEQ 0; 00275100
IF K GTR 0 THEN 00275200
BEGIN ;L:=L+LENGTH; 00275300
SP[LOC]:=0; 00275400
SP[LOC].LEN:=K; SP[LOC].NEXT:=LINK.NEXT; 00275500
END ELSE L:=LINK.NEXT; 00275600
K:=L; L:=LASTAREA; 00275700
COMMENT ZERO OUT THE STORAGE BEFORE ALLOCATION; 00275800
SP[LOC].NEXT:=K; K:=NEXTAREA+LENGTH-1; 00275900
FOR L:=GETSPACE:=NEXTAREA STEP 1 UNTIL K DO SP[LOC]:=0; 00276000
IF FALSE THEN SPOVERFLOW: BEGIN 00276100
GETSPACE:=-1@10;ERR:=SPERROR END; 00276200
ENDGETSPACE: 00276300
END OF GETSPACE; 00276400
PROCEDURE FORGETSPACE(LOCATE,LENGTH); VALUE LOCATE,LENGTH; 00276500
INTEGER LOCATE,LENGTH; 00276600
BEGIN INTEGER L; 00276700
IF LENGTH GTR 0 THEN BEGIN 00276800
L:=LOCATE; 00276900
SP[LOC]:=SP[0,0]; 00277000
SP[LOC].LEN:=LENGTH; 00277100
SP[0,0]:=L; 00277200
END; 00277300
END; 00277400
INTEGER PROCEDURE BUILDNULL(LASTCONSTANT); 00277500
INTEGER LASTCONSTANT; 00277600
BEGIN REAL T, N; 00277700
IF NOT CURRENTMODE=FUNCMODE THEN 00277800
BEGIN 00277900
T:=0; 00278000
T.DID:=DDPNVW; 00278100
T.BACKP:=LASTCONSTANT; 00278200
LASTCONSTANT:=BUILDNULL:=N:=GETSPACE(1); 00278300
SP[NOC]:=T; 00278400
END; 00278500
END OF BUILDNULL; 00278600
00278700
INTEGER PROCEDURE BUILDCONSTANT(LASTCONSTANT); 00278800
INTEGER LASTCONSTANT; 00278900
BEGIN ARRAY A[0:MAXCONSTANT]; 00279000
INTEGER ATOP,L,K; 00279100
REAL AP; 00279200
DEFINE GS=GETSPACE#; 00279300
DO 00279400
A[ATOP:=ATOP+1]:=ACCUM[0] 00279500
UNTIL NOT SCAN OR NOT NUMERIC OR ATOP = MAXCONSTANT; 00279600
IF MAXCONSTANT=ATOP OR ERR NEQ 0 THEN COMMENT AN ERROR; 00279700
ELSE 00279800
00279900
IF ATOP=1 THEN COMMENT SCALAR FOUND; 00280000
BEGIN L:=K:=GS(1); 00280100
SP[LOC]:=A[1]; 00280200
BUILDCONSTANT:=L:=GETSPACE(1); 00280300
SP[LOC]:=K&DDPNSW[CDID]&LASTCONSTANT[CLOCF]; 00280400
LASTCONSTANT:=L; 00280500
END ELSE COMMENT VECTOR; 00280600
BEGIN L:=K:=GS(ATOP+1); 00280700
TRANSFERSP(INTO,SP,L+1,A,1,ATOP); 00280800
SP[LOC]:=ATOP; 00280900
BUILDCONSTANT:=L:=GS(1); %VECTOR DESCRIPTOR 00281000
SP[LOC]:=K&1[CRF]&DDPNVW[CDID]&LASTCONSTANT[CLOCF]; 00281100
LASTCONSTANT:=L; 00281200
END 00281300
00281400
END; 00281500
OWN INTEGER OLDDATA,REALLYERROR; 00281600
INTEGER L,N,M; 00281700
OWN REAL ST,T,U; 00281800
LABEL EXECUTION,PROCESSEXIT; 00281900
DEFINE STLOC=ST.[30:11],ST.[41:7]#, 00282000
STMINUS=(ST-1).[30:11],(ST-1).[41:7]#, 00282100
AREG=SP[STLOC]#, 00282200
BREG=SP[STMINUS]#, 00282300
BACKPT=6:36:12#, 00282400
CI=18:36:12#, 00282500
SPTSP=30:30:18#, 00282600
PROGMKS=0#, 00282700
IMKS=2#, 00282800
FMKS=1#, 00282900
00283000
BACKF=[6:12]#, 00283100
CIF=[18:12]#, 00283200
ENDEF=#; 00283300
PROCEDURE PACK(L,OFFSET,N);VALUE L,OFFSET,N;INTEGER L,OFFSET,N; 00283400
FORWARD; 00283500
INTEGER PROCEDURE UNPACK(S,OFFSET,N);VALUE S,OFFSET,N; 00283600
INTEGER S,OFFSET,N; FORWARD; 00283700
PROCEDURE PUSH; 00283800
IF ST LSS STACKSIZE+STACKBASE THEN ST:=ST+1 ELSE 00283900
ERR:=DEPTHERROR; 00284000
PROCEDURE POP; 00284100
BEGIN REAL U; 00284200
IF ST GTR STACKBASE THEN 00284300
IF BOOLEAN((U:=AREG).NAMED)OR NOT BOOLEAN(U.PRESENCE) 00284400
THEN ST:=ST-1 ELSE 00284500
BEGIN COMMENT GET RID OF SP STORAGE FOR THIS VARIABLE; 00284600
IF U.SPF NEQ 0 AND BOOLEAN(U.DATADESC) THEN 00284700
SCRATCHDATA(U); 00284800
00284900
ST:=ST-1; 00285000
END 00285100
ELSE ERR:=SYSTEMERROR; 00285200
END; 00285300
REAL PROCEDURE GETARRAY(DESCRIPTOR); VALUE DESCRIPTOR; 00285400
REAL DESCRIPTOR; 00285500
BEGIN 00285600
INTEGER R,I,J,K,L,LL,TOTAL,PT; 00285700
REAL T; 00285800
ARRAY BLOCK[0:BLOCKSIZE],DIMVECTOR[0:32]; 00285900
%SEE MAXWORDSTORE, LINE 17260 00286000
00286100
T:=DESCRIPTOR; 00286200
IF (R:=DESCRIPTOR.RF=0) THEN T.DIMPTR:=0 00286300
ELSE BEGIN 00286400
I:=CONTENTS(WS,DESCRIPTOR.DIMPTR,DIMVECTOR); 00286500
TOTAL:=1; 00286600
FOR I:=0 STEP 1 UNTIL R-1 DO 00286700
TOTAL:=TOTAL|DIMVECTOR[I]; 00286800
IF DESCRIPTOR.ARRAYTYPE=CHARARRAY THEN 00286900
TOTAL:=ENTIER((TOTAL+7) DIV 8); 00287000
TOTAL:=TOTAL+R; 00287100
LL:=GETSPACE(TOTAL); 00287200
TRANSFERSP(INTO,SP,LL,DIMVECTOR,0,R); 00287300
L:=LL+R; 00287400
J:=CONTENTS(WS,DESCRIPTOR.INPTR,DIMVECTOR)-1; 00287500
GTA[0]:=0; 00287600
FOR I:=0 STEP 2 UNTIL J DO 00287700
BEGIN 00287800
TRANSFER(DIMVECTOR,I,GTA,6,2); 00287900
PT:=GTA[0]; 00288000
K:=CONTENTS(WS,PT,BLOCK); 00288100
TRANSFERSP(INTO,SP,L,BLOCK,0, 00288200
(K:=ENTIER((K+7)DIV 8))); 00288300
L:=L+K; 00288400
END; 00288500
T.DIMPTR:=L; 00288600
END; 00288700
T.INPTR:=0; 00288800
T.PRESENCE:=1; 00288900
GETARRAY:=T; 00289000
END; 00289100
INTEGER PROCEDURE FINDSIZE(D);VALUE D; REAL D; 00289200
BEGIN 00289300
INTEGER I,J,M,R; 00289400
J:=1; I:=D.SPF; R:=D.RF+I-1; 00289500
IF I NEQ 0 THEN 00289600
FOR M:=I STEP 1 UNTIL R DO J:=J|SP[MOC]; 00289700
FINDSIZE:=J; 00289800
END PROCEDURE FINDSIZE; 00289900
00290000
INTEGER PROCEDURE NUMELEMENTS(D); VALUE D; REAL D; 00290100
BEGIN 00290200
INTEGER I; 00290300
GT1:=I:=FINDSIZE(D); 00290400
IF D.ARRAYTYPE=CHARARRAY THEN 00290500
I:=ENTIER((I+7) DIV 8); 00290600
NUMELEMENTS:=I; 00290700
END; 00290800
PROCEDURE SCRATCHDATA(D); VALUE D; REAL D; 00290900
BEGIN 00291000
INTEGER T,R; 00291100
IF BOOLEAN(D.SCALAR) THEN T:=1 ELSE 00291200
IF R:=D.RF = 0 THEN T:=0 ELSE %BONAFIDE VECTOR 00291300
BEGIN T:=NUMELEMENTS(D)+R; 00291400
00291500
END; 00291600
IF T NEQ 0 THEN FORGETSPACE(D.SPF,T); 00291700
END; 00291800
COMMENT RELEASEARRAY HAS BEEN MOVED WOUT OF PROCESS SO THAT IT 00291900
CAN BE CALLED ELSEWHERE; 00292000
REAL PROCEDURE MOVEARRAY(SPDESC); VALUE SPDESC; 00292100
REAL SPDESC; 00292200
COMMENT MOVE THE ARRAY FROM SCRATCHPAD TO PERMANENT 00292300
STORAGE AND CONSTRUCT NEW DESCRIPTOR; 00292400
BEGIN 00292500
INTEGER TOTAL,R,J,M,K; 00292600
REAL T; 00292700
ARRAY BLOCK[0:BLOCKSIZE],BUFFER[0:32]; %SEE MAXWORDSTORE, LINE 1726000292800
T:=SPDESC; 00292900
TRANSFERSP(OUTOF,SP,SPDESC.SPF,BUFFER,0,R:=SPDESC.RF); 00293000
T.DIMPTR:=STORESEQ(WS,BUFFER,8|R); 00293100
TOTAL:=NUMELEMENTS(SPDESC); 00293200
M:=SPDESC.SPF+R; 00293300
K:=ENTIER(TOTAL DIV BLOCKSIZE)-1; 00293400
FOR J:=0 STEP 1 UNTIL K DO BEGIN 00293500
TRANSFERSP(OUTOF,SP,M,BLOCK,0,BLOCKSIZE); 00293600
R:=STORESEQ(WS,BLOCK,BLOCKSIZE|8); 00293700
TRANSFER(R,6,BUFFER,J|2,2); 00293800
M:=M+BLOCKSIZE; 00293900
END; 00294000
IF J:=TOTAL-(K:=K+1)|BLOCKSIZE GTR 0 THEN 00294100
BEGIN 00294200
TRANSFERSP(OUTOF,SP,M,BLOCK,0,J); %GET REMAINDER OF MATRIX 00294300
R:=STORESEQ(WS,BLOCK,J|8); 00294400
TRANSFER(R,6,BUFFER,K|2,2); 00294500
K:=K+1; 00294600
END; 00294700
T.INPTR:=STORESEQ(WS,BUFFER,K|K); 00294800
MOVEARRAY:=T; 00294900
END; 00295000
PROCEDURE WRITEBACK; 00295100
COMMENT COPY CHANGED VARIABLES INTO PREMANENT STORAGE; 00295200
BEGIN 00295300
INTEGER I,J,K,L,M,NUM; 00295400
REAL T; 00295500
ARRAY NEWDESC[0:1],OLDDESC [0:1]; 00295600
L:=SYMBASE; 00295700
NUM:=SP[LOC]-1; 00295800
L:=L-1; 00295900
FOR I:=1 STEP 2 UNTIL NUM DO BEGIN 00296000
L:=L+2; 00296100
IF ((T:=SP[LOC]).TYPEFIELD) NEQ FUNCTION THEN 00296200
IF BOOLEAN(T.CHANGE) THEN BEGIN 00296300
IF VARIABLES=0 THEN 00296400
00296500
BEGIN VARIABLES:=NEXTUNIT; 00296600
T:=CURRENTMODE; 00296700
VARSIZE:=1; STOREPSR; 00296800
CURRENTMODE:=T; VARSIZE:=0; 00296900
END; 00297000
M:=L+1;WHILE(T:=SP[MOC]).BACKP NEQ 0 AND T.PRESENCE=1 00297100
AND(GT1:=GT1+1)LSS MAXMEMACCESSES DO M:=T.BACKP;GT1:=0; 00297200
GTA[0]:=SP[LOC];GTA[1]:=T; 00297300
TRANSFER(GTA,1,NEWDESC,0,7); 00297400
00297500
SETFIELD(NEWDESC,7,1, IF BOOLEAN(T.SCALAR) 00297600
THEN SCALARDATA ELSE ARRAYDATA); 00297700
MOVE(NEWDESC,1,OLDDESC); K:=1; 00297800
IF (IF VARSIZE=0 THEN FALSE ELSE 00297900
K:=SEARCHORD(VARIABLES,NEWDESC,J,7)=0) 00298000
THEN BEGIN 00298100
K:=CONTENTS(VARIABLES,J,OLDDESC); 00298200
DELETE1(VARIABLES,J); 00298300
IF GETFIELD(OLDDESC,7,1)=ARRAYDATA THEN 00298400
RELEASEARRAY(OLDDESC[1]); 00298500
END ELSE 00298600
BEGIN VARSIZE:=VARSIZE+1; J:=J+K-1; 00298700
MOVE(OLDDESC,1,NEWDESC); 00298800
END; 00298900
SETFIELD(NEWDESC,7,1,IF BOOLEAN(T.SCALAR) 00299000
THEN SCALARDATA ELSE ARRAYDATA); 00299100
IF BOOLEAN(T.SCALAR) THEN 00299200
BEGIN M:=T.SPF; 00299300
NEWDESC[1]:=SP[MOC]; 00299400
END ELSE %A VECTEOR 00299500
BEGIN T.PRESENCE:=0; 00299600
NEWDESC[1]:=(IF T.RF NEQ 0 THEN 00299700
MOVEARRAY(T) ELSE T) 00299800
END; 00299900
STOREORD(VARIABLES,NEWDESC,J); 00300000
00300100
END; 00300200
END; 00300300
END; 00300400
PROCEDURE SPCOPY(S,D,N);VALUE S,D,N;INTEGER S,D,N; 00300500
BEGIN 00300600
INTEGER K; 00300700
WHILE (N:=N-K) GTR 0 DO 00300800
TRANSFERSP(INTO,SP,(D:=D+K),SP[(S:=S+K)DIV SPRSIZE,*], 00300900
K:=S MOD SPRSIZE,K:=MIN(N,SPRSIZE-K)); 00301000
END; 00301100
INTEGER PROCEDURE CHAIN(D,CHAINLOC); VALUE D,CHAINLOC; 00301200
INTEGER CHAINLOC; REAL D; 00301300
BEGIN 00301400
INTEGER M; 00301500
CHAIN:=M:=GETSPACE(1); 00301600
D.LOCFIELD:=CHAINLOC; 00301700
SP[MOC]:=D; 00301800
END; 00301900
PROCEDURE SCRATCHAIN(L); VALUE L; INTEGER L; 00302000
BEGIN 00302100
REAL R; 00302200
WHILE L NEQ 0 DO BEGIN 00302300
SCRATCHDATA(R:=SP[LOC]); 00302400
FORGETSPACE(L,1); 00302500
IF L=R.LOCFIELD THEN L:=0 ELSE 00302600
L:=R.LOCFIELD; 00302700
END; 00302800
END; 00302900
PROCEDURE RESTORELOCALS(FPTR);VALUE FPTR;REAL FPTR; 00303000
BEGIN 00303100
INTEGER L,M,N,I,K,FLOC; 00303200
REAL T; 00303300
M:=FPTR.LOCFIELD; 00303400
L:=FPTR.SPF+2;K:=SP[LOC]-2;%LAST ALPHA POINTER 00303500
T:=L+4; 00303600
FOR I:=T STEP 2 UNTIL K DO % ONCE FOR EACH LOCAL 00303700
BEGIN 00303800
M:=M+1;N:=SP[MOC].SPF; %LOCATION IN SYMBOL TABLE 00303900
T:=SP[NOC];L:=T.BACKP;T.BACKP:=0;T.NAMED:=0; 00304000
SP[MOC]:=T;%COPY OF DESCRIPTOR TO STACK 00304100
IF L=0 THEN 00304200
BEGIN N:=N-1; GTA[0]:=SP[NOC]; 00304300
TRANSFER(GTA,1,ACCUM,2,7); OPERANDTOSYMTAB(N); 00304400
END 00304500
ELSE BEGIN SP[NOC]:=SP[LOC];FORGETSPACE(L,1);END; 00304600
END; 00304700
END; % OF PROCEDURE RESTORELOCALS 00304800
OWN INTEGER FUNCLOC,POLLOC,LASTMKS,POLTOP,CINDEX; 00304900
PROCEDURE STEPLINE(LABELED); VALUE LABELED; 00305000
BOOLEAN LABELED; 00305100
00305200
BEGIN 00305300
LABEL ENDFUNC,TERMINATE,DONE; 00305400
LABEL BUMPLINE; 00305500
LABEL TRYNEXT; 00305600
REAL STREAM PROCEDURE CON(A); VALUE A; 00305700
BEGIN SI:=LOC A; DI:=LOC CON; DS:=8DEC; 00305800
END; 00305900
INTEGER C; 00306000
REAL N,T,L,TLAST,M,BASE; 00306100
COMMENT 00306200
MONITOR PRINT (FUNCLOC,POLLOC,LASTMKS,POLTOP,CINDEX,N,T,L, 00306300
TLAST,M,BASE); 00306400
L:=FUNCLOC;M:=SP[LOC].SPF+L; 00306500
IF BOOLEAN(SP[MOC].SUSPENDED) THEN 00306600
BEGIN %RESUME A SUSPENDED FUNCTI+ON 00306700
SP[MOC].SUSPENDED:=0;%REMOVE SUSPENDED BIT 00306800
RESTORELOCALS(SP[MOC]); 00306900
SP[LOC].RF:=N:=SP[LOC].RF-1; 00307000
IF N LEQ 0 THEN SUSPENSION:=0;% NO MORE SUSPENDED FNS 00307100
END; 00307200
IF LABELED THEN %MAKE INITIAL CHECKS AND CHANGES; 00307300
BEGIN 00307400
IF NOT BOOLEAN((T:=AREG).PRESENCE) OR L:=T.SPF=0 00307500
THEN 00307600
BEGIN LABELED:=FALSE; GO TO BUMPLINE; 00307700
END; 00307800
IF BOOLEAN (T.CHRMODE) THEN GO TO TERMINATE; 00307900
L:=L+T.RF; %PICK UP THE FIRST ELEMENT OF THE ARRAY 00308000
IF T:=SP[LOC] GTR 9999.99994 OR T LSS 0 THEN 00308100
T:=0; 00308200
T:=CON(ENTIER(T|10000+.5)) 00308300
END; BUMPLINE: 00308400
L:=LASTMKS; TLAST:=SP[LOC].BACKF; 00308500
C:=(LASTMKS:=SP[MOC].LOCFIELD)-STACKBASE;%LOC OF FMKS 00308600
WHILE TLAST GTR C DO %STRIP OFF CURRENT LINE 00308700
BEGIN L:=TLAST+STACKBASE;TLAST:=(N:=SP[LOC]).BACKF; 00308800
IF N.DID=IMKS THEN SCRATCHAIN(N.SPF); 00308900
END; 00309000
WHILE ST GEQ L AND ERR=0 DO POP; 00309100
IF ERR NEQ 0 THEN GO TO DONE; 00309200
M:=BASE:=SP[MOC].SPF;%LOC OF LABEL TABLE 00309300
TRYNEXT: 00309400
N:=SP[MOC]+M+1; % N IS ONE BUIGGER THAN TOP 00309500
M:=M+2; M:=SP[MOC]+2; % M IS ON THE FIRST POINTER 00309600
IF LABELED THEN %BINARY SEARCH FOR THE DESIRED LINE 00309700
BEGIN 00309800
IF N-M LSS 2 THEN GO TO ENDFUNC; 00309900
WHILE N-M GTR 2 AND C LSS 1@8 DO 00310000
00310100
BEGIN L:=M+ENTIER((N-M)DIV 4)|2; C:=C+1; 00310200
IF T LSS SP[LOC] THEN N:=L ELSE M:=L 00310300
END; 00310400
IF C=1@8 THEN GO TO TERMINATE; 00310500
IF SP[MOC] NEQ T THEN GO ENDFUNC; T:=M; 00310600
%T HAS THE SP LOCATION OF THE CORRECT LABEL 00310700
END ELSE %BUMP THE POINTER 00310800
IF T:=CURLINE+2+BASE GEQ N OR T LSS M THEN GO ENDFUNC; 00310900
M:=T+1; CURLINE:=T-BASE; %M IS SET TO PROG DESC 00311000
IF NOT BOOLEAN((T:=SP[MOC]).PRESENCE) THEN %MAKE POLISH 00311100
BEGIN N:=BASE+1;N:=SP[NOC].SPF;%SEQ STORAGE UNIT 00311200
INITBUFF(BUFFER,BUFFSIZE); 00311300
N:=CONTENTS(N,T,BUFFER); %GET TEXT 00311400
RESCANLINE; WHILE LABELSCAN(GTA,0) DO; %CLEAR LABELS 00311500
IF BOOLEAN(EOB) THEN % AN EMPTY LINE--BUMP POINTER 00311600
BEGIN M:=BASE;LABELED:=FALSE;GO TO TRYNEXT;END ELSE 00311700
IF T:=ANALYZE(TRUE)=0 THEN % NO GOOD 00311800
GO TO DONE; 00311900
SP[MOC]:=T; %SAVE THE POLISH DESCRIPTOR AT M 00312000
END; 00312100
PUSH; IF ERR NEQ 0 THEN GO TO DONE; 00312200
AREG:=(L:=ENTIER(M))&1[CCIF]&TLAST[BACKPT]; 00312300
LASTMKS:=ST; 00312400
POLLOC:=SP[LOC].SPF; 00312500
L:=T.SPF; POLTOP:=SP[LOC]; CINDEX:=1; 00312600
GO TO DONE; 00312700
ENDFUNC: 00312800
%ARRIVE HERE WHEN FUNCTION IS COMPLETED. 00312900
%GET RESULT OF FUNCTION 00313000
M:=FUNCLOC;M:=SP[MOC].SPF+M;N:=TLAST:=SP[MOC].LOCFIELD; 00313100
M:=SP[NOC].SPF;M:=SP[MOC]; 00313200
COMMENT I CANNOT CONJURE UP A CASE WHERE A USER RETURNS TO A 00313300
FUNCTION WHOSE DESCRIPTOR HAS BEEN PUSHED DOWN BY A SUSPENDED 00313400
VARIABLE.IF THIS HAPPENS-HOPE FOR A GRACEFUL CRASH; 00313500
%M IS THE DESCRIPTOR FOR THE FUNCTION, TLAST IS BASE ADDRESS 00313600
00313700
IF BOOLEAN(M.RETURNVALUE) THEN %GET THE RESULT 00313800
BEGIN 00313900
N:=M.SPF+5;%RELATIVE LOCATION OF RESULT 00314000
N:=SP[NOC]+TLAST; %LOCATION IN STACK OF RESKLULT 00314100
T:=SP[NOC]; SP[NOC].NAMED:=1; N:=T; 00314200
END; 00314300
WHILE ST GEQ TLAST AND ERR=0 DO POP; %GET RID OF TEMPS 00314400
OLDDATA:=(T:=AREG).SPF; POP;% GET RID OF INTERRUPT MKS 00314500
IF ERR NEQ 0 THEN GO TO DONE; 00314600
IF BOOLEAN(M.RETURNVALUE) THEN %REPLACE RESULT 00314700
BEGIN PUSH; IF ERR NEQ 0 THEN GO TO DONE; 00314800
AREG:=N; %RESULT OF CALL 00314900
END; 00315000
L:=STACKBASE+1;L:=SP[LOC].SPF;M:=SP[LOC].SPF+L; 00315100
00315200
SP[MOC]:=0;SP[LOC].SPF:=(M:=M-1)-L; 00315300
COMMENT NOW INITIATE ANY OLD FUNCTIONS, AND GET POLISH 00315400
GOING; 00315500
LASTMKS:=N:=T.BACKF+STACKBASE; %LOCATION OF PROGRAM DESC. 00315600
T:=SP[NOC]; % PICK UP PROGRAM DESCRIPTOR 00315700
N:=T.SPF; %LOCATION OF POLISH DESCRIPTOR 00315800
POLLOC:=(N:=SP[NOC].SPF); 00315900
POLTOP:=SP[NOC]; 00316000
CINDEX:=T.CIF; 00316100
IF M NEQ L THEN % GET LAST FUNCTION STARTED 00316200
BEGIN N:=SP[MOC].LOCFIELD; 00316300
T:=SP[NOC]; 00316400
CURLINE:=T.CIF 00316500
END ELSE CURLINE:=0; 00316600
GO TO DONE; 00316700
TERMINATE: 00316800
ERR:=LABELERROR; 00316900
DONE: 00317000
END; 00317100
00317200
PROCEDURE FIXTAKEORDROP(LDESC,RDESC,OPT,MAP,SIZEMAP,SIZE); 00317300
VALUE LDESC,RDESC,OPT; REAL LDESC,RDESC; 00317400
INTEGER OPT, SIZE; ARRAY MAP, SIZEMAP[1]; 00317500
BEGIN INTEGER LRANK,LSIZE,L,M,RRANK,N,I,TOP,PUT; 00317600
DEFINE TAKE = OPT = 2#; 00317700
INTEGER LNUM, RNUM; LABEL QUIT; 00317800
IF LSIZE := FINDSIZE(LDESC) NEQ RRANK := RDESC.RF AND LSIZE NEQ 1 00317900
OR LRANK:=LDESC.RF GTR 1 AND LSIZE NEQ 1 00318000
OR L := LDESC.SPF=0 00318100
OR M := RDESC.SPF = 0 THEN BEGIN 00318200
ERR:=DOMAINERROR; GO TO QUIT; END; 00318300
L := L + LRANK; 00318400
00318500
SIZE := 1; 00318600
FOR I := 1 STEP 1 UNTIL RRANK DO BEGIN 00318700
RNUM:=SP[MOC]; 00318800
LNUM:=IF TAKE THEN SP[LOC] ELSE (PUT:=SP[LOC])-SIGN(PUT)|RNUM; 00318900
IF ABS(LNUM) GTR RNUM THEN BEGIN 00319000
ERR:=DOMAINERROR; GO TO QUIT; END; 00319100
IF LNUM = 0 THEN BEGIN 00319200
SIZE := 0; GO TO QUIT; END; 00319300
IF LNUM = 0 THEN BEGIN 00319400
SIZEMAP[1] := LNUM; 00319500
MAP[I] . SPF := 0; 00319600
MAP[I] . RF := 1; 00319700
END ELSE BEGIN 00319800
LNUM:=ABS(LNUM); 00319900
PUT := RNUM - LNUM +ORIGIN; 00320000
MAP[I].SPF := N := GETSPACE(LNUM+1); 00320100
SIZEMAP[I] := SP[NOC] := LNUM; 00320200
TOP := N + LNUM; 00320300
FOR N:=N+1 STEP 1 UNTIL TOP DO BEGIN 00320400
SP[NOC]:=PUT; PUT:=PUT+1; END; 00320500
MAP[I].RF := 1; 00320600
MAP[I] := - MAP[I]; 00320700
END; 00320800
IF LSIZE NEQ 1 THEN L:=L+1; 00320900
M:=M+1; 00321000
SIZE:=SIZE | LNUM; 00321100
END; 00321200
QUIT: END PROCEDURE FIXTAKEORDROP; 00321300
REAL PROCEDURE SUBSCRIPTS(DIRECTION,D,RANK); 00321400
VALUE DIRECTION,D,RANK; REAL D,RANK; INTEGER DIRECTION; 00321500
BEGIN COMMENT THIS PROCEDURE EVALUATES A SET OF SUBSCRIPTS 00321600
,POPS THEM OFF THE STACK, AND RESTURNS WITH A DESC. 00321700
FOR THE ITEM REFERENCED; 00321800
LABEL GOHOME,DONE; 00321900
INTEGER SIZE,I,L,M,N,VALUW; 00322000
INTEGER ADDRESS,NOTSCAL,DIM,LEVEL,TEMP,K,J; 00322100
REAL SUBDESC,T; 00322200
BOOLEAN DCHARS; 00322300
STREAM PROCEDURE TCHAR(A,B,C,D);VALUE B,D; 00322400
BEGIN SI:=A;SI:=SI+B;DI:=C;DI:=DI+D;DS:=CHR;END; 00322500
ARRAY MAP[1:RANK],SIZEMAP[1:RANK]; 00322600
ARRAY BLOCKSIZE[1:RANK],POINTER[0:RANK],PROGRESS[1:RANK]; 00322700
INTEGER PROCEDURE SUBINDEX(M,S,P);VALUE M,S,P;REAL M,S,P; 00322800
IF M LSS 0 THEN BEGIN M:=-M; 00322900
M:=P+M.SPF+M.RF-1;SUBINDEX:=SP[MOC]-ORIGIN;END 00323000
ELSE SUBINDEX:=(IF S=1 THEN M.SPF ELSE M.SPF+P-1); 00323100
COMMENT 00323200
MONITOR PRINT(I,L,M,N,VALUE,ADDRESS,T,ERR,MAP,SIZEMAP, 00323300
SIZE,D,RANK,DIRECTION); 00323400
DCHARS:=BOOLEAN(D.CHRMODE); 00323500
IF DIRECTION GTR 1 THEN % THIS IS A TAKE OR DROP 00323600
BEGIN 00323700
NOTSCAL:=1; 00323800
FIXTAKEORDROP(AREG,BREG,DIRECTION,MAP,SIZEMAP,SIZE); 00323900
IF ERR NEQ 0 THEN GO TO GOHOME; 00324000
IF SIZE=0 THEN BEGIN D.DID:=DDPUVW; D.RF:=1; 00324100
D.SPF:=0; SUBSCRIPTS:=D; GO TO GOHOME; END; 00324200
%IF SIZE=0 AND TAKE OR DROP, RESULT IS A NULL 00324300
END ELSE BEGIN 00324400
IF RANK NEQ D.RF THEN BEGIN ERR:=RANKERROR;GO TO GOHOME;END; 00324500
SIZE:=1; 00324600
N:=D.SPF-1; 00324700
L:=ST-1; % LOCATE THE EXECUTION STACK 00324800
FOR I:=1 STEP 1 UNTIL RANK DO 00324900
BEGIN 00325000
L:=L-1; SUBDESC:=SP[LOC]; % WANDER INTO EXEC STACK 00325100
IF ERR NEQ 0 THEN GO TO GOHOME; 00325200
N:=N+1; 00325300
IF BOOLEAN(SUBDESC.SCALAR) THEN 00325400
BEGIN M:=SUBDESC.SPF; 00325500
IF (VALUW:=SP[MOC]-ORIGIN) GEQ SP[NOC] 00325600
OR VALUW LSS 0 THEN BEGIN ERR:=INDEXERROR;GO TO 00325700
GOHOME; END; 00325800
MAP[I]:=VALUW; SIZEMAP[I]:=1; 00325900
END ELSE % CHECK FOR A NULL 00326000
IF SUBDESC.SPF=0 THEN % THIS IS A NULL 00326100
BEGIN 00326200
NOTSCAL:=1; 00326300
SIZE:=SIZE|(M:=SP[NOC]); 00326400
MAP[I].RF:=1;SIZEMAP[I]:=M; 00326500
END ELSE % IT MUST BE A VECTOR 00326600
BEGIN DEFINE STARTSEGMENT=#; %////////////////////////// 00326700
00326800
00326900
NOTSCAL:= 1; 00327000
MAP[I]:=-((M:=SUBDESC.SPF)&SUBDESC.RF[CRF]); 00327100
SIZE:=SIZE|(SIZEMAP[I]:=FINDSIZE(SUBDESC)); 00327200
J:=SP[NOC]+ORIGIN;M:=M+SUBDESC.RF;T:=SIZEMAP[I]+M 00327300
-1; 00327400
FOR M:=M STEP 1 UNTIL T DO 00327500
IF SP[MOC] GEQ J OR SP[MOC] LSS ORIGIN THEN 00327600
BEGIN ERR:=INDEXERROR; GO TO GOHOME; END; 00327700
END; 00327800
END; % OF THE FOR STATEMENT 00327900
END; 00328000
IF SIZE LEQ 0 THEN BEGIN ERR:=INDEXERROR;GO TO GOHOME;END; 00328100
IF SIZE=1 AND NOT BOOLEAN(NOTSCAL) THEN %SCALAR REFERENCED 00328200
BEGIN 00328300
DEFINE STARTSEGMENT=#; %//////////////////////////////// 00328400
N:=D.SPF; M:=RANK-1; 00328500
FOR I:=1 STEP 1 UNTIL M DO 00328600
BEGIN N:= N+1; 00328700
ADDRESS:=SP[NOC]|(ADDRESS+MAP[I]); 00328800
END; 00328900
ADDRESS:=ADDRESS+MAP[RANK] +1; 00329000
IF DIRECTION=OUTOF THEN 00329100
IF DCHARS THEN BEGIN 00329200
N:=(ADDRESS+7)DIV 8+N;J:=(ADDRESS-1)MOD 8; 00329300
T:=M:=GETSPACE(2);SP[MOC]:=1;M:=M+1; 00329400
SP[MOC]:=0; TCHAR(SP[NOC],J,SP[MOC],0); 00329500
SUBSCRIPTS:=T&1[CRF]&DDPUVC[CDID]; 00329600
END ELSE 00329700
BEGIN N:= ADDRESS+N; 00329800
M:=GETSPACE(1);SP[MOC]:=SP[NOC]; 00329900
T:=M; T.DID:=DDPUSW; 00330000
SUBSCRIPTS:=T; 00330100
END ELSE % DIRECTION IS INTO 00330200
BEGIN 00330300
L:=L-1;SUBSCRIPTS:=SUBDESC:=SP[LOC]; 00330400
IF DCHARS AND FINDSIZE(SUBDESC)=1 OR 00330500
BOOLEAN(SUBDESC.SCALAR) THEN 00330600
BEGIN 00330700
L:=GETSPACE(N:=(NUMELEMENTS(D)+D.RF)); 00330800
SPCOPY(D.SPF,L,N); % MAKE A NEW COPY 00330900
IF DCHARS THEN BEGIN 00331000
N:=(ADDRESS+7)DIV 8+L;J:=(ADDRESS-1)MOD 8; 00331100
M:=SUBDESC.SPF;IF SP[MOC] GTR 1 OR SUBDESC.RF 00331200
NEQ 1 THEN BEGIN ERR:=DOMAINERROR;GO TO 00331300
GOHOME;END; 00331400
M:=M+1;TCHAR(SP[MOC],0,SP[NOC],J); 00331500
END ELSE BEGIN 00331600
M:=L+ADDRESS+D.RF-1; 00331700
N:=SUBDESC.SPF; 00331800
SP[MOC]:=SP[NOC]; %PERFORM THE REPLACEMENT 00331900
END; 00332000
N:=D.LOCFIELD;I:=SP[NOC].BACKP; 00332100
SP[NOC]:=D&L[CSPF]&I[CLOCF];%STORE NEW DESC 00332200
OLDDATA:=CHAIN(D,OLDDATA); 00332300
IF BOOLEAN(D.NAMED) THEN BEGIN 00332400
N:=N-1;IF I=0 AND SP[NOC].SUSPENDVAR=0 00332500
THEN SP[NOC].CHANGE:=1%MUST BE A REAL GLOBAL 00332600
END ELSE %MUST BE A LOCAL VARIABLE 00332700
AREG.NAMED:=1; %DONT LET IT BE FORGOTTEN 00332800
END ELSE ERR:=RANKERROR; 00332900
END; 00333000
END ELSE % A VECTOR IS REFERENCED 00333100
BEGIN % START WITH INITIALIZATION 00333200
N:=D.SPF+D.RF;BLOCKSIZE[RANK]:=PROGRESS[RANK]:=J:=1; 00333300
FOR I:=RANK-1 STEP -1 UNTIL 1 DO 00333400
BEGIN N:=N-1; 00333500
J:=BLOCKSIZE[I]:=J|SP[NOC]; 00333600
PROGRESS[I]:=1; 00333700
END; 00333800
K:=POINTER[1]:=SUBINDEX(MAP[1],SIZEMAP[1],PROGRESS[1]) 00333900
|BLOCKSIZE[1]; 00334000
FOR I:=2 STEP 1 UNTIL RANK DO 00334100
K:=POINTER[I]:=K+SUBINDEX(MAP[I],SIZEMAP[I], 00334200
PROGRESS[I])|BLOCKSIZE[I]; 00334300
DIM:=0; 00334400
FOR I:=1 STEP 1 UNTIL RANK DO 00334500
IF SIZEMAP[I] GTR 1 THEN DIM:=DIM+MAP[I].RF; 00334600
IF DCHARS THEN BEGIN TEMP:=D; D.SPF:=UNPACK(D.SPF, 00334700
RANK,FINDSIZE(D)); IF DIM=0 THEN DIM:=1; END; 00334800
IF DIRECTION GTR 0 THEN % OUTOF..TAKE.. OR DROP 00334900
BEGIN DEFINE STARTSEGMENT=#; %////////////////////////// 00335000
IF SIZE+DIM GTR MAXWORDSTORE THEN BEGIN ERR:=KITEERROR; GO TO 00335100
GOHOME END ELSE TEMP:=L:=GETSPACE(SIZE+DIM); %RPOOM FOR RESULT 00335200
IF DIM GTR 0 THEN 00335300
IF DIM=1 THEN BEGIN SP[LOC]:=SIZE; L:=L+1;END 00335400
ELSE FOR I:=1 STEP 1 UNTIL RANK DO 00335500
IF SIZEMAP[I] GTR 1 THEN 00335600
IF (M:=MAP[I].SPF)=0 THEN BEGIN SP[LOC]:= 00335700
SIZEMAP[I];L:=L+1;END ELSE 00335800
BEGIN N:=M+MAP[I].RF-1; 00335900
00336000
FOR M:=M STEP 1 UNTIL N DO BEGIN 00336100
SP[LOC]:=SP[MOC];L:=L+1;END; 00336200
END; 00336300
COMMENT THIS INITIALIZES RESULT DIM VECTOR; 00336400
ADDRESS:= D.SPF+D.RF; 00336500
END ELSE % DIRECTION IS INTO 00336600
BEGIN DEFINE STARTSEGMENT=#; %///////////////// 00336700
L:=L-1; SUBSCRIPTS:=SUBDESC:=SP[LOC]; 00336800
IF FINDSIZE(SUBDESC) NEQ SIZE THEN 00336900
BEGIN ERR:=RANKERROR; GO TO GOHOME;END; 00337000
N:=SUBDESC.RF; 00337100
IF BOOLEAN(SUBDESC.CHRMODE) THEN SUBDESC.SPF:= 00337200
UNPACK(SUBDESC.SPF,N,FINDSIZE(SUBDESC)); 00337300
IF DCHARS THEN L:= D.SPF ELSE BEGIN 00337400
L:=GETSPACE(N:=(NUMELEMENTS(D)+D.RF)); 00337500
SPCOPY(D.SPF,L,N); % MAKE FRESH COPY TO PATCH INTO 00337600
END; 00337700
ADDRESS:=L+D.RF; % SP LOCATION TO STORE INTO 00337800
N:=D.LOCFIELD;I:=SP[NOC].BACKP; 00337900
SP[NOC]:=D&L[CSPF]&I[CLOCF];%STORE NEW DESC. 00338000
OLDDATA:=CHAIN(IF DCHARS THEN TEMP ELSE D,OLDDATA); 00338100
IF BOOLEAN(D.NAMED ) THEN BEGIN 00338200
N:=N-1;IF I=0 AND SP[NOC].SUSPENDVAR=0 00338300
THEN SP[NOC].CHANGE:=1%MUST BE A REAL GLOCAL 00338400
END ELSE %IT MUST BE A LOCAL VARIABLE 00338500
AREG.NAMED:=1;%DONT LET IT BE FORGOTTEN ON POP 00338600
L:=SUBDESC.SPF+SUBDESC.RF;%POINT TO SOURCE 00338700
END; 00338800
00338900
00339000
WHILE TRUE DO % RECURSIVE EVALUATION LOOP 00339100
BEGIN N:=POINTER[RANK]+ADDRESS; 00339200
LEVEL:=RANK; 00339300
IF DIRECTION GTR 0 THEN %OUTOF..TAKE..DROP 00339400
BEGIN SP[LOC]:=SP[NOC]; L:=L+1; 00339500
END ELSE BEGIN % INTO 00339600
SP[NOC]:= SP[LOC];L:=L+1; END; 00339700
WHILE PROGRESS[LEVEL]GEQ SIZEMAP[LEVEL] DO 00339800
BEGIN PROGRESS[LEVEL]:=1 ; %LOOK FOR MORE WORK 00339900
IF LEVEL:=LEVEL-1 LEQ 0 THEN GO TO DONE; 00340000
END; 00340100
COMMENT THERE IS MORE ON THIS LEVEL; 00340200
PROGRESS[LEVEL]:=PROGRESS[LEVEL]+1; 00340300
K:=POINTER[LEVEL]:=POINTER[LEVEL-1] +SUBINDEX( 00340400
MAP[LEVEL],SIZEMAP[LEVEL],PROGRESS[LEVEL])| 00340500
BLOCKSIZE[LEVEL];%POINTER[0] IS 0 00340600
FOR I:=LEVEL+1 STEP 1 UNTIL RANK DO 00340700
K:=POINTER[I]:=K+SUBINDEX(MAP[I],SIZEMAP[I], 00340800
PROGRESS[I])|BLOCKSIZE[I]; 00340900
END; % OF RECURSIVE EVALUATION LOOP 00341000
DONE: IF DIRECTION GTR 0 THEN % OUTOF TAKE OR DROP 00341100
IF DCHARS THEN BEGIN PACK(TEMP,DIM,SIZE); 00341200
FORGETSPACE(D.SPF,RANK+FINDSIZE(D)); 00341300
SUBSCRIPTS:=TEMP&DIM[CRF]&DDPUVC[CDID]; 00341400
END ELSE % THIS IS A NUMERIC VECTOR 00341500
IF DIM=0 THEN SUBSCRIPTS:=TEMP&DDPUSW[CDID] ELSE 00341600
SUBSCRIPTS:=TEMP&DIM[CRF]&DDPUVW[CDID] 00341700
ELSE % THE DIRECTION IS INTO 00341800
BEGIN IF BOOLEAN(SUBDESC.CHRMODE) THEN 00341900
FORGETSPACE(SUBDESC.SPF,FINDSIZE(SUBDESC)+1); 00342000
IF DCHARS THEN PACK(D.SPF,RANK,FINDSIZE(D)); 00342100
END; 00342200
00342300
END; 00342400
GOHOME: IF DIRECTION GTR 1 THEN 00342500
FOR I:=1 STEP 1 UNTIL RANK DO 00342600
IF MAP[I] LSS 0 THEN FORGETSPACE(MAP[I].SPF,SIZEMAP[I]+1); 00342700
END; % OF SUBSCRIPTS PROCEDURE 00342800
PROCEDURE IMS(N); VALUE N; INTEGER N; 00342900
BEGIN COMMENT N=0 FOR REGULAR INTERRUPT MKS 00343000
N=1 FOR QQUAD INTERRUPT MKS 00343100
N=2 FOR QUAD INTERRUPT MKS 00343200
N=3 FOR EXECUTION LINE FOLLOWING 00343300
N=4 FOR SUSPENDED FUNCTION; 00343400
INTEGER L,M; 00343500
00343600
PUSH;AREG:=OLDDATA&(LASTMKS-STACKBASE) 00343700
[BACKPT]&N[QUADINV]&IMKS[CDID]; 00343800
IF N NEQ 4 THEN BEGIN L:=LASTMKS;SP[LOC].CIF:=CINDEX;END; 00343900
L:=STACKBASE+1;L:=SP[LOC].SPF +1; 00344000
IF (M:=SP[LOC].SPF) NEQ 0 THEN % SAVE CURLINE 00344100
BEGIN L:=L+M; L:=SP[LOC].LOCFIELD; 00344200
SP[LOC].CIF:=CURLINE; 00344300
END; 00344400
LASTMKS:=ST; 00344500
END; 00344600
PROCEDURE DISPLAYCHARV(D); VALUE D; REAL D; 00344700
BEGIN INTEGER I,J,K,L,M,NWORDS,NJ,T,NMAT,II,JJ,WDLINE,F,CC; 00344800
COMMENT WDLINE=#WORDS NEEDED TO FILL A TELETYPE LINE 00344900
NWORDS=#WORDS NEEDED TO GET F CHARACTERS FOR LAST 00345000
TELETYPE LINE OF A ROW 00345100
F=#CHARACTERS IN LAST TELETYPE LINE OF A ROW 00345200
T=#TELETYPE LINES NEEDED PER ROW BEYOND FIRST LINE 00345300
NMAT=#MATRICES TO BE PRINTED OUT (1 IF RANK=2); 00345400
L := (T:=D.SPF) + (NJ:=D.RF) - 1; 00345500
J := SP[LOC]; %J IS NUMBER OF CHARACTERS PER ROW 00345600
IF NJ GTR 1 THEN BEGIN 00345700
L:=L-1; K:=SP[LOC] 00345800
END ELSE K := 1; %K IS NUMBER OF ROWS PER MATRIX 00345900
00346000
L := T + NJ; 00346100
NMAT := FINDSIZE(D) DIV (J|K); 00346200
WDLINE := (LINESIZE+6) DIV 8 + 1; 00346300
IF II:=J-LINESIZE GTR 0 THEN BEGIN 00346400
T:= II DIV (I:=LINESIZE-2)+(IF II MOD I=0 THEN 0 ELSE 1); 00346500
NWORDS:=((F:=II-(T-1)|I)+6) DIV 8 + 1; 00346600
END ELSE BEGIN NWORDS:=((F:=J)+6)DIV 8 + 1; T:=0; END; 00346700
FOR II:=1 STEP 1 UNTIL NMAT DO BEGIN 00346800
FOR I:=1 STEP 1 UNTIL K DO BEGIN 00346900
CC:=0; 00347000
FOR JJ:=1 STEP 1 UNTIL T DO BEGIN 00347100
TRANSFERSP(OUTOF,SP,L+M DIV 8,BUFFER,0,WDLINE); 00347200
FORMROW(3,CC,BUFFER,ENTIER(M MOD 8),NJ:=LINESIZE-CC); 00347300
M := M + NJ; CC := 2; END; 00347400
IF I=K AND II=NMAT THEN IF L+M DIV 8 + NWORDS GTR 00347500
(1+NROWS)|SPRSIZE THEN NWORDS:=NWORDS-1; 00347600
%TO TAKE CARE OF BEING AT THE END OF SP 00347700
TRANSFERSP(OUTOF,SP,L+M DIV 8, BUFFER,0,NWORDS); 00347800
FORMROW(3,CC,BUFFER,ENTIER(M MOD 8), F); 00347900
M := M + F; 00348000
END; 00348100
FORMWD(3,"1 "); 00348200
END; 00348300
END OF CHARACTER DISPLAY PROCEDURE; 00348400
REAL PROCEDURE SEMICOL; 00348500
BEGIN COMMENT FORM CHAR STRING FROM TWO DESCRIPTORS; 00348600
INTEGER J,K,L; 00348700
REAL LD, RD; 00348800
STREAM PROCEDURE BLANKS(B,J,K);VALUE J,K; 00348900
BEGIN LOCAL T,U; 00349000
SI:=LOC K; DI:=LOC U; DI:=DI+1; DS:=7 CHR; 00349100
SI:=LOC J; DI:=LOC T; DI:=DI+1; DS:=7 CHR; 00349200
DI:=B; U(2(DI:=DI+32));; DI:= DI+K; 00349300
T(2(DS:=32 LIT " "));J(DS:=1 LIT " "); 00349400
END; 00349500
PROCEDURE MOVEC(J,L,K);VALUE J,L,K; INTEGER J,L,K; 00349600
BEGIN INTEGER I; 00349700
IF(J+K+8) GTR MAXBUFFSIZE|8 THEN ERR:=LENGTHERROR ELSE 00349800
BEGIN TRANSFERSP(OUTOF,SP,L,BUFFER,ENTIER((J+7)DIV 8), 00349900
ENTIER((K+7) DIV 8)); 00350000
IF I:=(J MOD 8) NEQ 0 THEN TRANSFER(BUFFER,J+8-I, 00350100
BUFFER,J,K); END; 00350200
END; 00350300
INTEGER PROCEDURE MOVEN(J,L,K);VALUE J,L,K;INTEGER J,L,K; 00350400
BEGIN INTEGER I;K:=K+L-1; I:=MAXBUFFSIZE|8; 00350500
BLANKS(BUFFER,I-J,J); 00350600
FOR L:= L STEP 1 UNTIL K DO 00350700
BEGIN NUMBERCON(SP[LOC],ACCUM); 00350800
TRANSFER(ACCUM,2,BUFFER,J:=J+1,ACOUNT); 00350900
IF (J:=J+ACOUNT)GTR I THEN BEGIN L:=K;ERR:=LENGTHERROR; 00351000
END;END; 00351100
MOVEN:=J; 00351200
END; 00351300
LD := AREG; RD := BREG; 00351400
IF L:=LD.RF GTR 1 THEN ERR:= RANKERROR ELSE 00351500
IF LD.SPF NEQ 0 THEN 00351600
IF BOOLEAN(LD.CHRMODE) THEN MOVEC(0,L+LD.SPF,J:=FINDSIZE 00351700
(LD))ELSE J:=MOVEN(0,L+LD.SPF,FINDSIZE(LD)); 00351800
IF L:=RD.RF GTR 1 OR ERR NEQ 0 THEN ERR:=RANKERROR ELSE 00351900
IF RD.SPF NEQ 0 THEN IF BOOLEAN(RD.CHRMODE) THEN 00352000
BEGIN MOVEC(J,L+RD.SPF,K:=FINDSIZE(RD));J:=J+K; 00352100
END ELSE J:=MOVEN(J,L+RD.SPF,FINDSIZE(RD)); 00352200
IF ERR=0 THEN 00352300
IF J=0 THEN SEMICOL:=NULLV ELSE 00352400
BEGIN L:=GETSPACE((K:=ENTIER((J+7)DIV 8))+1); 00352500
TRANSFERSP(INTO,SP,L+1,BUFFER,0,K); 00352600
SP[LOC]:=J; SEMICOL:=L&1[CRF]&DDPUVC[CDID]; 00352700
END; 00352800
00352900
END; 00353000
BOOLEAN PROCEDURE SETUPLINE; 00353100
BEGIN REAL T;INTEGER M; 00353200
IF T:=ANALYZE(FALSE) NEQ 0 THEN % WE HAVE A PROGRAM DESC 00353300
BEGIN IMS(3); 00353400
M:=GETSPACE(1); SP[MOC]:=T; 00353500
LASTMKS:=ST-STACKBASE; 00353600
PUSH; IF ERR=0 THEN 00353700
BEGIN AREG:=PROGMKS&LASTMKS[BACKPT]&1[CI]&M[SPTSP]; 00353800
POLLOC:=M:=T.SPF; POLTOP:=SP[MOC]; 00353900
LASTMKS:=LASTMKS+1+STACKBASE; CINDEX:=1; 00354000
END; 00354100
SETUPLINE:=TRUE; 00354200
END ELSE SETUPLINE:=FALSE; 00354300
END; 00354400
BOOLEAN PROCEDURE POPPROGRAM(OLDDATA,LASTMKS); 00354500
REAL OLDDATA,LASTMKS; 00354600
BEGIN LABEL EXIT;REAL L,M,N; 00354700
WHILE TRUE DO 00354800
BEGIN 00354900
WHILE(L:=AREG).DATADESC NEQ 0 AND ERR=0 DO POP; 00355000
IF L.DID=PROGMKS THEN 00355100
IF L=0 THEN %SOMETHING IS FUNNY...CONTINUE POPPING 00355200
POP 00355300
ELSE BEGIN 00355400
LASTMKS:=M:=L.BACKF+STACKBASE; 00355500
IF L.BACKF NEQ 0 AND NOT ((N:=SP[MOC]).DID=IMKS 00355600
AND N.QUADIN=4) THEN POPPROGRAM:=TRUE; 00355700
IF N.DID NEQ FMKS THEN 00355800
FORGETPROGRAM(L);POP;GO TO EXIT; 00355900
END ELSE %NOT A PROGRAM MKS 00356000
IF L.DID=FMKS THEN 00356100
BEGIN % MUST CUT BACK STATE VECTOR 00356200
M:=STACKBASE+1;M:=SP[MOC].SPF+1;N:=SP[MOC].SPF+M; 00356300
IF BOOLEAN(SP[NOC].SUSPENDED) THEN BEGIN SP[MOC].RF:=L:=00356400
SP[MOC].RF-1;IF L=0 THEN SUSPENSION:=0;END; 00356500
SP[NOC]:=0;SP[MOC].SPF:=N-M-1;POP; 00356600
END ELSE % NOT A FMKS EITHER 00356700
IF L.DID=IMKS THEN 00356800
BEGIN SCRATCHAIN(OLDDATA);OLDDATA:=L.SPF;POP;END; 00356900
IF ERR NEQ 0 THEN GO TO EXIT; 00357000
END; % OF THE DO 00357100
EXIT: END;%OF PROCEDURE POPPROGRAM 00357200
REAL PROCEDURE BUILDALPHA(LASTCONSTANT); 00357300
INTEGER LASTCONSTANT; 00357400
BEGIN 00357500
ARRAY B[0:BUFFSIZE]; 00357600
REAL R; 00357700
INTEGER L,N; 00357800
REAL STREAM PROCEDURE GETCHRS(ADDR,B); VALUE ADDR; 00357900
BEGIN LOCAL C1,C2,TDI,TSI,QM; 00358000
LOCAL ARROW; 00358100
LABEL L,DSONE,FINIS,ERR; 00358200
DI:=LOC QM; DS:=2RESET; DS:=2SET; 00358300
DI:=LOC ARROW; DS:=RESET; DS:=7SET; 00358400
DI:=B; DS:=8LIT"0"; 00358500
SI:=ADDR; 00358600
L: 00358700
IF SC=""" THEN % MAY BE DOUBLE QUOTE 00358800
BEGIN 00358900
SI:=SI+1; 00359000
IF SC=""" THEN % GET RID OF QUOTE 00359100
GO TO DSONE; 00359200
COMMENT ELSE WE ARE LOOKING PAST THE RH QUOTE; 00359300
GO TO FINIS; 00359400
END ELSE % LOOK FOR THE QUESTION MARK 00359500
BEGIN TDI:=DI; DI:=LOC QM; 00359600
IF SC=DC THEN % END OF BUFFER ENCOUNTERED 00359700
GO TO ERR; 00359800
SI:=SI-1; DI:=LOC ARROW; 00359900
IF SC=DC THEN %FOUND LEFT ARROW 00360000
GO TO ERR; 00360100
SI:=SI-1; DI:=TDI; GO TO DSONE 00360200
END; 00360300
DSONE: DS:=CHR; TALLY:=TALLY+1; 00360400
C2:=TALLY; TSI:=SI; SI:=LOC C2; SI:=SI+7; 00360500
IF SC="0" THEN 00360600
BEGIN TALLY:=C1; TALLY:=TALLY+1; C1:=TALLY; 00360700
TALLY:=0; 00360800
END; 00360900
SI:=TSI; 00361000
GO TO L; 00361100
FINIS: GETCHRS:=SI; 00361200
DI:=B; SI:=LOC C1; SI:=SI+1; DS:=7CHR; SI:=LOC C2; 00361300
SI:=SI+7; DS:=CHR; 00361400
ERR: 00361500
END; 00361600
IF R:=GETCHRS(ADDRESS,B) NEQ 0 THEN % GOT A VECTOR 00361700
IF NOT CURRENTMODE=FUNCMODE THEN 00361800
BEGIN ADDRESS:=R; 00361900
COMMENT B[0] HAS THE LENGTH OF THE STRING; 00362000
IF R:=B[0] GEQ 1 THEN COMMENT A VECTOR; 00362100
BEGIN 00362200
L:=GETSPACE(N:=(R-1)DIV 8+2); 00362300
TRANSFERSP(INTO,SP,L,B,0,N); 00362400
SP[LOC]:=R; 00362500
END; 00362600
N:=GETSPACE(1); 00362700
R:= L; 00362800
R.DID:=DDPNVC; 00362900
R.BACKP:=LASTCONSTANT; 00363000
LASTCONSTANT:=N; 00363100
IF B[0]=0 THEN R.DID:=DDPNVW %NULL BECAUSE .SPF=.RF=0 00363200
%DON"T WANT CHARACTER NULL TO LOOK LIKE CHARS 00363300
ELSE R.RF:=1; 00363400
SP[NOC]:=R; 00363500
COMMENT WE HAVE BUILT THE VECTOR AND DESCRIPTOR 00363600
BUILDALPHA:=N; 00363700
END 00363800
ELSE BEGIN BUILDALPHA:=1;ADDRESS:=R END; 00363900
%ELSE WE HAVE AN ERROR (MISSING " ETC.) 00364000
END; % OF THE BUILD ALPHA PROCEDURE; 00364100
PROCEDURE PACK(L,OFFSET,N); VALUE L,OFFSET,N; 00364200
INTEGER L,OFFSET,N; 00364300
BEGIN 00364400
LABEL QUIT; 00364500
INTEGER M,T,MB,S; 00364600
STREAM PROCEDURE PACKEM(A,B,N); VALUE N; 00364700
BEGIN LOCAL T; 00364800
SI:=LOC N; DI:=LOC T; DI:=DI+1; DS:=7CHR; 00364900
SI:=A; DI:=B; 00365000
T(2(32(SI:=SI+7; DS:=CHR))); N(SI:=SI+7; DS:=CHR); 00365100
END; 00365200
IF N = 0 THEN GO TO QUIT; 00365300
T:=(M:=L:=L+OFFSET)+N; 00365400
MB:=MAXBUFFSIZE DIV 8 | 8; 00365500
WHILE M LSS T DO 00365600
BEGIN 00365700
TRANSFERSP(OUTOF,SP,M,BUFFER,0,MB:=MIN(MB,T-M)); 00365800
PACKEM(BUFFER,ACCUM,MB); 00365900
TRANSFERSP(INTO,SP,L,ACCUM,0,S:=(MB+7)DIV 8); 00366000
L:=L+S; M:=M+MB; 00366100
END; 00366200
FORGETSPACE(L,T-L); 00366300
QUIT: END PROCEDURE PACK; 00366400
INTEGER PROCEDURE UNPACK(S,OFFSET,N); VALUE N,S,OFFSET; 00366500
INTEGER N,S,OFFSET; 00366600
BEGIN 00366700
INTEGER L,M,K,MB,T; 00366800
LABEL QUIT; 00366900
STREAM PROCEDURE UNPACKEM(A,B,N); VALUE N; 00367000
BEGIN 00367100
LOCAL T; 00367200
SI:=LOC N; DI:=LOC T; DI:=DI+1; DS:=7CHR; 00367300
SI:=A; DI:=B; 00367400
T(2(32(DS:=7LIT"0"; DS:=CHR))); 00367500
N(DS:=7LIT"0"; DS:=CHR); 00367600
END; 00367700
IF N = 0 THEN BEGIN UNPACK := S; GO TO QUIT; END; 00367800
UNPACK:=L:=GETSPACE(OFFSET+N); K:=S+OFFSET-1; 00367900
FOR M:=S STEP 1 UNTIL K DO; 00368000
BEGIN SP[LOC]:=SP[MOC]; L:=L+1 00368100
END; 00368200
K:=L+N; S:=S+OFFSET; 00368300
MB:=MAXBUFFSIZE DIV 8; 00368400
N := MB | 8; 00368500
WHILE L LSS K DO 00368600
BEGIN 00368700
TRANSFERSP(OUTOF,SP,S,BUFFER,0,M:=MIN(MB,(K-L+7)DIV 8)); 00368800
UNPACKEM(BUFFER,ACCUM, M:= MIN(K-L, M|8)); 00368900
TRANSFERSP(INTO,SP,L,ACCUM,0,M); 00369000
L := L+N; S:= S+MB; 00369100
END; 00369200
QUIT: END PROCEDURE UNPACK; 00369300
PROCEDURE TRANSPOSE; 00369400
BEGIN INTEGER M,N,L,I,ROW,COL,RANK,OUTER,INNER; REAL NEWDESC; 00369500
INTEGER SIZE,J,MAT,TOP,START; BOOLEAN CHARACTER; 00369600
LABEL QUIT; DEFINE GIVEUP=GO TO QUIT#; 00369700
REAL NULL, DESC; 00369800
DEFINE RESULT=RESULTD#; 00369900
NULL := AREG; DESC := BREG; 00370000
IF L:=DESC.SPF=0 THEN BEGIN ERR:=DOMAINERROR; GIVEUP; END; 00370100
RANK := DESC.RF; 00370200
SIZE := FINDSIZE(DESC); 00370300
IF RANK LSS 2 THEN BEGIN NEWDESC:=DESC; 00370400
%THEN THE TRANSPOSE IS THE THING ITSELF 00370500
NEWDESC.NAMED:=0; 00370600
NEWDESC.SPF := N:=GETSPACE(RANK+SIZE); 00370700
SPCOPY(L,N,RANK+SIZE); 00370800
GO TO QUIT; END; 00370900
IF DESC.ARRAYTYPE=1 THEN BEGIN 00371000
L:=UNPACK(L,RANK,SIZE); 00371100
CHARACTER := TRUE; END; 00371200
N:=L+RANK-1; COL := SP[NOC]; 00371300
N:=N-1; ROW := SP[NOC]; 00371400
TOP := SIZE DIV (MAT:=ROW|COL); 00371500
NEWDESC := DESC; 00371600
NEWDESC.SPF := M := GETSPACE(SIZE+RANK); 00371700
SPCOPY (L,M,RANK-2); 00371800
N:=M+RANK-1; SP[NOC]:=ROW; 00371900
N:=N-1; SP[NOC] := COL; 00372000
J:=0; M:=M+RANK; 00372100
WHILE J LSS TOP DO BEGIN 00372200
OUTER:=(START:=L+RANK+J|MAT) + COL - 1; 00372300
FOR I:=START STEP 1 UNTIL OUTER DO BEGIN INNER:=I+MAT-1; 00372400
FOR N:=I STEP COL UNTIL INNER DO 00372500
BEGIN SP[MOC] := SP[NOC]; M:=M+1; END; END; 00372600
J:=J+1; END; 00372700
QUIT: IF CHARACTER THEN BEGIN NEWDESC.ARRAYTYPE:=1; 00372800
FORGETSPACE(L,SIZE+RANK); 00372900
PACK(NEWDESC.SPF, RANK,SIZE); END; 00373000
RESULTD := NEWDESC; 00373100
END PROCEDURE TRANSPOSE; 00373200
BOOLEAN PROCEDURE MATCHDIM(DESC1,DESC2); REAL DESC1,DESC2; 00373300
BEGIN INTEGER I,L,M,TOP; LABEL DONE; 00373400
MATCHDIM:= TRUE; 00373500
IF DESC1.RF NEQ DESC2.RF THEN BEGIN MATCHDIM:=FALSE; 00373600
ERR:=RANKERROR; GO TO DONE; END; 00373700
I:=DESC1.SPF; M:=DESC2.SPF; TOP:=I+DESC1.RF-1; 00373800
FOR L:=I STEP 1 UNTIL TOP DO BEGIN 00373900
IF SP[LOC] NEQ SP[MOC] THEN BEGIN MATCHDIM:=FALSE; 00374000
ERR:=LENGTHERROR; GO TO DONE; END; 00374100
M:=M+1; END; 00374200
DONE: END PROCEDURE MATCHDIM; 00374300
INTEGER PROCEDURE RANDINT(A,B,U); VALUE A,B; 00374400
REAL A,B,U; 00374500
BEGIN DEFINE QQMODUL = 67108864#, QQMULT = 8189#, 00374600
QQRANDOM=(U:=U|QQMULT MOD QQMODUL)/QQMODUL#; 00374700
RANDINT := (B-A+1)|QQRANDOM+A-.5; 00374800
END PROCEDURE RANDINT; 00374900
BOOLEAN PROCEDURE BOOLTYPE(A,B); REAL A,B; 00375000
BEGIN IF ABS(A-1) LEQ FUZZ THEN A:=1; 00375100
IF ABS(A) LEQ FUZZ THEN A:=0; 00375200
IF ABS(B-1) LEQ FUZZ THEN B:=1; 00375300
IF ABS(B) LEQ FUZZ THEN B:=0; 00375400
BOOLTYPE := (IF A=1 OR A=0 AND B=1 OR B=0 THEN TRUE 00375500
ELSE FALSE); END PROCEDURE BOOLTYPE; 00375600
REAL PROCEDURE GAMMA(X); REAL X; 00375700
COMMENT THIS PROCEDURE WAS TAKEN FROM ACM ALGORITHM 31. 00375800
THE ONLY DIFFERENCE IS THAT THERE IS NO PROVISION FOR 00375900
X LEQ 0 SINCE IT WILL NOT BE CALLED IN THAT CASE. IT 00376000
IS SUPPOSED TO GIVE ACCURACY TO 7 DIGITS; 00376100
BEGIN REAL H,Y; LABEL A1, A2; 00376200
H := 1; Y := X; 00376300
A1: IF Y = 2 THEN GO TO A2 ELSE IF Y LSS 2 THEN BEGIN 00376400
H:=H/Y; Y:=Y+1; GO TO A1 END 00376500
ELSE IF Y GEQ 3 THEN BEGIN 00376600
Y:=Y-1; H:=H|Y; GO TO A1 END 00376700
ELSE BEGIN Y := Y - 2; 00376800
H := (((((((.0016063118 | Y + .0051589951) | Y 00376900
+ .0044511400) | Y + .0721101567) | Y 00377000
+ .0821117404) | Y + .4117741955) | Y 00377100
+ .4227874605) | Y + .9999999758) | H END; 00377200
A2: GAMMA := H; 00377300
END OF PROCEDURE GAMMA; 00377400
BOOLEAN PROCEDURE EXCLAM(MARG,NARG,M,ANS); VALUE MARG,NARG,M; 00377500
REAL MARG,NARG,ANS; INTEGER M; 00377600
BEGIN INTEGER N,I; REAL DENOM; LABEL PUT; 00377700
EXCLAM := TRUE; 00377800
IF I:=NARG.[1:8] NEQ 0 OR DENOM:=MARG.[1:8] NEQ 0 THEN BEGIN 00377900
IF MARG LSS 0 OR NARG LSS 0 THEN BEGIN EXCLAM:=FALSE; 00378000
GO TO PUT; END; 00378100
IF M=0 THEN ANS:=GAMMA(NARG) ELSE BEGIN 00378200
IF (NARG-MARG) LEQ 0 THEN BEGIN EXCLAM:=FALSE; GO TO PUT END; 00378300
ANS := 1; 00378400
IF I=0 THEN FOR I:=2 STEP 1 UNTIL NARG DO ANS:=ANS|I 00378500
ELSE ANS:=GAMMA(NARG); 00378600
IF DENOM=0 THEN BEGIN DENOM:=1; FOR I:=2 STEP 1 UNTIL MARG DO 00378700
DENOM:=DENOM|I END ELSE DENOM:=GAMMA(MARG); 00378800
ANS := ANS / (DENOM | GAMMA(NARG-MARG)); 00378900
END; 00379000
GO TO PUT; END; 00379100
IF M=0 THEN BEGIN ANS := 1; 00379200
FOR I:=1 STEP 1 UNTIL NARG DO ANS:=ANS|I; 00379300
GO TO PUT; END 00379400
ELSE BEGIN IF MARG GTR NARG THEN 00379500
BEGIN ANS:=0; GO TO PUT; END; 00379600
IF MARG=0 THEN BEGIN ANS:=1; GO TO PUT; END; 00379700
ANS := NARG - MARG + 1; 00379800
FOR I:=NARG-MARG+2 STEP 1 UNTIL NARG DO ANS:=ANS|I; 00379900
DENOM := 1; 00380000
FOR I:=2 STEP 1 UNTIL MARG DO DENOM:=DENOM|I; 00380100
ANS := ANS / DENOM; END; 00380200
PUT: END PROCEDURE EXCLAM; 00380300
BOOLEAN PROCEDURE OPERATION(LEFT,RIGHT,LPTR,OP,ANS); 00380400
COMMENT: OP DEFINES THE APL OPERATORS AS FOLLOWS: 00380500
OP APL OPERATOR OP APL OPERATOR 00380600
0 + 10 FACT-COMB 00380700
1 TIMES 11 LSS 00380800
2 - 12 = 00380900
3 DIV 13 GEQ 00381000
4 * 14 GTR 00381100
5 RNDM 15 NEQ 00381200
6 RESD-ABS 16 LEQ 00381300
7 MIN-FLR 17 AND 00381400
8 MAX-CEIL 18 OR 00381500
9 NOT 19 NAND 00381600
20 NOR 00381700
21 LN-LOG 00381800
THE "CIRCLE" OPERATORS FOLLOW. 00381900
22 PI | 30 SQRT(1-B*2) 00382000
23 ARCTANH 31 SIN 00382100
24 ARCCOSH 32 COS 00382200
25 ARCSINH 33 TAN 00382300
26 SQRT(B*2-1) 34 SQRT(1+B*2) 00382400
27 ARCTAN 35 SINH 00382500
28 ARCCOS 36 COSH 00382600
29 ARCSIN 37 TANH; 00382700
00382800
COMMENT: LPTR IS LSS 0 IF THE CALL COMES FROM A 00382900
REDUCTION TYPE PROCEDURE. 00383000
LPTR = 0 IF OPERATOR IS MONADIC. 00383100
LPTR GTR 0 IF OPERATOR IS DYADIC. 00383200
LPTR LSS 0 IF COMES FORM REDUCTION TYPE OPERATION; 00383300
VALUE LEFT,RIGHT,LPTR,OP; 00383400
REAL LEFT,RIGHT,LPTR,OP; 00383500
REAL ANS; 00383600
BEGIN LABEL PUT,DOMAIN,KITE; DEFINE GIVEUP=GO TO PUT#; 00383700
DEFINE MAXEXP=158.037557167#, 00383800
MINEXP=-103.7216898#; 00383900
MONITOR INTOVR, ZERO, EXPOVR; 00384000
OPERATION:=TRUE; 00384100
IF LPTR LSS 0 THEN IF OP GTR 10 AND OP LSS 21 THEN 00384200
IF NOT BOOLTYPE(LEFT,RIGHT) THEN GO TO DOMAIN; 00384300
IF OP = 45 THEN IF LPTR=0 THEN OP:=22 00384400
ELSE IF ABS(LEFT) GTR 7 THEN GO TO DOMAIN 00384500
ELSE OP := LEFT + 30; 00384600
IF OP GTR 16 AND OP LSS 21 THEN IF NOT BOOLTYPE(LEFT,RIGHT) 00384700
THEN GO TO DOMAIN; 00384800
ZERO:=DOMAIN; INTOVR:=KITE; EXPOVR:=KITE; 00384900
CASE OP OF BEGIN 00385000
ANS := LEFT + RIGHT; 00385100
ANS := IF LPTR=0 THEN SIGN(RIGHT) ELSE LEFT | RIGHT; 00385200
ANS := LEFT - RIGHT; 00385300
ANS := LEFT / RIGHT; 00385400
IF LPTR=0 THEN IF RIGHT GTR MINEXP AND RIGHT LSS MAXEXP 00385500
THEN ANS:=EXP(RIGHT) ELSE GO TO KITE 00385600
ELSE IF RIGHT.[3:6]=0 THEN ANS:=LEFT*ENTIER(RIGHT) 00385700
ELSE IF LEFT GTR 0 THEN IF ANS:=RIGHT|LN(LEFT) GTR MINEXP 00385800
AND ANS LSS MAXEXP THEN 00385900
ANS:=EXP(ANS) ELSE GO TO KITE 00386000
ELSE IF LEFT=0 AND RIGHT GTR 0 THEN ANS:=0 00386100
ELSE GO TO DOMAIN; 00386200
IF LPTR NEQ 0 THEN BEGIN ERR:=SYSTEMERROR; GIVEUP; END ELSE 00386300
IF RIGHT LSS ORIGIN THEN GO TO DOMAIN ELSE 00386400
ANS := RANDINT(ORIGIN,RIGHT,SEED); 00386500
IF LPTR=0 THEN ANS := ABS(RIGHT) ELSE 00386600
BEGIN IF LEFT=0 THEN IF RIGHT GEQ 0 THEN 00386700
ANS := RIGHT ELSE GO TO DOMAIN 00386800
ELSE IF (ANS:=RIGHT MOD LEFT) LSS 0 00386900
THEN ANS:=ANS + ABS(LEFT); END; 00387000
ANS := (IF LPTR=0 THEN ENTIER(RIGHT+FUZZ) 00387100
ELSE IF LEFT LEQ RIGHT THEN LEFT ELSE RIGHT); 00387200
ANS := (IF LPTR=0 THEN -ENTIER(-RIGHT+FUZZ) 00387300
ELSE IF LEFT GTR RIGHT THEN LEFT ELSE RIGHT); 00387400
IF LPTR NEQ 0 THEN BEGIN ERR:=SYNTAXERROR; GIVEUP; END 00387500
ELSE IF NOT BOOLTYPE(0,RIGHT) THEN 00387600
BEGIN ERR:=DOMAINERROR; GIVEUP; END 00387700
ELSE ANS := (IF RIGHT=1 THEN 0 ELSE 1); 00387800
IF NOT EXCLAM(LEFT,RIGHT,LPTR,ANS) THEN GO TO DOMAIN; 00387900
00388000
ANS := (IF RIGHT-LEFT GTR FUZZ|ABS(RIGHT) THEN 1 ELSE 0); 00388100
ANS:=(IF ABS(LEFT-RIGHT) LEQ FUZZ|ABS(RIGHT) THEN 1 ELSE 0); 00388200
ANS:=(IF RIGHT-LEFT LEQ FUZZ|ABS(RIGHT) THEN 1 ELSE 0); 00388300
ANS:=(IF LEFT-RIGHT GTR FUZZ|ABS(RIGHT) THEN 1 ELSE 0); 00388400
ANS:=(IF ABS(LEFT-RIGHT) GTR FUZZ|ABS(RIGHT) THEN 1 ELSE 0); 00388500
ANS:=(IF LEFT-RIGHT LEQ FUZZ|ABS(RIGHT) THEN 1 ELSE 0); 00388600
ANS := RIGHT | LEFT; %AND 00388700
ANS := IF RIGHT + LEFT = 0 THEN 0 ELSE 1; %OR 00388800
ANS := IF RIGHT | LEFT = 1 THEN 0 ELSE 1; %NAND 00388900
ANS := IF RIGHT + LEFT = 0 THEN 1 ELSE 0; %NOR 00389000
IF RIGHT LEQ 0 THEN GO TO DOMAIN ELSE IF LPTR=0 THEN 00389100
ANS:=LN(RIGHT) ELSE 00389200
IF LEFT LEQ 1 THEN GO TO DOMAIN ELSE 00389300
ANS := LN(RIGHT) / LN(LEFT); %LOGARITHMS 00389400
ANS := 3.1415926536 | RIGHT; 00389500
IF ABS(RIGHT) GEQ 1 THEN GO TO DOMAIN ELSE 00389600
ANS:= .5|LN((1+RIGHT)/(1-RIGHT)); %ARCTANH 00389700
00389800
IF RIGHT LSS 1 THEN GO TO DOMAIN ELSE 00389900
ANS:=LN(RIGHT+SQRT(RIGHT|RIGHT-1)); %ARCCOSH 00390000
ANS := LN(RIGHT + SQRT(RIGHT|RIGHT+1)); %ACRSINH 00390100
00390200
IF ABS(RIGHT) LSS 1 THEN GO TO DOMAIN ELSE 00390300
ANS:=SQRT(RIGHT|RIGHT-1); 00390400
ANS := ARCTAN(RIGHT); 00390500
IF ABS(RIGHT) GTR 1 THEN GO TO DOMAIN ELSE 00390600
IF RIGHT=0 THEN ANS:=1.5707963268 ELSE 00390700
ANS:=ARCTAN(SQRT(1-RIGHT*2)/RIGHT); %ARCCOS 00390800
IF ABS(RIGHT) GTR 1 THEN GO TO DOMAIN ELSE 00390900
ANS:=ARCTAN(RIGHT/ SQRT(1-RIGHT*2)); %ARCSIN 00391000
IF ABS(RIGHT) GTR 1 THEN GO TO DOMAIN ELSE 00391100
ANS := SQRT(1-RIGHT*2); 00391200
ANS := SIN(RIGHT); 00391300
ANS := COS(RIGHT); 00391400
ANS := SIN(RIGHT) / COS(RIGHT); %TAN 00391500
ANS := SQRT(1+RIGHT|RIGHT); 00391600
ANS := (EXP(RIGHT) - EXP(-RIGHT))/2; %SINH 00391700
ANS := (EXP(RIGHT) + EXP(-RIGHT))/2; %COSH 00391800
ANS := ((OP:=EXP(RIGHT))-(ANS:=EXP(-RIGHT)))/(OP+ANS); %TANH 00391900
END; 00392000
GO TO PUT; 00392100
KITE: ERR:=KITEERROR; GO TO PUT; 00392200
DOMAIN: ERR:=DOMAINERROR; 00392300
PUT: IF ERR NEQ 0 THEN OPERATION := FALSE; 00392400
END PROCEDURE OPERATION; 00392500
PROCEDURE ARITH(OP); VALUE OP; 00392600
INTEGER OP; 00392700
COMMENT: ARITH HANDLES ALL APL OPERATORS THAT EMPLOY THE 00392800
VECTOR-VECTOR, SCALAR-VECTOR, SCALAR-SCALAR, VECTOR-SCALAR 00392900
FEATURE. DESC1 AND DESC2 ARE THE DESCRIPTORS FOR THE 00393000
LEFTHAND AND RIGHTHAND OPERANDS, RESPECTIVELY. IF 00393100
IF DESC1 = 0, THE OPERATOR IS TAKEN TO BE MONADIC. 00393200
IF DESC.SPF = 0, THE OPERAND IS NULL AND A DOMAIN ERROR 00393300
RESULTS EXCEPT IN THE CASE OF MULTIPLICATION. 00393400
OP IS AN INTERNAL OPERATION CODE FOR THE OPERATOR, WHICH 00393500
DEPENDS ON THE CASE STATEMENT IN THE OPERATION PROCEDURE.; 00393600
BEGIN INTEGER L,M,I,N,SIZE,RANK1,RANK2,TOP, 00393700
FORGETL, FORGETM; 00393800
REAL DESC,LEFT,RIGHT,ANS,SIZE1,SIZE2,DESC1,DESC2; 00393900
LABEL DONE, LEFTSCALE, SCALVECT, DOMAIN, VECTSCAL; 00394000
BOOLEAN CHAR1, CHAR2; 00394100
DESC1 := AREG; DESC2 := BREG; 00394200
L:=DESC1.SPF; M:=DESC2.SPF; 00394300
RANK1:=DESC1.RF; RANK2:=DESC2.RF; 00394400
SIZE1:=FINDSIZE(DESC1); SIZE2:=FINDSIZE(DESC2); 00394500
IF(CHAR1:=DESC1.ARRAYTYPE=1) OR (CHAR2:=DESC2.ARRAYTYPE=1) 00394600
THEN BEGIN IF OP LSS 11 OR OP GTR 16 00394700
OR NOT(CHAR1 AND CHAR2) AND NOT(OP=12 OR OP=15) 00394800
THEN BEGIN CHAR1:=CHAR2:=FALSE; GO TO DOMAIN; END; 00394900
IF CHAR1 THEN 00395000
FORGETL := L := UNPACK(L,RANK1,SIZE1); 00395100
IF CHAR2 THEN 00395200
FORGETM := M := UNPACK(M,RANK2,SIZE2); END; 00395300
00395400
00395500
IF M=0 THEN BEGIN IF OP NEQ 1 THEN GO TO DOMAIN 00395600
ELSE BEGIN DESC := NULLV; 00395700
GO TO DONE; END; END; 00395800
IF L=0 THEN BEGIN 00395900
IF DESC1.DID NEQ 0 THEN 00396000
IF OP=1 THEN BEGIN DESC:=NULLV; GO TO DONE; END 00396100
ELSE GO TO DOMAIN; 00396200
IF OP GTR 10 AND OP LSS 21 THEN GO TO DOMAIN; 00396300
LEFT := OP MOD 2; GO TO LEFTSCALE; END; 00396400
IF SIZE1=1 00396500
THEN BEGIN L:=L+RANK1; LEFT:=SP[LOC]; 00396600
GO TO LEFTSCALE; END; 00396700
IF SIZE2=1 THEN BEGIN 00396800
% DESC1 IS A VECTOR, DESC2 IS A SCALAR; 00396900
VECTSCAL: M:=M+RANK2; RIGHT:=SP[MOC]; 00397000
I := GETSPACE( SIZE:=SIZE1+RANK1); 00397100
DESC.SPF:=I; DESC.DID:=DDPUVW; SPCOPY(L,I,RANK1); 00397200
L:=L+RANK1; I:=I+RANK1; 00397300
DESC.RF:=RANK1; TOP:=SIZE1+I-1; 00397400
FOR N:=I STEP 1 UNTIL TOP DO BEGIN 00397500
IF OPERATION(SP[LOC],RIGHT,L,OP,ANS) THEN 00397600
SP[NOC] := ANS ELSE GO TO DONE; 00397700
L:=L+1; END; 00397800
GO TO DONE; END; 00397900
% BOTH DESC1 AND DESC2 ARE ARRAYS; 00398000
IF NOT MATCHDIM(DESC1,DESC2) THEN GO TO DONE 00398100
ELSE BEGIN 00398200
I := GETSPACE( SIZE := SIZE2 + RANK2 ); 00398300
SPCOPY(M,I,RANK2); DESC.SPF:=I; DESC.DID:=DDPUVW; 00398400
DESC.RF := RANK2; 00398500
M:=M+RANK2; I:=I+RANK2; L:=L+RANK2; 00398600
TOP := I+SIZE2-1; 00398700
FOR N:=I STEP 1 UNTIL TOP DO BEGIN 00398800
IF OPERATION(SP[LOC],SP[MOC],L,OP,ANS) THEN 00398900
SP[NOC] := ANS ELSE GO TO DONE; 00399000
L:=L+1; M:=M+1; END; 00399100
GO TO DONE; END; 00399200
LEFTSCALE: IF SIZE2 = 1 00399300
THEN BEGIN 00399400
IF RANK1 NEQ RANK2 THEN BEGIN 00399500
IF RANK1=0 THEN GO TO SCALVECT; 00399600
IF RANK2=0 THEN BEGIN L:=L-RANK1; GO TO VECTSCAL; END; 00399700
IF CHAR1 AND RANK1=1 THEN GO TO SCALVECT; 00399800
IF CHAR2 AND RANK2=1 THEN GO TO VECTSCAL; 00399900
ERR:=KITEERROR; GO TO DONE; END 00400000
ELSE IF RANK1|RANK2 NEQ 0 THEN GO TO SCALVECT; 00400100
% BOTH OPERANDS ARE SCALAR; 00400200
M := M + RANK2; 00400300
N := GETSPACE(SIZE:=1); RIGHT:=SP[MOC]; 00400400
DESC.SPF := N; DESC.DID := DDPUSW; 00400500
IF OPERATION(LEFT,RIGHT,L,OP,ANS) THEN 00400600
SP[NOC] := ANS ELSE GO TO DONE; 00400700
GO TO DONE; END 00400800
ELSE BEGIN %DESC1 IS SCALAR, DESC2 IS VECTOR; 00400900
00401000
SCALVECT: I := GETSPACE( SIZE := SIZE2 + RANK2); 00401100
DESC.SPF := I; DESC.RF := RANK2; DESC.DID:=DDPUVW; 00401200
SPCOPY(M,I,RANK2); 00401300
M:=M+RANK2; I:=I+RANK2; TOP:=SIZE2+I-1; 00401400
FOR N:=I STEP 1 UNTIL TOP DO BEGIN 00401500
IF OPERATION(LEFT,SP[MOC],L,OP,ANS) 00401600
THEN SP[NOC] := ANS ELSE GO TO DONE; 00401700
M := M+1; END; 00401800
END; 00401900
GO TO DONE; 00402000
DOMAIN: ERR:= DOMAINERROR; 00402100
DONE: RESULTD := DESC; 00402200
IF CHAR1 THEN FORGETSPACE(FORGETL,SIZE1+RANK1); 00402300
IF CHAR2 THEN FORGETSPACE(FORGETM,SIZE2+RANK2); 00402400
IF ERR NEQ 0 THEN FORGETSPACE(DESC.SPF, SIZE); 00402500
END PROCEDURE ARITH; 00402600
PROCEDURE DYADICRNDM; 00402700
BEGIN INTEGER NUM, KIND; REAL DESC; 00402800
REAL DESC1, DESC2; 00402900
INTEGER L,M,N,T,I,TEMP,OUTTOP,TOP,PICK; LABEL QUIT; 00403000
INTEGER START; LABEL INSERT; 00403100
DESC1 := AREG; DESC2 := BREG; 00403200
IF FINDSIZE(DESC1) NEQ 1 OR FINDSIZE(DESC2) NEQ 1 00403300
THEN BEGIN ERR:=RANKERROR; GO TO QUIT; END; 00403400
IF DESC1.SPF=0 OR DESC2.SPF=0 THEN BEGIN 00403500
ERR:=DOMAINERROR; GO TO QUIT; END; 00403600
L:=DESC1.SPF+DESC1.RF; M:=DESC2.SPF+DESC2.RF; 00403700
NUM := SP[LOC]; KIND := SP[MOC]; 00403800
IF KIND LSS ORIGIN 00403900
OR NUM GTR PICK := KIND-ORIGIN+1 00404000
OR DESC1.ARRAYTYPE=1 00404100
OR DESC2.ARRAYTYPE=1 THEN BEGIN ERR:=DOMAINERROR; 00404200
GO TO QUIT; END; 00404300
DESC.DID := DDPUVW; DESC.RF := 1; 00404400
IF NUM LEQ 0 THEN BEGIN DESC := NULLV; GO TO QUIT; END; 00404500
IF NUM GTR MAXWORDSTORE THEN BEGIN ERR:=KITEERROR; GO TO QUIT; END; 00404600
DESC.SPF := L := GETSPACE(NUM+1); 00404700
SP[LOC] := NUM; L := L+1; 00404800
OUTTOP := L+NUM-1; 00404900
TEMP := GETSPACE(NUM); 00405000
START:=ORIGIN; I:=0; 00405100
FOR L:=L STEP 1 UNTIL OUTTOP DO BEGIN 00405200
PICK:=RANDINT(START,KIND,SEED); 00405300
M:=TEMP; 00405400
IF I = 0 OR PICK LSS SP[MOC] THEN N:=TEMP 00405500
ELSE BEGIN TOP:=TEMP+I-1; 00405600
N:=TEMP+T:=I DIV 2; 00405700
WHILE T GTR 0 DO 00405800
IF PICK GEQ SP[NOC] THEN N:=N+T:=T DIV 2 00405900
ELSE N:=N-T:=T DIV 2; 00406000
00406100
FOR N:=MAX(TEMP,N-1) STEP 1 UNTIL TOP DO 00406200
IF SP[NOC] GTR PICK THEN 00406300
GO TO INSERT; 00406400
END; 00406500
INSERT: IF L LSS OUTTOP THEN BEGIN TOP:=N+1; N:=TEMP+I; 00406600
FOR M:=N STEP -1 UNTIL TOP DO BEGIN 00406700
N:=N-1; SP[MOC] := SP[NOC] - 1; END; 00406800
SP[NOC] := PICK; END; 00406900
SP[LOC] := N - TEMP + PICK; 00407000
KIND:=KIND-1; 00407100
I:=I+1; 00407200
END; 00407300
FORGETSPACE(TEMP,NUM); 00407400
QUIT: RESULTD := DESC; 00407500
END PROCEDURE DYADICRNDM; 00407600
PROCEDURE RHOP; 00407700
BEGIN INTEGER RANK,M,POINT; REAL NEWDESC,DESC1,DESC; 00407800
LABEL QUIT, WORK; BOOLEAN CHARACTER; 00407900
DEFINE TOOBIG=BEGIN ERR:=KITEERROR; GO TO QUIT; END#; 00408000
INTEGER N,TOP,NEWRANK,RANK1, POINT1,SIZE1,L,SIZE2; 00408100
DESC1 := AREG; DESC := BREG; 00408200
IF DESC.SPF = 0 THEN BEGIN ERR:=DOMAINERROR; GO TO QUIT; END; 00408300
IF DESC1.DID NEQ 0 THEN BEGIN %--DYADIC RHO--RESTRUCTURING--------- 00408400
IF L:=DESC1.SPF = 0 THEN BEGIN %NULL LEFT OP MEANS SCALAR ANS 00408500
IF DESC.ARRAYTYPE=1 THEN TOOBIG; %NO SCALAR CHARACTERS 00408600
NEWDESC.SPF:=M:=GETSPACE(1); 00408700
NEWDESC.DID:=DDPUSW; 00408800
L:=DESC.SPF+DESC.RF; 00408900
SP[MOC]:=SP[LOC]; GO TO QUIT; END; 00409000
IF DESC1.ARRAYTYPE NEQ 0 THEN BEGIN 00409100
ERR:=DOMAINERROR; GO TO QUIT; END; 00409200
RANK1:=DESC1.RF; 00409300
IF FINDSIZE(DESC1)=1 THEN BEGIN 00409400
N:=L+RANK1; 00409500
IF SIZE1:=ENTIER(SP[NOC]+.5) LSS 0 THEN BEGIN 00409600
ERR:=DOMAINERROR; GO TO QUIT; END; 00409700
NEWRANK:=1; TOP:=N; GO TO WORK; END; 00409800
IF RANK1 NEQ 1 THEN BEGIN ERR:=RANKERROR; GO TO QUIT; END; 00409900
IF NEWRANK:=SP[LOC] GTR 31 THEN TOOBIG; 00410000
SIZE1:=1; TOP := L+NEWRANK+RANK1-1; 00410100
IF NEWRANK LEQ 0 THEN BEGIN ERR:=SYSTEMERROR; GO TO QUIT; END; 00410200
FOR N:=L+RANK1 STEP 1 UNTIL TOP DO 00410300
IF SIZE1:=SIZE1|ENTIER(SP[NOC]+.5) LSS 0 THEN BEGIN 00410400
ERR:=DOMAINERROR; GO TO QUIT; END; 00410500
WORK: IF SIZE1=0 THEN BEGIN NEWDESC := NULLV; GO TO QUIT END; 00410600
IF SIZE1 GTR MAXWORDSTORE THEN TOOBIG; 00410700
NEWDESC.DID:=DDPUVW; NEWDESC.RF:=NEWRANK; 00410800
NEWDESC.SPF := M := GETSPACE(SIZE1+NEWRANK); 00410900
%CANT USE SPCOPY FOR DIM VECTOR AS LEFT OP MAY NOT BE INTEGER 00411000
FOR L:=L+RANK1 STEP 1 UNTIL TOP DO; 00411100
BEGIN SP[MOC]:=ENTIER(SP[LOC]+.5); M:=M+1; END; 00411200
SIZE2:=FINDSIZE(DESC); L:=DESC.SPF; RANK:=DESC.RF; 00411300
IF DESC.ARRAYTYPE=1 THEN BEGIN L:=UNPACK(L,RANK,SIZE2); 00411400
CHARACTER:=TRUE; END; TOP:=SIZE1 DIV SIZE2; POINT:=L+RANK; 00411500
FOR N:=1 STEP 1 UNTIL TOP DO BEGIN SPCOPY(POINT,M,SIZE2); 00411600
M := M+SIZE2; END; 00411700
TOP := SIZE1 MOD SIZE2; SPCOPY(POINT,M,TOP); 00411800
GO TO QUIT; END ELSE 00411900
%--------MONADIC RHO-----DIMENSION VECTOR---------------------- 00412000
RANK := DESC.RF; POINT := DESC.SPF; 00412100
NEWDESC.DID := DDPUVW; NEWDESC.RF := 1; 00412200
IF DESC.DATATYPE = 1 THEN BEGIN 00412300
NEWDESC := NULLV; GO TO QUIT END; 00412400
NEWDESC.SPF := M := GETSPACE(RANK+1); 00412500
SP[MOC] := RANK; 00412600
SPCOPY(POINT,M+1, RANK); 00412700
QUIT: IF CHARACTER THEN BEGIN NEWDESC.ARRAYTYPE:=1; 00412800
FORGETSPACE(L,SIZE2+RANK); 00412900
PACK(NEWDESC.SPF, NEWRANK,SIZE1); END; 00413000
RESULTD := NEWDESC; 00413100
END PROCEDURE RHOP; 00413200
PROCEDURE IOTAP; 00413300
BEGIN INTEGER I,L,M,TOP; REAL DESC; 00413400
REAL LEFTOP, RIGHTOP; 00413500
INTEGER RSIZE,LSIZE,RRANK,LRANK,N,LL,MM,TIP,NIX; 00413600
00413700
LABEL QUIT, DONE; 00413800
LEFTOP:=AREG; RIGHTOP:=BREG; 00413900
IF L:=RIGHTOP.SPF=0 THEN BEGIN ERR:=DOMAINERROR; GO TO QUIT END; 00414000
RSIZE:=FINDSIZE(RIGHTOP); RRANK:=RIGHTOP.RF; 00414100
DESC.DID := DDPUVW; DESC.RF := 1; 00414200
IF LEFTOP.DID NEQ 0 THEN BEGIN %-------DYADIC IOTA------------ 00414300
IF LRANK := LEFTOP.RF GTR 1 THEN BEGIN ERR:=RANKERROR; 00414400
GO TO QUIT; END; 00414500
LSIZE := FINDSIZE(LEFTOP); 00414600
IF M:=LEFTOP.SPF=0 THEN BEGIN %RESULT IS ORIGIN IF IT WAS NULL 00414700
DESC.SPF:=M:=GETSPACE(1); DESC.RF:=0; DESC.SCALAR:=1; 00414800
SP[MOC] := ORIGIN; GO TO QUIT; END; 00414900
IF LEFTOP.ARRAYTYPE=1 THEN M:=UNPACK(M,LRANK,LSIZE); 00415000
IF RIGHTOP.ARRAYTYPE=1 THEN L:=UNPACK(L,RRANK,RSIZE); 00415100
TIP := (NIX:=LSIZE+ORIGIN) - 1; 00415200
DESC.SPF:=N:=GETSPACE(RSIZE+RRANK); 00415300
IF RRANK=0 THEN DESC.SCALAR:=1 ; DESC.RF:=RRANK; 00415400
SPCOPY(L,N,RRANK); 00415500
MM := M+LRANK; LL:=L:=L+RRANK; 00415600
TOP:=N+RRANK+RSIZE-1; 00415700
FOR N:=N+RRANK STEP 1 UNTIL TOP DO BEGIN 00415800
SP[NOC] := NIX; 00415900
M := MM; 00416000
FOR I:=ORIGIN STEP 1 UNTIL TIP DO 00416100
IF OPERATION(SP[MOC],SP[LOC],1,12,LEFTOP) AND LEFTOP=1 00416200
THEN BEGIN SP[NOC]:=I; GO TO DONE; 00416300
END ELSE M:=M+1; 00416400
DONE: L:=L+1; END; 00416500
IF LEFTOP.ARRAYTYPE=1 THEN FORGETSPACE(MM-LRANK,LRANK+LSIZE); 00416600
IF RIGHTOP.ARRAYTYPE=1 THEN FORGETSPACE(LL-RRANK,RRANK+RSIZE); 00416700
END ELSE BEGIN %-------------MONADIC IOTA------------------ 00416800
IF RIGHTOP.ARRAYTYPE=1 THEN 00416900
BEGIN ERR:=DOMAINERROR; GO TO QUIT 00417000
END; 00417100
IF RSIZE NEQ 1 THEN BEGIN ERR:=RANKERROR; GO TO QUIT END; 00417200
00417300
L := L + RRANK; 00417400
IF TOP:=SP[LOC] GTR MAXWORDSTORE THEN 00417500
BEGIN ERR:=KITEERROR; GO TO QUIT 00417600
END; 00417700
00417800
IF TOP LSS ORIGIN THEN BEGIN DESC:=NULLV; GO TO QUIT END; 00417900
DESC.SPF := M := GETSPACE(TOP+1); 00418000
SP[MOC] := TOP; M := M+1; 00418100
TOP := TOP + ORIGIN - 1; 00418200
FOR I := ORIGIN STEP 1 UNTIL TOP DO BEGIN 00418300
SP[MOC] := I; M := M+1; END; 00418400
END; 00418500
QUIT: RESULTD := DESC; 00418600
END PROCEDURE IOTAP; 00418700
PROCEDURE COMMAP; 00418800
BEGIN REAL LDESC, RDESC; 00418900
INTEGER L,M,N,LRANK,RRANK,LSIZE,RSIZE,SIZE; 00419000
REAL DESC; LABEL QUIT; BOOLEAN CHARACTER; 00419100
LDESC := AREG; RDESC := BREG; 00419200
RRANK := RDESC.RF; LRANK := LDESC.RF; 00419300
LSIZE := IF (L := LDESC.SPF) = 0 THEN 0 ELSE FINDSIZE(LDESC); 00419400
RSIZE := IF (M := RDESC.SPF) = 0 THEN 0 ELSE FINDSIZE(RDESC); 00419500
IF RDESC.ARRAYTYPE = 1 THEN BEGIN 00419600
M := UNPACK(M,RRANK,RSIZE); 00419700
CHARACTER := TRUE; END; 00419800
DESC.DID := DDPUVW; DESC.RF := 1; 00419900
IF LDESC.DID = 0 THEN BEGIN %-----MONADIC COMMA--RAVEL-------- 00420000
IF RSIZE=0 THEN BEGIN DESC:=NULLV; GO TO QUIT END; 00420100
DESC.SPF := L := GETSPACE(RSIZE+1); 00420200
SP[LOC] := RSIZE; 00420300
SPCOPY(M+RRANK, L+1, RSIZE); 00420400
N := L; SIZE := RSIZE; 00420500
GO TO QUIT; END 00420600
ELSE BEGIN 00420700
%HERE IS THE CODE FOR DYADIC COMMA, I.E. CATENATION 00420800
IF RRANK NEQ 1 AND RSIZE GTR 1 OR 00420900
LRANK NEQ 1 AND LSIZE GTR 1 THEN BEGIN 00421000
ERR:= RANKERROR; GO TO QUIT; END; 00421100
IF SIZE:=LSIZE+RSIZE GTR MAXWORDSTORE THEN BEGIN 00421200
ERR:=KITEERROR; GO TO QUIT; END; 00421300
COMMENT CANT MIX NUMBER AND CHARACTERS. HAVE TO JUGGLE 00421400
IF LEFT IS NUMBERS AND RIGHT IS CHARACTERS AS RIGHT 00421500
HAS ALREADY BEEN UNPACKED AND WE DONT WANT TO FORGET 00421600
LEFT AND DONT WANT TO PACK THE NON-RESULT; 00421700
IF CHARACTER THEN 00421800
IF LDESC.ARRAYTYPE=1 OR LSIZE=0 THEN L:=UNPACK(L,LRANK,LSIZE) 00421900
ELSE BEGIN SIZE:=0; LSIZE:=-LRANK; ERR:=DOMAINERROR; 00422000
GO TO QUIT END 00422100
ELSE IF LDESC.ARRAYTYPE=1 THEN 00422200
IF RSIZE NEQ 0 THEN 00422300
BEGIN ERR:=DOMAINERROR; GO TO QUIT END 00422400
ELSE BEGIN CHARACTER:=TRUE; 00422500
L:=UNPACK(L,LRANK,LSIZE); END; 00422600
IF SIZE=0 THEN BEGIN DESC:=NULLV; GO TO QUIT END; 00422700
DESC.SPF := N := GETSPACE(SIZE+1); 00422800
SP[NOC] := SIZE; 00422900
SPCOPY(L+LRANK, N+1, LSIZE); 00423000
SPCOPY(M+RRANK, N+LSIZE+1, RSIZE); 00423100
END; 00423200
QUIT: 00423300
IF CHARACTER THEN BEGIN DESC.ARRAYTYPE := 1; 00423400
PACK(N,1,SIZE); 00423500
FORGETSPACE(L,LSIZE+LRANK); 00423600
FORGETSPACE(M,RSIZE+RRANK); 00423700
END; 00423800
RESULTD := DESC; 00423900
END PROCEDURE COMMAP; 00424000
INTEGER STREAM PROCEDURE GETOP(A,N); VALUE N; 00424100
BEGIN SI := A; SI := SI + N; 00424200
DI := LOC GETOP; 00424300
DS := 7 LIT "0"; DS := CHR; 00424400
END PROCEDURE GETOP; 00424500
REAL PROCEDURE IDENTITY(OP); VALUE OP; INTEGER OP; 00424600
BEGIN 00424700
CASE OP OF BEGIN 00424800
IDENTITY := 0; %FOR + 00424900
IDENTITY := 1; %FOR | 00425000
IDENTITY := 0; %FOR - 00425100
IDENTITY := 1; %FOR DIV 00425200
IDENTITY := 1; %FOR * 00425300
; %NO REDUCTION ON RNDM 00425400
IDENTITY := 0; %FOR RESD 00425500
IDENTITY := BIGGEST; %FOR MIN 00425600
IDENTITY := -BIGGEST; %FOR MAX 00425700
; %NOT ISNT DYADIC 00425800
IDENTITY := 1; %FOR COMB 00425900
IDENTITY := 0; %FOR LSS 00426000
IDENTITY := 1; %FOR = 00426100
IDENTITY := 1; %FOR GEQ 00426200
IDENTITY := 0; %FOR GTR 00426300
IDENTITY := 0; %FOR NEQ 00426400
IDENTITY := 1; %FOR LEQ 00426500
IDENTITY := 1; %FOR AND 00426600
IDENTITY := 0; %FOR OR 00426700
END; END PROCEDURE IDENTITY; 00426800
INTEGER PROCEDURE GETT(ALONG,RANK); VALUE ALONG, RANK; 00426900
INTEGER ALONG, RANK; 00427000
GETT:= IF ALONG=1 THEN 0 ELSE 00427100
IF ALONG=RANK THEN 2 ELSE 00427200
IF ALONG=RANK-1 THEN 1 ELSE 0; 00427300
BOOLEAN PROCEDURE CHECKANDADD(SIZE,L,SUM); 00427400
VALUE SIZE,L; INTEGER SIZE,L,SUM; 00427500
BEGIN LABEL QUIT; INTEGER I,TOP,M,S,T; 00427600
CHECKANDADD:=TRUE; 00427700
SUM := 0; 00427800
TOP := SIZE DIV 2 | 2 - 1 + L; 00427900
FOR L:=L STEP 2 UNTIL TOP DO BEGIN M:=L+1; 00428000
IF NOT BOOLTYPE(S:=SP[LOC], T:=SP[MOC]) THEN BEGIN 00428100
CHECKANDADD:=FALSE; GO TO QUIT; END 00428200
ELSE SUM := SUM+S+T; END; 00428300
IF SIZE MOD 2 = 1 THEN BEGIN 00428400
IF NOT BOOLTYPE(T:=SP[LOC],0) THEN 00428500
CHECKANDADD := FALSE ELSE SUM := SUM+T; 00428600
END; 00428700
QUIT: END PROCEDURE CHECKANDADD; 00428800
PROCEDURE COMPRESS(LDESC, RDESC, DIM); VALUE LDESC,RDESC,DIM; 00428900
REAL LDESC, RDESC, DIM; 00429000
BEGIN INTEGER I,J,K,L,M,N,T,RANK,LSIZE,RSIZE,ALONG,TOP, 00429100
FACTOR,SUM,DIMMOD,SIZE,LEFT,RIGHT,S; 00429200
REAL DESC; BOOLEAN CHARACTER; 00429300
LABEL QUIT,RANKE,DOMAIN,IDENT; 00429400
DESC.DID := DDPUVW; 00429500
IF L := LDESC.SPF = 0 THEN GO TO DOMAIN; 00429600
IF M:=RDESC.SPF = 0 THEN BEGIN DESC:=NULLV; GO TO QUIT; END; 00429700
LSIZE := FINDSIZE(LDESC); RSIZE := FINDSIZE(RDESC); 00429800
IF RANK:=LDESC.RF NEQ 1 THEN IF LSIZE NEQ 1 00429900
THEN GO TO DOMAIN; 00430000
LEFT := L := L+RANK; 00430100
RANK := RDESC.RF; 00430200
IF N:=DIM.SPF=0 AND DIM.DID NEQ 0 OR DIM.ARRAYTYPE=1 00430300
OR LDESC.ARRAYTYPE=1 THEN GO TO DOMAIN; 00430400
IF J:=DIM.RF NEQ 0 THEN BEGIN 00430500
IF FINDSIZE(DIM)=1 THEN N:=N+J ELSE GO TO DOMAIN END; 00430600
IF ALONG:=(IF N=J THEN RANK ELSE SP[NOC]-ORIGIN+1) GTR RANK 00430700
OR ALONG LSS 1 AND RANK NEQ 0 00430800
THEN BEGIN ERR:=INDEXERROR; GO TO QUIT; END; 00430900
IF RANK = 0 THEN 00431000
IF LSIZE NEQ 1 THEN GO TO DOMAIN ELSE BEGIN 00431100
IF TOP:=SP[LOC]=0 THEN BEGIN DESC:=NULLV; GO TO QUIT; END; 00431200
IF TOP = 1 THEN BEGIN DESC.SPF := N := GETSPACE(2); 00431300
DESC.RF := SP[NOC] := 1; 00431400
N:=N+1; SP[NOC]:=SP[MOC]; GO TO QUIT; 00431500
END ELSE GO TO DOMAIN; END; 00431600
IF LSIZE = 1 THEN BEGIN 00431700
COMMENT IF LEFT ARG IS SCALAR, ANSWER IS NULL IF 0, 00431800
RIGHT ARG IF 1; 00431900
SUM:=SP[LOC]; 00432000
IF SUM NEQ 0 AND SUM NEQ 1 THEN GO TO DOMAIN 00432100
00432200
ELSE GO TO IDENT; END; 00432300
N := M+ALONG - 1; 00432400
IF LSIZE NEQ (T:=SP[NOC]) THEN BEGIN 00432500
ERR:=LENGTHERROR; GO TO QUIT; END; 00432600
IF NOT CHECKANDADD(LSIZE,LEFT,SUM) THEN GO TO DOMAIN; 00432700
IDENT: IF SUM=0 THEN BEGIN DESC:=NULLV; GO TO QUIT END; 00432800
IF SUM = LSIZE THEN BEGIN 00432900
IF RDESC.ARRAYTYPE=1 THEN BEGIN 00433000
RSIZE:=RSIZE DIV 8 + (IF RSIZE MOD 8 NEQ 0 THEN 1 ELSE 0); 00433100
DESC.CHRMODE:=1; END; 00433200
DESC.SPF:=N:=GETSPACE(TOP:=RSIZE+RANK); 00433300
DESC.RF := RANK; SPCOPY(M,N,TOP); GO TO QUIT; END; 00433400
SIZE := RSIZE DIV T | SUM; 00433500
DESC.RF:=RANK; 00433600
IF RDESC.ARRAYTYPE = 1 THEN BEGIN M:=UNPACK(M,RANK,RSIZE); 00433700
CHARACTER := TRUE; END; 00433800
RIGHT := M; 00433900
DESC.SPF := S := GETSPACE(SIZE+RANK); 00434000
N := S; 00434100
FOR I:=1 STEP 1 UNTIL RANK DO BEGIN 00434200
IF I=ALONG THEN SP[NOC]:=SUM ELSE SP[NOC]:=SP[MOC]; 00434300
N:=N+1; M:=M+1; END; 00434400
T := GETT(ALONG, RANK); 00434500
FACTOR := 1; TOP := RIGHT+ALONG; 00434600
FOR N:=RIGHT+RANK-1 STEP -1 UNTIL TOP DO FACTOR:= 00434700
FACTOR | SP[NOC]; 00434800
N:=RIGHT + RANK - 1; DIM := SP[NOC]; 00434900
N := N+1; M:=S+RANK; I:=0; 00435000
DIMMOD := DIM-1; 00435100
WHILE I LSS RSIZE DO BEGIN 00435200
CASE T OF BEGIN 00435300
L := I DIV FACTOR MOD LSIZE; 00435400
L := I DIV FACTOR MOD DIMMOD; 00435500
L := I MOD DIM; END; 00435600
L := L+LEFT; 00435700
IF SP[LOC] = 1 THEN FOR K:=1 STEP 1 UNTIL FACTOR DO BEGIN 00435800
SP[MOC]:=SP[NOC]; I:=I+1; M:=M+1; N:=N+1; 00435900
END ELSE BEGIN I:=I+FACTOR; N:=N+FACTOR; END; 00436000
END; 00436100
GO TO QUIT; 00436200
RANKE: ERR:=RANKERROR; GO TO QUIT; 00436300
DOMAIN: ERR:=DOMAINERROR; GO TO QUIT; 00436400
QUIT: IF CHARACTER THEN BEGIN PACK(S,RANK,SIZE); 00436500
DESC.ARRAYTYPE:=1; FORGETSPACE(RIGHT,RSIZE+RANK); END; 00436600
RESULTD := DESC; 00436700
POP; 00436800
END PROCEDURE COMPRESS; 00436900
PROCEDURE EXPAND(LDESC,RDESC,DIM); VALUE LDESC,RDESC,DIM; 00437000
REAL LDESC,RDESC, DIM; 00437100
BEGIN INTEGER I,J,K,L,M,N,S,T,RANK,LSIZE,RSIZE,SIZE, 00437200
ALONG,TOP,LADDR,MADDR,FACTOR, SUM; 00437300
REAL DESC, INSERT; 00437400
LABEL QUIT, DOMAIN; 00437500
BOOLEAN CHARACTER; 00437600
LSIZE:=FINDSIZE(LDESC); RSIZE:=FINDSIZE(RDESC); 00437700
RANK := RDESC.RF; 00437800
IF M:=RDESC.SPF=0 00437900
OR L:=LDESC.SPF=0 00438000
OR I:=LDESC.RF GTR 1 00438100
00438200
OR N:=DIM.SPF=0 AND DIM.DID NEQ 0 00438300
OR DIM.ARRAYTYPE=1 00438400
OR FINDSIZE(DIM ) NEQ 1 00438500
OR LDESC.ARRAYTYPE=1 00438600
THEN GO TO DOMAIN; 00438700
N:=N + (T:=DIM.RF); 00438800
IF ALONG :=(IF N=T THEN RANK ELSE SP[NOC]-ORIGIN+1) GTR RANK 00438900
OR ALONG LSS 1 AND RANK NEQ 0 00439000
THEN BEGIN ERR:=INDEXERROR; GO TO QUIT; END; 00439100
IF RANK=0 THEN DIM:=1 00439200
ELSE BEGIN N:=M+ALONG-1; DIM:=SP[NOC]; END; 00439300
IF SIZE:=RSIZE DIV DIM | LSIZE GTR MAXWORDSTORE 00439400
THEN BEGIN ERR:=KITEERROR; GO TO QUIT; END; 00439500
IF NOT CHECKANDADD(LSIZE,LADDR:=L+I, SUM) THEN GO TO DOMAIN; 00439600
IF SUM NEQ DIM THEN BEGIN ERR:=RANKERROR; GO TO QUIT; END; 00439700
IF RANK=0 THEN BEGIN 00439800
DIM:=SP[MOC]; DESC.SPF:=N:=GETSPACE(LSIZE+I); 00439900
DESC.RF:=I; DESC.DID:=(IF I=0 THEN DDPUSW ELSE DDPUVW); 00440000
SPCOPY(L,N,I); L:=L+I; N:=N+I; TOP:=L+LSIZE-1; 00440100
FOR L:=L STEP 1 UNTIL TOP DO BEGIN 00440200
IF SP[LOC]=1 THEN SP[NOC]:=DIM; 00440300
N:=N+1; END; 00440400
GO TO QUIT END; 00440500
IF RDESC.ARRAYTYPE=1 THEN BEGIN CHARACTER:=TRUE; 00440600
M:=UNPACK(M,RANK,RSIZE); 00440700
INSERT := " "; END; 00440800
FACTOR:=1; TOP:=M+ALONG; 00440900
FOR N:=M+RANK-1 STEP -1 UNTIL TOP DO FACTOR:=FACTOR|SP[NOC]; 00441000
T := GETT(ALONG, RANK); 00441100
J:=0; N:=(MADDR:=M) + RANK; 00441200
DESC.SPF:=M:=GETSPACE(SIZE+RANK); 00441300
I:=M+RANK; 00441400
WHILE J LSS SIZE DO BEGIN 00441500
CASE T OF BEGIN 00441600
S := J DIV FACTOR MOD LSIZE; 00441700
S:=J DIV FACTOR MOD LSIZE; 00441800
S:=J MOD LSIZE; END; 00441900
L:=S + LADDR; 00442000
IF SP[LOC]=1 THEN FOR K:=1 STEP 1 UNTIL FACTOR DO 00442100
BEGIN L:=J+I; SP[LOC] := SP[NOC]; 00442200
J:=J+1; N:=N+1; 00442300
END ELSE FOR K:=1 STEP 1 UNTIL FACTOR DO BEGIN 00442400
L:=J+I; SP[LOC]:=INSERT; J:=J+1; END; 00442500
END; 00442600
L := MADDR; 00442700
FOR I:=1 STEP 1 UNTIL RANK DO BEGIN 00442800
IF I = ALONG THEN SP[MOC]:=LSIZE ELSE SP[MOC]:=SP[LOC]; 00442900
M:=M+1; L:=L+1; END; 00443000
DESC.DID:=DDPUVW; DESC.RF:=RANK; 00443100
GO TO QUIT; 00443200
DOMAIN: ERR:=DOMAINERROR; 00443300
QUIT: IF CHARACTER THEN BEGIN DESC.ARRAYTYPE:=1; 00443400
FORGETSPACE(MADDR, RSIZE+RANK); 00443500
PACK(DESC.SPF,RANK,SIZE); END; 00443600
RESULTD:=DESC; 00443700
POP; 00443800
END PROCEDURE EXPAND; 00443900
PROCEDURE MEMBER; 00444000
BEGIN REAL LDESC, RDESC; 00444100
INTEGER L,M,N,I,S,T,LSIZE,RSIZE,LRANK,RRANK,TOP; 00444200
REAL DESC, TEMP, ANS; 00444300
LABEL QUIT; 00444400
LDESC := AREG; RDESC := BREG; 00444500
LSIZE:=FINDSIZE(LDESC); RSIZE:=FINDSIZE(RDESC); 00444600
LRANK:=LDESC.RF; RRANK:=RDESC.RF; 00444700
IF L:=LDESC.SPF=0 OR M:=RDESC.SPF=0 THEN BEGIN 00444800
ERR:=DOMAINERROR; GO TO QUIT END; 00444900
IF LDESC.ARRAYTYPE=1 THEN L:=UNPACK(L,LRANK,LSIZE); 00445000
IF RDESC.ARRAYTYPE=1 THEN M:=UNPACK(M,RRANK,RSIZE); 00445100
DESC:=LDESC; DESC.NAMED:=0; 00445200
DESC.ARRAYTYPE:=0; 00445300
DESC.SPF:=N:=GETSPACE(LSIZE+LRANK); 00445400
SPCOPY(L,N,LRANK); 00445500
N:=N+LRANK; L:=(T:=L)+LRANK; M:=(S:=M)+RRANK; 00445600
T:=M+RSIZE-1; TOP := L+LSIZE-1; 00445700
FOR L:=L STEP 1 UNTIL TOP DO BEGIN 00445800
TEMP:=SP[LOC]; M:=S; 00445900
WHILE M LEQ T DO 00446000
IF OPERATION(TEMP,SP[MOC],0,12,ANS) AND ANS=1 THEN BEGIN 00446100
SP[NOC]:=1; M:=M+T; END ELSE M:=M+1; 00446200
N:=N+1; END; 00446300
00446400
IF RDESC.ARRAYTYPE=1 THEN FORGETSPACE(S,RSIZE+RRANK); 00446500
IF LDESC.ARRAYTYPE=1 THEN FORGETSPACE(I,LSIZE+LRANK); 00446600
QUIT: RESULTD:=DESC; 00446700
END PROCEDURE MEMBER; 00446800
REAL PROCEDURE BASEVALUE; 00446900
BEGIN 00447000
COMMENT THIS RETURNS A DESCRIPTOR FOR A SCALAR RESULT; 00447100
LABEL OUTE,BAD; 00447200
REAL E,L,M,LEFT,RIGHT,T,LARG,RARG; 00447300
LARG := AREG; RARG := BREG; 00447400
IF M:=RARG.SPF=0 OR LARG.CHRMODE=1 OR RARG.CHRMODE=1 00447500
OR L:=LARG.SPF=0 AND LARG.DID NEQ 0 00447600
THEN GO TO BAD; 00447700
RIGHT:=SP[MOC]; 00447800
LEFT:=SP[LOC]; 00447900
IF FINDSIZE(LARG)=1 THEN % A 1 ELEMENT VECTOR 00448000
BEGIN 00448100
L:=L+LARG.RF; 00448200
LARG.SCALAR:=1; 00448300
LEFT:=SP[LOC]; 00448400
END; 00448500
IF FINDSIZE(RARG)=1 THEN % A ONE ELEMENT VECTOR 00448600
BEGIN 00448700
M:=M+RARG.RF; 00448800
RIGHT:=SP[MOC]; 00448900
RARG.SCALAR:=1; 00449000
END; 00449100
IF L=0 THEN 00449200
BEGIN % BASEVAL MONADIC 00449300
LEFT:=2; %IF MONADIC, ITS 2 BASVAL X 00449400
LARG.SCALAR:=1; 00449500
END; 00449600
IF BOOLEAN(LARG.SCALAR )THEN %SCALAR 00449700
IF BOOLEAN(RARG.SCALAR) THEN 00449800
BEGIN 00449900
T:=RIGHT; %SCALAR-SCALAR 00450000
GO OUTE; 00450100
END 00450200
ELSE 00450300
IF RARG.RF=1 THEN 00450400
BEGIN COMMENT SCALAR-VECTOR--LEFT IS VALUE OF SCALAR, RIGHT 00450500
IS # OF ELEMENTS; 00450600
IF LEFT=0 THEN GO OUTE 00450700
ELSE E:=1/LEFT; 00450800
FOR L :=M+RIGHT STEP -1 UNTIL M+1 DO 00450900
T:=T+SP[LOC]|(E:=E|LEFT); 00451000
GO OUTE; 00451100
END 00451200
ELSE BAD: ERR:=DOMAINERROR 00451300
ELSE 00451400
IF RARG.SCALAR=0 THEN 00451500
IF LARG.RF NEQ 1 OR RARG.RF NEQ 1 THEN 00451600
ERR:=DOMAINERROR 00451700
ELSE 00451800
BEGIN 00451900
GT2:=L; % SAVE FOR LATER TEST 00452000
GT1:=M+2; % WANT TO STOP 2 UP IN LOOP 00452100
L:=L+LEFT; % START AT OTHER END 00452200
E:=1; 00452300
M:=M+RIGHT; 00452400
T:=SP[MOC]; % INITIAL VALUE 00452500
FOR M:=M-1 STEP -1 UNTIL GT1 DO 00452600
BEGIN 00452700
IF L:=L-1 LSS GT2 THEN L:=GT2+LEFT; % START OVER 00452800
E:=E|SP[LOC]; 00452900
T:=T+SP[MOC]|E; 00453000
END; 00453100
OUTE: 00453200
L:=GETSPACE(1); 00453300
SP[LOC]:=T; 00453400
T:=0; 00453500
T.DID:=DDPUSW; % BUILD DESCRIPTOR 00453600
T.SPF:=L; 00453700
BASEVALUE:=T; 00453800
END 00453900
ELSE ERR := DOMAINERROR 00454000
END OF BASEVALUE; 00454100
REAL PROCEDURE REPRESENT; 00454200
BEGIN 00454300
COMMENT RETURNS DESCRIPTOR OF VECTOR IF LARG VECTOR AND RARG SCALAR;00454400
REAL L,M,LEFT,RIGHT,T,E,LARG,RARG; 00454500
LABEL AROUND; 00454600
LARG := AREG; RARG := BREG; 00454700
IF (RARG.SCALAR=1 OR FINDSIZE(RARG)=1 AND RARG.CHRMODE=0) 00454800
AND NOT(LARG.SCALAR=1 OR LARG.CHRMODE=1 OR LARG.RF NEQ 1) THEN 00454900
BEGIN 00455000
COMMENT VECTOR-SCALAR; 00455100
IF L:=LARG.SPF=0 OR M:=RARG.SPF=0 THEN GO AROUND; 00455200
IF RARG.SCALAR=0 THEN M:=M+RARG.RF; 00455300
RIGHT:=SP[MOC]; % VALUE OF SCALAR 00455400
LEFT:=SP[LOC]; % LENGTH OF VECTOR 00455500
E:=M:=GETSPACE(LEFT+1); % MAKE ROOM FOR ANSWER 00455600
SP[MOC]:=LEFT; % LENGTH OF ANSWER 00455700
M:=M+LEFT; 00455800
GT1:=L+2; 00455900
FOR L:=L+LEFT STEP -1 UNTIL GT1 DO 00456000
IF T:=SP[LOC] LEQ 0 THEN 00456100
IF T LSS 0 THEN ERR:= DOMAINERROR 00456200
ELSE 00456300
BEGIN 00456400
L:=GT1-1 ; % STOP THE LOOP 00456500
M:=M-1; 00456600
END 00456700
ELSE 00456800
BEGIN 00456900
SP[MOC]:= RIGHT MOD T; 00457000
RIGHT:=RIGHT DIV T; 00457100
M:=M-1; 00457200
IF RIGHT LSS FUZZ THEN L:=GT1-1; % STOP THE LOOP 00457300
END; 00457400
SP[MOC]:=RIGHT; % LEFTOVER GOES HERE 00457500
T.DID:=DDPUVW; 00457600
T.RF:=1; 00457700
T.SPF:=E; 00457800
REPRESENT:=T; 00457900
END 00458000
ELSE AROUND: ERR:=DOMAINERROR; 00458100
END OF REPRESENT; 00458200
PROCEDURE PERIOD(LDESC,RDESC,LOP,ROP); 00458300
VALUE LDESC,RDESC,LOP,ROP; REAL LDESC,RDESC; INTEGER LOP,ROP; 00458400
BEGIN INTEGER L,M,N,J,LRANK,RRANK,RANK,LSIZE,RSIZE,SIZE,LL,MM,I, 00458500
RROW,RCOL,LROW,LCOL,LJUMP,RJUMP,MSAVE,LSAVE,RSTART; 00458600
REAL DESC, TEMP; 00458700
BOOLEAN CHARACTER, FIRST,LSCALAR, RSCALAR; 00458800
LABEL QUIT, DOMAIN, FORGET, OUTERPROD; 00458900
IF L:=LDESC.SPF = 0 OR M:= RDESC.SPF=0 THEN GO TO DOMAIN; 00459000
LSIZE := FINDSIZE(LDESC); RSIZE:=FINDSIZE(RDESC); 00459100
LRANK:=LDESC.RF; RRANK := RDESC.RF; 00459200
IF LOP NEQ 45 THEN 00459300
IF LRANK GTR 2 AND LSIZE NEQ 1 OR RRANK GTR 2 AND RSIZE NEQ 1 THEN 00459400
BEGIN ERR:=KITEERROR; GO TO QUIT; END; 00459500
IF ROP:=GETOP(CORRESPONDENCE,ROP-1) = 9 THEN BEGIN 00459600
ERR:=SYNTAXERROR; GO TO QUIT; END; 00459700
IF LL:=LDESC.ARRAYTYPE=1 OR MM:=RDESC.ARRAYTYPE=1 THEN 00459800
IF LL | MM NEQ 1 THEN GO TO DOMAIN 00459900
ELSE BEGIN 00460000
00460100
IF ROP LSS 11 OR ROP GTR 16 THEN GO TO DOMAIN; 00460200
CHARACTER:=TRUE; 00460300
M:=UNPACK(M,RRANK,RSIZE); 00460400
L:=UNPACK(L,LRANK,LSIZE); END; 00460500
MSAVE := M; LSAVE:=L; IF ROP NEQ 45 THEN 00460600
IF LOP=45 THEN GO TO OUTERPROD ELSE 00460700
IF LOP:=GETOP(CORRESPONDENCE,LOP-1)=9 THEN 00460800
BEGIN ERR:=SYNTAXERROR; GO TO QUIT; END; 00460900
IF LRANK=2 THEN BEGIN 00461000
N:=L+LRANK-1; LCOL := SP[NOC]; 00461100
N:=N-1; LROW:=SP[NOC]; END; 00461200
IF LRANK=1 THEN BEGIN LROW:=1; LCOL:=SP[LOC]; END; 00461300
IF RRANK=2 THEN BEGIN 00461400
N :=M+RRANK-1; RCOL:=SP[NOC]; 00461500
N:=N-1; RROW:=SP[NOC]; END; 00461600
IF RRANK=1 THEN BEGIN RROW:=SP[MOC]; RCOL:=1; END; 00461700
IF LSIZE =1 OR RSIZE=1 THEN BEGIN 00461800
IF LSIZE = 1 AND RSIZE = 1 THEN LROW:=LCOL:=RROW:=RCOL:=1 00461900
ELSE IF LSIZE=1 THEN BEGIN LCOL:=RROW; LROW:=1; 00462000
L:=L+LRANK-1; LRANK:=1; 00462100
LSCALAR:=TRUE; END 00462200
ELSE BEGIN RROW := LCOL; RCOL := 1; 00462300
M:=M+RRANK-1; RRANK:=1; 00462400
RSCALAR:=TRUE; END; 00462500
END; 00462600
IF LCOL NEQ RROW 00462700
THEN BEGIN ERR:=RANKERROR; GO TO QUIT; END; 00462800
DESC.SPF:=N:=GETSPACE((RANK:=MAX(0,LRANK+RRANK-1))+ 00462900
SIZE:=LROW|RCOL); 00463000
SPCOPY(L,N,LRANK-1); 00463100
SPCOPY(M+1,N+LRANK-1,RRANK-1); 00463200
DESC.RF:=RANK; DESC.DID:=(IF RANK=0 THEN DDPUSW ELSE DDPUVW); 00463300
N:=N+RANK; 00463400
LL := L + LRANK - 1; 00463500
MM := M + RRANK - 1; 00463600
LJUMP := LCOL-1; RJUMP := IF RSCALAR THEN 0 ELSE (RROW-1) | RCOL; 00463700
FOR J:=1 STEP LCOL UNTIL LSIZE DO 00463800
FOR RSTART:=1 STEP 1 UNTIL RCOL DO BEGIN 00463900
FIRST:=TRUE; 00464000
M := MM + RSTART + RJUMP; RROW := LL + J; 00464100
FOR I:=LL + LJUMP + J STEP -1 UNTIL RROW DO BEGIN 00464200
IF LSCALAR THEN L:=LL+1 ELSE L:=I; 00464300
IF FIRST THEN BEGIN 00464400
IF NOT OPERATION(SP[LOC],SP[MOC],1,ROP,SP[NOC]) 00464500
THEN GO TO FORGET ELSE FIRST := FALSE; 00464600
END ELSE BEGIN 00464700
IF NOT OPERATION(SP[LOC],SP[MOC],1,ROP,TEMP) 00464800
THEN GO TO FORGET; 00464900
IF NOT OPERATION(TEMP,SP[NOC],-1,LOP,SP[NOC]) 00465000
THEN GO TO FORGET END; 00465100
IF NOT RSCALAR THEN M:=M-RCOL; END; 00465200
N := N+1; 00465300
END; 00465400
GO TO QUIT; 00465500
OUTERPROD: IF SIZE:=LSIZE|RSIZE GTR MAXWORDSTORE 00465600
OR RANK := LRANK+RRANK GTR 31 THEN BEGIN 00465700
ERR:=KITEERROR; GO TO QUIT; END; 00465800
DESC.SPF:=N:=GETSPACE(SIZE+RANK); 00465900
DESC.DID:=IF RANK=0 THEN DDPUSW ELSE DDPUVW; 00466000
DESC.RF:=RANK; 00466100
SPCOPY(L,N,LRANK); 00466200
SPCOPY(M,N+LRANK,RRANK); 00466300
N:=N+RANK; 00466400
I:=L + LRANK + LSIZE - 1; 00466500
MM := M+RRANK + RSIZE - 1; 00466600
FOR L:=L+LRANK STEP 1 UNTIL I DO 00466700
FOR M:=MSAVE+RRANK STEP 1 UNTIL MM DO 00466800
IF NOT OPERATION(SP[LOC],SP[MOC],1,ROP,SP[NOC]) THEN 00466900
GO TO FORGET ELSE N:=N+1; 00467000
GO TO QUIT; 00467100
FORGET: FORGETSPACE(DESC.SPF,RANK+SIZE); 00467200
DOMAIN: ERR:=DOMAINERROR; 00467300
QUIT: IF CHARACTER THEN BEGIN 00467400
FORGETSPACE(MSAVE , RRANK+RSIZE); 00467500
FORGETSPACE(LSAVE , LRANK+LSIZE); END; 00467600
RESULTD := DESC; 00467700
END PROCEDURE PERIOD; 00467800
PROCEDURE REVERSE(SOURCE,LENGTH,DEST,JUMP); VALUE SOURCE,DEST, 00467900
LENGTH,JUMP; INTEGER SOURCE,LENGTH,DEST,JUMP; 00468000
BEGIN INTEGER L,M,TOP; 00468100
M:=SOURCE + TOP:=(LENGTH-1) | JUMP; TOP:=DEST+TOP; 00468200
FOR L:=DEST STEP JUMP UNTIL TOP DO BEGIN 00468300
SP[LOC] := SP[MOC]; M:=M-JUMP; END; 00468400
END PROCEDURE REVERSE; 00468500
PROCEDURE ROTATE(SOURCE,LENGTH,DEST,JUMP,ROT); VALUE SOURCE, 00468600
LENGTH,DEST,JUMP,ROT; INTEGER SOURCE,LENGTH,DEST,JUMP,ROT; 00468700
BEGIN INTEGER L,M,TOP; 00468800
TOP := SOURCE + (LENGTH-1) | JUMP; 00468900
FOR L:=SOURCE STEP JUMP UNTIL TOP DO BEGIN 00469000
M:=DEST+(ROT MOD LENGTH)|JUMP; SP[MOC]:=SP[LOC]; 00469100
ROT := ROT + 1; END; 00469200
END PROCEDURE ROTATE; 00469300
INTEGER PROCEDURE GETNUM(TIM,L,SIZE,DIM); VALUE TIM,L, 00469400
SIZE,DIM; INTEGER TIM,L,SIZE,DIM; 00469500
BEGIN INTEGER NUM; 00469600
IF SIZE NEQ 0 THEN L := L + TIM; 00469700
NUM:=SIGN(NUM:=SP[LOC]) | ENTIER(ABS(NUM)) MOD DIM; 00469800
IF NUM LSS 0 THEN GETNUM := -NUM %FOR RIGHT ROTATION 00469900
ELSE GETNUM:=DIM-NUM; %FOR LEFT ROTATION 00470000
END PROCEDURE GETNUM; 00470100
BOOLEAN PROCEDURE MATCHROT(LDESC,RDESC,ALONG); VALUE LDESC, 00470200
RDESC,ALONG; INTEGER LDESC,RDESC,ALONG; 00470300
BEGIN INTEGER I,L,M,R; LABEL QUIT; 00470400
MATCHROT:=TRUE; L:=LDESC.SPF; M:=RDESC.SPF; 00470500
IF R:=LDESC.RF NEQ RDESC.RF-1 THEN BEGIN 00470600
MATCHROT:=FALSE; GO TO QUIT; END; 00470700
FOR I:=1 STEP 1 UNTIL R DO BEGIN IF I=ALONG THEN M:=M+1; 00470800
IF SP[LOC] NEQ SP[MOC] THEN BEGIN MATCHROT:=FALSE; 00470900
GO TO QUIT; END; M:=M+1; L:=L+1; END; 00471000
QUIT: END PROCEDURE MATCHROT; 00471100
PROCEDURE REDUCESORTSCAN(LOP,RDESC,DIM,KIND); VALUE LOP,RDESC, 00471200
DIM,KIND; REAL LOP,RDESC,DIM; INTEGER KIND; 00471300
BEGIN INTEGER L,M,N,I,J,K,ALONG,FACTOR,T,MSAVE,DIFF,SSIZE, 00471400
JUMP,RANK,SIZE,TOP,LASTDIM,INTERVAL,TEMP,HOP; 00471500
INTEGER REMDIM,LRANK,LSAVE,LSIZE,S; 00471600
BOOLEAN CHARACTER,REDUCE,SORT,SCAN,REVERSAL,ROTATION; 00471700
REAL DESC; 00471800
LABEL QUIT, FORGET, RANKERR; 00471900
COMMENT: KIND=1 FOR REDUCTION 00472000
KIND=2 FOR SORTUP OR SORTDN 00472100
KIND=3 FOR SCAN 00472200
KIND=4 FOR REVERSAL 00472300
KIND=5 FOR ROTATION; 00472400
PROCEDURE SORTIT(L,M,SIZE,JUMP,UP); VALUE L,M,SIZE,JUMP,UP; 00472500
INTEGER L,M,SIZE,JUMP; BOOLEAN UP; 00472600
BEGIN INTEGER N,TIP,TOP,LSAVE; 00472700
REAL COMPARE,OUTOFIT; 00472800
OUTOFIT:=IF UP THEN BIGGEST ELSE -BIGGEST; 00472900
TIP := M + (N:=(SIZE-1) | JUMP); TOP := L + N; 00473000
LSAVE := L; 00473100
FOR M:=M STEP JUMP UNTIL TIP DO BEGIN 00473200
L := LSAVE; COMPARE := SP[LOC]; N:=L; 00473300
FOR L:=L+1 STEP 1 UNTIL TOP DO 00473400
IF UP THEN BEGIN IF SP[LOC] LSS COMPARE THEN BEGIN 00473500
N:=L; COMPARE:=SP[LOC]; END; 00473600
END ELSE IF SP[LOC] GTR COMPARE THEN BEGIN 00473700
N:=L; COMPARE:=SP[LOC]; END; 00473800
SP[NOC] := OUTOFIT; 00473900
SP[MOC] := (N-LSAVE) + ORIGIN; 00474000
END; 00474100
END PROCEDURE SORTIT; 00474200
CASE KIND OF BEGIN ; REDUCE:=TRUE; SORT:=TRUE; SCAN:=TRUE; 00474300
REVERSAL:=TRUE; ROTATION:=TRUE; END; 00474400
IF LOP GTR 64 AND NOT ROTATION THEN BEGIN 00474500
ERR:=SYSTEMERROR; GO TO QUIT; END; 00474600
IF REDUCE OR SCAN THEN IF LOP NEQ 45 THEN 00474700
LOP := GETOP(CORRESPONDENCE,LOP-1); 00474800
IF M:=RDESC.SPF=0 AND NOT REDUCE 00474900
OR DIM.DID NEQ 0 AND N:=DIM.SPF=0 OR DIM.ARRAYTYPE=1 00475000
OR FINDSIZE(DIM) NEQ 1 THEN BEGIN 00475100
ERR:=DOMAINERROR; GO TO QUIT END; 00475200
IF (REDUCE OR SCAN) AND LOP=9 THEN BEGIN %OP NOT DYADIC SCALAR 00475300
ERR:=SYNTAXERROR; GO TO QUIT END; 00475400
IF M=0 THEN BEGIN 00475500
%FOR REDUCTION, RESULT OF A NULL IS CORRESPONDING IDENTITY 00475600
%EXCEPT THAT NAND, NOR, CIRCLE, AND LOG (LOP GTR 18) 00475700
%HAVE NO IDENTITIES, SO THE RESULT IS A NULL 00475800
DESC.DID := DDPUSW; 00475900
IF LOP LEQ 18 THEN BEGIN DESC.SPF:=N:=GETSPACE(1); 00476000
SP[NOC] := IDENTITY(LOP); END ELSE DESC.RF:=1; 00476100
GO TO QUIT; END; 00476200
IF RDESC.ARRAYTYPE=1 AND (REDUCE OR SCAN) THEN 00476300
BEGIN ERR:=DOMAINERROR; GO TO QUIT; END; 00476400
SIZE:=FINDSIZE(RDESC); 00476500
RANK:=RDESC.RF; 00476600
IF SIZE=1 THEN BEGIN 00476700
%UNLESS SORT, RESULT OF SINGLE-VALUED ARGUMENT IS THAT ARGUMENT 00476800
DESC := RDESC; 00476900
DESC.SPF := N := GETSPACE(RANK+1); 00477000
SPCOPY(M,N,RANK);M:=M+RANK;N:=N+RANK; 00477100
IF SORT THEN BEGIN SP[NOC]:=ORIGIN; DESC.ARRAYTYPE:=0; 00477200
END ELSE SP[NOC]:=SP[MOC]; 00477300
GO TO QUIT; END; 00477400
00477500
IF RDESC.ARRAYTYPE=1 THEN BEGIN 00477600
CHARACTER := TRUE; 00477700
M:=UNPACK(M,RANK,SIZE); END; 00477800
MSAVE:=M; 00477900
N:=N+(T:=DIM.RF); 00478000
IF ALONG:=(IF N=T THEN RANK ELSE SP[NOC]-ORIGIN+1) GTR RANK 00478100
OR ALONG LSS 1 00478200
THEN BEGIN ERR:=INDEXERROR; GO TO QUIT; END; 00478300
IF ROTATION THEN BEGIN 00478400
IF LSAVE:=LOP.SPF=0 OR LOP.ARRAYTYPE=1 THEN 00478500
BEGIN ERR:=DOMAINERROR; GO TO QUIT; END; 00478600
IF LSIZE:=FINDSIZE(LOP) NEQ 1 THEN 00478700
IF NOT MATCHROT(LOP,RDESC,ALONG) THEN BEGIN 00478800
ERR:=RANKERROR; GO TO QUIT; END; 00478900
LSAVE := LSAVE + LRANK := LOP.RF; 00479000
IF LSIZE = 1 THEN LRANK := 0; END; 00479100
N:=M+ALONG-1; 00479200
DIM:=SP[NOC]; 00479300
JUMP:=1; I:=M+ALONG; 00479400
FOR L:=M+RANK-1 STEP -1 UNTIL I DO JUMP:=JUMP | SP[LOC]; 00479500
N:=M+RANK-1; LASTDIM:=SP[NOC]; 00479600
IF ALONG = RANK-1 THEN BEGIN N:=N-1; 00479700
FACTOR:=LASTDIM | SP[NOC]; END; 00479800
T := GETT(ALONG, RANK); 00479900
J := M + RANK; 00480000
REMDIM := 1; 00480100
HOP := (DIM-1) | JUMP; 00480200
DESC.DID := DDPUVW; 00480300
IF ALONG GTR 1 AND ALONG LSS RANK-1 THEN BEGIN TOP:=M+ALONG-2; 00480400
FOR L:=M STEP 1 UNTIL TOP DO REMDIM:=REMDIM|SP[LOC]; END; 00480500
IF REDUCE THEN BEGIN DESC.SPF:=N:=GETSPACE(SSIZE:=SSIZE DIV DIM 00480600
+ RANK - 1); 00480700
IF RANK=1 THEN DESC.SCALAR:=1 ELSE DESC.RF:=RANK-1; 00480800
FOR I:=1 STEP 1 UNTIL RANK DO BEGIN 00480900
IF I NEQ ALONG THEN BEGIN SP[NOC]:=SP[MOC]; N:=N+1; END; 00481000
M:=M+1; END; 00481100
JUMP := - JUMP; 00481200
END ELSE BEGIN DESC.SPF:=N:=GETSPACE(SSIZE:=SIZE+RANK); 00481300
INTERVAL := (DIFF := N-M) + HOP; 00481400
SPCOPY(M,N,RANK); DESC.RF:=RANK; END; 00481500
IF SORT THEN TEMP:=GETSPACE(DIM); 00481600
TOP := SIZE DIV (DIM | REMDIM) - 1; 00481700
FOR S:=1 STEP 1 UNTIL REMDIM DO BEGIN 00481800
FOR I:=0 STEP 1 UNTIL TOP DO BEGIN 00481900
CASE T OF BEGIN 00482000
L := I + J; 00482100
L:=I DIV LASTDIM|FACTOR + I MOD LASTDIM + J; 00482200
L:=I|LASTDIM + J; END; 00482300
IF REDUCE THEN BEGIN M:=I+N; L:=HOP + (K:=L); 00482400
SP[MOC] := SP[LOC]; 00482500
FOR L:=L+JUMP STEP JUMP UNTIL K DO 00482600
IF NOT OPERATION(SP[LOC],SP[MOC],-1,LOP,SP[MOC]) 00482700
THEN GO TO FORGET; 00482800
END ELSE 00482900
IF SORT THEN BEGIN K:=L+HOP; N:=TEMP; 00483000
FOR M:=L STEP JUMP UNTIL K DO BEGIN 00483100
SP[NOC] := SP[MOC]; N:=N+1; END; 00483200
IF LOP LSS 0 THEN SORTIT(TEMP,L+DIFF,DIM,JUMP,FALSE) 00483300
ELSE SORTIT(TEMP,L+DIFF,DIM,JUMP,TRUE); 00483400
END ELSE IF SCAN THEN BEGIN 00483500
K:=L+INTERVAL; N:=L+DIFF; SP[NOC] := SP[LOC]; 00483600
FOR N:=N+JUMP STEP JUMP UNTIL K DO BEGIN 00483700
M:=N-JUMP; L:=L+JUMP; 00483800
IF NOT OPERATION(SP[MOC],SP[LOC],-1,LOP,SP[NOC]) 00483900
THEN GO TO FORGET; END; 00484000
END ELSE IF REVERSAL THEN REVERSE(L,DIM,L+DIFF,JUMP) 00484100
ELSE IF ROTATION THEN ROTATE(L,DIM,L+DIFF,JUMP, 00484200
GETNUM(I,LSAVE,LRANK,DIM)); 00484300
END; 00484400
J := J + ABS(JUMP|DIM); 00484500
N := N + TOP + 1; 00484600
DIFF := DIFF + TOP + 1; 00484700
END; 00484800
GO TO QUIT; 00484900
RANKERR: ERR:=RANKERROR; FORGETSPACE(DESC.SPF,SSIZE);GO QUIT; 00485000
FORGET: ERR:=DOMAINERROR; FORGETSPACE(DESC.SPF, SSIZE); 00485100
QUIT: IF CHARACTER THEN BEGIN 00485200
FORGETSPACE(MSAVE,SIZE+RANK); 00485300
IF (REVERSAL OR ROTATION) AND ERR=0 THEN BEGIN 00485400
DESC.ARRAYTYPE:=1; PACK(DESC.SPF,RANK,SIZE); END; END; 00485500
IF SORT THEN FORGETSPACE(TEMP,DIM); 00485600
RESULTD := DESC; 00485700
IF ROTATION THEN POP; 00485800
END PROCEDURE REDUCESORTSCAN; 00485900
PROCEDURE DYADICTRANS; 00486000
BEGIN REAL LDESC,RDESC; 00486100
INTEGER L,M,N,RANK,NEWRANK,SIZE,TEMP,I,J; 00486200
DEFINE SPTOP=RDESC#,MIN=RDESC#,PTR=NEWRANK#,MBASE=LDESC#,TOP=RDESC# 00486300
,RESULT=RESULTD#; 00486400
LABEL QUIT; BOOLEAN CARRY; 00486500
INTEGER ARRAY RVEC,DEL,SUB,OLDEL[0:3]; 00486600
LDESC:=AREG; RDESC:=BREG; 00486700
RESULT:=0; L:=LDESC.SPF; J:=LDESC.RF; RANK:=RDESC.RF; 00486800
IF M:=RDESC.SPF=0 OR L=0 OR LDESC.ARRAYTYPE=1 THEN BEGIN 00486900
ERR:=DOMAINERROR; GO TO QUIT; END; 00487000
IF NUMELEMENTS(LDESC)=1 THEN BEGIN N:=L+J; 00487100
IF SP[NOC] NEQ ORIGIN OR RANK GTR 1 THEN BEGIN 00487200
ERR:=DOMAINERROR; GO TO QUIT END; 00487300
%IF WE GET HERE, THE ANSWER IS ITSELF 00487400
RESULT:=RDESC; I:=NUMELEMENTS(RDESC); 00487500
RESULT.SPF:=N:=GETSPACE(SIZE:=RANK+1); RESULT.NAMED:=0; 00487600
SPCOPY(M,N,SIZE); GO TO QUIT END; 00487700
IF J GTR 1 THEN BEGIN ERR:=RANKERROR; GO TO QUIT END; 00487800
IF SP[LOC] NEQ RANK THEN BEGIN ERR:=LENGTHERROR; GO TO QUIT END; 00487900
% FIND MAX OF LDESC FOR NOW- DO THE REST LATER 00488000
%LDESC W/R/T ORIGIN 0 GETS STORED IN SUB[I] 00488100
SPTOP:=L+RANK; NEWRANK:=0; I:=0; 00488200
FOR N:=L+1 STEP 1 UNTIL SPTOP DO BEGIN 00488300
IF TEMP:=SP[NOC]-ORIGIN+1 GTR NEWRANK THEN NEWRANK:=TEMP; 00488400
SUB[I]:=TEMP-1; I:=I+1 END; 00488500
IF NEWRANK GTR RANK THEN BEGIN ERR:=DOMAINERROR;GO TO QUIT END; 00488600
% CALCULATE THE OLD DEL VECTOR, OLDEL 00488700
OLDEL[RANK-1]:=1; N:=M+RANK-1; 00488800
FOR I:=RANK-2 STEP -1 UNTIL 0 DO BEGIN 00488900
OLDEL[I]:=OLDEL[I+1]|SP[NOC]; N:=N-1 END; 00489000
MBASE:=M; SIZE:=1; 00489100
%FIX UP THE NEW RVAC AND DEL 00489200
FOR I:=NEWRANK-1 STEP -1 UNTIL 0 DO BEGIN 00489300
% FIND SMALLEST EL. OF RHO RDESC [J] S.T. A[J]=I 00489400
% AND SUM OF OLDEL[J] S.T. A[J]=1 00489500
MIN:=31; TEMP:=0; 00489600
FOR J:=RANK-1 STEP -1 UNTIL 0 DO 00489700
IF SUB[J]=1 THEN BEGIN 00489800
M:=MBASE+J; 00489900
IF SP[MOC] LSS MIN THEN MIN:=SP[MOC]; 00490000
TEMP:=TEMP+OLDEL[J] END; 00490100
RVEC[I]:=MIN; DEL[I]:=TEMP; SIZE:=SIZE|RVEC[I]; 00490200
IF TEMP=0 THEN BEGIN %IT DOESN7T EXHAUSE IOTA NEWRANK 00490300
ERR:=DOMAINERROR; GO TO QUIT END; 00490400
END; 00490500
RESULT:=M:=GETSPACE(NEWRANK+SIZE); 00490600
RESULT.RF:=NEWRANK; RESULT.DID:=DDPUVW; 00490700
IF BOOLEAN(BREG.ARRAYTYPE) THEN BEGIN 00490800
RESULT.ARRAYTYPE:=1; N:=MBASE; 00490900
MBASE:=UNPACK(MBASE,RANK,N:=OLDEL[0]|SP[NOC]); 00491000
FORGETSPACE(MBASE,N+RANK) END; 00491100
FOR I:=1 STEP 1 UNTIL NEWRANK DO BEGIN 00491200
SP[MOC]:=RVEC[I-1]; M:=M+1 END; 00491300
%INTIALIZE FOR STEPPING THRU NEW ARRAY 00491400
FOR I:=NEWRANK-1 STEP -1 UNTIL 0 DO BEGIN 00491500
SUB[I]:=0; OLDEL[I]:=RVEC[I]|DEL[I] END; 00491600
L:=MBASE+RANK; 00491700
%STEP THRU THE SUBSCRIPTS OF THE ANSWER TO PICK UP THE ELEMENTS 00491800
% IN ROW ORDER ACCORDING TO THE MAPPING GIVEN BY DEL 00491900
PTR:=TOP:=NEWRANK-1; 00492000
FOR I:=1 STEP 1 UNTIL SIZE DO BEGIN 00492100
SP[MOC] :=SP[LOC]; 00492200
M:=M+1; 00492300
%GET NEXT SUBSCRIPT FOR NEW ARRAY AND SET NEXT L; 00492400
SUB[PTR]:=SUB[PTR]+1; 00492500
L:=L+DEL[TOP]; 00492600
CARRY:=TRUE; 00492700
WHILE CARRY AND I NEQ SIZE DO 00492800
IF SUB[PTR] GEQ RVEC[PTR] THEN BEGIN 00492900
SUB[PTR]:=0; 00493000
L:=L-OLDEL[PTR]+DEL[PTR:=PTR-1]; 00493100
SUB[PTR]:=SUB[PTR]+1 00493200
END ELSE CARRY := FALSE; 00493300
PTR:=TOP; 00493400
END; 00493500
IF BOOLEAN(RESULT.ARRAYTYPE) THEN PACK(RESULT.SPF,TOP+1,SIZE); 00493600
QUIT: END OF DYADICTRANS; 00493700
INTEGER PROCEDURE LOCATE(L,M); VALUE L,M; REAL L,M; 00493800
BEGIN 00493900
COMMENT L IS THE DIMENSION OF THE VECTOR(DESCRIPTOR), 00494000
M IS THE INDEX VECTOR; 00494100
INTEGER P,I,UB; 00494200
L:=I:=L.SPF; M:=I:=M.SPF; 00494300
UB:=SP[MOC]-1; 00494400
M:=M+1; 00494500
FOR I:=1 STEP 1 UNTIL UB DO 00494600
BEGIN 00494700
L:=L+1; 00494800
P:=(P+SP[MOC]-1)|SP[LOC]; 00494900
M:=M+1; 00495000
END; 00495100
P:=P+SP[MOC]; 00495200
LOCATE:=P+L; 00495300
END; 00495400
PROCEDURE DISPLAY(A,B); VALUE A,B; REAL A,B; 00495500
BEGIN 00495600
PROCEDURE PRINTMATRIX(L,ROW,COL);VALUE L,ROW,COL; 00495700
INTEGER L,ROW,COL; 00495800
BEGIN INTEGER I,J,CC,FOLD; DEFINE WIDE=GT2#; 00495900
WIDE:=LINESIZE; 00496000
FOR I:=1 STEP 1 UNTIL ROW DO 00496100
BEGIN CC:=0; %NO BLANKS AT BEGINNING OF LINE 00496200
FOLD:=0; 00496300
FOR J:=1 STEP 1 UNTIL COL DO 00496400
BEGIN NUMBERCON(SP[LOC],ACCUM); 00496500
IF FOLD:=FOLD+ACOUNT+CC GTR WIDE AND ACOUNT+CC 00496600
LEQ WIDE THEN BEGIN TERPRINT; 00496700
FORMROW(0,2,ACCUM,2,ACOUNT); FOLD:=ACOUNT+2; END ELSE 00496800
FORMROW(0,CC,ACCUM,2,ACOUNT); L:=L+1; 00496900
CC:=2; %PUT 2 BLANKS AFTER FIRST ITEM. 00497000
END; 00497100
TERPRINT; 00497200
END 00497300
END; 00497400
INTEGER L,N,M,BOTTOM,ALOC,BLOC; 00497500
INTEGER ROW,COL; 00497600
ALOC:=A.SPF; BLOC:=B.SPF-1; 00497700
L:=(M:=B.RF)+ BLOC; COL:=SP[LOC]; 00497800
L:=L-1; 00497900
ROW:=(IF M GTR 1 THEN SP[LOC] ELSE 1); 00498000
L:=BOTTOM:=M-2; 00498100
PRINTMATRIX(LOCATE(B,A),ROW,COL); 00498200
WHILE L GTR 0 DO 00498300
BEGIN 00498400
M:=ALOC+L; N:=BLOC+L; 00498500
IF SP[MOC]:=SP[MOC]+1 GTR SP[NOC] THEN 00498600
BEGIN SP[MOC]:=1; L:=L-1; END 00498700
ELSE BEGIN FORMWD(3,"1 "); 00498800
PRINTMATRIX(LOCATE(B,A),ROW,COL); 00498900
L:=BOTTOM; 00499000
END; 00499100
END; 00499200
FORMWD(3,"1 "); 00499300
END; 00499400
PROCEDURE MAKEFUNCTIONPRESENT(L); VALUE L ; REAL L; %LOC DESC 00499500
BEGIN 00499600
INTEGER I; 00499700
REAL M,N,SEQ,ORD,D; 00499800
BOOLEAN NUMERIC; 00499900
REAL STREAM PROCEDURE CON(A);VALUE A; 00500000
BEGIN SI:=LOC A; DI:=LOC CON; DS:=8OCT 00500100
END; 00500200
D:=SP[LOC]; %DESCRIPTOR FOR FUNCTION IS IN D 00500300
SEQ:=GETFIELD(D,FSQF-8,FFL); ORD:=GETFIELD(D,FPTF-8,FFL); 00500400
N:=GETSPACE((M:=SIZE(ORD))|2+6); %GET SPACE FOR TABLE 00500500
SP[NOC]:=M|2+5; %SIZE OF THE VECTOR WHICH FOLLOWS 00500600
D:=D&N[CSPF]&1[CRF]&0[BACKPT]; D.PRESENCE:=1; 00500700
SP[LOC]:=D; %THIS SETS UP THE FUNCTION DESCRIPTOR. 00500800
N:=N+1; SP[NOC]:=SEQ; 00500900
COMMENT 00501000
SP[N] = SIZE OF THE VECTOR 00501100
SP[N+1] = SEQUENTIAL STORAGE UNIT FOR THE TEXT 00501200
SP[N+2] = SP LOC OF FIRST NUMERIC POINTER TO TEXT 00501300
00501400
SP[N+3] = REL LOC (TO N+5) OF THE FIRST ARG 00501500
SP[N+4] = REL LOC TO THE SECOND ARG 00501600
SP[N+5] = REL LOC OF RESULT . IF ANY ARE ZERO, THEN 00501700
THEY ARE NOT THERE.; 00501800
D:=M; M:=(N:=N+4)+1; %D IS #ITEMS, M IS LOC 1ST, N=M-1 00501900
FOR I:=1 STEP 1 UNTIL D DO %GET LABELS FROM STORAGE 00502000
BEGIN L:=CONTENTS(ORD,I-1,GTA); 00502100
IF NOT NUMERIC THEN %RESULT, ARGS, OR LOCALS/LABELS 00502200
IF NUMERIC:=GTA[0]=0 THEN %FIRST NUMERIC POINTER 00502300
BEGIN L:=N-3; SP[LOC]:=N+I|2-1; 00502400
END; 00502500
SP[MOC]:=GTA[0]; M:=M+1; 00502600
IF NUMERIC THEN SP[MOC]:=GTA[1] ELSE 00502700
BEGIN 00502800
IF SEQ:=GTA[1] LSS 0 THEN %RESULT OR ARG 00502900
BEGIN L:=N+SEQ+1; SP[LOC]:=I; 00503000
SEQ:=0; 00503100
END ELSE SEQ:=CON(SEQ)/10000; 00503200
SP[MOC]:=SEQ 00503300
END; 00503400
M:=M+1 00503500
END; 00503600
COMMENT WE HAVE TO SET UP THE FUNCTION LABEL TABLE, LET 00503700
SOMEONE ELSE FIGURE OUT HOW TO EXECUTE IT; 00503800
END; 00503900
PROCEDURE PUSHINTOSYMTAB(FPTR);VALUE FPTR;REAL FPTR; 00504000
BEGIN COMMENT ...PUT THE LOCAL VARIABLES FROM THIS SUSPENDED 00504100
FUNCTION INTO THE SYMBOL TABLE TO BE TREATED AS GLOBAL VARIABLES 00504200
WHILE THE FUNCTION IS SUSPENDED. FPTR IS THE ENTRY FROM THE 00504300
STATE INDICATOR VECTOR FOR THE FUNCTION.; 00504400
00504500
REAL T,U; 00504600
LABEL COPY; 00504700
INTEGER K,L,M,N; 00504800
M:=FPTR.LOCFIELD+1;%LOCATE FMKS TO FIND LOCAL VALUES IN STACK 00504900
N:=FPTR.SPF+2;T:=SP[NOC]-2;%FIND LOCAL NAMES 00505000
FOR N:=N+4 STEP 2 UNTIL T DO %ONCE FOR EACH LOCAL 00505100
BEGIN GT1:=SP[NOC].[6:42];%PICK UP THE LOCAL NAME 00505200
L:=SYMBASE;K:=L+SP[LOC];% LOOK IN SYMBOL TABLE 00505300
FOR L:=L+1 STEP 2 UNTIL K DO % CHECK EACH NAME 00505400
IF GT1=SP[LOC].[6:42] THEN % WE FOUND A MATCH 00505500
BEGIN GT1:=M;K:=M:=GETSPACE(1);L:=L+1; 00505600
SP[MOC]:=SP[LOC]; %PUSH CURRENT DESCRIPTOR DOWN 00505700
M:=GT1; GO TO COPY; 00505800
END; 00505900
COMMENT GET HERE IF NO MATCH...MUST MAKE A NEW ENTRY IN 00506000
SYMBOL TABLE; 00506100
IF K LSS MAXSYMBOL|2 THEN % THERE IS ROOM IN SYMBOL TABLE 00506200
BEGIN L:=SYMBASE;SP[LOC]:=SP[LOC]+2; L:=K+1; 00506300
SP[LOC]:=GT1&OPERAND[CTYPEF]&1[CSUSVAR];L:=L+1;K:=0; 00506400
COPY: COMMENT L IS LOC IN SYMBOL TABLE FOR DESC. K WILL BE 00506500
CONTENTS OF BACKF. NOW SET UP THE NEW DESCRIPTOR AND 00506600
SAVE ITS LOCATION IN THE STACK. M IS THE STACK LOCATION 00506700
OF THE LOCAL; 00506800
00506900
SP[LOC]:=SP[MOC]&K[CLOCF]&1[CNAMED]; 00507000
SP[MOC]:=L&DDNUVW[CDID];M:=M+1; 00507100
END ELSE % THERE IS NO ROOM IN THE SYMBEOL TABLE 00507200
BEGIN N:=T;ERR:=SPERROR;END; 00507300
END;% OF FOR LOOP STEPPING THROGH THE LOCALS 00507400
END; % OF PUSHINTOSYMTAB PROCEDURE 00507500
PROCEDURE FORGETPROGRAM(U);VALUE U; REAL U; 00507600
BEGIN REAL L,M; 00507700
COMMENT U IS A PROGRAMMKS...THE SP STORAGE FOR THIS LINE 00507800
SHOULD BE RELEASED; 00507900
M:=U.SPF;SCRATCHAIN(SP[MOC].LOCFIELD);%CONSTANT CHAIN 00508000
L:=SP[MOC].SPF;FORGETSPACE(M,1);%FORGET PROGRAM DESC. 00508100
M:=L+1;SCRATCHDATA(SP[MOC]);%FORGET BUFFER 00508200
FORGETSPACE(L,SP[LOC]+1);%FORGET THE POLISH 00508300
END; 00508400
EXPOVR:=EXPOVRL; 00508500
INTOVR:=INTOVRL; 00508600
INDEX:=INDEXL; 00508700
FLAG:=FLAGL; 00508800
ZERO:=ZEROL; 00508900
CASE MODE OF 00509000
BEGIN ;%-------------------------------------------------------- 00509100
%---------------- CASE 1....MODE=XEQUTE------------------------ 00509200
CASE CURRENTMODE OF 00509300
BEGIN%----------------------------------------------------- 00509400
%------------- SUB-CASE 0....CURRENTMODE=CALCMODE---------- 00509500
IF T:=ANALYZE(TRUE) NEQ 0 THEN % WE HAVE A PROGRAM DESC 00509600
BEGIN COMMENT SET-UP THE STACK; 00509700
IF STACKBASE=0 THEN BEGIN 00509800
STACKBASE:=L:=GETSPACE(STACKSIZE+1); 00509900
IF ERR NEQ 0 THEN BEGIN STACKBASE:=0; 00510000
ERRORMESS(ERR,0,0); GO TO PROCESSEXIT;END; 00510100
SP[LOC]:=2; 00510200
L:=L+1; 00510300
M:=GETSPACE(STATEVECTORSIZE+1); 00510400
SP[LOC]:=M&1[CRF]&DDPNVW[CDID]; 00510500
SP[MOC]:=STATEVECTORSIZE; 00510600
M:=M+1; SP[MOC]:=0; % THE STATE VECTOR IS INITIALIZED NOW 00510700
FUNCLOC:=M; 00510800
N:=0; 00510900
L:=L+1; COMMENT READY FOR A PROG MKS; 00511000
END ELSE % THERE IS ALREADY A STACK...USE IT 00511100
BEGIN L:=STACKBASE; 00511200
ST:=SP[LOC]+L; 00511300
WHILE M:=AREG.DID NEQ IMKS AND M NEQ PROGMKS AND 00511400
ERR=0 DO POP;%STRIP BACK TO LASTMARKSTACK 00511500
IF M=IMKS THEN BEGIN N:=ST-STACKBASE;PUSH; 00511600
END ELSE N:=AREG.BACKF; 00511700
SP[LOC]:=ST-STACKBASE;L:=ST; 00511800
END; 00511900
CURLINE:=0; 00512000
M:=GETSPACE(1); SP[MOC]:=T; %STORE PROG DESCRIPTOR 00512100
SP[LOC]:=M&PROGMKS[CDID]&N[BACKPT]&1[CI]; 00512200
COMMENT JUST BUILT A PROGRAM MARKSTACK; 00512300
GO TO EXECUTION; 00512400
END; 00512500
%------------SUB-CASE 1....CURRENTMODE=XEQMODE--------------- 00512600
COMMENT RECOVERY FROM A TIME-OUT; 00512700
GO TO EXECUTION; 00512800
%----------- SUB-CASE 2....CURRENTMODE=FUNCMODE-------------- 00512900
COMMENT SYNTAX CHECK ONLY; 00513000
IF ANALYZE(TRUE)=0 THEN; 00513100
%------- END OF SUB CASES----------------------------------- 00513200
END; 00513300
%------------------ CASE 2.....MODE=ALLOC------------------------ 00513400
COMMENT NOTHING TO DO; 00513500
; 00513600
%----------------- CASE 3.... MODE=WRITEBACK------------------- 00513700
COMMENT HAVE TO WRITE BACK ALL THE CHANGED VARIABLES; 00513800
IF SYMBASE NEQ 0 THEN 00513900
WRITEBACK; 00514000
00514100
%----------------- CASE 4.... MODE=DEALLOC--------------------- 00514200
; 00514300
00514400
00514500
%----------------- CASE 5 .... MODE=INTERROGATE---------------- 00514600
COMMENT PRINT OUT THE PROGRAM STATUS VECTOR HERE; 00514700
IF L:=STACKBASE+1 NEQ 1 THEN 00514800
BEGIN COMMENT GT1=1 FOR SIV...=0 FOR SI; 00514900
U:=GT1; 00515000
L:=SP[LOC].SPF+1;M:=SP[LOC].SPF+L; 00515100
WHILE M GTR L DO 00515200
BEGIN N:=SP[MOC].LOCFIELD;N:=SP[NOC].SPF-1; 00515300
% N IS LOCATION OF THE FUNCTION NAME 00515400
ACCUM[0]:=SP[NOC]; 00515500
FORMROW(2,6,ACCUM,1,7); 00515600
IF BOOLEAN(SP[MOC].SUSPENDED) THEN FORMWD(0,"3 S ") 00515700
ELSE FORMWD(0,"3 "); 00515800
IF BOOLEAN(U) THEN % PRINT LOCAL VARIABLE NAMES 00515900
BEGIN 00516000
N:=SP[MOC].SPF+2;T:=SP[NOC]-2; 00516100
FOR N:=N+4 STEP 2 UNTIL T DO 00516200
BEGIN ACCUM[0]:=SP[NOC]; 00516300
FORMROW(0,1,ACCUM,1,7); 00516400
END; 00516500
END; 00516600
TERPRINT; M:=M-1; 00516700
END; 00516800
END; 00516900
END;% OF THE CASE STATMENT 00517000
%--------------END OF CASES--------------------------------------- 00517100
IF FALSE THEN EXECUTION: 00517200
BEGIN COMMENT EXECUTION LOOP; 00517300
INTEGER LOOP; 00517400
INTEGER INPUTIMS; 00517500
LABEL BREAKKEY; 00517600
LABEL SKIPPOP,XEQEPS; 00517700
BOOLEAN XIT, JUMP; 00517800
REAL POLWORD; 00517900
DEFINE RESULT=RESULTD#; 00518000
LABEL EXECEXIT, EVALQ, EVALQQ; 00518100
%%% 00518200
COMMENT THERE IS A PROGRAM DESCRIPTOR AT THE TOP OF THE STACK; 00518300
ERR:=0; 00518400
L:=STACKBASE; ST:=L+SP[LOC]; 00518500
L:=L+1;FUNCLOC:=SP[LOC].SPF+1; 00518600
T:=AREG; 00518700
IF CURRENTMODE=XEQMODE THEN %AREG IS INTERRUPT MARK STACK 00518800
BEGIN LASTMKS:=STACKBASE+T.BACKF; 00518900
OLDDATA:=T.SPF; INPUTIMS:=T.QUADIN; POP; 00519000
COMMENT MAY BE CURRENTLY EXECUTING A FUNCTION; 00519100
L:=STACKBASE+1; L:=SP[LOC].SPF+1; 00519200
IF (M:=SP[LOC].SPF) NEQ 0 THEN 00519300
BEGIN M:=M+L; L:=SP[MOC].LOCFIELD; 00519400
CURLINE:=SP[LOC].CIF; 00519500
00519600
END; 00519700
END 00519800
ELSE LASTMKS:=ST;%AREG IS PROGRAM MARK STACK 00519900
CURRENTMODE:=XEQMODE; 00520000
L:=LASTMKS; T:=SP[LOC]; % T IS PROGRAM MARK STACK 00520100
CINDEX:=T.CIF; % CONTROL INDEX IN POLISH 00520200
IF L:=T.SPF =0 THEN %PHONEY PROG DESC FROM FUNCTION CALL 00520300
N:=POLTOP:=POLLOC:=0 ELSE 00520400
BEGIN 00520500
N:=POLLOC:=SP[LOC].SPF; 00520600
POLTOP:=SP[NOC] 00520700
END; 00520800
IF ERR = 0 THEN % POP WORKED 00520900
IF INPUTIMS=2 THEN BEGIN JUMP:=TRUE; GO TO EVALQ END ELSE 00521000
IF INPUTIMS = 1 THEN BEGIN JUMP:=TRUE; GO TO EVALQQ; END ELSE 00521100
DO BEGIN COMMENT EXECUTE UNTIL DONE OR TIME-OUT; 00521200
IF CINDEX LSS POLTOP THEN %MORE TO EXECUTE IN POLISH 00521300
BEGIN COMMENT GET NEXT POLISH TO EXECUTE; 00521400
M:=(CINDEX:=CINDEX+1)+POLLOC; 00521500
POLWORD:=T:=SP[MOC]; 00521600
CASE T.TYPEFIELD OF 00521700
BEGIN %-------TF=0 (REPLACEMENT)-------------- 00521800
BEGIN %MAY BE A LOCAL OR A GLOBAL VARIABLE 00521900
DEFINE STARTSEGMENT=#; %///////////////////// 00522000
PUSH; IF ERR NEQ 0 THEN GO TO SKIPPOP; 00522100
N:=T.LOCFIELD; 00522200
IF BOOLEAN(T.OPTYPE) THEN %A LOCAL VARIABLE 00522300
BEGIN M:=FUNCLOC;%FIND LAST MKS 00522400
M:=SP[MOC].SPF+M; 00522500
N:=SP[MOC].LOCFIELD+N; END; 00522600
U:=SP[NOC]; U.LOCFIELD:=N; AREG:=U; 00522700
IF U.DATADESC=0 THEN ERR:=NONCEERROR; 00522800
COMMENT PROBABLY MIXUP WITH FUNCTION NAMES 00522900
AND NAMES OF LOCAL SUSPENDED VARIABLES; 00523000
END; 00523100
%-------------FUNCTION CALL----------------- 00523200
%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 00523300
BEGIN COMMENT SET UP STACK FOR A FUNCTION CALL; 00523400
REAL U,V,NARGS,D; 00523500
INTEGER I,FLOC; 00523600
LABEL TERMINATE; 00523700
COMMENT 00523800
MONITOR PRINT(D,L,M,N,FLOC,SP,LASTMKS);%:::::::::::::::::::: 00523900
FLOC:=N:=T.LOCFIELD; 00524000
IF BOOLEAN(SP[NOC].DATADESC) THEN BEGIN ERR:=NONCEERROR; 00524100
GO TO TERMINATE;END;%SUSPENDED VAR CONFUSED WITH FUNCTION 00524200
IF NOT BOOLEAN(SP[NOC].PRESENCE) THEN MAKEFUNCTIONPRESENT(N); 00524300
D:=SP[NOC]; L:=LASTMKS; %D IS TEH DESC, L IS THE PROG MKS 00524400
SP[LOC].CIF:=CINDEX; %SAVE CURRENT POLISH LOCATION 00524500
L:=STACKBASE+1; L:=SP[LOC].SPF+1; 00524600
M:=SP[LOC].SPF; 00524700
IF N:=M+L NEQ L THEN %THERE IS A NESTED CALL 00524800
IF NOT BOOLEAN(SP[NOC].SUSPENDED) THEN 00524900
BEGIN N:=SP[NOC].LOCFIELD;SP[NOC].CIF:=CURLINE;END; 00525000
00525100
00525200
SETFIELD(GTA,0,8,0); SETFIELD(GTA,8,8,0); %INITIALIZE GTA 00525300
NARGS:=D.NUMBERARGS; 00525400
FOR I:=1 STEP 1 UNTIL NARGS DO 00525500
IF BOOLEAN((T:=AREG).DATADESC) THEN 00525600
BEGIN 00525700
IF BOOLEAN(T.NAMED) THEN %MAKE A COPY 00525800
COMMENT YOU COULD MAKE A CALL BY NAME HERE; 00525900
BEGIN U:=GETSPACE(V:=(NUMELEMENTS(T)+T.RF)); 00526000
SPCOPY(T.SPF,U,V); T.NAMED:=0; T.SPF:=U; 00526100
T.BACKP:=0; 00526200
END ELSE %NO NEED TO MAKE A COPY 00526300
AREG.PRESENCE:=0; 00526400
POP; GTA[I-1]:=T; %SAVE THE DESCRIPTOR FOR LATER USE 00526500
END ELSE ERR:=SYSTEMERROR; 00526600
IF (N:=M+1) GEQ STATEVECTORSIZE THEN ERR:=DEPTHERROR; 00526700
IF ERR NEQ 0 THEN GO TO TERMINATE; 00526800
SP[LOC].SPF:=N; 00526900
PUSH;AREG:=OLDDATA&(LASTMKS-STACKBASE)[BACKPT]&IMKS[CDID]; 00527000
OLDDATA:=0; %REINITIALIZE OLDDATA CHAIN FOR THIS FUNCTION 00527100
%NOW SET UP THE FUNCTION MARK STACK. 00527200
00527300
M:=N+L;PUSH;SP[MOC]:=D.SPF&ST[CLOCF]; 00527400
M:=D.SPF; M:=M+2; % M IS LOC OF LOC OF FIRST LINE 00527500
AREG:=0&FLOC[CSPF]&((LASTMKS:=ST)-STACKBASE-1)[BACKPT]& 00527600
(U:=SP[MOC]-D.SPF)[CCIF]&FMKS[CDID]; % FUNCTION MKS 00527700
CURLINE:=U; 00527800
00527900
U:=(U-6)/2; % U IS THE NUMBER OF LOCALS, LABELS, AND ARGS 00528000
M:=M+5; % M IS ON THE FIRST DESC OF THE FIRST LAB, LOC,... 00528100
FOR I:=1 STEP 1 UNTIL U DO % GET DESCRIPTORS INTO THE STACK 00528200
BEGIN IF SP[MOC] NEQ 0 THEN %MAKE UP THE DESC 00528300
BEGIN L:=GETSPACE(1); SP[LOC]:=SP[MOC]; 00528400
T:=L&DDPUSW[CDID]&0[CCIF] 00528500
END ELSE 00528600
T:=NULLV; 00528700
PUSH; M:=M+2; 00528800
AREG:=T; %A SINGLE LOCAL 00528900
END; 00529000
%COPY OVER THE ARGUMENTS 00529100
FOR I:=1 STEP 1 UNTIL NARGS DO %COPY OVER 00529200
BEGIN M:=D.SPF; %M IS THE LOCATION OF THE LABEL TABLE. 00529300
M:=M+2+I; %M IS LOCATION OF REL LOCATION OF VARIABLE 00529400
M:=SP[MOC]; 00529500
N:=LASTMKS+M; 00529600
SP[NOC]:=GTA[I-1]; 00529700
END; 00529800
%PUT IN A PHONEY PROG DESC TO START THINGS OFF 00529900
PUSH; IF ERR NEQ 0 THEN GO TO TERMINATE; 00530000
AREG:=0&4094[CCIF]&(LASTMKS-STACKBASE)[BACKPT]; 00530100
LASTMKS:=ST; POLTOP:=POLLOC:=0; 00530200
TERMINATE: 00530300
END; 00530400
%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 00530500
%-------END OF LOAD FUNCTION FOR CALL----- 00530600
%-------------TF=2 (CONSTANT)--------------------- 00530700
BEGIN PUSH; IF ERR=0 THEN BEGIN 00530800
N:=POLWORD.LOCFIELD;AREG:=SP[NOC];END; 00530900
END; 00531000
%-------------TF=3 (OPERATOR)----------------- 00531100
COMMENT SEQUENCE NUMBERS CORRESPOND TO OPERATOR 00531200
ASSIGNMENT NUMBER; 00531300
BEGIN IF T.OPTYPE=MONADIC THEN 00531400
BEGIN PUSH;IF ERR=0 THEN AREG:=0; END; 00531500
CASE T.LOCFIELD OF 00531600
BEGIN %--------------- OPERATE ON STACK --------------------- 00531700
COMMENT EACH EXECUTION PROCEDURE SETS RESULT TO THE 00531800
DESCRIPTOR OF THE RESULT OF THE OPERATION. 00531900
AREG AND BREG ARE THE LEFT AND RIGHT-HAND OPERANDS AND 00532000
ARE ACTUALLY THE TOP TWO DESCRIPTORS ON THE STACK. 00532100
IF AREG IS ZERO, THE OPERATOR IS TAKEN TO BE MONADIC.; 00532200
; 00532300
; 00532400
; 00532500
; 00532600
%---------------------REPLACEMENT OPERATOR--------------- 00532700
BEGIN DEFINE STARTSEGMENT=#; %/////////////////////////////// 00532800
IF NOT BOOLEAN(L:=AREG.NAMED) THEN % SHOULD BE LOCAL VARIABLE 00532900
AREG.NAMED:=1; % DONT LET IT BE FORGOTTEN. 00533000
00533100
IF BOOLEAN((T:=AREG).PRESENCE) AND T.SPF NEQ 0 THEN 00533200
OLDDATA:=CHAIN(T,OLDDATA); 00533300
M:=T.LOCFIELD; 00533400
00533500
IF(RESULT:=BREG).SPF = 0 THEN U:=T:=0 ELSE 00533600
U:=GETSPACE(T:=NUMELEMENTS(RESULT)+RESULT.RF); 00533700
SPCOPY(RESULT.SPF,U,T); 00533800
RESULT.SPF:=U; RESULT.NAMED:=L; %L IS 0 FOR LOCALS 00533900
GT1:=IF BOOLEAN((U:=SP[MOC]).PRESENCE) THEN U.BACKP ELSE 0; 00534000
SP[MOC]:=RESULT&GT1[CLOCF]; 00534100
IF BOOLEAN(L) AND GT1=0 THEN %CHECK FOR GLOBAL 00534200
BEGIN M:=M-1;IF(SP[MOC].SUSPENDVAR=0)THEN SP[MOC].CHANGE:=1; 00534300
00534400
END; 00534500
RESULT.NAMED:=1; %KEEP "PUSH" FROM TOSSING THE DATA 00534600
END; 00534700
%-------TRANSFER OPERATOR----------------------------- 00534800
BEGIN DEFINE STARTSEGMENT=#; %//////////////////////////////// 00534900
SCRATCHAIN(OLDDATA);OLDDATA:=0; 00535000
IF BOOLEAN(T.OPTYPE) THEN ST:=ST-1; %GET RID OF PHONEY TOP 00535100
L:=FUNCLOC; 00535200
IF SP[LOC] NEQ 0 THEN STEPLINE(TRUE) ELSE 00535300
ERR:=SYNTAXERROR; 00535400
GO TO SKIPPOP; 00535500
END; 00535600
BEGIN %--------------COMPRESSION------------------------------------00535700
DEFINE STARTSEGMENT=#; %///////////////////////////////////// 00535800
L:=ST-2; IF T.OPTYPE=MONADIC THEN COMPRESS(BREG,SP[LOC],AREG) 00535900
ELSE COMPRESS(AREG,SP[LOC],BREG); COMMENT A/B HAS BEEN 00536000
STACKED AS B,A,NULL...A/[I] B HAS BEEN STACKED AS B,I,A; 00536100
END; 00536200
ARITH(3); %OPERATION IS DIVIDE 00536300
; 00536400
; 00536500
%-------------QUAD INPUT------------------------------- 00536600
EVALQ: BEGIN LABEL EVALQUAD; 00536700
IF JUMP THEN BEGIN JUMP:=FALSE; GO TO EVALQUAD END; 00536800
CURRENTMODE:=INPUTMODE; 00536900
FORMWD(3,"3[]: "); INDENT(0); 00537000
00537100
IMS(2); % SETUP MARKSTACK FOR QUAD EXIT 00537200
IF ERR NEQ 0 THEN GO TO SKIPPOP; 00537300
GO TO EXECEXIT; % EXIT TO MONITOR TILL INPUT IS COMPLETE 00537400
EVALQUAD: %LOOK AT BUFFER TO SEE WHAT CAME IN 00537500
BEGIN 00537600
IF NOT SCAN THEN BEGIN CINDEX:=CINDEX-1;GO TO SKIPPOP;END; 00537700
IF NOT SETUPLINE THEN CINDEX:=CINDEX-1;%MAKE THEM REDO IT 00537800
GO TO SKIPPOP; 00537900
END; 00538000
END; 00538100
BEGIN % -----EVALUATE SUBSCRIPTS--------------- 00538200
DEFINE STARTSEGMENT=#; %///////////////////////////////////// 00538300
T:=AREG; L:=BREG.SPF; 00538400
IF BOOLEAN(T.SCALAR) THEN BEGIN ERR:=DOMAINERROR; GO TO SKIPPOP;END;00538500
U:=SP[LOC]; % GET # OF SUBSCRIPTS 00538600
IF U GTR 32 THEN ERR:=INDEXERROR ELSE 00538700
BEGIN 00538800
IF U GTR 0 THEN BEGIN 00538900
IF T.PRESENCE NEQ 1 THEN % GET ARRAY INTO SP 00539000
BEGIN N:=T.LOCFIELD; 00539100
IF (T:=SP[NOC]).PRESENCE NEQ 1 THEN 00539200
BEGIN T:=GETARRAY(T); SP[NOC]:=T END; 00539300
T.LOCFIELD:= N; 00539400
END; 00539500
IF ERR=0 THEN % NOW EVALUATE 00539600
00539700
RESULT:=SUBSCRIPTS(L:=(IF T.LOCFIELD=0 THEN OUTOF 00539800
ELSE INTO),T,U); 00539900
IF L=INTO THEN BEGIN 00540000
00540100
CINDEX:=CINDEX+1;END; % SKIP OVER REPLACE OP 00540200
END ELSE % NO SUBSCRIPTS 00540300
BEGIN BREG:=T; ST:=ST-1; GO TO SKIPPOP; 00540400
END; % DON{T LET THE DESC. IN T BE POPPED. 00540500
U:=U+2; % # OF THINGS TO POP 00540600
FOR N:=1 STEP 1 UNTIL U DO POP; 00540700
IF L=OUTOF THEN PUSH; AREG:=RESULT; 00540800
00540900
GO TO SKIPPOP; 00541000
END; 00541100
END; 00541200
; 00541300
; 00541400
%-------------QQUAD INPUT------------------------------- 00541500
EVALQQ: BEGIN LABEL EVALQQUAD; 00541600
IF JUMP THEN BEGIN JUMP:=FALSE; GO TO EVALQQUAD END; 00541700
CURRENTMODE:=INPUTMODE; 00541800
IMS(1); %SET UP MARKSTACKS FOR QQUAD EXIT 00541900
IF ERR NEQ 0 THEN GO TO SKIPPOP; 00542000
GO TO EXECEXIT; 00542100
EVALQQUAD: % BUFFER CONTAINS THE INPUT STRING 00542200
IF (L:=LENGTH(BUFFER,TRUE))NEQ 0 THEN BEGIN %L IS # CHAR INPUT 00542300
N:=ENTIER((L+7) DIV 8); % FIND NUMBER OF WORDS 00542400
M:=GETSPACE(N+1); % GET SPACE FOR THE VECTOR IN SP 00542500
TRANSFERSP(INTO,SP,M+1,BUFFER,0,N); 00542600
SP[MOC]:=L; % STORE LENGTH OF VECTOR 00542700
RESULT:=M&1[CRF]&DDPUVC[CDID]; % SET UP DESCRIPTOR 00542800
END ELSE RESULT:=NULLV;% NOTHING WAS INPUT 00542900
PUSH; IF ERR=0 THEN AREG:=RESULT; 00543000
GO TO SKIPPOP; 00543100
END; 00543200
RESULTD := SEMICOL; %CONVERSIEON CONCATENATION 00543300
COMMAP; %CATENATE 00543400
BEGIN%----------INNER PRODUCT (PERIOD)--------------------- 00543500
M:=(CINDEX:=CINDEX+2) + POLLOC; T:=SP[MOC];M:=M-1;U:=SP[MOC]; 00543600
PERIOD(AREG,BREG,U.LOCFIELD,T.LOCFIELD); 00543700
END; 00543800
ARITH(4); %* 00543900
; 00544000
; 00544100
ARITH(17); %AND 00544200
ARITH(18); %OR 00544300
ARITH(9); %NOT 00544400
ARITH(11); %LESS:THAN 00544500
ARITH(16); %LEQ 00544600
ARITH(12); %= 00544700
ARITH(13); %GEQ 00544800
ARITH(14); %GREATER-THAN 00544900
ARITH(15); %NEQ 00545000
ARITH(8); %MAX/CEIL 00545100
ARITH(7); %MIN/FLOOR 00545200
ARITH(6); %RESD/ABS 00545300
IF T.OPTYPE=MONADIC THEN GO TO XEQEPS ELSE MEMBER; %MEMBERSHIP 00545400
RHOP; %RHO 00545500
IOTAP; %IOTA 00545600
; 00545700
REDUCESORTSCAN(0,BREG,AREG,4); %REVERSAL; 00545800
BEGIN %-----------EXPANSION------------------------- 00545900
DEFINE STARTSEGMENT=#; %//////////////////////////////////// 00546000
L:=ST-2; IF T.OPTYPE=MONADIC THEN EXPAND(BREG,SP[LOC],AREG) 00546100
ELSE EXPAND(AREG,SP[LOC],BREG); COMMENT A EXPN B HAS BEEN 00546200
STACKED AS B,A,NULL WHILE A EXPN [I] B IS STACKED AS B,I,A; 00546300
END; 00546400
RESULTD:=BASEVALUE; %BASE VALUE 00546500
ARITH(10); %COMB/FACT 00546600
; 00546700
IF T.OPTYPE=MONADIC THEN ARITH(5) ELSE 00546800
DYADICRNDM; %RNDM 00546900
IF T.OPTYPE=MONADIC THEN TRANSPOSE ELSE DYADICTRANS;%GUESS WHAT 00547000
RESULTD := REPRESENT; %REPRESENTATION 00547100
ARITH(45); %CIRCLE--TRIGONOMETRIC FUNCTIONS 00547200
; 00547300
; 00547400
ARITH(0); %ADD 00547500
ARITH(2); %SUBTRACT 00547600
ARITH(1); %MULTIPLY 00547700
%-------------------DISPLAY--------------------------------------- 00547800
00547900
BEGIN DEFINE STARTSEGMENT=#; %///////////////////////////////// 00548000
IF BREG.SPF=0 THEN FORMROW(3,0,ACCUM,2,0) ELSE %FOR A NULL 00548100
IF BOOLEAN((RESULT:=BREG).DATADESC)THEN %THIS IS A DATA DESC 00548200
IF BOOLEAN(RESULT.PRESENCE) AND M:=RESULT.SPF NEQ 0 THEN 00548300
IF BOOLEAN(RESULT.SCALAR) THEN 00548400
BEGIN NUMBERCON(SP[MOC],ACCUM); 00548500
FORMROW(3,0,ACCUM,2,ACOUNT) 00548600
END 00548700
ELSE %A VECTOR 00548800
IF L:=RESULT.RF NEQ 0 THEN % SOMETHING TO PRINT 00548900
IF BOOLEAN(RESULT.CHRMODE) THEN DISPLAYCHARV(RESULT) 00549000
ELSE 00549100
BEGIN RESULT:=M:=GETSPACE(L+1); 00549200
SP[MOC]:=L; RESULT.RF:=1; RESULT.DID:=DDPUVW; 00549300
AREG:=RESULT; 00549400
FOR T:=1 STEP 1 UNTIL L DO 00549500
BEGIN M:=M+1; SP[MOC]:=1 00549600
END; 00549700
DISPLAY(AREG,BREG); 00549800
RESULT:=BREG; 00549900
END ELSE TERPRINT 00550000
ELSE TERPRINT 00550100
ELSE ; %PROBABLY A FUNCTION....DONT DO ANYTHING 00550200
IF BREAKFLAG THEN %USER HIT BREAK DURING OUTPUT 00550300
GO TO BREAKKEY; 00550400
POP; GO TO SKIPPOP; 00550500
END; 00550600
BEGIN % ---------------REDUCTION------------------------------------00550700
M:=(CINDEX:= CINDEX+1) + POLLOC; % FIND OPERATION IN POLISH 00550800
IF (T:=SP[MOC]).TYPEFIELD NEQ 3 THEN ERR:=SYSTEMERROR 00550900
ELSE REDUCESORTSCAN(T.LOCFIELD,BREG,AREG,1); 00551000
END; 00551100
BEGIN %--------ROTATION---------------------------- 00551200
DEFINE STARTSEGMENT=#; %//////////////////////////////////// 00551300
L:=ST-2; IF T.OPTYPE=MONADIC THEN 00551400
REDUCESORTSCAN(BREG,SP[LOC],AREG,5) ELSE 00551500
REDUCESORTSCAN(AREG,SP[LOC],BREG,5); COMMENT A ROT B IS 00551600
STACKED AS B,A,NULL WHILE A ROT [I] B IS STACKED AS B,I,A; 00551700
END; 00551800
ARITH(21); %LOG 00551900
REDUCESORTSCAN(0,BREG,AREG,2); % SORTUP 00552000
REDUCESORTSCAN(-1,BREG,AREG,2); %SORTDN 00552100
BEGIN%--------------SCAN-------LIKE REDUCTION---------------- 00552200
DEFINE STARTSEGMENT=#; %////////////////////////////////////// 00552300
M:=(CINDEX:=CINDEX+1) + POLLOC; %FIND OPERATOR IN POLISH 00552400
IF (T:=SP[MOC]).TYPEFIELD NEQ 3 THEN ERR:=SYSTEMERROR 00552500
ELSE REDUCESORTSCAN(T.LOCFIELD,BREG,AREG,3); 00552600
END; 00552700
ARITH(19); %NAND 00552800
ARITH(20); %NOR 00552900
IF (T:=BREG).RF NEQ 0 THEN RESULT:=SUBSCRIPTS(3,T,T.RF) 00553000
ELSE ERR:=RANKERROR; % OPERATION IS TAKE 00553100
IF (T:=BREG).RF NEQ 0 THEN RESULT:=SUBSCRIPTS(3,T,T.RF) 00553200
ELSE ERR:=RANKERROR; % OPERATION IS DROP 00553300
%------------------------XEQ--------------------------------- 00553400
XEQEPS: BEGIN DEFINE STARTSEGMENT=#; %//////////////// 00553500
IF AREG NEQ 0 THEN ERR:=SYNTAXERROR %MUST BE MONADIC ONLY 00553600
ELSE IF (T:=BREG).RF NEQ 1 OR %MUST BE A VECTOR 00553700
NOT BOOLEAN(T.CHRMODE) THEN ERR:=DOMAINERROR %MUST BE CHAR STRING 00553800
ELSE IF U:=NUMELEMENTS(T) GTR MAXBUFFSIZE THEN ERR:=LENGTHERROR 00553900
ELSE BEGIN 00554000
M:=GT1; % # OF CHARACTERS SET BY NUMELEMENTS 00554100
INITBUFF(BUFFER,MAXBUFFSIZE);RESCANLINE; 00554200
TRANSFERSP(OUTOF,SP,T.SPF+1,BUFFER,0,U); 00554300
IF(U:=U|8-M) GTR 0 THEN SETFIELD(BUFFER,M,U," "); 00554400
IF T.SPF=0 OR NOT SCAN THEN RESULT:=0&1[CRF]&DDPUVW[CDID]% NULL 00554500
ELSE BEGIN POP;IF SETUPLINE THEN; GO TO SKIPPOP;END 00554600
END; END; 00554700
END; %--------------END OF OPERATION ON STACK--------------------- 00554800
POP;POP;PUSH;IF ERR=0 THEN AREG:=RESULT; 00554900
SKIPPOP: END OF TYPEFIELD EQUALS OPERATOR; 00555000
%-------TF=4 (LOCAL VARIABLE)------------ 00555100
BEGIN COMMENT MOVE DESCRIPTOR UP TO TOP; 00555200
DEFINE STARTSEGMENT=#; %///////////////// 00555300
N:=T.LOCFIELD;M:=FUNCLOC;M:=SP[MOC]+M; 00555400
00555500
N:=SP[MOC].LOCFIELD+N; 00555600
T:=SP[NOC]; T.NAMED:=1; %KEEP FROM THROWING AWAY 00555700
PUSH; AREG:=T; 00555800
END; 00555900
%-------TF=5 (OPERAND)----------------------- 00556000
BEGIN PUSH; IF ERR=0 THEN BEGIN 00556100
N:=POLWORD.LOCFIELD; U:=SP[NOC]; 00556200
IF U.DATADESC=0 THEN ERR:=NONCEERROR ELSE 00556300
IF U.PRESENCE NEQ 1 THEN BEGIN 00556400
U:=GETARRAY(U); SP[NOC]:=U END; 00556500
U.LOCFIELD:=0; 00556600
AREG:=U; END; 00556700
END; 00556800
END; % OF CASE STATEMENT TESTING TYPEFIELD 00556900
END % OF TEST FOR CINDEX LEQ POLTOP 00557000
ELSE % WE ARE AT THE END OF THE POLISH 00557100
BEGIN COMMENT LASKMKS CONTAINS THE LOCATION 00557200
OF THE LAST MARK STACK. GET MARK STACK AND CONTINUE; 00557300
00557400
SCRATCHAIN(OLDDATA); OLDDATA:=0; 00557500
L:=LASTMKS;M:=(U:=SP[LOC]).BACKF+STACKBASE;T:=SP[MOC]; 00557600
IF T.DID=IMKS AND T.QUADIN=3 THEN %SINGLE LINE DONE 00557700
IF (RESULT:=AREG)=T THEN ERR:=SYNTAXERROR%NO RESULT 00557800
ELSE BEGIN RESULT.NAMED:=0;%MAKE NEW COPY 00557900
IF BOOLEAN(RESULT.SCALAR) THEN 00558000
BEGIN M:=GETSPACE(2);L:=RESULT.SPF; 00558100
RESULT.SPF:=M+1;SP[MOC]:=RESULT; 00558200
M:=M+1;SP[MOC]:=SP[LOC]; 00558300
END ELSE % MAKE COPY OF A VECTOR 00558400
BEGIN M:=GETSPACE(1+(N:=RESULT.RF+NUMELEMENTS( 00558500
RESULT))); 00558600
L:=RESULT.SPF;RESULT.SPF:=M+1; 00558700
SP[MOC]:=RESULT; SPCOPY(L,M+1,N); END; 00558800
00558900
00559000
FORGETPROGRAM(U); 00559100
00559200
DO POP UNTIL ST LSS LASTMKS;%CUT BACK STACK TO IMS 00559300
OLDDATA:=T.SPF;L:=LASTMKS:=T.BACKF+STACKBASE; 00559400
AREG:=RESULT; % STORE EXECUTION RESULT OVER IMS 00559500
CINDEX:=SP[LOC].CIF; M:= SP[LOC].SPF; 00559600
POLLOC:=M:=SP[MOC].SPF; POLTOP:=SP[MOC]; 00559700
END ELSE 00559800
BEGIN L:=FUNCLOC;M:=SP[LOC].SPF+L; 00559900
IF M NEQ L AND NOT BOOLEAN(SP[MOC].SUSPENDED)THEN 00560000
BEGIN 00560100
IF 0=(LOOP:=(LOOP+1) MOD 5) THEN 00560200
WRITE(TWXOUT,1,JIGGLE[*])[BREAKKEY:BREAKKEY]; 00560300
%THAT WAS TO CHECK FOR A BREAK TO INTERRUPT A PROG 00560400
STEPLINE(FALSE) 00560500
END 00560600
ELSE BEGIN XIT:=TRUE;CURRENTMODE:=CALCMODE; 00560700
WHILE POPPROGRAM(OLDDATA,LASTMKS) DO; 00560800
END; 00560900
END; 00561000
END; %COMPLETION OF ONE POLISH EVALUATION (1 CELL) 00561100
IF ERR NEQ 0 THEN % PUT OUT ERROR MESSAGE 00561200
BEGIN 00561300
DEFINE STARTSEGMENT=#; %///////////////////////////// 00561400
COMMENT 00561500
MONITOR PRINT(ST,L,M,SP,GTA,T);%:::::::::::::::::::::: 00561600
XIT:=TRUE;CURRENTMODE:=ERRORMODE; 00561700
00561800
L:=POLLOC+1; 00561900
TRANSFERSP(OUTOF,SP,(L:=SP[LOC].SPF)+1,BUFFER, 00562000
0,MIN(MAXBUFFSIZE,ENTIER((SP[LOC]+7)DIV 8))); 00562100
L:=FUNCLOC;M:=SP[LOC].SPF+L; 00562200
GT1:=1;N:=SP[MOC].LOCFIELD;%LOCATION OF FMKS 00562300
WHILE LASTMKS GTR N AND BOOLEAN (GT1) DO GT1:=IF 00562400
POPPROGRAM(OLDDATA,LASTMKS)THEN 1 ELSE 0; 00562500
IF M NEQ L AND NOT BOOLEAN(SP[MOC].SUSPENDED)THEN%GET LINE# 00562600
BEGIN SP[LOC].RF:=SP[LOC].RF+1;%UP SUSPENDED COUNT 00562700
L:=SP[NOC].SPF-1;%LOCATION OF FUNCTION NAME 00562800
SETFIELD(GTA,0,1,0); 00562900
GTA[0]:=SP[LOC]; 00563000
FORMROW(3,0,GTA,1,7); 00563100
L:=SP[MOC].SPF; %BASE OF LABEL TABLE 00563200
L:=L+CURLINE; 00563300
T:=SP[LOC]; 00563400
00563500
%ALSO PUT THE FUNCTION INTO SUSPENSION 00563600
IMS(4);SP[MOC].SUSPENDED:=1;SUSPENSION:=1; 00563700
PUSHINTOSYMTAB(SP[MOC]); 00563800
END ELSE T:=0; 00563900
ERRORMESS(ERR,POLWORD.SPF,T); 00564000
END; 00564100
END UNTIL XIT; 00564200
BREAKKEY: BEGIN BREAKFLAG:=FALSE; 00564300
XIT:=TRUE;CURRENTMODE:=CALCMODE; 00564400
L:=FUNCLOC;M:=SP[LOC].SPF+L; 00564500
IF M NEQ L AND NOT BOOLEAN(SP[MOC].SUSPENDED) THEN 00564600
BEGIN SP[MOC].SUSPENDED:=1;SUSPENSION:=1; 00564700
PUSHINTOSYMTAB(SP[MOC]);SP[LOC].RF:=SP[LOC].RF+1; 00564800
M:=SP[MOC].LOCFIELD;%LOCATION OF FMKS IN STACK 00564900
WHILE LASTMKS GTR M DO IF POPPROGRAM(OLDDATA,LASTMKS) 00565000
THEN; LASTMKS:=M;IMS(4); 00565100
END 00565200
IF FALSE THEN 00565300
END; 00565400
EXECEXIT: 00565500
IF STACKBASE NEQ 0 THEN BEGIN 00565600
L:=STACKBASE; SP[LOC]:=ST-L; %UPDATE SIZE OF STACK 00565700
00565800
END; 00565900
END OF EXECUTION LOOP; 00566000
PROCESSEXIT: 00566100
IF BOOLEAN(POLBUG) THEN % DUMP SP 00566200
IF MODE=XEQUTE OR MODE=3 OR MODE=6 THEN GO TO DEBUGSP; 00566300
IF FALSE THEN 00566400
BEGIN CASE 0 OF BEGIN 00566500
EXPOVRL: SPOUT(3951200); 00566600
INTOVRL: SPOUT(3591300); 00566700
INDEXL: SPOUT(3951400); 00566800
FLAGL: SPOUT(3951500); 00566900
ZEROL: SPOUT(3951600); 00567000
END; 00567100
REALLYERROR:=1; 00567200
DEBUGSP: 00567300
WRITE(PRINT,MIN(15,PSRSIZE),PSR); 00567400
BEGIN 00567500
STREAM PROCEDURE FORM(A,B,N); VALUE N; 00567600
BEGIN 00567700
DI:=B; 15(DS:=8LIT" "); 00567800
SI:=LOC N; DI:=B; DS:=8DEC; DI:=DI+3; 00567900
SI:=A; 10(DS:=8CHR; DI:=DI+1); 00568000
END; 00568100
M:=MIN(NROWS+1|SPRSIZE-1,MAXMEMACCESSES); 00568200
FOR N:=0 STEP 10 UNTIL M DO 00568300
BEGIN TRANSFERSP(OUTOF,SP,N,ACCUM,0,MIN(M-N,10)); 00568400
FORM(ACCUM,BUFFER,N); 00568500
WRITE(PRINT,15,BUFFER[*]); 00568600
END; 00568700
END; 00568800
IF POLBUG=0 OR BOOLEAN(REALLYERROR) THEN 00568900
BEGIN 00569000
ERRORMESS(IF ERR NEQ SPERROR THEN SYSTEMERROR ELSE ERR,0,0); 00569100
SUSPENSION:=0; 00569200
CURRENTMODE:=CALCMODE; 00569300
REALLYERROR:=ERR:=0; 00569400
END; 00569500
END; 00569600
END OF PROCESS PROCEDURE; 00569700
PROCEDURE ERRORMESS(N,ADDR,R); VALUE N,ADDR,R; REAL R; 00569800
INTEGER N; REAL ADDR; 00569900
BEGIN 00570000
INTEGER STREAM PROCEDURE FORM(A,B); VALUE A; 00570100
BEGIN LOCAL T,U; 00570200
LABEL L,M; 00570300
SI:=A; 00570400
L: IF SC=" " THEN 00570500
BEGIN SI:=SI+1; GO TO L; 00570600
END; 00570700
DI:=LOC T; DS:=2RESET; DS:=2SET; 00570800
DI:=B; MESSIZE(U:=DI; DI:=LOC T; IF SC=DC THEN JUMP OUT TO M; 00570900
SI:=SI-1; DI:=U; DS:=CHR; TALLY:=TALLY+1); M: 00571000
FORM:=TALLY; 00571100
END; 00571200
ARRAY ERMES[0:13],B[0:MESSIZE/8]; 00571300
FILL ERMES[*] WITH 00571400
"1 ", 00571500
"5DEPTH ", 00571600
"6DOMAIN ", 00571700
"7EDITING", 00571800
"5INDEX ", 00571900
"5LABEL ", 00572000
"6LENGTH ", 00572100
"5NONCE ", 00572200
"4RANK ", 00572300
"6SYNTAX ", 00572400
"6SYSTEM ", 00572500
"5VALUE ", 00572600
"7SP FULL", 00572700
"7FLYKITE"; 00572800
IF R NEQ 0 THEN 00572900
BEGIN INDENT(R);CHRCOUNT:=CHRCOUNT-1; 00573000
END; 00573100
FORMROW((IF R=0 THEN 2 ELSE 0),0,ERMES,N|8+1, 00573200
ERMES[N].[1:5]); 00573300
FORMWD(0,"6 ERROR"); 00573400
IF ADDR.[33:15] GEQ 512 THEN 00573500
BEGIN 00573600
FORMWD(0,"4 AT "); 00573700
FORMROW(1,1,B,0,FORM(ADDR,B)) 00573800
END; 00573900
FORMWD(3,"1 "); 00574000
END; 00574100
PROCEDURE LOADWORKSPACE(JOBNUM,NAME,IDENT); VALUE JOBNUM,NAME; 00574200
REAL JOBNUM,NAME; ARRAY IDENT[0]; FORWARD; 00574300
PROCEDURE LOGINAPLUSER; 00574400
BEGIN 00574500
COMMENT LOG:IN THE CURRENT USER; 00574600
COMMENT INPUT LINE IS IS THE BUFFER; 00574700
LABEL EXEC, GUESS; 00574800
DEFINE T=GT1#, J=GT2#,I=GT3#; 00574900
PROCEDURE INITIALIZEPSR; 00575000
BEGIN FOR I:=0 STEP 1 UNTIL PSRSIZE-1 DO 00575100
PSRM[I] := 0; 00575200
SEED:=STREAMBASE; ORIGIN:=1; 00575300
FUZZ:=1@-11; 00575400
LINESIZE:=72; DIGITS:=9; 00575500
END; 00575600
LADDRESS := ADDRESS := ABSOLUTEADDRESS; 00575700
WORKSPACE:=WORKSPACEUNIT; 00575800
ITEMCOUNT := EOB := 0; 00575900
IF NEXTUNIT=WORKSPACEUNIT THEN % ESTABLISH A WORKSPACE 00576000
BEGIN 00576100
WORKSPACE:=NEXTUNIT; 00576200
SEQUENTIAL(WORKSPACE); 00576300
INITIALIZEPSR; 00576400
I:=STORESEQ(WORKSPACE,PSR,PSRSIZE|8); 00576500
INITBUFF(OLDBUFFER,BUFFSIZE); 00576600
00576700
END ELSE % WORKSPACE ASSIGNED 00576800
I:=CONTENTS(WORKSPACE,0,PSR); 00576900
FILL ACCUM[*] WITH "LOGGED 1", "N "; 00577000
FORMROW(0,1,ACCUM,0,9); 00577100
I:=DAYTIME(ACCUM); 00577200
FORMROW(1,1,ACCUM,0,I); 00577300
SYMBASE:=STACKBASE:=0; 00577400
CSTATION.APLOGGED:=1; 00577500
CASE CURRENTMODE OF 00577600
BEGIN %--------CALCMODE-------------- 00577700
;COMMENT NOTHING TO DO ANYMORE; 00577800
%--------------XEQUTEMODE---------------------- 00577900
EXEC: 00578000
BEGIN FILL ACCUM[*] WITH "LAST RUN"," STOPPED"; 00578100
FORMROW(3,0,ACCUM,0,16); 00578200
CURRENTMODE:=CALCMODE; 00578300
END; 00578400
%-------------FUNCMODE----------------- 00578500
BEGIN FILL ACCUM[*]WITH "CONTINUE"," DEFINIT", 00578600
"ION OF "; 00578700
FORMROW(2,0,ACCUM,0,23); FORMROW(1,0,PSR, 00578800
FSTART|8,7); 00578900
CURLINE:=GT3:=TOPLINE(GT1:=FUNCPOINTER); 00579000
CHECKSEQ(CURLINE,GT3,INCREMENT); %GET INCREMENT 00579100
CURLINE:=CURLINE+INCREMENT; INDENT(-CURLINE); 00579200
FUNCSIZE:=SIZE(GT1); 00579300
END; 00579400
%------------INPUTMODE--------------ERRORMODE---- 00579500
GO TO EXEC; GO TO EXEC; 00579600
END; 00579700
GUESS: %SHOULD BE BETTER PLACE BUT HERE IS WHERE OTHERS COME OUT 00579800
STOREPSR; 00579900
IF CURRENTMODE NEQ FUNCMODE THEN 00580000
INDENT(0); TERPRINT; 00580100
VARSIZE:=IF VARIABLES=0 THEN 0 ELSE SIZE(VARIABLES); 00580200
END; 00580300
PROCEDURE APLMONITOR; 00580400
BEGIN 00580500
REAL T; 00580600
INTEGER I; 00580700
BOOLEAN WORK; 00580800
LABEL AROUND, NEWUSER; 00580900
LABEL CALCULATE,EXECUTEIT,FUNCTIONSTART,BACKAGAIN; 00581000
LABEL CALCULATEDIT; 00581100
I := CUSER := 1; 00581200
T := STATION; 00581300
BEGIN FILL ACCUM[*] WITH "APL/B550","0 UW COM" 00581400
,"PUTER SC","IENCE # ",VERSIONDATE; 00581500
WORK:=TRUE; 00581600
FORMROW(3,MARGINSIZE,ACCUM,0,40); 00581700
INDENT(0); TERPRINT; CSTATION.APLHEADING:=1 00581800
; LOGINAPLUSER; 00581900
END; 00582000
AROUND: 00582100
00582200
BEGIN 00582300
IF MAINTENANCE THEN; 00582400
CASE CURRENTMODE OF 00582500
BEGIN %-------CALCMODE-------------------------------- 00582600
COMMENT HE MUST BE READ READY FOR THE CALCMODE STUFF; 00582700
00582800
GO CALCULATE; 00582900
%--------XEQUTE MODE-------------------------------- 00583000
GO TO EXECUTEIT; 00583100
%----------FUNCMODE----------------------------------- 00583200
GO TO FUNCTIONSTART; 00583300
%-----------INPUTMODE--------------------------------- 00583400
COMMENT REQUIRES INPUT; 00583500
00583600
BEGIN COMMENT GET THE LINE AND GO BACK; 00583700
STARTSCAN; 00583800
CURRENTMODE:=XEQMODE; 00583900
GO TO EXECUTEIT; 00584000
END; 00584100
%----------ERRORMODE--------------------------------- 00584200
GO TO BACKAGAIN; 00584300
00584400
END; %OF CASES 00584500
END; 00584600
COMMENT GET HERE IF NOTHING TO DO; 00584700
00584800
GO TO AROUND; 00584900
CALCULATE: 00585000
STARTSCAN; 00585100
CALCULATEDIT: 00585200
ERR:=0; %AND DON"T RESET IT IN SCAN OR IN ANALYZE 00585300
IF SCAN THEN 00585400
IF RGTPAREN THEN MESSAGEHANDLER ELSE 00585500
IF DELV THEN FUNCTIONHANDLER ELSE 00585600
BEGIN COMMENT PROCESS CALCULATOR MODE REQUEST; 00585700
MOVE(BUFFER,BUFFERSIZE,OLDBUFFER); 00585800
IF NOT BOOLEAN(SUSPENSION) THEN BEGIN %INITIALIZE USER 00585900
%%% 00586000
%%% 00586100
SYMBASE:=STACKBASE:=0; 00586200
END; 00586300
PROCESS(XEQUTE); 00586400
IF CURRENTMODE=CALCMODE THEN 00586500
BACKAGAIN: BEGIN INDENT(0); TERPRINT; 00586600
IF NOT BOOLEAN(SUSPENSION) THEN 00586700
BEGIN IF CURRENTMODE NEQ ERRORMODE THEN 00586800
PROCESS(WRITEBACK); 00586900
SP[0,0]:=0;NROWS:=-1; 00587000
%%% 00587100
END; 00587200
CURRENTMODE:=CALCMODE; 00587300
END; 00587400
END; 00587500
IF EDITOG=1 THEN 00587600
BEGIN MOVE(OLDBUFFER,BUFFERSIZE,BUFFER); 00587700
RESCANLINE; EDITOG:=0; GO TO CALCULATEDIT; 00587800
END; 00587900
I:=0; 00588000
GO AROUND; 00588100
EXECUTEIT: 00588200
PROCESS(XEQUTE); %GO BACK TO PROCESS FOR AWHILE 00588300
IF CURRENTMODE=CALCMODE THEN GO TO BACKAGAIN; 00588400
I:=0; 00588500
GO AROUND; 00588600
FUNCTIONSTART: 00588700
IF SPECMODE = 0 THEN 00588800
BEGIN %SEE IF A SPECIAL FUNCTION. 00588900
STARTSCAN; 00589000
IF SCAN AND RGTPAREN THEN MESSAGEHANDLER ELSE 00589100
FUNCTIONHANDLER 00589200
END ELSE 00589300
FUNCTIONHANDLER; 00589400
I:=0; 00589500
GO AROUND 00589600
END; 00589700
INTEGER PROCEDURE LENGTH(A,M);VALUE M; BOOLEAN M; ARRAY A[0]; 00589800
BEGIN 00589900
INTEGER STREAM PROCEDURE LENGT(A,M,L); VALUE M,L; 00590000
BEGIN LOCAL T; 00590100
LOCAL C,CC,TSI; LABEL LAB; 00590200
LOCAL AR; LABEL LAB2; 00590300
SI:=LOC M; SI:=SI+7; 00590400
IF SC="1" THEN 00590500
BEGIN COMMENT LOOK FOR LEFT ARROW.; 00590600
DI:=LOC AR; DS:=RESET; DS:=5SET; 00590700
SI:=LOC L; DI:=LOC T; DI:=DI+1; DS:=7CHR; 00590800
SI:=A; 00590900
T(2(32(DI:=LOC AR; IF SC=DC THEN JUMP OUT 3 TO LAB; 00591000
TALLY:=TALLY+1; 00591100
C:=TALLY; TSI:=SI; SI:=LOC C; 00591200
SI:=SI+7; IF SC="0" THEN 00591300
BEGIN TALLY:=CC; TALLY:=TALLY+1; CC:=TALLY; 00591400
TALLY:=0; 00591500
END; SI:=TSI))); 00591600
L(DI:=LOC AR; IF SC=DC THEN JUMP OUT TO LAB; 00591700
TALLY:=TALLY+1; C:=TALLY; TSI:=SI; SI:=LOC C; SI:=SI+7; 00591800
IF SC="0" THEN 00591900
BEGIN TALLY:=CC; TALLY:=TALLY+1; CC:=TALLY; TALLY:=0; 00592000
END; SI:=TSI); 00592100
LAB: SI:=LOC CC; DI:=LOC LENGT; DI:=DI+6; SI:=SI+7; 00592200
DS:=CHR; SI:=LOC C; SI:=SI+7; DS:=CHR; 00592300
END ELSE 00592400
BEGIN 00592500
SI:=LOC L; DI:=LOC T; DI:=DI+1; DS:=7CHR; 00592600
SI:=A; T(2(SI:=SI+32)); SI:=SI+L; 00592700
T(2(32(SI:=SI-1; IF SC NEQ " " THEN JUMP OUT 3 TO LAB2; 00592800
TALLY:=TALLY+1; C:=TALLY; TSI:=SI; SI:=LOC C; SI:=SI+7; 00592900
IF SC="0" THEN 00593000
BEGIN TALLY:=CC; TALLY:=TALLY+1; CC:=TALLY; TALLY:=0 00593100
END; SI:=TSI))); 00593200
L(SI:=SI-1; IF SC NEQ" " THEN JUMP OUT TO LAB2; 00593300
TALLY:=TALLY+1; C:=TALLY; TSI:=SI; SI:=LOC C; SI:=SI+7; 00593400
IF SC="0" THEN 00593500
BEGIN TALLY:=CC; TALLY:=TALLY+1; CC:=TALLY; TALLY:=0 00593600
END; SI:=TSI); 00593700
LAB2: GO TO LAB 00593800
END 00593900
END; 00594000
INTEGER I; 00594100
I:=LENGT(A,M,BUFFSIZE|8); 00594200
LENGTH:=IF M THEN I ELSE BUFFSIZE|8-I 00594300
END; 00594400
BOOLEAN PROCEDURE LABELSCAN(L,K); VALUE K; INTEGER K; ARRAY L[0]; 00594500
BEGIN REAL T; 00594600
T:=ADDRESS; 00594700
IF SCAN AND IDENT THEN 00594800
BEGIN SETFIELD(ACCUM,1,1,0); TRANSFER(ACCUM,1,L,K|8,8); 00594900
IF NOT(LABELSCAN:=(SCAN AND COLON)) THEN 00595000
BEGIN ADDRESS:=T; EOB:=0; IF SCAN THEN; 00595100
END; 00595200
END 00595300
END; 00595400
STREAM PROCEDURE MOVEWDS(A,N,B); VALUE N; 00595500
BEGIN SI:=A; DI:=B; DS:=N WDS END; 00595600
INTEGER PROCEDURE DAYTIME(B); ARRAY B[0]; 00595700
BEGIN 00595800
00595900
INTEGER D,H,M,MIN,Q,P,Y,TIME1; 00596000
LABEL OWT; 00596100
STREAM PROCEDURE FORM(A,DAY,MO,DA,YR,HR,MIN,AP); 00596200
VALUE DAY,MO,DA,YR,HR,MIN,AP; 00596300
BEGIN DI:=A; 00596400
SI:=LOC DAY; SI:=SI+7; 00596500
IF SC="0" THEN DS:=3LIT"SUN" ELSE 00596600
IF SC="1" THEN DS:=3LIT"MON" ELSE 00596700
IF SC="2" THEN DS:=4LIT"TUES" ELSE 00596800
IF SC="3" THEN DS:=6LIT"WEDNES" ELSE 00596900
IF SC="4" THEN DS:=5LIT"THURS" ELSE 00597000
IF SC="5" THEN DS:=3LIT"FRI" ELSE DS:=5LIT"SATUR"; 00597100
DS:=4LIT"DAY "; SI:=LOC MO; DS:=2DEC; 00597200
DS:=LIT"-"; SI:=LOC DA; DS:=2DEC; DS:=LIT"-"; 00597300
SI:=LOC YR; DS:=2DEC; DS:=2LIT" "; 00597400
SI:=LOC HR; DS:=2DEC; DS:=LIT":"; SI:=LOC MIN; 00597500
SI:=SI+6; DS:=2CHR; SI:=LOC AP; SI:=SI+7; DS:=LIT" "; 00597600
DS:=CHR; DS:=LIT"M" 00597700
END; 00597800
TIME1:=TIME(1); 00597900
Y:=TIME(0); 00598000
D:=Y.[30:1]|100+Y.[36:6]|10+Y.[42:6]; 00598100
Y:=Y.[18:6]|10+Y.[24:6]; 00598200
FOR H:=31,IF Y MOD 4=0 THEN 29 ELSE 28,31,30, 00598300
31,30,31,31,30,31,30 DO 00598400
IF D LEQ H THEN GO OWT ELSE 00598500
BEGIN D:=D-H; M:=M+1; 00598600
END; 00598700
OWT: 00598800
H:=TIME1 DIV 216000; 00598900
MIN:=(TIME1 DIV 3600) MOD 60; 00599000
IF M LSS 2 THEN 00599100
BEGIN Q:=M+11; P:=Y-1; 00599200
END ELSE 00599300
BEGIN Q:=M-1; P:=Y 00599400
END; 00599500
M:=M+1; 00599600
FORM(B,TIME1:=((Q|26-2)DIV 10+D+P+P.[36:10]+1)MOD 7, 00599700
M,D,Y,Q:= H MOD 12, Q:=MIN MOD 10+(MIN DIV 10)|64, 00599800
IF H GEQ 12 THEN "P" ELSE 17); 00599900
DAYTIME:=(IF TIME1=6 THEN 5 ELSE 00600000
IF TIME1=5 THEN 3 ELSE 00600100
IF TIME1=2 THEN 4 ELSE 3)+22; 00600200
00600300
00600400
END; 00600500
PROCEDURE LOADWORKSPACE(NAME1,NAME2,IDENT); VALUE NAME1,NAME2; 00600600
REAL NAME1,NAME2; ARRAY IDENT[0]; 00600700
BEGIN 00600800
FILE DISK DISK(2,WDSPERREC,WDSPERBLK); 00600900
INTEGER PROCEDURE RD(D,N,A); 00601000
VALUE N; INTEGER N; FILE D; ARRAY A[0]; 00601100
BEGIN READ(D[N],WDSPERREC,A[*]); 00601200
RD:=N+1; 00601300
END; 00601400
PROCEDURE LOADITEM(RD,D,ITEM); 00601500
INTEGER PROCEDURE RD; FILE D; 00601600
ARRAY ITEM[0]; 00601700
BEGIN 00601800
DEFINE T=ITEM#; 00601900
PROCEDURE GETALINE(C,S,L,B,RD,D,LEN); 00602000
VALUE LEN; INTEGER C,S,L,LEN; 00602100
ARRAY B[0]; INTEGER PROCEDURE RD; FILE D; 00602200
BEGIN % GET 2 CHRS GIVING ENSUING CHAR COUNT 00602300
INTEGER P; 00602400
IF C GTR LEN-2 THEN 00602500
IF C GTR LEN-1 THEN % READ A NEW RECORD AND TAKE 2 CHRS 00602600
BEGIN 00602700
S:=RD(D,S,B); 00602800
C:=2; 00602900
TRANSFER(B,0,L,6,2); 00603000
END 00603100
ELSE % 1 CHR LEFT ON LINE 00603200
BEGIN 00603300
TRANSFER(B,C,L,6,1); 00603400
S:=RD(D,S,B); 00603500
TRANSFER(B,0,L,7,1); 00603600
C:=1; 00603700
END 00603800
ELSE % AT LEAST 2 CHARS REMAINING ON LINE 00603900
BEGIN 00604000
TRANSFER(B,C,L,6,2); 00604100
C:=C+2; 00604200
END; 00604300
P:=0; 00604400
IF L NEQ 0 THEN % SOMETHING LEFT IN FUNCTION 00604500
BEGIN 00604600
WHILE P LSS L DO 00604700
IF (L-P) GTR (LEN-C) THEN % # OF CHARS IN LINE 00604800
% EXTENDS INTO NEXT RECORD 00604900
BEGIN 00605000
TRANSFER(B,C,BUFFER,P,LEN-C); % FINISH OUT RECORD 00605100
S:=RD(D,S,B); 00605200
P:=P+(LEN-C); % AMOUNT READ SO FAR 00605300
C:=0; 00605400
END 00605500
ELSE % ALL ON ONE RECORD 00605600
BEGIN 00605700
TRANSFER(B,C,BUFFER,P,L-P); 00605800
C:=C+L-P; 00605900
P:=L; % FINISHED 00606000
END; 00606100
END; 00606200
END OF GETALINE; 00606300
INTEGER S,K,L,M,C,LEN,SQ,PT,G,I,SIZE; 00606400
INTEGER HOLD; 00606500
LABEL SCALARL; 00606600
ARRAY U[0:1],B[0:WDSPERREC-1]; 00606700
BOOLEAN TOG; 00606800
TRANSFER(T,0,U,0,7); 00606900
G:=GETFIELD(T,7,1); 00607000
IF VARSIZE GTR 0 THEN 00607100
IF K:=SEARCHORD(VARIABLES,U,HOLD,7)=0 THEN 00607200
IF K:=GETFIELD(U,7,1)=FUNCTION THEN TOG:=TRUE 00607300
ELSE % NOT A FUNCTION IN THE SYMBOL TABLE 00607400
IF G=FUNCTION THEN 00607500
BEGIN 00607600
DELETE1(VARIABLES,HOLD); 00607700
IF K=ARRAYDATA THEN RELEASEARRAY(U[1]); 00607800
END 00607900
ELSE TOG:=TRUE % DON-T CHANGE 00608000
ELSE % NOT IN VARIABLES 00608100
BEGIN 00608200
VARSIZE:=VARSIZE+1; 00608300
HOLD:=HOLD+K-1; 00608400
END 00608500
ELSE VARSIZE:=1; 00608600
LEN:=(WDSPERREC-1)|8; 00608700
IF NOT TOG THEN % OK TO PUT INTO VARIABLES 00608800
IF G=FUNCTION THEN % READ A FUNCTION INTO VARIABLES 00608900
BEGIN 00609000
TRANSFER(T,0,U,0,9); % U HOLDS FUNCTION NAME, 00609100
%NUMBER OF ARGUMENTS, AND WHETHER FN RETURNS A VALUE 00609200
S:=T[1].LIBF1; % RECORD NUMBER 00609300
M:=T[1].LIBF2; % WORD WITHIN RECORD 00609400
SIZE:=T[1].LIBF3; % SIZE OF POINTERS TABLE 00609500
PT:=NEXTUNIT; 00609600
S:=RD(D,S,B); 00609700
FOR I:=0 STEP 1 UNTIL SIZE-1 DO 00609800
BEGIN 00609900
TRANSFER(M,M|8,T,0,16); 00610000
M:=M+2; 00610100
IF M GEQ WDSPERREC-1 THEN 00610200
BEGIN 00610300
S:=RD(D,S,B); 00610400
IF M GEQ WDSPERREC THEN 00610500
BEGIN 00610600
TRANSFER(B,0,T,8,8); 00610700
M:=1; 00610800
END 00610900
ELSE M:=0; 00611000
END; 00611100
STOREORD(PT,T,I); 00611200
END; % HAVE FINISHED FILLIN G POINTERS TABLE 00611300
IF VARIABLES=0 THEN BEGIN 00611400
VARIABLES:=NEXTUNIT; TOG:=TRUE; %KEEP THE UNIT OPEN 00611500
STOREORD(VARIABLES,U,HOLD); END; 00611600
SEQUENTIAL (SQ:=NEXTUNIT); 00611700
SETFIELD(U,FPTF,FFL,PT); 00611800
SETFIELD(U,FSQF,FFL,SQ); 00611900
STOREORD(VARIABLES,U,HOLD); 00612000
IF TOG THEN DELETE1(VARIABLES,HOLD+1);%REMOVE 1 EXTRA 00612100
COMMENT NOW FILL IN SEQ STORAGE; 00612200
IF M NEQ 0 THEN BEGIN 00612300
M:=C:=0; 00612400
S:=RD(D,S,B); % TEXT STARTS AT BEG. OF NEW RECORD 00612500
END; 00612600
L:=1; 00612700
00612800
WHILE L NEQ 0 DO 00612900
BEGIN 00613000
GETALINE(C,S,L,B,RD,D,LEN); 00613100
GT1:=STORESEQ(SQ,BUFFER,L); 00613200
END 00613300
END 00613400
ELSE 00613500
IF G=ARRAYDATA THEN 00613600
IF T[1].INPTR=0 THEN % NULL VECTOR 00613700
GO TO SCALARL 00613800
ELSE 00613900
BEGIN 00614000
ARRAY DIMVECT[0:MAXBUFFSIZE]; 00614100
S:=T[1].INPTR; % RECORD NUMBER 00614200
M:=T[1].DIMPTR; % LOC WITHIN RECORD 00614300
C:=M|8; 00614400
SIZE:=T[1].RF; % RANK 00614500
S:=RD(D,S,B); 00614600
GETALINE(C,S,L,B,RD,D,LEN); 00614700
T[1].DIMPTR:=STORESEQ(WS,BUFFER,L); 00614800
% PUTS DIMVECT INTO WORKSPACE 00614900
GETALINE(C,S,L,B,RD,D,LEN); % # BLOCKS 00615000
SIZE:=L-1; 00615100
FOR K:=0 STEP 2 UNTIL SIZE DO 00615200
BEGIN 00615300
GETALINE(C,S,L,B,RD,D,LEN); 00615400
SETFIELD(DIMVECT,K,2,STORESEQ(WS,BUFFER,L)); 00615500
END; COMMENT THIS STORES THE VALUES OF THE 00615600
ARRAY INTO THE WORKSPACE, AND ALSO RECORDS 00615700
THE LOCATION WITHIN WS IN DIMVECT,TO BE STORED;00615800
T[1].INPTR:=STORESEQ(WS,DIMVECT,SIZE+1); 00615900
IF VARIABLES=0 THEN VARIABLES:=NEXTUNIT; 00616000
STOREORD(VARIABLES,T,HOLD); 00616100
END 00616200
ELSE % MUST BE A SCALAR 00616300
SCALARL: 00616400
BEGIN 00616500
IF VARIABLES=0 THEN VARIABLES:=NEXTUNIT; 00616600
STOREORD(VARIABLES,T,HOLD); 00616700
END 00616800
ELSE % WILL NOT REPLACE IN SYMBOL TABLE 00616900
BEGIN 00617000
FILL BUFFER[*] WITH " ","NOT REPL","ACED "; 00617100
TRANSFER(T,0,BUFFER,0,7); 00617200
FORMROW(3,0,BUFFER,0,20); 00617300
END; 00617400
END LOADITEM; 00617500
BOOLEAN STREAM PROCEDURE EQUAL(A,B); 00617600
BEGIN SI:=A; DI:=B; SI:=SI+2; IF 7SC=DC THEN TALLY:=1; 00617700
EQUAL:=TALLY 00617800
END; 00617900
INTEGER I,J,L,NDIR,N; 00618000
LABEL MOVEVAR,SKIP; 00618100
ARRAY T,U[0:1],D[0:WDSPERREC-1]; 00618200
FILL DISK WITH NAME1,NAME2; L:=RD(DISK,L,D); 00618300
IF D[1] NEQ JOBNUM AND D[1] NEQ 0 THEN GO SKIP; % FILE LOCKED 00618400
FOR I:=2 STEP 1 UNTIL 9 DO IF GETFIELD(D[I],1,7) NEQ 0 THEN GO SKIP;00618500
IF NDIR:=D[0] NEQ 0 THEN 00618600
BEGIN N:=LIBSPACES+ENTIER(NDIR|2/(J:=WDSPERREC-1)); 00618700
IF(NDIR|2) MOD J NEQ 0 THEN N:=N+1; 00618800
FOR I:=1 STEP 1 UNTIL NDIR DO 00618900
BEGIN COMMENT GET FUNCTION OR VARIABLE NAME FROM LIB; 00619000
IF WDSPERREC-J LSS 3 THEN 00619100
IF WDSPERREC-J=1 THEN 00619200
BEGIN L:=RD(DISK,L,D); J:=0; GO MOVEVAR 00619300
END ELSE 00619400
BEGIN TRANSFER(D,J|8,T,0,8); L:=RD(DISK,L,D); 00619500
TRANSFER(D,0,T,8,8); J:=1 00619600
END ELSE MOVEVAR: 00619700
BEGIN TRANSFER(D,J|8,T,0,16); J:=J+2 00619800
END; 00619900
IF(IF IDENT[0]=0 THEN TRUE ELSE EQUAL(IDENT,T)) THEN 00620000
BEGIN IF IDENT[0] NEQ 0 THEN I:=NDIR+1; 00620100
LOADITEM(RD,DISK,T); 00620200
END 00620300
END; 00620400
STOREPSR; % UPDATE SINCE HAVE ADDED TO VARIABLES 00620500
END; 00620600
IF FALSE THEN SKIP: FORMWD(1,"6BADFIL"); 00620700
EOB:=1; 00620800
END OF LIBRARY LOAD; 00620900
PROCEDURE PURGEWORKSPACE(WS); VALUE WS; INTEGER WS; 00621000
IF WORKSPACE NEQ 0 THEN 00621100
BEGIN 00621200
INTEGER I,J,K,V,L,G; 00621300
ARRAY T[0:1]; 00621400
J:=SIZE(V:=VARIABLES)-1; 00621500
FOR I:=0 STEP 1 UNTIL J DO 00621600
BEGIN K:=CONTENTS(V,I,T); 00621700
IF GETFIELD(T,7,1)=FUNCTION THEN 00621800
FOR L:=FPTF,FSQF DO % GET RID OF STORAGE 00621900
IF G:=GETFIELD(T,L,FFL) NEQ 0 THEN RELEASEUNIT(G); 00622000
END; 00622100
RELEASEUNIT(V); 00622200
VARIABLES:=0; VARSIZE:=0; 00622300
CURRENTMODE:=0; J:=SIZE(WS)-1; 00622400
FOR I:=1 STEP 1 UNTIL J DO DELETE1(WS,I); 00622500
STOREPSR; 00622600
END; 00622700
PROCEDURE ELIMWORKSPACE(WS); VALUE WS; INTEGER WS; 00622800
BEGIN LABEL QQQ; QQQ: 00622900
IF WORKSPACE NEQ 0 THEN 00623000
BEGIN 00623100
PURGEWORKSPACE(WS); RELEASEUNIT(WS); 00623200
% 00623300
END ELSE SPOUT(8015222); 00623400
END; 00623500
PROCEDURE SAVEWORKSPACE(NAME1,NAME2,LOCKFILE); 00623600
VALUE NAME1,NAME2,LOCKFILE; 00623700
REAL NAME1,NAME2,LOCKFILE; 00623800
BEGIN 00623900
SAVE FILE DISK DISK [NAREAS:SIZEAREAS] 00624000
(2,WDSPERREC,WDSPERBLK,SAVE 100); 00624100
INTEGER PROCEDURE WR(D,N,A); VALUE N; INTEGER N; 00624200
FILE D; ARRAY A[0]; 00624300
BEGIN REAL STREAM PROCEDURE CON(A); VALUE A; 00624400
BEGIN SI:=LOC A; DI:=LOC CON; DS:=8DEC END; 00624500
STREAM PROCEDURE CLEANER(A); 00624600
BEGIN DI:=A; WDSPERREC(DS:=8LIT".") END; 00624700
A[WDSPERREC-1]:=CON(N); 00624800
WRITE(D[N],WDSPERREC,A[*]); 00624900
WR:=N+1; CLEANER(A); 00625000
END; 00625100
PROCEDURE PUTAWAY(C,J,WR,D,N,M,B,L); VALUE L,J; 00625200
INTEGER L,C,J,N,M; 00625300
ARRAY B[0]; INTEGER PROCEDURE WR; FILE D; 00625400
BEGIN INTEGER P,K; 00625500
IF C+2 GTR L THEN 00625600
BEGIN TRANSFER(J,6,B,C,1); N:=WR(D,N,B); C:=1; 00625700
TRANSFER(J,7,B,0,1); 00625800
END ELSE 00625900
BEGIN TRANSFER(J,6,B,C,2); C:=C+2; 00626000
END; 00626100
WHILE J NEQ 0 DO 00626200
IF J GTR K:=(L-C) THEN 00626300
BEGIN TRANSFER(BUFFER,P,B,C,K); 00626400
N:=WR(D,N,B); J:=J-K; C:=0; P:=P+K 00626500
END ELSE 00626600
BEGIN TRANSFER(BUFFER,P,B,C,J); C:=C+J; J:=0 00626700
END; 00626800
IF C=L THEN 00626900
BEGIN N:=WR(D,N,B); C:=0 00627000
END; 00627100
END; 00627200
00627300
PROCEDURE MOVETWO(U,B,M,WR,L,D); 00627400
ARRAY U,B[0]; INTEGER M,L; INTEGER PROCEDURE WR; FILE D; 00627500
BEGIN 00627600
COMMENT PUTS 2 WORDS OF U IN B AND WRITES ON D IF A FULLRECORD;00627700
TRANSFER(U,0,B,M|8,16); % CONTENTS OF U INTO B 00627800
M:=M+2; 00627900
IF M GEQ WDSPERREC-1 THEN % FULL RECORD 00628000
BEGIN 00628100
L:=WR(D,L,B); 00628200
IF M GEQ WDSPERREC THEN % 1 OVER FULL RECORD 00628300
00628400
BEGIN 00628500
TRANSFER(U,8,B,0,8); 00628600
M:=1; 00628700
END 00628800
ELSE M:=0; 00628900
END; 00629000
END OF MOVETWO; 00629100
INTEGER H,Q,M,N,I,L,S,J,K,LINE,MAX,PT,SQ,C,LEN,W; 00629200
REAL LSD,STP; 00629300
LABEL SKIP; 00629400
ARRAY T,U[0:1],DIR,B,SEX[0:WDSPERREC]; 00629500
N:=LIBSPACES+ENTIER((S:=SIZE(VARIABLES))|2/(WDSPERREC-1)); 00629600
IF (S|2) MOD (WDSPERREC-1) NEQ 0 THEN N:=N+1; % ADJUST 00629700
LEN:=(WDSPERREC-1)|8; 00629800
FILL DISK WITH NAME1,NAME2; 00629900
DIR[0]:=S; % SIZE OF SYMBOL TABLE 00630000
IF BOOLEAN (LOCKFILE) THEN DIR[1]:=JOBNUM; 00630100
S:=S-1; 00630200
L:=WR(DISK,L,DIR); % FIRST LINE CONTAINS # OF ENTRIES IN 00630300
COMMENT SYMBOL TABLE AND LOCK INFORMATION; 00630400
FOR I:=0 STEP 1 UNTIL S DO 00630500
BEGIN 00630600
J:=CONTENTS(VARIABLES,I,T); % RETURNS VALUE OF I-TH LOC 00630700
% IN VARIABLES INTO T 00630800
IF GT2:=GETFIELD(T,7,1)=FUNCTION THEN 00630900
BEGIN 00631000
PT:=GETFIELD(T,FPTF,FFL); % FUNCTION POINTER FIELD 00631100
SQ:=GETFIELD(T,FSQF,FFL); % FUNCTION SEQUENTIAL FIELD 00631200
%PT=# OF ORDERED STORAGE UNIT CONTAINING HEADER&POINTE 00631300
%SQ=# OF SEQ STORAGE UNIT CPONTAINING TEXT 00631400
MAX:=SIZE(PT); 00631500
T[1].LIBF1:=N; % RECORD # 00631600
T[1].LIBF2:=M; % LOC WITHIN RECORD 00631700
T[1].LIBF3:=MAX; % SIZE OF POINTERS TABLE; 00631800
% SAVE ENOUGH ROOM FOR THE ENTIRE POINTERS TABLE 00631900
H:=ENTIER(GT1:=(M+MAX|2)/(WDSPERREC-1)); 00632000
H:=IF GT1 NEQ H THEN H+N+1 ELSE H+N; 00632100
U[0]:=0; 00632200
J:=SEARCHORD(PT,U,LINE,8); % LOOK FOR ALL ZEROS 00632300
IF J=2 THEN GO SKIP; 00632400
FOR W:=0 STEP 1 UNTIL LINE-1 DO 00632500
%MOVE LOCALS AND LABELS INTO THE SAVE FILE 00632600
BEGIN 00632700
J:=CONTENTS(PT,W,U); 00632800
MOVETWO(U,B,M,WR,N,DISK); 00632900
END; 00633000
FOR LINE:=LINE STEP 1 UNTIL MAX-1 DO 00633100
BEGIN 00633200
00633300
J:=CONTENTS(PT,LINE,U); 00633400
GT1:=U[1]; 00633500
U[1]:=LINE-W; 00633600
MOVETWO(U,B,M,WR,N,DISK); % POINTERS TABLE 00633700
J:=CONTENTS(SQ,GT1,BUFFER); 00633800
PUTAWAY(C,J,WR,DISK,H,Q,SEX,LEN); % TEXT 00633900
END; 00634000
PUTAWAY(C,0,WR,DISK,H,Q,SEX,LEN); 00634100
SKIP: 00634200
Q:=C DIV 8; 00634300
IF C MOD 8 NEQ 0 THEN Q:=Q+1; 00634400
IF Q=WDSPERREC-1 THEN 00634500
BEGIN 00634600
H:=WR(DISK,H,SEX); 00634700
Q:=0; 00634800
END; 00634900
IF M GTR 0 THEN N:=WR(DISK,N,B); 00635000
M:=Q; N:=H; 00635100
TRANSFER(SEX,0,B,0,C); % MOVE BACK TO B 00635200
C:=0; 00635300
END 00635400
ELSE 00635500
IF GT2=ARRAYDATA THEN 00635600
BEGIN 00635700
ARRAY DIMVECT[0:MAXBUFFSIZE]; 00635800
LSD:=T[1]; 00635900
IF H:=LSD.SPF=0 THEN % NULL VECTOR 00636000
ELSE 00636100
BEGIN 00636200
T[1].INPTR:=N; T[1].DIMPTR:=M; 00636300
C:=M|8; 00636400
J:=CONTENTS(WS,LSD.DIMPTR,BUFFER); % DIM VECT 00636500
PUTAWAY(C,J,WR,DISK,N,M,B,LEN); % STD DIM VECT 00636600
J:=CONTENTS(WS,LSD.INPTR,DIMVECT); 00636700
TRANSFER(DIMVECT,0,BUFFER,0,J); 00636800
PUTAWAY(C,J,WR,DISK,N,M,B,LEN); 00636900
J:=J-1; 00637000
FOR LINE:=0 STEP 2 UNTIL J DO 00637100
BEGIN 00637200
PT:=GETFIELD(DIMVECT,LINE,2); 00637300
STP:=CONTENTS(WS,PT,BUFFER); 00637400
PUTAWAY(C,STP,WR,DISK,N,M,B,LEN); 00637500
END; 00637600
M:=C DIV 8; IF C MOD 8 NEQ 0 THEN M:=M+1; C:=0; 00637700
IF M=WDSPERREC-1 THEN BEGIN N:=WR(DISK,N,B); 00637800
M:=0; END; 00637900
END; 00638000
END; 00638100
MOVETWO(T,DIR,K,WR,L,DISK); 00638200
END; 00638300
00638400
EOB:=1; 00638500
IF M GTR 0 THEN N:=WR(DISK,N,B); 00638600
IF K GTR 0 THEN L:=WR(DISK,L,DIR); 00638700
LOCK(DISK); 00638800
END; 00638900
BOOLEAN PROCEDURE LIBNAMES(A,B); REAL A,B; 00639000
BEGIN REAL T; 00639100
A:=B:=GT1:=0; 00639200
% 00639300
% 00639400
IF SCAN AND IDENT THEN 00639500
BEGIN T~ACCUM[0]; T.[6:6]~"/"; 00639600
IF SCAN AND LOCKIT THEN GT1~1 ELSE IF IDENT THEN LIBNAMES~TRUE; 00639700
A~T; B~ JOBNUM; 00639800
END 00639900
ELSE LIBNAMES~ TRUE; 00640000
END; 00640100
PROCEDURE MESSAGEHANDLER; 00640200
BEGIN 00640300
LABEL ERR1; 00640400
% 00640500
IF SCAN THEN IF IDENT THEN 00640600
BEGIN INTEGER I; REAL R,S; 00640700
PROCEDURE NOFILEPRESENT; 00640800
BEGIN 00640900
FILL BUFFER[*] WITH "FILE NOT"," ON DISK"; 00641000
FORMROW(3,0,BUFFER,0,16); 00641100
END OF NOFILEPRESENT; 00641200
PROCEDURE PRINTID(VARS); VALUE VARS; BOOLEAN VARS; 00641300
BEGIN INTEGER I,J,K,L,M; ARRAY T[0:1]; BOOLEAN TOG; 00641400
INTEGER NUM; 00641500
J:=VARSIZE-1; M:=VARIABLES; 00641600
FOR I:=0 STEP 1 UNTIL J DO 00641700
BEGIN L:=CONTENTS(M,I,T); TOG:=GETFIELD(T,7,1) 00641800
=FUNCTION; 00641900
IF NUM:=3|REAL(TOG AND VARS)+8+NUM GTR LINESIZE 00642000
THEN BEGIN TERPRINT; NUM:=3|REAL(TOG AND VARS)+8 END; 00642100
IF VARS THEN 00642200
BEGIN FORMROW(0,1,T,0,7); L:=L+1; 00642300
IF TOG THEN FORMWD(0,"3(F) "); 00642400
END ELSE 00642500
IF TOG THEN BEGIN L:=L+1; FORMROW(0,1,T,0,7) END; 00642600
END; 00642700
IF L=0 THEN FORMWD(3,"6 NULL.") ELSE TERPRINT 00642800
END; 00642900
R:=ACCUM[0]; 00643000
FOR I:=0 STEP 1 UNTIL MAXMESS DO 00643100
IF R=MESSTAB[I] THEN 00643200
BEGIN R:=I; I:=MAXMESS+1 00643300
END; 00643400
IF I=MAXMESS+2 THEN 00643500
CASE R OF 00643600
BEGIN 00643700
% ------- SAVE ------- 00643800
IF NOT LIBNAMES(R,S) THEN 00643900
IF NOT LIBRARIAN(R,S) THEN BEGIN 00644000
SAVEWORKSPACE(R,S,GT1); %GT1 SET IN LIBNAMES 00644100
GTA[0]~GTA[1]~0;TRANSFER(R,1,GTA,1,7); 00644200
IF(GT1~SEARCHORD(LIBRARY,GTA, I, 7)) NEQ 0 THEN 00644300
BEGIN GTA[0]~GTA[1]~0;TRANSFER(R,1,GTA,1,7); 00644400
STOREORD(LIBRARY,GTA,I+(IF GT1=1 THEN -1 ELSE 1));00644500
END; LIBSIZE~LIBSIZE+1; 00644600
END 00644700
ELSE 00644800
BEGIN 00644900
FILL BUFFER[*] WITH "FILE ALR","EADY ON ", 00645000
"DISK "; 00645100
FORMROW(3,0,BUFFER,0,20); 00645200
END 00645300
ELSE GO ERR1; 00645400
% ------- LOAD ------- 00645500
IF NOT LIBNAMES(R,S) AND R NEQ 0 THEN 00645600
IF LIBRARIAN(R,S) THEN 00645700
BEGIN ARRAY A[0:1]; 00645800
LOADWORKSPACE(R,S,A); 00645900
END 00646000
ELSE NOFILEPRESENT 00646100
ELSE GO ERR1; 00646200
% ------- DROP ------- 00646300
IF CURRENTMODE=CALCMODE THEN 00646400
IF NOT LIBNAMES(R,S) THEN 00646500
IF LIBRARIAN(R,S) THEN 00646600
BEGIN FILE ELIF DISK (1,1); 00646700
FILL ELIF WITH R,S; WRITE(ELIF[0]); 00646800
CLOSE(ELIF,PURGE) 00646900
;GTA[0]~GTA[1]~0;TRANSFER(R,1,GTA,1,7); 00647000
IF SEARCHORD(LIBRARY,GTA,I,7)=0 THEN DELETE1(LIBRARY,I); 00647100
LIBSIZE~LIBSIZE-1; 00647200
END 00647300
ELSE NOFILEPRESENT 00647400
ELSE 00647500
IF NOT BOOLEAN(SUSPENSION)THEN PURGEWORKSPACE(WORKSPACE) 00647600
ELSE GO ERR1 ELSE GO ERR1; 00647700
% ------- COPY ------- 00647800
IF LIBNAMES(R,S) THEN 00647900
IF LIBRARIAN(R,S) THEN 00648000
LOADWORKSPACE(R,S,ACCUM) 00648100
ELSE NOFILEPRESENT 00648200
ELSE GO ERR1; 00648300
00648400
% -------- VARS ------- 00648500
PRINTID(TRUE); 00648600
00648700
%------- FNS ------- 00648800
PRINTID(FALSE); 00648900
%-------- LOGGED ---------------- 00649000
; 00649100
%-------- MSG -------- 00649200
ERRORMESS(SYNTAXERROR,LADDRESS,0); 00649300
%-----WIDTH (INTEGER) --------------------------- 00649400
IF NOT SCAN THEN BEGIN NUMBERCON(LINESIZE, ACCUM); 00649500
FORMROW(3,0,ACCUM,2,ACOUNT); END 00649600
ELSE IF NUMERIC AND I:=ACCUM[0] GTR 9 AND I LEQ 72 00649700
THEN BEGIN TERPRINT; LINESIZE:=I; STOREPSR; 00649800
END 00649900
%IF A NUMBER CONVERSION ERROR, RESULT WILL BE ZERO 00650000
%AND WE"LL GET AN ERROR ANYWAY 00650100
ELSE GO TO ERR1; 00650200
%-------- OPR -------- 00650300
; 00650400
%------DIGITS (INTEGER) ------------------------ 00650500
IF NOT SCAN THEN BEGIN NUMBERCON(DIGITS,ACCUM); 00650600
FORMROW(3,0,ACCUM,2,ACOUNT); END 00650700
ELSE IF NUMERIC AND I:=ACCUM[0] GEQ 0 AND I LEQ 12 00650800
AND ERR=0 THEN BEGIN DIGITS:=I; STOREPSR END 00650900
ELSE GO TO ERR1; 00651000
%-------- OFF -------- 00651100
BEGIN 00651200
IF SCAN THEN IF ACCUM[0]="7DISCAR" THEN 00651300
ELIMWORKSPACE(WORKSPACE) ELSE 00651400
GO TO ERR1; 00651500
FILL ACCUM[*] WITH "END OF R","UN "; 00651600
FORMROW(3,MARGINSIZE,ACCUM,0,10); 00651700
CURRENTMODE:=CALCMODE; 00651800
GT1:=CSTATION; 00651900
CSTATION:=GT1&0[CAPLOGGED] 00652000
;GO TO FINIS; 00652100
END; 00652200
%--------ORIGIN---------------------------------- 00652300
IF NOT SCAN THEN BEGIN NUMBERCON(ORIGIN,ACCUM); 00652400
FORMROW(3,0,ACCUM,2,ACOUNT) END 00652500
ELSE IF NUMERIC AND ERR=0 THEN BEGIN ORIGIN:= 00652600
I:=ACCUM[0]; STOREPSR END ELSE GO TO ERR1; 00652700
%--------SEED--------------------------------- 00652800
IF NOT SCAN THEN BEGIN NUMBERCON(SEED,ACCUM); 00652900
FORMROW(3,0,ACCUM,2,ACOUNT) END 00653000
ELSE IF NUMERIC AND ERR=0 THEN BEGIN 00653100
SEED:=ABS(I:=ACCUM[0]); 00653200
STOREPSR END ELSE GO TO ERR1; 00653300
%--------FUZZ------------------------------------ 00653400
IF NOT SCAN THEN BEGIN 00653500
NUMBERCON(FUZZ,ACCUM); 00653600
FORMROW(3,0,ACCUM,2,ACOUNT) END 00653700
ELSE IF NUMERIC AND ERR=0 THEN BEGIN FUZZ:=ABS(ACCUM[0]); 00653800
STOREPSR END ELSE GO TO ERR1; 00653900
%------- SYN, NOSYN------------------------------------- 00654000
NOSYNTAX:=0; NOSYNTAX:=1; 00654100
%-----------------STORE------------------------- 00654200
IF SYMBASE NEQ 0 THEN PROCESS(WRITEBACK); 00654300
00654400
00654500
%-----------------ABORT------------------------- 00654600
BEGIN IF BOOLEAN(SUSPENSION) THEN 00654700
SP[0,0]:=0; NROWS:=-1; 00654800
%%% 00654900
SUSPENSION:=0; 00655000
STOREPSR; 00655100
END; 00655200
%-----------------SI--------------------------------- 00655300
IF BOOLEAN(SUSPENSION) THEN 00655400
BEGIN GT1:=0; 00655500
PROCESS(LOOKATSTACK); 00655600
END ELSE FORMWD(3,"6 NULL."); 00655700
%------------------SIV------------------------------ 00655800
IF BOOLEAN(SUSPENSION) THEN 00655900
BEGIN GT1:=1; 00656000
PROCESS(LOOKATSTACK); 00656100
END ELSE FORMWD(3,"6 NULL."); 00656200
%------------------ERASE------------------------------ 00656300
IF CURRENTMODE=FUNCMODE OR BOOLEAN(SUSPENSION) THEN GO TO ERR1 00656400
ELSE WHILE SCAN AND IDENT DO 00656500
BEGIN % LOOK FOR THE INDENTIFIER NAME IN ACCUM 00656600
TRANSFER(ACCUM,2,GTA,0,7); 00656700
IF (IF VARIABLES=0 THEN FALSE ELSE 00656800
SEARCHORD(VARIABLES,GTA,GT1,7)=0) THEN 00656900
BEGIN % FOUND A SYMBOL TABLE ENTRY MATCHING NAME 00657000
DELETE1(VARIABLES,GT1); % REMOVE FROM SYMBOLTABLE 00657100
IF VARSIZE:=VARSIZE-1=0 THEN VARIABLES:=0; 00657200
COMMENT IF NOTHING IS IN THE UNIT IT IS DELETED; 00657300
00657400
% CHECK IF THERE IS MORE TO DELETE 00657500
IF GT1:=GETFIELD(GTA,7,1)=FUNCTION THEN 00657600
BEGIN 00657700
RELEASEUNIT(GETFIELD(GTA,FPTF,FFL)); 00657800
RELEASEUNIT(GETFIELD(GTA,FSQF,FFL)); 00657900
END 00658000
ELSE IF GT1 GTR 0 THEN % MUST BE AN ARRAY 00658100
RELEASEARRAY(GTA[1]); 00658200
END ELSE % THERE IS NO SUCH VARIABLE 00658300
ERRORMESS(LABELERROR,LADDRESS,0); 00658400
END; % OF TAKING CARE OF ERASE 00658500
%------------ ASSIGN -------------------------------- 00658600
; 00658700
%------------ DELETE --------------------------------- 00658800
; 00658900
%------------- LIST ------------------------------------ 00659000
; 00659100
% -------------DEBUG -------------------------------- 00659200
IF SCAN AND IDENT THEN 00659300
IF ACCUM[0]="6POLISH" THEN POLBUG:=ABS(POLBUG-1); 00659400
00659500
%----------------------------- FILES ---------------------- 00659600
IF LIBSIZE>1 THEN 00659700
BEGIN FOR I~1 STEP 1 UNTIL LIBSIZE-1 DO 00659800
BEGIN R~CONTENTS(LIBRARY,I ,ACCUM); 00659900
FORMROW(0,1,ACCUM,2,6); 00660000
END; TERPRINT; 00660100
END ELSE FORMWD(3,"6 NULL."); 00660200
%------------------------ END OF CASES ----------------------- 00660300
END ELSE GO TO ERR1; 00660400
IF CURRENTMODE=FUNCMODE THEN INDENT(-CURLINE); 00660500
END ELSE 00660600
IF QUOTE THEN EDITLINE ELSE 00660700
ERR1: ERRORMESS(SYNTAXERROR,0,0); 00660800
INDENT(0); 00660900
TERPRINT; 00661000
END; 00661100
REAL PROCEDURE LINENUMBER(R); VALUE R; REAL R; 00661200
BEGIN 00661300
REAL STREAM PROCEDURE CON(R); VALUE R; 00661400
BEGIN SI:=LOC R; DI:=LOC CON; DS:=8DEC 00661500
END; 00661600
LINENUMBER:=CON( ENTIER( (R+.00005)|10000)) 00661700
END; 00661800
DEFINE DELIM="""#, ENDCHR="$"#; 00661900
BOOLEAN PROCEDURE WITHINALINE(COMMAND,OLD,NEW,CHAR,WORD); 00662000
VALUE COMMAND,CHAR,WORD; INTEGER COMMAND,CHAR,WORD; 00662100
ARRAY OLD, NEW[0]; BEGIN 00662200
BOOLEAN STREAM PROCEDURE WITHINLINE(COMMAND,OLD,NEW,CHAR,WORD); 00662300
VALUE COMMAND,CHAR,WORD; 00662400
BEGIN 00662500
LOCAL OLDLINE,NEWLINE,F,BCHR; 00662600
LOCAL N,M,T; 00662700
LOCAL X,Y,Z; 00662800
LABEL LOOKING,FOUND,BETWEEN,TAIL,FINISH, 00662900
OVER; 00663000
DI:=NEW; WORD(DS:=8LIT" "); 00663100
SI:=LOC CHAR; DI:=LOC T; DI:=DI+1; DS:=7CHR; 00663200
SI:=COMMAND; 00663300
TALLY:=T; X:=TALLY; TALLY:=2; Y:=TALLY; TALLY:=32; Z:=TALLY; 00663400
TALLY:=0; 00663500
IF SC!"~" THEN 00663600
BEGIN BCHR:=SI; SI:=OLD; OLDLINE:=SI; 00663700
DI:=NEW; NEWLINE:=DI; SI:=BCHR; 00663800
63(IF SC=DELIM THEN JUMP OUT ELSE SI:=SI+1; TALLY 00663900
:=TALLY+1); N:=TALLY; 00664000
IF TOGGLE THEN 00664100
BEGIN 00664200
SI:=SI+1; TALLY:=0; 00664300
63(IF SC=DELIM THEN TALLY:=0 ELSE 00664400
IF SC="~" THEN JUMP OUT ELSE TALLY:=TALLY+1; SI:=SI+1); 00664500
IF TOGGLE THEN M:=TALLY;; 00664600
DI:=OLDLINE; SI:=BCHR; 00664700
2( X( Y( Z( CI:=CI+F; 00664800
GO LOOKING; GO FOUND; GO BETWEEN; GO TAIL; GO FINISH; 00664900
LOOKING: %************ LOOKING FOR THE FIRST UNIQUE STRING**************00665000
IF SC=DELIM THEN BEGIN SI:=SI+1; TALLY:=2; F:= TALLY ; 00665100
DI:=NEWLINE; GO BETWEEN END ELSE 00665200
IF N SC=DC THEN BEGIN SI:=OLDLINE; SI:=SI+N; OLDLINE:=SI; 00665300
DI:=NEWLINE; SI:=BCHR; TALLY:=1; F:=TALLY; 00665400
GO FOUND END ELSE 00665500
BEGIN SI:=OLDLINE; DI:=NEWLINE; DS:=CHR; NEWLINE:=DI; 00665600
OLDLINE:=SI; SI:=BCHR; DI:=OLDLINE; 00665700
END; GO OVER; 00665800
FOUND: %**************FOUND THE FIRST UNIQUE STRING ******************00665900
IF SC=DELIM THEN BEGIN SI:=SI+1; TALLY:=2; 00666000
F:=TALLY; GO BETWEEN END ELSE 00666100
DS:=CHR; GO OVER; 00666200
BETWEEN: % ********** BETWEEN THEN // *********************************00666300
IF SC=DELIM THEN BEGIN SI:=SI+1; NEWLINE:=DI; DI:=OLDLINE; 00666400
TALLY:=3; F:=TALLY; GO TAIL END ELSE 00666500
IF SC="~" THEN BEGIN TALLY:=4; F:=TALLY; 00666600
SI:=OLDLINE; GO FINISH END ELSE 00666700
DS:=CHR; GO OVER; 00666800
TAIL: % ******* THE TAIL END OF THE COMMAND ***************************00666900
IF M SC=DC THEN BEGIN DI:=NEWLINE; SI:=OLDLINE; TALLY:=4; 00667000
F:=TALLY; GO FINISH END ELSE 00667100
BEGIN SI:=SI-M; DI:=DI-M; DI:=DI+1; OLDLINE:=DI; END; 00667200
GO OVER; 00667300
FINISH: % ********FINISH UP THE CHAR MOVE FROM OLD TO NEW*************00667400
DS:=CHR; OVER:))); 00667500
TALLY:=CHAR; X:=TALLY; TALLY:=1; Y:=TALLY; 00667600
Z:=TALLY); 00667700
SI:=NEW; DI:=OLD; DS:=WORD WDS; TALLY:=1; 00667800
WITHINLINE:=TALLY; 00667900
END 00668000
END 00668100
END OF WITHINALINE; 00668200
WITHINALINE := WITHINLINE(COMMAND,OLD,NEW,CHAR,WORD); 00668300
END OF PHONY WITHINALINE; 00668400
PROCEDURE EDITLINE; 00668500
BEGIN ARRAY T[0:MAXBUFFSIZE]; 00668600
INITBUFF(T,BUFFSIZE); 00668700
TRANSFER(OLDBUFFER,0,T,0,LENGTH(OLDBUFFER,TRUE)); 00668800
IF WITHINALINE(ADDRESS,T,OLDBUFFER,BUFFSIZE|8,BUFFSIZE) THEN 00668900
BEGIN MOVEWDS(OLDBUFFER,BUFFSIZE,BUFFER); 00669000
00669100
IF SCAN AND RGTPAREN THEN 00669200
ERRORMESS(SYNTAXERROR,LADDRESS,0) ELSE EDITOG:=1; 00669300
END; 00669400
00669500
00669600
FORMROW(3,0,BUFFER,0,LENGTH(BUFFER,FALSE)); 00669700
END; 00669800
PROCEDURE CHECKSEQ(SEQ,L,INC); REAL SEQ,L,INC; 00669900
BEGIN 00670000
INTEGER I,J; 00670100
I:=L|10000 MOD 10000; 00670200
FOR J:=-4 STEP 1 WHILE J LSS 0 AND I MOD 10=0 DO 00670300
I:=I/10; 00670400
INC:=10*J; 00670500
SEQ:=L; 00670600
END; 00670700
PROCEDURE FUNCTIONHANDLER; 00670800
BEGIN 00670900
LABEL ENDHANDLER; 00671000
OWN BOOLEAN EDITMODE; 00671100
DEFINE FPT=FUNCPOINTER#, 00671200
FSQ=FUNCSEQ#, 00671300
SEQ=CURLINE#, 00671400
INC=INCREMENT#, 00671500
MODE=SPECMODE#, 00671600
ENDDEFINES=#; 00671700
INTEGER STREAM PROCEDURE DELPRESENT(ADDR); VALUE ADDR; 00671800
BEGIN LABEL L,FINIS; 00671900
LOCAL Q; 00672000
DI:=LOC Q; DS:=RESET; DS:=5SET; DS:=2RESET; DS:=2SET; 00672100
% LEFT-ARROW / QUESTION MARK 00672200
SI:=ADDR; 00672300
L: DI:=LOC Q; 00672400
IF SC=DELCHR THEN 00672500
BEGIN ADDR:=SI; SI:=LOC Q; DI:=ADDR; DS:=LIT" "; 00672600
TALLY:=1; DELPRESENT:=TALLY; GO TO FINIS; 00672700
END; 00672800
IF SC=DC THEN GO TO FINIS; SI:=SI-1; 00672900
IF SC=DC THEN GO TO FINIS; 00673000
GO TO L; 00673100
FINIS: 00673200
END; 00673300
INTEGER PROCEDURE OLDLABCONFLICT(PT,S); VALUE PT,S; 00673400
INTEGER PT; REAL S; 00673500
IF PT NEQ 0 THEN 00673600
BEGIN INTEGER K; ARRAY L[0:1]; 00673700
ADDRESS:=ABSOLUTEADDRESS; 00673800
WHILE LABELSCAN(L,0) AND ERR EQL 0 DO 00673900
IF SEARCHORD(PT,L,K,8)=0 THEN 00674000
IF L[1] NEQ S THEN ERR:=24; 00674100
OLDLABCONFLICT:=ERR 00674200
END; 00674300
INTEGER PROCEDURE ELIMOLDLINE(PT,SQ,L); VALUE PT,SQ,L; INTEGER PT, 00674400
SQ,L; FORWARD; 00674500
INTEGER PROCEDURE STOREAWAY(PT,SQ,B,SEQ); VALUE SEQ; 00674600
INTEGER PT,SQ; REAL SEQ; ARRAY B[0]; FORWARD; 00674700
PROCEDURE BUFFERCLEAN(BUFFER,BUFFSIZE,ADDR); VALUE BUFFSIZE, 00674800
ADDR; REAL ADDR; INTEGER BUFFSIZE; ARRAY BUFFER[0]; 00674900
FORWARD; COMMENT THIS IS A PHONEY DEAL, BUT I CAN"T 00675000
DECLARE CLEANBUFFER FORWARD (MOVE IT UP HERE LATER); 00675100
PROCEDURE EDITDRIVER(PT,SQ,I,K); VALUE PT,SQ,I,K; 00675200
INTEGER PT,SQ,I,K; 00675300
BEGIN ARRAY C,LAB[0:1],OLD,NEW[0:MAXBUFFSIZE]; 00675400
STREAM PROCEDURE BL(A); 00675500
BEGIN DI:=A; MAXBUFFSIZE(DS:=8LIT" ") END; 00675600
DEFINE MOVE=MOVEWDS#; 00675700
REAL T,SEQ; INTEGER A,B,L,M; 00675800
T:=ADDRESS; 00675900
FOR A:=I STEP 1 WHILE A LEQ K AND EDITMODE DO 00676000
BEGIN B:=CONTENTS(PT,A,C); BL(OLD); 00676100
SEQ:=C[0]; 00676200
B:=CONTENTS(SQ,C[1],OLD); 00676300
IF EDITMODE:=WITHINALINE(T,OLD,NEW,BUFFSIZE|8,BUFFSIZE) 00676400
THEN BEGIN MOVE(BUFFER,MAXBUFFSIZE+1,NEW); 00676500
MOVE(OLD,MAXBUFFSIZE,BUFFER); 00676600
IF EDITMODE:=ERR:=OLDLABCONFLICT(PT,C[0])=0 THEN 00676700
BEGIN B:=ELIMOLDLINE(PT,SQ,C[1]); 00676800
DELTOG:=DELPRESENT(ADDRESS); 00676900
DELETE1(SQ,C[1]); DELETE1(PT,A+B); C[1]:= 00677000
STORESEQ(SQ,BUFFER,LENGTH(BUFFER,FALSE)); 00677100
STOREORD(PT,C,A+B); 00677200
RESCANLINE; L:=0; M:=1; LAB[1]:=C[0]; 00677300
WHILE LABELSCAN(C,0) DO 00677400
BEGIN MOVEWDS(C,1,LAB); 00677500
IF(IF FUNCSIZE=0 THEN TRUE ELSE L:= 00677600
SEARCHORD(PT,C,M,8)NEQ 0) THEN 00677700
BEGIN B:=B+1; FUNCSIZE:=FUNCSIZE+1; 00677800
STOREORD(PT,LAB,L+M-1) 00677900
END END; 00678000
A:=A+B; K:=K+B; 00678100
COMMENT THE NEXT LINE CAUSE A SYSTEM CRASH AFTER THE EDIT; 00678200
IF NOSYNTAX=0 THEN PROCESS(XEQUTE); 00678300
END END; 00678400
MOVE(NEW,MAXBUFFSIZE+1,BUFFER) 00678500
END END; 00678600
PROCEDURE LISTLINE(PT,SQ,I); VALUE PT,SQ,I; INTEGER PT,SQ,I; 00678700
BEGIN 00678800
GT1:=CONTENTS(PT,I,GTA); 00678900
INDENT(GTA[0]); 00679000
GT1:=CONTENTS(SQ,GTA[1],BUFFER); 00679100
CHRCOUNT:=CHRCOUNT-1; 00679200
FORMROW(1,0,BUFFER,0,GT1); 00679300
END; 00679400
INTEGER PROCEDURE DISPLAY(A,B,PT,SQ); VALUE A,B,PT,SQ; 00679500
INTEGER PT,SQ; REAL A,B; 00679600
IF A LEQ B AND FUNCSIZE NEQ 0 THEN 00679700
BEGIN 00679800
ARRAY C[0:1]; 00679900
INTEGER I,J,K; 00680000
DEFINE CLEANBUFFER=BUFFERCLEAN#; 00680100
A:=LINENUMBER(A); B:=LINENUMBER(B); 00680200
C[0]:=A; 00680300
I:=SEARCHORD(PT,C,K,8); 00680400
I:=( IF I=2 THEN IF K LSS FUNCSIZE-1 THEN K:=K+1 ELSE 00680500
K ELSE K); 00680600
IF A NEQ B THEN 00680700
BEGIN 00680800
C[0]:=B; B:=SEARCHORD(PT,C,K,8); 00680900
END; 00681000
IF EDITMODE THEN % MAY HAVE ONLY ONE LINE TO EDIT 00681100
IF I=K THEN 00681200
IF A NEQ 0 THEN %NOT EDITING THE HEADER 00681300
EDITDRIVER(PT,SQ,I,K) 00681400
ELSE %EDITING THE FUNCTION HEADER, FIX LATER. 00681500
ERR:=31 00681600
ELSE %EDITING MORE THAN ONE LINE 00681700
BEGIN MODE:=EDITING; 00681800
IF A=0 THEN I:=I+1; 00681900
CLEANBUFFER(BUFFER,BUFFSIZE,ADDRESS); 00682000
MOVE(BUFFER,BUFFSIZE,OLDBUFFER); 00682100
LOWER:=I; UPPER:=K 00682200
END 00682300
ELSE %NOT EDITING, MUST BE A LIST 00682400
BEGIN 00682500
FORMWD(3,"1 "); 00682600
IF K=I THEN % LISTING A SINGLE LINE 00682700
BEGIN LISTLINE(PT,SQ,I); 00682800
FORMWD(3,"1 "); 00682900
END ELSE % LISTING A SET OF LINES 00683000
BEGIN MODE:=DISPLAYING; 00683100
LOWER:=I; UPPER:=K; 00683200
END; 00683300
END; 00683400
EOB:=1; 00683500
END ELSE DISPLAY:=20; 00683600
INTEGER PROCEDURE DELETE(A,B,PT,SQ); VALUE A,B; 00683700
INTEGER PT,SQ; REAL A,B; 00683800
IF A LEQ B AND FUNCSIZE NEQ 0 AND A NEQ 0 THEN 00683900
BEGIN 00684000
INTEGER I,J,K,L; 00684100
ARRAY C[0:1]; 00684200
A:=LINENUMBER(B); 00684300
B:=LINENUMBER(B); 00684400
C[0]:=A; 00684500
IF SEARCHORD(PT,C,K,8)=2 THEN K:=K+1; 00684600
C[0]:=B; 00684700
IF SEARCHORD(PT,C,I,8)=1 THEN I:=I-1; 00684800
IF K GTR I OR I GEQ FUNCSIZE THEN DELETE:=21 ELSE 00684900
BEGIN 00685000
FOR J:=K STEP 1 UNTIL I DO 00685100
BEGIN A:=CONTENTS(PT,J,C); 00685200
L:=ELIMOLDLINE(PT,SQ,C[1]); 00685300
FUNCSIZE:=FUNCSIZE+L; I:=I+L; K:=K+L; J:=J+L; 00685400
DELETE1(SQ,C[1]) 00685500
END; 00685600
FUNCSIZE:=FUNCSIZE-(I-K+1) 00685700
; EOB:=1; 00685800
DELETEN(PT,K,I); 00685900
IF FUNCSIZE=0 THEN 00686000
BEGIN 00686100
PT:=0; RELEASEUNIT(SQ); SQ:=0; 00686200
STOREPSR; 00686300
END; 00686400
END; 00686500
END ELSE DELETE:=22; 00686600
INTEGER PROCEDURE ELIMOLDLINE(PT,SQ,L); VALUE PT,SQ,L; 00686700
INTEGER PT,SQ,L; 00686800
BEGIN INTEGER K,J; 00686900
REAL AD; 00687000
ARRAY T[0:MAXBUFFSIZE],LAB[0:1]; 00687100
AD:=ADDRESS; 00687200
MOVEWDS(BUFFER,MAXBUFFSIZE+1,T); 00687300
INITBUFF(BUFFER,BUFFSIZE); 00687400
K:=CONTENTS(SQ,L,BUFFER); 00687500
RESCANLINE; 00687600
WHILE LABELSCAN(LAB,0) DO 00687700
IF SEARCHORD(PT,LAB,K,8)=0 THEN 00687800
BEGIN DELETE1(PT,K); J:=J-1 END; 00687900
ADDRESS:=AD; 00688000
MOVEWDS(T,MAXBUFFSIZE+1,BUFFER); 00688100
ELIMOLDLINE:=J 00688200
END; 00688300
INTEGER PROCEDURE STOREAWAY(PT,SQ,B,SEQ); VALUE SEQ; 00688400
INTEGER PT,SQ; REAL SEQ; ARRAY B[0]; 00688500
BEGIN DEFINE BUFFER=B#; 00688600
ARRAY C,LAB[0:1]; 00688700
INTEGER I,J,K,L; 00688800
BOOLEAN TOG; 00688900
SEQ:=LINENUMBER(SEQ); 00689000
C[0]:=SEQ; 00689100
IF TOG:=(PT=0 OR FUNCSIZE=0) THEN 00689200
BEGIN SEQUENTIAL(SQ:=NEXTUNIT); I:=0 00689300
END ELSE 00689400
IF J:=SEARCHORD(PT,C,I,8)=0 THEN 00689500
BEGIN 00689600
K:=ELIMOLDLINE(PT,SQ,C[1]); 00689700
I:=I+K; FUNCSIZE:=FUNCSIZE+K; 00689800
DELETE1(PT,I); 00689900
FUNCSIZE:=FUNCSIZE-1; 00690000
DELETE1(SQ,C[1]); 00690100
END ELSE 00690200
I:=I+J-1; 00690300
RESCANLINE; 00690400
DELTOG:=DELPRESENT(ADDRESS); 00690500
K:=STORESEQ(SQ,BUFFER,LENGTH(BUFFER,TRUE)); 00690600
LAB[1]:=SEQ; L:=0; J:=1; 00690700
IF TOG THEN PT:=NEXTUNIT; 00690800
WHILE LABELSCAN(C,0) DO 00690900
BEGIN 00691000
MOVEWDS(C,1,LAB); 00691100
IF (IF FUNCSIZE=0 THEN TRUE ELSE L:= 00691200
SEARCHORD(PT,C,J,8)NEQ 0 ) THEN 00691300
BEGIN I:=I+1; FUNCSIZE:=FUNCSIZE+1; 00691400
STOREORD(PT,LAB,L+J-1); 00691500
END; 00691600
END; 00691700
C[1]:=K; 00691800
C[0]:=SEQ; 00691900
FUNCSIZE:=FUNCSIZE+1; 00692000
STOREORD(PT,C,I); 00692100
IF TOG THEN STOREPSR; 00692200
EOB:=1; 00692300
END; 00692400
BOOLEAN PROCEDURE BOUND(PT); VALUE PT; INTEGER PT; 00692500
IF NOT(BOUND:=NUMERIC) THEN 00692600
IF IDENT AND FUNCSIZE GTR 0 THEN 00692700
BEGIN ARRAY L[0:1]; INTEGER K; 00692800
REAL T,U; 00692900
REAL STREAM PROCEDURE CON(A); 00693000
VALUE A; 00693100
BEGIN SI:=LOC A; DI:=LOC CON; DS:=8OCT 00693200
END; 00693300
TRANSFER(ACCUM,2,L,1,7); 00693400
IF BOUND:=SEARCHORD(PT,L,K,8)=0 THEN 00693500
BEGIN T:=ADDRESS; 00693600
U:=CON(MAX(L[1],0))/10000; %ARGS AND RESULT ARE NEG 00693700
IF SCAN AND PLUS OR MINUS THEN 00693800
BEGIN K:=(IF PLUS THEN 1 ELSE -1); 00693900
IF SCAN AND NUMERIC THEN 00694000
ACCUM[0]:=MAX(U+K|ACCUM[0],0) ELSE 00694100
BEGIN ACCUM[0]:=U; 00694200
ADDRESS:=T; 00694300
END; 00694400
END ELSE BEGIN ACCUM[0]:=U; ADDRESS:=T; 00694500
END; 00694600
EOB:=0; 00694700
END 00694800
END; 00694900
00695000
00695100
PROCEDURE FINISHUP; 00695200
BEGIN COMMENT GET HIM BACK TO CALCULATOR MODE; 00695300
IF FUNCPOINTER=0 THEN % HE DELETED EVERY THING 00695400
BEGIN TRANSFER(PSR,FSTART|8,GTA,0,8); 00695500
IF SEARCHORD(VARIABLES,GTA,GT1,7)=0 THEN 00695600
BEGIN DELETE1(VARIABLES,GT1); 00695700
IF VARSIZE:=VARSIZE-1=0 THEN VARIABLES:=0; 00695800
END ELSE SPOUT(9198260); 00695900
END; 00696000
DELTOG:=CURRENTMODE:=CURLINE:=INCREMENT:=0; 00696100
STOREPSR; 00696200
END; 00696300
00696400
LABEL SHORTCUT; 00696500
REAL L,U,TADD; 00696600
STREAM PROCEDURE CLEANBUFFER(BUFFER,BUFFSIZE,ADDR); 00696700
VALUE BUFFSIZE,ADDR; 00696800
BEGIN LABEL L; LOCAL T,U,TSI,TDI; 00696900
SI:=ADDR; SI:=SI-1; L: 00697000
IF SC NEQ "]" THEN 00697100
BEGIN SI:=SI-1; GO TO L END; 00697200
SI:=SI+1; DI:=LOC T; SKIP 2 DB; DS:=2SET; 00697300
DI:=BUFFER; TDI:=DI; DI:=LOC T; TSI:=SI; 00697400
BUFFSIZE(8(IF TOGGLE THEN DS:=LIT" " ELSE 00697500
IF SC=DC THEN 00697600
BEGIN SI:=LOC U; DI:=TDI; DS:=LIT" " 00697700
END ELSE 00697800
BEGIN TSI:=SI; SI:=SI-1; DI:=LOC U; DS:=CHR; 00697900
DI:=TDI; SI:=LOC U; DS:=CHR; TDI:=DI; DI:=LOC T; 00698000
SI:=TSI; 00698100
END)) 00698200
END; 00698300
PROCEDURE BUFFERCLEAN(BUFFER,BUFFSIZE,ADDR); VALUE BUFFSIZE, 00698400
ADDR; REAL ADDR; INTEGER BUFFSIZE; ARRAY BUFFER[0]; 00698500
CLEANBUFFER(BUFFER,BUFFSIZE,ADDR); 00698600
COMMENT DETERMINE WHETHER OR NOT WE CAME FROM CALCULATOR MODE; 00698700
ERR:=0; 00698800
IF BOOLEAN(SUSPENSION) THEN GO TO ENDHANDLER; 00698900
BEGIN DEFINE STARTSEGMENT=#; %/////////////////////////////// 00699000
IF GT1:=CURRENTMODE=CALCMODE THEN % TAKE CARE OF HEADER. 00699100
BEGIN ARRAY A[0:MAXHEADERARGS]; 00699200
LABEL HEADERSTORE,FORGETITFELLA; 00699300
IF FUNCTIONHEADER(A,TADD) THEN %HEADER OK 00699400
IF VARIABLES NEQ 0 THEN % MAY BE A RE-DEFINITION 00699500
BEGIN COMMENT GET THE FUNCTION NAME; 00699600
TRANSFER(A,1,GTA,0,7); 00699700
IF GT2:=SEARCHORD(VARIABLES,GTA,GT3,7)=0 THEN 00699800
COMMENT RE-DEFINING A FUNCTION. MAKE SURE NULL ; 00699900
IF GETFIELD(GTA,7,1)=FUNCTION AND 00700000
(A[1]+A[2]+A[3])=0 THEN %NULL HEADER--OK 00700100
%--------------------SET UP FOR CONTINUATION OF DEFINITION------ 00700200
BEGIN 00700300
FUNCPOINTER:=GETFIELD(GTA,FPTF,FFL); 00700400
FUNCSEQ:=GETFIELD(GTA,FSQF,FFL); 00700500
GT3:=CURLINE:=TOPLINE(FPT); 00700600
CHECKSEQ(CURLINE,GT3,INC); %SET THE INCREMENT 00700700
COMMENT THE CURRENT LINE IS SET TO THE LAST LINE OF THE 00700800
FUNCTION; 00700900
FUNCSIZE:=SIZE(FPT); 00701000
CURLINE:=CURLINE+INC; 00701100
DELTOG:=DELPRESENT(ADDRESS); 00701200
END ELSE 00701300
%------------------REDEFINING THE HEADER OF A DEFINED FUNCTION---- 00701400
GO TO FORGETITFELLA 00701500
ELSE 00701600
%--------------------NAME NOT FOUND IN DIRECTORY, SET UP 00701700
HEADERSTORE: 00701800
BEGIN COMMENT GET THE HEADER TO INSERT AT LINE 0; 00701900
ARRAY OLDBUFFER[0:MAXBUFFSIZE]; 00702000
INTEGER L,U,F,K,J; 00702100
INTEGER A1,A2; 00702200
COMMENT FUNCTIONHEADER RETURN AN ARRAY WITH THE 00702300
FOLLOWING VALUES: 00702400
A[0] = FUNCTION NAME , I.E., 0AAAAAAA 00702500
A[1] = 0 IF NO RESULT, 1 IF A RESULT IS RETURNED BY THE 00702600
FUNCTION. 00702700
A[2] = NUMBER OF ARGUMENTS TO THE FUNCTION. 00702800
A[3] = NUMBER OF LOCALS + RESULT +ARGUMENTS. 00702900
A[4]....A[N] ARE ALL OF THE LOCALS, RESULT, AND ARGUMENTS. 00703000
THE RESULT IS FIRST, THEN THE SECOND ARGUMENT, THEN 00703100
THE FIRST ARGUMENT, FOLLOWED BY THE LOCALS. ALL 00703200
ARE OF THE FORM 0XXXXXXX; 00703300
U:=(A1:=A[1])+(A2:=A[2])+3; 00703400
FOR L:=4 STEP 1 UNTIL U DO %LOOK FOR DUPLICATES AMONG 00703500
FOR K:=L+1 STEP 1 UNTIL U DO %THE RESULT/ARGUMENT SET 00703600
IF A[L]=A[K] THEN GO TO FORGETITFELLA; 00703700
SEQUENTIAL(FUNCSEQ:=NEXTUNIT); 00703800
SETFIELD(GTA,8,8,STORESEQ(FUNCSEQ,OLDBUFFER, 00703900
HEADER(TADD.[1:23],TADD.[24:24],OLDBUFFER))); 00704000
SETFIELD(GTA,0,8,0); 00704100
STOREORD(F:=FUNCPOINTER:=NEXTUNIT,GTA,0); 00704200
SETFIELD(GTA,0,8,0); SETFIELD(GTA,8,8,0); 00704300
FOR L:=4 STEP 1 UNTIL U DO 00704400
BEGIN GTA[0]:=A[L]; IF A1 GTR 0 THEN 00704500
BEGIN A1:=0; GTA[1]:=-1; %"RESULT" SET TO -1 00704600
STOREORD(F,GTA,0); 00704700
END ELSE %LOOKING AT THE ARGUMENTS 00704800
BEGIN K:=SEARCHORD(F,GTA,J,8); 00704900
GTA[1]:=A2-4; A2:=A2-1; GTA[0]:=A[L]; 00705000
STOREORD(F,GTA,J+K-1); 00705100
END END; 00705200
FUNCSIZE:=U:=U-2; U:=A[3]-U+L; 00705300
FOR L:=L STEP 1 UNTIL U DO %GET LOCALS INTO THE LABEL TABLE 00705400
BEGIN GTA[0]:=A[L]; 00705500
IF K:=SEARCHORD(F,GTA,J,8) NEQ 0 THEN %NOT YET IN TABLE. 00705600
BEGIN GTA[0]:=A[L]; GTA[1]:=0; 00705700
STOREORD(F,GTA,J+K-1); 00705800
FUNCSIZE:=FUNCSIZE+1 00705900
END; 00706000
END; 00706100
GTA[1]:=0&ENTIER(A[1])[CRETURN]&ENTIER(A[2])[CNUMBERARGS]; 00706200
CURLINE:=INCREMENT:=1; 00706300
DELTOG:=0; 00706400
COMMENT GET THE "TYPE" OF THE FUNCTION LATER WHEN THERE 00706500
IS A PLACE FOR IT. THE TYPE IS EITHER 1 (FUNCTION CALL), OR 00706600
0 (SUBROUTINE CALL); 00706700
END; 00706800
%-------------------------------------------------------- 00706900
END ELSE % VARAIBLES=0, MAKE UP A DIRECTORY 00707000
BEGIN GT3:=0; GT2:=1; GO TO HEADERSTORE 00707100
END 00707200
ELSE % HEADER SYNTAX IS BAD 00707300
GO TO ENDHANDLER; 00707400
COMMENT WE MAKE IT TO HERE IF ALL IS WELL ABOVE; 00707500
IF GT2 NEQ 0 THEN %NAME NOT FOUND IN DIRECTORY; 00707600
BEGIN 00707700
TRANSFER(A,1,GTA,0,7); %GET FUNCTION NAME 00707800
SETFIELD(GTA,7,1,FUNCTION); 00707900
SETFIELD(GTA,FPTF,FFL,FUNCPOINTER); 00708000
SETFIELD(GTA,FSQF,FFL,FUNCSEQ); 00708100
IF VARIABLES=0 THEN 00708200
VARIABLES:=NEXTUNIT; 00708300
STOREORD(VARIABLES,GTA,GT3+GT2-1); 00708400
VARSIZE:=VARSIZE+1; 00708500
END; 00708600
CURRENTMODE:=FUNCMODE; 00708700
TRANSFER(GTA,0,PSR,FSTART|8,8); 00708800
STOREPSR; 00708900
IF SCAN THEN GO TO SHORTCUT; 00709000
IF FALSE THEN 00709100
FORGETITFELLA: ERRORMESS(ERR:=LABELERROR,TADD.[1:23],0); 00709200
END ELSE % WE ARE IN FUNCTION DEFINITION MODE 00709300
IF GT1:=MODE NEQ 0 THEN % A SPECIAL FUNCTION SUCH AS DISPLAY OR EDIT00709400
BEGIN L:=LOWER; 00709500
IF GT1=DISPLAYING THEN 00709600
LISTLINE(FPT,FSQ,L) ELSE 00709700
IF GT1=EDITING THEN 00709800
BEGIN INITBUFF(BUFFER,BUFFSIZE); 00709900
MOVE(OLDBUFFER,BUFFSIZE,BUFFER); 00710000
EDITMODE:=TRUE; ADDRESS:=ABSOLUTEADDRESS; 00710100
EDITDRIVER(FPT,FSQ,L,L) 00710200
;IF NOT EDITMODE THEN 00710300
BEGIN MODE:=0; ERR:=30 00710400
END; 00710500
END ELSE 00710600
IF GT1=RESEQUENCING THEN 00710700
IF GT1:=L LEQ UPPER THEN 00710800
BEGIN GT2:=CONTENTS(FPT,L,GTA); 00710900
GT3:=GTA[0]:=LINENUMBER(CURLINE); 00711000
DELETE1(FPT,L); 00711100
STOREORD(FPT,GTA,L); 00711200
CURLINE:=CURLINE+INCREMENT; 00711300
GT2:=CONTENTS(FSQ,GTA[1],BUFFER); RESCANLINE; 00711400
WHILE (IF ERR NEQ 0 THEN FALSE ELSE 00711500
LABELSCAN(GTA,0)) DO 00711600
IF GT1:=SEARCHORD(FPT,GTA,GT2,8)=0 THEN 00711700
BEGIN GTA[1]:=GT3; DELETE1(FPT,GT2); 00711800
STOREORD(FPT,GTA,GT2) 00711900
END ELSE ERR:=16 00712000
END 00712100
ELSE MODE:=0; 00712200
LOWER:=L+1; 00712300
IF LOWER GTR UPPER THEN 00712400
BEGIN IF MODE=DISPLAYING THEN 00712500
FORMWD(3,"1 "); 00712600
MODE:=0; 00712700
END; 00712800
GO TO ENDHANDLER 00712900
END; 00713000
END ; % OF BLOCK STARTED ON LINE 9225115 ////////////////// 00713100
00713200
00713300
00713400
IF ERR=0 AND EOB=0 THEN 00713500
00713600
SHORTCUT: BEGIN LABEL RGTBRACK,DELOPTION; %////////////////////////// 00713700
IF DELV THEN FINISHUP ELSE 00713800
IF LFTBRACKET THEN 00713900
BEGIN 00714000
IF SCAN THEN 00714100
IF BOUND(FPT) THEN 00714200
BEGIN L:=ACCUM[0]; 00714300
IF SCAN THEN 00714400
IF QUADV OR EDITMODE:=(QUOTEQUAD) THEN 00714500
IF SCAN THEN 00714600
IF BOUND(FPT) THEN 00714700
BEGIN U:=ACCUM[0]; 00714800
RGTBRACK: 00714900
IF SCAN AND RGTBRACKET THEN 00715000
IF(IF EDITMODE THEN FALSE ELSE SCAN) THEN 00715100
IF DELV THEN 00715200
BEGIN ERR:=DISPLAY(L,U,FPT,FSQ); 00715300
DELTOG:=1; 00715400
END 00715500
ELSE ERR:=1 00715600
ELSE ERR:=DISPLAY(L,U,FPT,FSQ) 00715700
ELSE ERR:=2 00715800
END 00715900
ELSE 00716000
IF RGTBRACKET THEN 00716100
IF(IF EDITMODE THEN FALSE ELSE SCAN) THEN 00716200
IF DELV THEN 00716300
BEGIN ERR:=DISPLAY(L,L,FPT,FSQ); 00716400
DELTOG:=1; 00716500
END 00716600
ELSE ERR:=3 00716700
ELSE ERR:=DISPLAY(L,L,FPT,FSQ) 00716800
ELSE ERR:=4 00716900
ELSE ERR:=5 00717000
ELSE 00717100
IF RGTBRACKET THEN 00717200
BEGIN TADD:=ADDRESS; 00717300
IF SCAN THEN 00717400
IF IDENT AND ACCUM[0]="6DELETE" THEN 00717500
IF SCAN THEN 00717600
IF LFTBRACKET THEN 00717700
DELOPTION: 00717800
IF SCAN AND BOUND(FPT) THEN 00717900
BEGIN U:=ACCUM[0]; 00718000
IF SCAN AND RGTBRACKET THEN 00718100
IF SCAN THEN 00718200
IF DELV THEN 00718300
BEGIN ERR:=DELETE(L,U,FPT,FSQ); 00718400
FINISHUP 00718500
END 00718600
ELSE ERR:=6 00718700
ELSE ERR:=DELETE(L,U,FPT,FSQ) 00718800
ELSE ERR:=7 00718900
END 00719000
ELSE ERR:=8 00719100
ELSE 00719200
IF DELV THEN 00719300
BEGIN ERR:=DELETE(L,L,FPT,FSQ); 00719400
FINISHUP 00719500
END 00719600
ELSE ERR:=9 00719700
ELSE ERR:=DELETE(L,L,FPT,FSQ) 00719800
ELSE 00719900
IF LFTBRACKET THEN GO TO DELOPTION ELSE 00720000
BEGIN CHECKSEQ(SEQ,L,INC); 00720100
CLEANBUFFER(BUFFER,BUFFSIZE,TADD); 00720200
ADDRESS:=ABSADDR(BUFFER); ITEMCOUNT:=0; 00720300
IF SCAN THEN GO TO SHORTCUT 00720400
END 00720500
ELSE ERR:=DELETE(L,L,FPT,FSQ) 00720600
END 00720700
ELSE ERR:=10 00720800
ELSE ERR:=11 00720900
END ELSE 00721000
IF QUADV OR EDITMODE:=(QUOTEQUAD) THEN 00721100
BEGIN L:=0; U:=9999.9999; GO TO RGTBRACK 00721200
END ELSE 00721300
IF IOTA THEN 00721400
IF SCAN AND RGTBRACKET AND FPT NEQ 0 THEN 00721500
BEGIN IF SCAN THEN 00721600
IF DELV THEN DELTOG:=1 ELSE ERR:=15; 00721700
IF ERR = 0 THEN 00721800
BEGIN MODE:=RESEQUENCING; CURLINE:=INCREMENT:=1; 00721900
SETFIELD(GTA,0,8,0); 00722000
GT1:=SEARCHORD(FPT,GTA,GT2,8); 00722100
LOWER:=GT2+1; UPPER:=FUNCSIZE-1; 00722200
END 00722300
END 00722400
ELSE ERR:=14 00722500
ELSE ERR:=12 00722600
ELSE ERR:=13 00722700
END 00722800
ELSE 00722900
IF CURLINE=0 THEN %CHANGING HEADER 00723000
ERR:=26 ELSE 00723100
IF ERR:=OLDLABCONFLICT(FPT,LINENUMBER(SEQ))=0 THEN 00723200
BEGIN 00723300
IF NOSYNTAX=0 THEN PROCESS(XEQUTE); 00723400
IF ERR:=STOREAWAY(FPT,FSQ,BUFFER,SEQ)=0 THEN SEQ:=SEQ+INC; 00723500
END; 00723600
IF ERR NEQ 0 THEN 00723700
BEGIN FORMWD(2,"5ERROR "); 00723800
NUMBERCON(ERR,ACCUM); ERR:=0; 00723900
EOB:=1; 00724000
FORMROW(1,1,ACCUM,2,ACCUM[0].[1:11]); 00724100
END; 00724200
END; %OF BLOCK STARTED ON LINE 9238000 ////////////////////// 00724300
ENDHANDLER: 00724400
IF BOOLEAN(SUSPENSION) THEN BEGIN 00724500
FILL ACCUM[*] WITH "ABORT SU", "SP. FNS."; 00724600
FORMROW(3,0,ACCUM,0,16); INDENT(0); TERPRINT; 00724700
END ELSE 00724800
IF MODE=0 THEN 00724900
BEGIN 00725000
IF BOOLEAN(DELTOG) THEN FINISHUP; 00725100
INDENT(-CURLINE); TERPRINT; 00725200
END; 00725300
00725400
END; 00725500
EXPOVR:=FAULTL; INTOVR:=FAULTL; INDEXF:=FAULTL; 00725600
FLAG:=FAULTL; ZERO:=FAULTL; 00725700
INITIALIZETABLE; 00725800
TRYAGAIN: 00725900
IF FALSE THEN %ENTERS WITH A FAULT. 00726000
FAULTL: 00726100
BEGIN SPOUT(09334300); %SEND MESSAGE TO SPO 00726200
00726300
BEGIN CSTATION.APLOGGED:=0; CSTATION.APLHEADING:=0 00726400
END 00726500
END; 00726600
APLMONITOR; 00726700
ENDOFJOB: 00726800
00726900
FINIS: 00727000
WRAPUP; 00727100
00727200
END. 00727300