1
0
mirror of https://github.com/retro-software/B5500-software.git synced 2026-03-02 17:44:40 +00:00
Files
Paul Kimpel 2c72f7fd1d Commit CUBE Library version 13 of February 1972.
1. Commit library tape images, directories, and extracted text files.
2. Commit additional utilities under Unisys-Emode-Tools.
2018-05-27 11:24:23 -07:00

661 lines
52 KiB
Plaintext

BEGIN 00000100
COMMENT PROGRAM INDEXER, CUBE LIBRARY NUMBER IS Q000001. 00000200
THIS VERSION DATED 6/1/67, 00000300
A STACK ADJUSTMENT CARD SET EQUAL TO 1000 MUST BE USED 00000400
AT COMPILE TIME; 00000500
COMMENT 00000600
I N D E X E R 00000700
00000800
A PROGRAM TO PROVIDE AN INDEX OF THE IDENTIFIERS 00000900
USED IN AN ALGOL PROGRAM 00001000
00001100
WRITTEN BY: ALAN BATSON 00001200
C-S CENTER 00001300
UNIVERSITY OF VIRGINIA 00001400
00001500
DISCLAIMER: THE AUTHORS OF THIS PROGRAM, THE CUBE ORGANIZATION, 00001600
AND THE BURROUGHS CORPORATION, BELIEVE THIS PROGRAM MATERIAL 00001700
TO BE CORRECT, HOWEVER, THEY BEAR NO RESPONSIBILITY, 00001800
FINANCIAL OR OTHERWISE, FOR ERROR RESULTING FROM ITS USE, NOR 00001900
ACCEPT ANY RESPONSIBILITY FOR ITS MAINTENANCE. 00002000
THIS PROGRAM PRODUCES AN INDEX (DICTIONARY) OF ALL THE IDENTIFIERS USED 00002100
IN AN ALGOL PROGRAM. THE INDEX IS IN ALPHABETICAL ORDER (ON THE FIRST 00002200
6 CHARACTERS OF EACH IDENTIFIER), AND NEARLY ALL OF THE RESERVED WORDS 00002300
ARE OMITTED. 00002400
AFTER EACH IDENTIFIER IS PRINTED THE SEQUENCE NUMBER (COLUMNS 73-8000002500
) OF THE CARDS ON WHICH THAT IDENTIFIER OCCURS. IF AN IDENTIFIER OCCURS00002600
TWICE ON THE SAME CARD, THAT CARD-S SEQUENCE NUMBER WILL APPEAR TWICE. 00002700
THE SEQUENCE NUMBERS ARE PRINTED OUT IN THE ORDER IN WHICH THEY OCCUR 00002800
IN THE DECK ITSELF. 00002900
INPUT: 00003000
THE PROGRAM MAY BE EITHER ON CARDS OR ON AN ALGOL SYMBOLIC TAPE 00003100
LABELLED "0CRDIMG", WHICH IS BLOCKED 5 CARDS PER PHYSICAL RECORD. THE 00003200
CARD READER FILE IS CALLED "CR", AND THE FIRST CARD IN THIS FILE MUST 00003300
BE A DOLLAR CARD OF THE TYPE 00003400
$ CARD OR $ TAPE 00003500
OF COURSE, IF THE DATA IS ON TAPE, THIS IS THE ONLY DATA CARD. 00003600
TIMING AND LIMITATIONS: 00003700
AS AN EXAMPLE, A 1000 CARD PROGRAM , COMING FROM CARDS, TOOK 200 00003800
SECONDS OF PROCESSOR TIME AND 104 SECONDS OF I/O TIME. THE TOTAL TIME 00003900
IS NOT GREATLY DEPENDENT ON THE INPUT MEDIUM. 00004000
THE PROGRAM WILL ONLY HANDLE UP TO 935 IDENTIFIERS. AFTER THIS 00004100
POINT HAS BEEN REACHED IN A PROGRAM, THE EXCESS IDENTIFIERS WHICH WILL 00004200
NOT BE INDEXED ARE PRINTED OUT EACH TIME THEY OCCUR, TOGETHER WITH THE 00004300
CARD SEQUENCE NUMBER. IF THERE ARE A VERY LARGE NUMBER OF VERY LONG 00004400
IDENTIFIERS, THEN SOME OF THESE MAY BE KEPT TO ONLY 6 CHARACTERS, AND 00004500
ON THE PRINTOUT THE MISSING CHARACTERS ARE INDICATED BY /-S. 00004600
THE PROGRAM HAS SUCCESSFULLY INDEXED BOTH THE ALGOL COMPILER AND 00004700
THE FORTRAN-TO-ALGOL TRANSLATOR. 00004800
NOTE: THIS PROGRAM NEEDS A COMPILE-TIME STACK ADJUSTMENT. 1000 WORDS 00004900
WORK FINE. 00005000
00005100
00005200
; 00005300
FILE CR(2,10); FILE LP 4 (2,15); COMMENT CARDS AND PRINTER; 00005400
INTEGER COUNTER; COMMENT THIS COUNTS THE NUMBER 00005500
OF RECORDS WRITTEN ONTO MT1; 00005600
FORMAT XXX(X15, 12("*",X6)); 00005700
INTEGER SIZE; COMMENT NUMBER OF CLOT ROWS-1; 00005800
INTEGER STCOUNT; COMMENT THE NUMBER OF NAMES; 00005900
FILE MT11(1,500); 00006000
LABEL FINALLABEL; 00006100
STREAM PROCEDURE MOVE(FROM,UNTO,N); 00006200
VALUE N; 00006300
BEGIN 00006400
SI~FROM; DI~UNTO; DS~ N WDS; 00006500
END OF MOVE; 00006600
FORMAT ERRORFORMAT1(X10,"YOU HAVE MORE THAN 935 IDENTIFIERS. SORRY."/ 00006700
"HERE ARE THE NON-INDEXED IDENTIFIERS"/); 00006800
FORMAT ERRORFORMAT2(X10,"TOO MANY OCCURRENCES OF A NAME. SORRY"); 00006900
FORMAT ERRORFORMAT3(X10,"INCORRECT DOLLAR CARD"); 00007000
ARRAY SYMBOL0,SYMBOL1[0:1022]; COMMENT THE SYMBOL TABLE; 00007100
DEFINE NAME=SYMBOL0[ALFA]#, IDEN= SYMBOL1[ALFA]#; 00007200
ARRAY CONTINUE[0:2,0:1022]; COMMENT FOR NAME EXTENSIONS; 00007300
INTEGER C1,C2; COMMENT THESE POINT TO CONTINUE;00007400
BOOLEAN T; COMMENT TRUE IF CONTINUE UNFULL;00007500
BOOLEAN OVER; COMMENT ON ONCE SYMBOL HAS 00007600
BEEN EXCEEDED; 00007700
ARRAY LINE[0:14]; COMMENT THE PRINTER ARRAY; 00007800
STREAM PROCEDURE BLANKLINE(LINE); 00007900
BEGIN 00008000
DI~LINE;15(DS~8 LIT" "); 00008100
END OF BLANKLINE; 00008200
STREAM PROCEDURE GET(FROM,UNTO,POS);VALUE POS; 00008300
BEGIN 00008400
SI~FROM;SI~SI+2; 00008500
DI~UNTO;DI~DI+POS; 00008600
6(IF SC="+" THEN JUMP OUT ELSE DS~1 CHR); 00008700
END; 00008800
INTEGER I,J,K,INDEX; 00008900
ARRAY BUFF[0:499]; COMMENT THE TAPE BUFFER; 00009000
SIZE~49; 00009100
00009200
BEGIN COMMENT THE INNER BLOCK 00009300
FOR PASS ONE; 00009400
INTEGER N,POSI,DELT,M,FRONT,BACK,CHRCOUNT,J,L,NEXT,INP; 00009500
BOOLEAN T1, DELTA; 00009600
ARRAY CARDNO[0:0]; 00009700
ARRAY INFO[0:9]; COMMENT THE CARD BUFFER; 00009800
LABEL EOP1, TOPOFHEAP, COMMENTDELETE,L1,L2,L3,L4,START; 00009900
ARRAY TRANSLATE[0:63]; COMMENT THE CODE FOR A CHAR.; 00010000
COMMENT I POINTS TO THE NEXT PLACE TO LOOK, 00010100
FRONT POINTS TO THE FIRST CHARACTER OF A FOUND NAME, 00010200
INDEX POINTS TO THE NEXT AVAILABLE SPACE IN BUFF; 00010300
FILE IN SMOG "0CRDIMG"(2,56,10); COMMENT THE SYMBOLIC TAPE; 00010400
SWITCH FILE INPUT~CR,SMOG; COMMENT CARD OR TAPE; 00010500
BOOLEAN RES; 00010600
ARRAY ARY[1:26]; COMMENT COUNTS NO. OF AS,BS ETC; 00010700
BOOLEAN STREAM PROCEDURE FMT(I,N,INFO); 00010800
VALUE I,N; 00010900
BEGIN LOCAL T; 00011000
SI~INFO;N(SI~SI+63;SI~SI+1); SI~SI+I; TALLY~0; 00011100
IF SC="F" THEN BEGIN DI~LOC T; DS~ 7 LIT "FORMAT "; 00011200
DI~DI-7; IF 7 SC=DC THEN 00011300
TALLY~ 1 END; 00011400
FMT~ TALLY 00011500
END OF FMT; 00011600
00011700
BOOLEAN STREAM PROCEDURE COM(I,N,INFO); 00011800
VALUE I,N; 00011900
BEGIN LOCAL T; 00012000
SI~INFO;N(SI~SI+63;SI~SI+1); SI~SI+I; TALLY~0; 00012100
IF SC="C" THEN BEGIN DI~LOC T; DS~ 8 LIT "COMMENT "; 00012200
DI~DI-8; IF 8 SC=DC THEN 00012300
TALLY~1 END; 00012400
COM~TALLY 00012500
END OF COM; 00012600
BOOLEAN STREAM PROCEDURE NOTDOLLAR(INFO); 00012700
BEGIN SI~INFO; TALLY ~ 1; IF SC="$" THEN TALLY~0; 00012800
NOTDOLLAR~TALLY; 00012900
END OF NOTDOLLAR; 00013000
BOOLEAN STREAM PROCEDURE O8(I,N,INFO); VALUE I,N; 00013100
BEGIN LOCAL T; 00013200
SI~INFO; N(SI~SI+63; SI~SI+1); SI~SI+I; TALLY~0; 00013300
IF SC ="O" THEN BEGIN DI~LOC T; DS~ 3 LIT "OCT"; 00013400
DI~DI-3; IF 3 SC=DC THEN 00013500
BEGIN IF SC{"9" THEN TALLY~1 END; 00013600
END; 00013700
O8~TALLY 00013800
END; 00013900
PROCEDURE READACARD; 00014000
BEGIN 00014100
STREAM PROCEDURE CARDID(C73, CARDNO); 00014200
BEGIN 00014300
SI~C73; DI~CARDNO; DS~ 8 CHR; 00014400
DI~C73; DS~ 1 LIT "%"; 00014500
END; 00014600
READ(INPUT[INP],10,INFO[*])[EOP1]; 00014700
CARDID(INFO[9], CARDNO); 00014800
I~0; 00014900
END; 00015000
PROCEDURE LOOK; COMMENT DOES NOT LOOK FOR PERCENTS; 00015100
BEGIN 00015200
ALPHA STREAM PROCEDURE LOK(I,N,INFO); 00015300
VALUE I,N; 00015400
BEGIN 00015500
SI~INFO;N(SI~SI+63;SI~SI+1); SI~SI+I; 00015600
DI~LOC LOK; DI~DI+7; DS~ 1 CHR; 00015700
END; 00015800
LABEL TOP; 00015900
TOP: IF I=72 THEN READACARD; 00016000
NEXT~LOK(I,I DIV 64, INFO); 00016100
I~I+1; 00016200
END; 00016300
PROCEDURE FETCHANAME; 00016400
BEGIN 00016500
STREAM PROCEDURE FETCHITBOY(I,N,POSI,DELT ,INFO,MARK); 00016600
VALUE I,N; 00016700
BEGIN LOCAL TEMP,TEMP1; 00016800
LABEL DOWN,ENDOFCARD,GOTIT,HORROR,NOGO,STRING,FIN; 00016900
SI~INFO;N(SI~SI+63;SI~SI+1);SI~SI+I; TALLY~0; 00017000
63( IF SC=ALPHA THEN JUMP OUT 1 TO DOWN 00017100
ELSE 00017200
IF SC="%" THEN JUMP OUT 1 TO ENDOFCARD; 00017300
IF SC=""" THEN JUMP OUT 1 TO STRING; 00017400
SI~SI+1; TALLY~TALLY +1); 00017500
DI~MARK; DS~8 LIT"00000000";GO TO NOGO; 00017600
COMMENT FOUND NOTHING; 00017700
DOWN:TEMP1~TALLY; 00017800
COMMENT TEMP1 NOW CONTAINS THE NUMBER OF CHARACTERS 00017900
PAST I WHERE STARTS THE ALPHA STRING; 00018000
SI~SI+1; TALLY ~1; 00018100
62(IF SC=ALPHA THEN BEGIN 00018200
SI~SI+1; TALLY~TALLY +1; 00018300
END ELSE 00018400
BEGIN 00018500
IF SC= "%" THEN JUMP OUT 1 TO 00018600
HORROR; JUMP OUT 1 TO GOTIT; 00018700
END ); 00018800
COMMENT NOTE THAT IF AN IDENTIFIER HAS MORE THAN 00018900
63 CHARACTERS WE DROP OUT AND SPLIT THE 00019000
IDENTIFIER IN TWO(OR MORE); 00019100
GOTIT: DI~MARK; DS~ 8 LIT "00000001"; 00019200
TEMP~ TALLY;SI~ LOC TEMP; DI~ DELT ; DS~ 1 WDS; 00019300
COMMENT DELT NOW CONTAINS THE NUMBER OF CHARACTERS 00019400
IN THE ALPHA STRING; 00019500
GO TO NOGO; 00019600
ENDOFCARD: DI~MARK; DS~ 8 LIT "00000002"; GO TO NOGO; 00019700
HORROR: GO TO GOTIT; COMMENT THIS USELESS *$*$*$*$ 00019800
IS FOLLOWED WHEN NAMES 00019900
ARE SPLIT ACROSS CARDS. WE 00020000
TREAT THIS AS TWO NAMES; 00020100
STRING: DI~MARK; DS~ 8 LIT "00000004"; 00020200
TEMP~TALLY; SI~LOC TEMP; DI~POSI; DS~ 1 WDS; GO TO FIN; 00020300
NOGO: 00020400
SI~LOC TEMP1; DI~POSI; DS~ 1 WDS; 00020500
FIN: END OF FETCHITBOY; 00020600
COMMENT NOTE THAT FETCHITBOY COMES OUT WITH 4 VALUES POSSIBLE 00020700
FOR MARK. 1 IS O.K. BUT THE OTHER(EVEN) ONES MEAN THINK; 00020800
LABEL TOP, EXIT, STRINGCUTTER, WOP; 00020900
TOP: FETCHITBOY(I,I DIV 64, POSI, DELT, INFO, M); 00021000
IF BOOLEAN(M) THEN GO TO EXIT ELSE 00021100
BEGIN 00021200
IF M=0 THEN I~I+63 ELSE 00021300
IF M=2 THEN READACARD ELSE 00021400
GO TO STRINGCUTTER; 00021500
GO TO TOP 00021600
END; 00021700
STRINGCUTTER: I~I+POSI+1; 00021800
LOOK; IF NEXT=""" THEN BEGIN 00021900
I~I+1; GO TO TOP 00022000
END; 00022100
WOP: LOOK; IF NEXT=""" THEN GO TO TOP 00022200
ELSE GO TO WOP; 00022300
EXIT: FRONT~I+POSI; CHRCOUNT~DELT ; I~FRONT+CHRCOUNT; 00022400
END OF FETCHANAME WHICH MUST FOLLOW LOOK AND READACARD; 00022500
BOOLEAN STREAM PROCEDURE PEEK(FRONT,N,INFO); 00022600
VALUE FRONT,N; 00022700
BEGIN LABEL DOWN; 00022800
SI~INFO; N(SI~SI+63;SI~SI+1);SI~SI+FRONT;TALLY~1; 00022900
IF SB THEN GO TO DOWN; 00023000
SKIP 1 SB; 00023100
IF SB THEN GO TO DOWN; 00023200
TALLY~0; 00023300
DOWN: PEEK~TALLY; 00023400
END OF PEEK; 00023500
PROCEDURE FORMATPROCESSOR; 00023600
BEGIN 00023700
INTEGER Q,LR; 00023800
LABEL A1,A2,A3,A4,A; 00023900
Q~LR~0; 00024000
A1: LOOK; IF NEXT !"(" THEN GO TO A1; 00024100
A2: LR~LR+1; 00024200
A: LOOK; IF NEXT=""" THEN BEGIN 00024300
IF Q=0 THEN BEGIN 00024400
LOOK; IF NEXT=""" THEN BEGIN 00024500
LOOK; Q~0 END 00024600
ELSE Q~1; GO TO A; 00024700
END; 00024800
Q~0; GO TO A 00024900
END; 00025000
IF NEXT="(" THEN BEGIN 00025100
IF Q=0 THEN GO TO A2 ELSE GO TO A 00025200
END; 00025300
IF NEXT !")" THEN GO TO A; 00025400
IF Q !0 THEN GO TO A; 00025500
LR~LR-1; IF LR ! 0 THEN GO TO A; 00025600
A3: LOOK; IF NEXT=";" THEN BEGIN T1~FALSE; GO TO A4 END; 00025700
IF NEXT ! "," THEN GO TO A3; 00025800
A4: 00025900
END OF THE FORMATPROCESSOR; 00026000
PROCEDURE LOOKUP(A,I); 00026100
VALUE I; ARRAY A[0]; INTEGER I; 00026200
BEGIN 00026300
INTEGER COUNT,C,WDCNT,L,M; OWN INTEGER ALFA; 00026400
LABEL TOP, BOTTOM, NOTIT, FOUND; 00026500
PROCEDURE INSERT(A,I); 00026600
VALUE I; ARRAY A[0]; INTEGER I; 00026700
BEGIN LABEL DOWN, RESS; 00026800
PROCEDURE PIN(A,I); 00026900
VALUE I; ARRAY A[0]; INTEGER I; 00027000
BEGIN INTEGER W; 00027100
NAME~A[I]; 00027200
W~A[I-1].[36:6]; 00027300
IF W!1 AND NOT T THEN IDEN.[24:3]~7; 00027400
IF W!1 AND T THEN BEGIN 00027500
IDEN.[37:1]~1; 00027600
MOVE(A[I+1],CONTINUE[C1,C2],W-1); 00027700
IDEN.[24:3]~C1.[45:3]; 00027800
IDEN.[27:10]~C2.[38:10]; 00027900
C2~C2+W-1; 00028000
IF C2}1009 THEN BEGIN 00028100
C1~C1+1; C2~0; 00028200
IF C1=3 THEN T~FALSE 00028300
END; 00028400
END; 00028500
IDEN.[38:10]~1; 00028600
IDEN.[12:6]~W; 00028700
END OF PIN; 00028800
IF DELTA THEN BEGIN 00028900
PIN(A,I); IDEN.[18:6]~63; GO TO RESS 00029000
END; 00029100
IF NAME=0 THEN BEGIN 00029200
J~TRANSLATE[A[I].[12:6]]; 00029300
PIN(A,I); 00029400
IDEN.[18:6]~J; 00029500
STCOUNT~STCOUNT+1; 00029600
GO TO DOWN END; 00029700
IF IDEN.[18:6]=63 THEN GO TO RESS; 00029800
IDEN.[38:10]~IDEN.[38:10]+1; 00029900
GO TO DOWN; 00030000
RESS: RES~TRUE; 00030100
DOWN: END OF INSERT; 00030200
PROCEDURE PRINTIT(A,I); VALUE I; ARRAY A[0]; INTEGER I; 00030300
BEGIN 00030400
INTEGER W,X,X2; 00030500
W~A[I-1].[36:6]; BLANKLINE(LINE); X2~6|(W-1); W~0 ; 00030600
FOR X~ 0 STEP 6 UNTIL X2 DO BEGIN 00030700
GET(A[I+W], LINE,X); W~W+1 END; 00030800
MOVE(CARDNO, LINE[10], 1); 00030900
WRITE(LP,15,LINE[*]); 00031000
END OF PRINTIT; 00031100
ALFA~(A[I].[12:6]-17)|25; ALFA~ALFA+ABS(A[I].[18:6]-17)|2; 00031200
IF ALFA>1022 THEN ALFA~1000; 00031300
COUNT~0; RES~FALSE; 00031400
TOP: IF NOT DELTA THEN 00031500
BEGIN 00031600
IF A[I]=NAME THEN BEGIN 00031700
C~IDEN.[37:1]; WDCNT~A[I-1].[36:6]; 00031800
IF C=0 THEN BEGIN 00031900
IF WDCNT=1 THEN GO TO FOUND; 00032000
IF IDEN.[24:3]=7 THEN GO TO FOUND 00032100
ELSE GO TO NOTIT 00032200
END; 00032300
L~IDEN.[24:3]; M~IDEN.[27:10]; 00032400
FOR J~ 0 STEP 1 UNTIL (WDCNT-2) DO BEGIN 00032500
IF CONTINUE[L,M+J]!A[I+1+J] THEN 00032600
GO TO NOTIT END; 00032700
GO TO FOUND END; 00032800
END; 00032900
NOTIT: IF NAME=0 THEN BEGIN 00033000
INSERT(A,I); GO TO BOTTOM; 00033100
END; 00033200
ALFA~ALFA+1; 00033300
COUNT~COUNT+1; 00033400
IF ALFA>1022 THEN ALFA~0; 00033500
IF COUNT=1022 THEN BEGIN 00033600
IF NOT OVER THEN BEGIN 00033700
OVER~ TRUE; WRITE(LP,ERRORFORMAT1); END; 00033800
PRINTIT(A,I); RES~ TRUE; GO TO BOTTOM; 00033900
END; 00034000
GO TO TOP; 00034100
FOUND: IF IDEN.[18:6]=63 THEN BEGIN 00034200
RES~TRUE; GO TO BOTTOM END; 00034300
INSERT(A,I); 00034400
BOTTOM: 00034500
END OF LOOKUP; 00034600
00034700
PROCEDURE STFILL; 00034800
BEGIN 00034900
ARRAY R[0:500]; 00035000
FOR J~0 STEP 3 UNTIL 231 DO R[J]~"10"; 00035100
FOR J~0 STEP 3 UNTIL 231 DO R[J+2]~" "; I~0; 00035200
FOR J~"ABS+++","ALPHA+","AND+++","ARCTAN","ARRAY+","ADD+++", 00035300
"BEGIN+","CHR+++","CI++++","COS+++","DBL+++","DB++++", 00035400
"DC++++","DEC+++","DEFINE","DI++++","DIV+++","DO++++", 00035500
"DS++++","DUMP++","ELSE++","END+++","ENTIER","EQV+++", 00035600
"EXP+++","FALSE+","FILE++","FILL++","FOR+++","GO++++", 00035700
"IF++++","IMP+++","IN++++","JUMP++","LABEL+","LIST++", 00035800
"LIT+++","LN++++","LOC+++","LOCAL+","MOD+++","NO++++", 00035900
"NOT+++","NUM+++","OCT+++","OR++++","OUT+++","OWN+++", 00036000
"PAGE++","READ++","REAL++","RESET+","SAVE++","SB++++", 00036100
"SC++++","SET+++","SI++++","SIGN++","SIN+++","SKIP++", 00036200
"SQRT++","STEP++","STREAM","SUB+++","SWITCH","TALLY+", 00036300
"THEN++","TIME++","TO++++","TOGGLE","TRUE++","UNTIL+", 00036400
"VALUE+","WDS+++","WHILE+","WITH++","WRITE+","ZON+++" 00036500
DO BEGIN 00036600
R[I+1]~J; 00036700
I~I+3 00036800
END; 00036900
COMMENT THATS THE SINGLE WORD ENTRIES; 00037000
FOR J~0 STEP 3 UNTIL 18 DO R[J+234]~"20"; I~0; 00037100
FOR J~"BOOLEA","N+++++","FORWAR","D+++++", 00037200
"INTEGE","R+++++","MONITO","R+++++", 00037300
"PROCED","URE+++","RELEAS","E+++++", 00037400
"REVERS","E+++++" 00037500
DO BEGIN 00037600
R[I+235]~J; 00037700
I~I+1; IF I MOD 3=2 THEN I~I+1; 00037800
END; 00037900
COMMENT THATS THE OTHERS INTO THE ARRAY; 00038000
DELTA~TRUE; COMMENT HERE WE GO; 00038100
FOR J~1 STEP 3 UNTIL 255 DO LOOKUP(R,J); 00038200
DELTA~FALSE; 00038300
END OF STFILL WHICH MUST FOLLOW LOOKUP; 00038400
PROCEDURE STUFFITAWAY; 00038500
BEGIN 00038600
STREAM PROCEDURE GETSIX(FRONT,N,INFO,HOWMANY,PLUSES,OVT); 00038700
VALUE FRONT,N,HOWMANY,PLUSES; 00038800
BEGIN 00038900
SI~INFO; N(SI~SI+63;SI~SI+1); SI~SI+FRONT; 00039000
DI~OVT; DS~2 LIT "00"; 00039100
DS~HOWMANY CHR; 00039200
PLUSES(DS~1 LIT "+"); 00039300
END; 00039400
M~L~0; N~INDEX; 00039500
L~CHRCOUNT MOD 6; IF L=0 THEN L~CHRCOUNT DIV 6 00039600
ELSE L~(CHRCOUNT DIV 6)+1; 00039700
M~M& CHRCOUNT[42:42:6] & L[36:42:6]; 00039800
BUFF[N]~M; N~N+1; 00039900
FOR J~0 STEP 1 UNTIL L-1 DO BEGIN 00040000
GETSIX(FRONT,FRONT DIV 64, INFO,CHRCOUNT,6-CHRCOUNT, 00040100
BUFF[N]); 00040200
FRONT~FRONT+6; CHRCOUNT~CHRCOUNT-6; N~N+1; 00040300
END; 00040400
MOVE(CARDNO,BUFF[N],1); 00040500
N~N+1; 00040600
COMMENT NOW THE RECORD IS IN THE BUFFER,WITH 00040700
INDEX MARKING THE BEGINNING AND N MARKING WHERE 00040800
WE START THE NEXT ONE; 00040900
END; 00041000
PROCEDURE CHECKBUFF; 00041100
BEGIN 00041200
IF INDEX}486 THEN BEGIN FOR J~INDEX STEP 1 UNTIL 499 DO 00041300
BUFF[J]~0; 00041400
INDEX~0; COUNTER~COUNTER+1; 00041500
WRITE(MT11,500,BUFF[*]); 00041600
END; 00041700
END OF CHECKBUFF; 00041800
COMMENT HERE WE GO ON PASS ONE; 00041900
T1~FALSE; T~TRUE; STCOUNT~0; 00042000
COUNTER~INDEX~0; COMMENT ZERO RECORDS ON TAPE, 00042100
NEXT ENTRY IN BUFF[*]; 00042200
C1~C2~0; COMMENT INITIALISE CONTINUE; 00042300
FILL TRANSLATE[*] WITH 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00042400
0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 00042500
4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 00042600
0, 0, 0,10,11,12,13,14,15,16, 00042700
17,18, 0, 0, 0, 0, 0, 0, 0, 0, 00042800
19,20,21,22,23,24,25,26, 0, 0, 00042900
0, 0, 0, 0; 00043000
FOR I~ 0 STEP 1 UNTIL 1022 DO SYMBOL0[I]~0; 00043100
STFILL; 00043200
COMMENT NOW DELTA IS FALSE FOR THE REST OF THE RUN; 00043300
RES~FALSE; 00043400
INP~0; READACARD; 00043500
IF NOTDOLLAR(INFO) THEN BEGIN 00043600
WRITE(LP,ERRORFORMAT3); GO TO FINALLABEL END; 00043700
FETCHANAME; STUFFITAWAY; 00043800
IF BUFF[INDEX+1]="TAPE++" THEN BEGIN 00043900
INP~1; CLOSE(CR,RELEASE); GO TO START END; 00044000
IF BUFF[INDEX+1]="CARD++" THEN GO TO START; 00044100
WRITE(LP,ERRORFORMAT3); GO TO FINALLABEL; 00044200
START: OVER~ FALSE; 00044300
READACARD; COMMENT THIS PULLS IN A CARD 00044400
PUTS THE CARDNUMBER INTO CARDNO 00044500
AND PUTS A PERCENT WHERE 00044600
COLUMN 73 WAS; 00044700
TOPOFHEAP: FETCHANAME; COMMENT LOOKS FOR AN IDENTIFIER 00044800
AND SETS FRONT AND CHRCOUNT; 00044900
IF CHRCOUNT =6 THEN BEGIN COMMENT LOOK FOR FORMAT; 00045000
IF FMT(FRONT,FRONT DIV 64,INFO) THEN BEGIN 00045100
T1~TRUE; GO TO TOPOFHEAP END 00045200
END; 00045300
IF CHRCOUNT=7 THEN BEGIN COMMENT LOOK FOR COMMENT; 00045400
IF COM(FRONT,FRONT DIV 64,INFO) THEN 00045500
GO TO COMMENTDELETE 00045600
END; 00045700
IF O8(FRONT, FRONT DIV 64, INFO) THEN GO TO TOPOFHEAP; 00045800
COMMENT DELETE OCTALS; 00045900
COMMENT NOW WE PEEK AT THE 00046000
FIRST CHARACTER TO MAKE SURE IT 00046100
IS A LETTER; 00046200
IF PEEK(FRONT,FRONT DIV 64,INFO) THEN STUFFITAWAY 00046300
ELSE GO TO TOPOFHEAP; 00046400
LOOKUP(BUFF,INDEX+1); 00046500
IF RES THEN BEGIN RES~FALSE;IF T1 THEN GO TO TOPOFHEAP END 00046600
ELSE BEGIN 00046700
INDEX~N; CHECKBUFF 00046800
END; 00046900
IF NOT T1 THEN GO TO TOPOFHEAP; 00047000
00047100
FORMATPROCESSOR; COMMENT HERE WE GET RID OF 00047200
THE REST OF A FORMAT DECL; 00047300
GO TO TOPOFHEAP; 00047400
00047500
COMMENTDELETE: LOOK; IF NEXT=";" THEN GO TO TOPOFHEAP 00047600
ELSE GO TO COMMENTDELETE; 00047700
00047800
EOP1: IF INDEX=0 THEN GO TO L1; 00047900
FOR J~ INDEX STEP 1 UNTIL 499 DO BUFF[J]~0; 00048000
COUNTER~COUNTER+1; 00048100
WRITE(MT11,500,BUFF[*]); 00048200
L1: REWIND(MT11); CLOSE(INPUT[INP],RELEASE); 00048300
I~J~0; FOR K~1 STEP 1 UNTIL 26 DO ARY[K]~0; 00048400
L2: IF SYMBOL0[J]=0 OR SYMBOL1[J].[18:6]=63 THEN 00048500
BEGIN J~J+1; GO TO L2 END; 00048600
SYMBOL0[I]~SYMBOL0[J]; SYMBOL1[I]~SYMBOL1[J]; 00048700
K~SYMBOL1[I].[18:6]; 00048800
ARY[K]~ARY[K]+SYMBOL1[I].[38:10]; 00048900
I~I+1; IF I!STCOUNT THEN BEGIN J~J+1; GO TO L2 END; 00049000
SYMBOL0[STCOUNT]~"======"; COMMENT MARKER; 00049100
COMMENT NOW THE SYMBOL TABLE IS PACKED UP; 00049200
COMMENT NOW WE SORT IT; 00049300
L3: I~0; RES~FALSE; 00049400
L4: IF SYMBOL0[I+1]<SYMBOL0[I] THEN 00049500
BEGIN 00049600
DELT~SYMBOL0[I+1]; SYMBOL0[I+1]~SYMBOL0[I]; SYMBOL0[I]~DELT; 00049700
DELT~SYMBOL1[I+1]; SYMBOL1[I+1]~SYMBOL1[I]; SYMBOL1[I]~DELT; 00049800
RES~TRUE 00049900
END; 00050000
I~I+1; 00050100
IF I!STCOUNT THEN GO TO L4; 00050200
IF RES THEN GO TO L3; 00050300
END OF THE INNER BLOCK SO TURN BACK STORAGE *; 00050400
00050500
BEGIN 00050600
ARRAY CLOT[0:SIZE,0:149]; COMMENT HOLDS THE CARDIDS FOR 00050700
THE CURRENT LOT OF IDENTIFIERS; 00050800
INTEGER ARRAY POINT[0:SIZE+2]; COMMENT POINTS TO ROWS OF CLOT 00050900
HOLDING SYMBOL REFERENCES; 00051000
INTEGER S; 00051100
INTEGER MIN,T,A,B,W,MAX; 00051200
DEFINE NAM=SYMBOL0[I]#,ID=SYMBOL1[I]#; 00051300
INTEGER ARRAY ROW[0:SIZE]; COMMENT POINTS TO CURRENT 00051400
POSITION IN EACH CLOT ROW; 00051500
BOOLEAN TT; 00051600
INTEGER LINEPOS; 00051700
FILE M(1,500); 00051800
SWITCH FILE F~MT11,M; 00051900
INTEGER IND; COMMENT POINTS TO THE OUTPUT TAPE ARRAY; 00052000
ARRAY BUF[0:499]; COMMENT THE OUTPUT ARRAY; 00052100
INTEGER IO; COMMENT TELLS WHICH IS INPUT TAPE; 00052200
INTEGER DUM; 00052300
LABEL TOP,AGAIN,BOT,LL1,ZOOP,LL2,NT,FD,KKK; 00052400
PROCEDURE PRINTNAME; 00052500
BEGIN 00052600
LABEL UNDER; 00052700
STREAM PROCEDURE XES(LINE,NUMB);VALUE NUMB; 00052800
BEGIN DI~LINE;DI~DI+6;NUMB(DS~1 LIT"/"); 00052900
END OF XES; 00053000
BLANKLINE(LINE); WRITE(LP,15,LINE[*]); 00053100
GET(NAM,LINE,0); 00053200
IF ID.[37:1]=1 THEN BEGIN W~ID.[12:6];C1~ID.[24:3]; 00053300
C2~ID.[27:10];A~6; 00053400
FOR T~0 STEP 1 UNTIL W-2 DO 00053500
BEGIN 00053600
GET(CONTINUE[C1,C2+T],LINE,A); 00053700
A~A+6; 00053800
END; 00053900
GO TO UNDER; 00054000
END; 00054100
IF ID.[24:3]=7 THEN BEGIN W~ID.[12:6]; 00054200
XES(LINE,W); 00054300
END; 00054400
UNDER: 00054500
WRITE(LP,15,LINE[*]); 00054600
END OF PRINTNAME; 00054700
PROCEDURE PRINTIDS; 00054800
BEGIN 00054900
INTEGER M,N; 00055000
PROCEDURE PUTONEIN(N); VALUE N; INTEGER N; 00055100
BEGIN 00055200
STREAM PROCEDURE GET(CLOTI,LINE,LINEPOS,MESS); 00055300
VALUE LINEPOS,MESS; 00055400
BEGIN 00055500
SI~CLOTI;DI~LINE;MESS(DI~DI+63;DI~DI+1); 00055600
DI~DI+LINEPOS; 00055700
DS~8 CHR;DS~1 LIT","; 00055800
END OF GET; 00055900
N~(J-1)MOD 150; 00056000
GET(CLOT[S,N],LINE,LINEPOS,LINEPOS DIV 64); 00056100
IF N=149 THEN BEGIN 00056200
S~S+1; 00056300
END; 00056400
IF LINEPOS=100 THEN BEGIN 00056500
WRITE(LP,15,LINE[*]); 00056600
BLANKLINE(LINE); 00056700
LINEPOS~10 00056800
END 00056900
ELSE 00057000
LINEPOS~LINEPOS+9; 00057100
END OF PUTONEIN; 00057200
BLANKLINE(LINE);LINEPOS~10; 00057300
M~ID.[38:10]; COMMENT THE NUMBER OF IDS; 00057400
FOR J~1 STEP 1 UNTIL M DO PUTONEIN(N); 00057500
WRITE(LP,15,LINE[*]); 00057600
WRITE(LP,XXX); 00057700
END OF PRINTIDS; 00057800
WRITE(LP[PAGE]); 00057900
READ(MT11,500,BUFF[*]);INDEX~0; IO~IND~0; 00058000
MIN~0;MAX~0; I~0; 00058100
TOP: S~0; POINT[0]~0; I~MIN; 00058200
AGAIN: COUNTER~ID.[38:10]; 00058300
IF COUNTER >150|SIZE THEN BEGIN WRITE(LP,ERRORFORMAT2); 00058400
GO TO FINALLABEL 00058500
END; 00058600
COUNTER~(COUNTER-1) DIV 150; 00058700
POINT[S+1]~POINT[S]+COUNTER +1; 00058800
I~I+1; S~S+1; 00058900
IF POINT[S]>SIZE+1 OR MIN+S=STCOUNT+1 THEN 00059000
BEGIN 00059100
S~S-2; I~I-2; GO TO BOT 00059200
END; 00059300
GO TO AGAIN; 00059400
BOT: COMMENT HERE WE HAVE SOME 00059500
IDENTIFIERS TO DUMP; 00059600
MAX~MIN+S; 00059700
FOR J~0 STEP 1 UNTIL SIZE DO ROW[J]~0; 00059800
LL1:A~BUFF[INDEX];B~BUFF[INDEX+1]; 00059900
W~A.[36:6];I~MIN; 00060000
IF A=0 THEN BEGIN 00060100
READ(F[IO],500,BUFF[*])[ZOOP]; 00060200
INDEX~0; GO TO LL1; 00060300
END; 00060400
S~0; 00060500
LL2:IF NAM!B THEN GO TO NT; 00060600
IF(ID.[37:1]=1)OR(ID.[24:3]=7)THEN TT~TRUE 00060700
ELSE TT~FALSE; 00060800
IF W=1 THEN 00060900
BEGIN IF TT THEN GO TO NT ELSE GO TO FD 00061000
END; 00061100
IF NOT TT THEN GO TO NT; 00061200
IF ID.[24:3]=7 THEN GO TO FD; 00061300
IF W!ID.[12:6]THEN GO TO NT; 00061400
C1~ID.[24:3];C2~ID.[27:10]; 00061500
FOR K~2 STEP 1 UNTIL W DO 00061600
IF BUFF[INDEX+K]!CONTINUE[C1,C2+K-2]THEN GO TO NT; 00061700
GO TO FD; 00061800
NT:IF I!MAX THEN BEGIN S~S+1;I~I+1; GO TO LL2 END; 00061900
COMMENT THE IDENTIFIER IS 00062000
NOT IN THIS LOT,TRY THE NEXT 00062100
IDENTIFIER; 00062200
COMMENT MOVE THIS IDENTIFIER TO 00062300
THE OUTPUT TAPE ; 00062400
MOVE(BUFF[INDEX],BUF[IND], W+2); 00062500
IND~IND+W+2; 00062600
IF IND}486 THEN BEGIN FOR DUM~IND STEP 1 UNTIL 499 DO 00062700
BUF[DUM]~0; IND~0; WRITE(F[1-IO],500,BUF[*]); 00062800
END; 00062900
INDEX~INDEX+W+2; 00063000
GO TO LL1; 00063100
FD: COMMENT THIS IDENTIFIER IS 00063200
INCLUDED IN THE CURRENT LOT; 00063300
MOVE(BUFF[INDEX+W+1],CLOT[POINT[S],ROW[POINT[S]]],1); 00063400
IF ROW[POINT[S]]=149 THEN 00063500
POINT[S]~POINT[S]+1 00063600
ELSE 00063700
ROW[POINT[S]]~ROW[POINT[S]]+1; 00063800
INDEX~INDEX+W+2; 00063900
GO TO LL1; 00064000
00064100
ZOOP: COMMENT NOW WE HAVE COLLECTED 00064200
ALL THE VALID CARDIDS FOR THIS 00064300
PASS.PRINT THEM OUT; 00064400
IF IND!0 THEN BEGIN FOR DUM~IND STEP 1 UNTIL 499 DO BUF[DUM]~0; 00064500
WRITE(F[1-IO],500,BUF[*]); 00064600
END; 00064700
REWIND(MT11); REWIND(M); IO~1-IO; 00064800
I~MIN; S~0; 00064900
KKK:PRINTNAME; 00065000
PRINTIDS; 00065100
IF I!MAX THEN BEGIN 00065200
S~S+1; I~I+1; GO TO KKK; 00065300
END; 00065400
MIN~MAX+1;IF MIN!STCOUNT THEN BEGIN 00065500
IND~INDEX~0; READ(F[IO],500,BUFF[*]); GO TO TOP; 00065600
END; 00065700
END OF THE SECOND PHASE OF INDEXER; 00065800
FINALLABEL: 00065900
END OF THE INDEXER PROGRAM. 00066000