perm filename DATALI.SAI[S,AIL] blob sn#000867 filedate 1971-12-02 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00014 PAGES VERSION 3-3(1)
RECORD PAGE   DESCRIPTION
 00001 00001
 00003 00002	HISTORY
 00004 00003	Subequ, Equal, Scl, Ident
 00006 00004	Readline, Linout, Crout, Blout
 00008 00005	Setpar, Intcheck, Chkpag, Chkpg1, Selprod, Symset
 00010 00006	Crefset, Blfind, Nameline, Creffind, Fill
 00014 00007	"Step 0 -- Initialization"
 00018 00008	"Step 0.5 -- Make the CREF file into a merged CREF file"
 00019 00009	"Step 1 -- Read in HEL2 file, hash exec names to productions"
 00021 00010	"Step 2 -- Make listing of DSCRs from EXTRACT"
 00024 00011	"Step 3 -- Make listing of data descriptions from EXTRACT"
 00027 00012	"Step 4 -- Make cross-reference listing of DSCRS"
 00030 00013	"Step 5 -- Make cross-reference listing of DATA"
 00033 00014
 00037 ENDMK
⊗;
COMMENT ⊗HISTORY
AUTHOR,SAIL,REASON
025  300300000001  ⊗;
REQUIRE '300300000001 VERSION;

COMMENT ⊗
VERSION 3-3(1) 12-2-71 BY DCS INSTALL VERSION NUMBER

⊗;
COMMENT Declarations;

BEGIN "DATALIST"


 REQUIRE 2000 NEW_ITEMS;
 REQUIRE 10000 STRING_SPACE;
 
 DEFINE SYMNO="570";

 REQUIRE "SYMSER.SAI[1,DCS]" SOURCE_FILE;

INTEGER ARRAY CHT[0:255];
REQUIRE "SRTSER.SAI[1,DCS]" SOURCE_FILE;
 DEFINE DSKI1="1", DSKI2="5", DSKOUT="2", TO_CRLF="1", TO_DELIM="2",
	TO_E="3", OVER_DEL="4", TAB="'11",TO_COMMA="5",TO_COL="6",
	TO_0="7", CRLF="('15&'12)";


 INTEGER BRK,EOF,FLAG,HELINDEX,HELI1,SETI,J,I,FLAG1;
 INTEGER DODSC,DODAT,PICKUP,LINENO,SRDSC,SRDAT,LT,GT,EQ,OVERA;
 INTEGER BLKIDX,SUMMARY,LSCREF,DSKIN,DEBEQ,DEBLG,DEBGE,DEBSTP;

 STRING LINE,TEMP,TEMP1,BLKNAM,PAG,CREF,SPAR,BLANKS,LIN;
 STRING FILNAM,BCREF,CREFNAME,BLCREF,FSCREF,CRCREF;
 STRING BLKDSC,RUNDSC,CCREFNAME,CLINE,LL;

 STRING ARRAY HELTAB[0:200];
 INTEGER ARRAY BLKREF[0:100];
 SET ARRAY REFSET[0:300];
 STRING ARRAY BLKTAB[0:100];

 INTEGER ARRAY PATCH[1:100];
 INTEGER ITEMVAR IT;
COMMENT Subequ, Equal, Scl, Ident;

BOOLEAN PROCEDURE SUBEQU(STRING S1,S2);
BEGIN "SUBEQU"
 IF LENGTH(S2)<LENGTH(S1) THEN RETURN (FALSE);
 RETURN(EQU(S1,S2[1 FOR LENGTH(S1)]))
END "SUBEQU";

BOOLEAN PROCEDURE EQUAL(STRING S,T);
BEGIN INTEGER I,J,K;
 DEFINE GGTT(V,ST)="(IF ST='177 THEN (V←'177) ELSE (V←CHT[ST[I FOR 1]]))";
 EQ←TRUE; LT←GT←FALSE;
 IF EQU(S,T) THEN RETURN(TRUE);
 EQ←FALSE; LT←TRUE;
 IF SUBEQU(S,T) THEN RETURN(FALSE);
 LT←FALSE; GT←TRUE;
 IF SUBEQU(T,S) THEN RETURN(FALSE);
 FOR I←1 STEP 1 UNTIL LENGTH(S) MIN LENGTH(T) DO
  IF GGTT(J,S)>GGTT(K,T) THEN RETURN (FALSE)
    ELSE IF J<K THEN DONE;
 LT←TRUE; GT←FALSE;
 RETURN(FALSE)
END "EQUAL";

STRING PROCEDURE SCL(REFERENCE STRING S;INTEGER TABLE);
 RETURN(SCAN(S,TABLE,BRK));

STRING PROCEDURE IDENT(REFERENCE STRING S);
BEGIN "IDENT"
 SCL(S,OVER_DEL);
 RETURN(SCL(S,TO_DELIM));
END "IDENT";
COMMENT Readline, Linout, Crout, Blout;

 STRING PROCEDURE READLINE(INTEGER CHANNEL);
 RETURN(INPUT(CHANNEL,TO_CRLF));

PROCEDURE LINOUT(STRING S);
BEGIN "LINOUT"
  IF (LINENO←LINENO-1) < 0∨LINENO≥100 THEN BEGIN "HEADER"
	STRING T;
	IF LINENO<106 THEN BEGIN
	OUT(DSKOUT,'14&'15);
	OUT(DSKOUT,"SAIL	"&RUNDSC&CRLF);
	LINENO←48
 	END ELSE BEGIN LINENO←LINENO-106;
	  OUT(DSKOUT,CRLF&CRLF&CRLF)
	END;
       IF DODSC∨DODAT THEN
	OUT(DSKOUT," "&FILNAM&":"&BLKNAM&BLKDSC&", PAGE "&PAG&CRLF);
	OUT(DSKOUT,CRLF);
  END "HEADER";
  OUT(DSKOUT,(S&CRLF)[1 TO 120]);
END "LINOUT";

PROCEDURE CROUT(STRING C,L,S);
BEGIN "CROUT"
  C←(BLANKS[1 FOR 5]&C)[∞-4 TO ∞];
  L←(BLANKS[1 FOR 5]&L)[∞-4 TO ∞];
  LINOUT(C&"   "&L&TAB&S);
END "CROUT";

PROCEDURE BLOUT(INTEGER TIMES);
BEGIN "BLOUT" INTEGER I; FOR I←1 STEP 1 UNTIL TIMES DO 
  LINOUT(NULL) 
END "BLOUT";
COMMENT Setpar, Intcheck, Chkpag, Chkpg1, Selprod, Symset;

PROCEDURE SETPAR;
BEGIN "SETPAR"
 INTEGER C;
 OUTSTR("SET PARAMETERS"&CRLF&
	"DODSC, DODAT, SRDSC, SRDAT, SUMMARY, DEBEQ, DEBGE, DEBLG"&
	",DEBSTP"&CRLF&"TYPE ""P"" TO PROCEED"&CRLF); 

 DO BEGIN "ONE VAL"
   STRING STR;
   INTEGER II; STR←NULL;
   OUTSTR("*"); TEMP1←INCHWL; C←TEMP1;
   TEMP←NULL; BRK←"←";
   NEEDNEXT WHILE BRK="←"∨BRK="=" DO BEGIN  "FIND VAL"
     TEMP←SCAN(TEMP1,TO_COL,BRK);
     NEXT; STR←STR&TEMP&BRK;
   END "FIND VAL";
   II←CVD(TEMP);
   DO BEGIN "SET VALS"
      INTEGER JJ; JJ←0;
      TEMP←SCAN(STR,TO_COL,BRK);
      FOR SPAR←"DODSC","DODAT","SRDSC","SRDAT","SUMMARY",
	"DEBGE","DEBEQ","DEBLG","DEBSTP","FOO"
	DO IF EQU(TEMP,SPAR) THEN DONE ELSE JJ←JJ+1;
	IF BRK="←" THEN CASE JJ OF BEGIN
	  DODSC←II; DODAT←II; SRDSC←II; SRDAT←II; SUMMARY←II;
	  DEBGE←II; DEBEQ←II; DEBLG←II; DEBSTP←II;;;
	END ELSE BEGIN
	 OUTSTR(SPAR&"="&CVS(
		CASE JJ OF (DODSC,DODAT,SRDSC,SRDAT,SUMMARY,
			DEBGE,DEBEQ,DEBLG,DEBSTP,DODSC,DODSC))&CRLF);
	END;
    END "SET VALS" UNTIL ¬LENGTH(STR);
END "ONE VAL" UNTIL C="P";
END "SETPAR";

PROCEDURE INTCHECK;
BEGIN "INTCHECK"
 INCHSL(FLAG);
 IF ¬FLAG THEN SETPAR;
END "INTCHECK";


PROCEDURE CHKPAG;
WHILE LINE="#"∨LINE="!" DO BEGIN "CHKPAG"
 IF LINE="#" THEN BEGIN
  I←LOP(LINE);
  TEMP←IDENT(LINE);
  IF ¬EQU(TEMP,FILNAM) THEN BEGIN "DIFFERENT FILE"
 	LINENO←0;
	FILNAM←TEMP
 END "DIFFERENT FILE";
  PAG←IDENT(LINE);
 END ELSE BEGIN
  LINE←LINE[3 TO ∞];
  BLKNAM←IDENT(LINE);
  BCREF←IDENT(LINE)
 END;
 LINE←READLINE(DSKI1)
END "CHKPAG";

PROCEDURE CHKPG1;
BEGIN "CHKPG1" INTEGER SAVL;
 SAVL←LINENO; CHKPAG; LINENO←SAVL
END "CHKPG1";

STRING PROCEDURE SELPROD(INTEGER J);
BEGIN "SELPROD" INTEGER K,L,M; STRING S,T,U;
 K←J LSH -18;  L←J LAND '777777;
 S←IF L=0 THEN "AT    " ELSE "AFTER ";
 T←HELTAB[K]; 
 S←S&SCAN(T,TO_E,BRK)&":";
 FOR M←0 STEP 1 UNTIL L DO U←SCAN(T,TO_0,BRK);
 RETURN(S&U);
END "SELPROD";

PROCEDURE SYMSET;
BEGIN "SYMSET"
  SETSYM;
  FOR I←0 STEP 1 UNTIL 300 DO REFSET[I]←PHI;
  FOR I←0 STEP 1 UNTIL 200 DO HELTAB[I]←NULL;
END "SYMSET";
COMMENT Crefset, Blfind, Nameline, Creffind, Fill;

PROCEDURE CREFSET(STRING FIL;INTEGER CHANNEL;REFERENCE STRING L,N;BOOLEAN FLG);
BEGIN "CREFSET"
 CLOSE(CHANNEL); EOF←FALSE;
 LOOKUP(CHANNEL,FIL,FLAG); IF FLAG THEN USERERR(0,0,"NO CREFIL");
 N←NULL;
 WHILE L≠"A" DO L←READLINE(CHANNEL);
 IF FLG THEN BEGIN
     WHILE L≠"B" DO L←READLINE(CHANNEL);
     WHILE L≠"A" DO L←READLINE(CHANNEL)
 END
END "CREFSET";

PROCEDURE BLFIND(STRING CRNO);
BEGIN "BLFIND"
 INTEGER I,J;
 I←CVD(CRNO);
 IF LENGTH(BLCREF) THEN
  IF I<LSCREF THEN BEGIN "SAM BLK"
	CRCREF←CRNO;
	RETURN
  END "SAM BLK" ELSE
   LINOUT(TAB&TAB&BLCREF&"("&FSCREF&"-"&CRCREF&")");

 IF I≠99999 THEN BEGIN "NEW BLK"
   CRCREF←FSCREF←CRNO;
   FOR J←0 STEP 1 UNTIL 99 DO
	IF BLKREF[J]≤I<BLKREF[J+1] THEN DONE;
   BLCREF←BLKTAB[J];
   LSCREF←BLKREF[J+1]
 END "NEW BLK" ELSE BLCREF←NULL;
 RETURN
END "BLFIND";



PROCEDURE NAMELINE(INTEGER CHANNEL,FLG;REFERENCE STRING L,N);
BEGIN "NAMELINE"
  WHILE ¬EOF∧(LENGTH(L)=0 ∨ L=TAB ∨ L=" ") DO
	L←READLINE(CHANNEL);
  IF EOF ∨(OVERA∧CHANNEL=DSKI1∧L="A") THEN N←'177&'177&'177&'177&'177
    ELSE BEGIN STRING S1;
	N←IDENT(L);
	IF ¬FLG THEN BEGIN
	S1←SCL(L,OVER_DEL);
	IF "A"≤L≤"Z" THEN S1←IDENT(L)
	END;
    END;
	L←TAB&L
END "NAMELINE";

PROCEDURE CREFFIND(STRING S);
BEGIN "CREFFIND"
 INTCHECK;

 IF "a"≤S≤"z" THEN RETURN;
WHILE TRUE DO BEGIN "MERGE"
 EQUAL(CREFNAME,S[1 TO 6]);
 IF DEBLG∨ (¬LT)∧DEBGE ∨ EQ∧DEBEQ THEN BEGIN
 OUTSTR(S&TAB&CREFNAME&TAB&(IF EQ THEN "EQ" 
	ELSE IF LT THEN "LT" ELSE "GT")&CRLF);
 IF DEBSTP THEN INCHRW ELSE INTCHECK;
END;
 IF EQ THEN BEGIN "EQ"
  STRING T;
  BLCREF←NULL;
  WHILE TRUE DO BEGIN "CRF ENTRY"
	IF ¬LENGTH(LINE) THEN BEGIN "READ CR"
	 WHILE ¬EOF∧¬LENGTH(LINE) DO LINE←READLINE(DSKI1);
	 IF LINE≠TAB∨EOF THEN DONE
	END "READ CR";
	T←IDENT(LINE);
	IF "0"≤T≤"9" ∧ T[∞ FOR 1]≠"#" THEN
	 	BLFIND(T)
   END "CRF ENTRY";
   BLFIND("99999");
   RETURN
 END "EQ";
 IF GT THEN RETURN;
 NAMELINE(DSKI1,FALSE,LINE,CREFNAME);
END "MERGE"
END "CREFFIND";

PROCEDURE FILL(INTEGER F);
 IF ¬F THEN NAMELINE(DSKI1,TRUE,LINE,CREFNAME) ELSE
	    NAMELINE(DSKI2,TRUE,CLINE,CCREFNAME);
"Step 0 -- Initialization"

SETBREAK(TO_CRLF,'12,'15&'14,"INS");
SETBREAK(TO_DELIM," "&TAB,NULL,"INS");
SETBREAK(OVER_DEL," "&TAB,NULL,"XNR");
SETBREAK(TO_E,"E:",NULL,"INS");
SETBREAK(TO_0,0,NULL,"INS");
SETBREAK(TO_COMMA," "&'12&TAB&","&"-"&"(",'15,"IN");
SETBREAK(TO_COL,"0123456789"&
	"ABCDEFGHIJKLMNOPQRSTUVWXYZ"&
	"↑↓$%."," "&"	","XN");

OPEN(DSKI1,"DSK",0,8,0,200,BRK,EOF);
BLANKS←"                                                  ";

 SORTSET(10,11,12);
 OPEN(DSKOUT,"DSK",0,0,2,0,I,I);

 LINENO←PICKUP←OVERA←0; DODSC←DODAT←SRDSC←SRDAT←SUMMARY←TRUE;
 DEBGE←DEBLG←DEBEQ←TRUE;

 SETPAR;
"Step 0.5 -- Make the CREF file into a merged CREF file"

WHILE TRUE DO BEGIN "WHILE TRUE FOR LABEL EXTERMINATION ONLY"
 INTEGER FLGG,PICKOFF;
 OPEN(DSKI2,"DSK",0,8,0,200,BRK,EOF);
 CLOSE(DSKI1); LOOKUP(DSKI2,"CREFIL",I); IF I THEN DONE; CLOSE(DSKI2);
 CREFSET("CREFIL",DSKI1,LINE,CREFNAME,FALSE);
 CREFSET("CREFIL",DSKI2,CLINE,CCREFNAME,TRUE);
 ENTER(DSKOUT,"CRFL",I); IF I THEN USERERR(0,0,"CAN'T ENTER CRFL");
 FLGG←-1; PICKOFF←FALSE;
 WHILE TRUE DO BEGIN "X"
	IF FLGG≠1 THEN FILL(0);
	IF FLGG≠0 THEN FILL(1);
	IF CREFNAME>"B" THEN OVERA←TRUE;
	IF PICKOFF THEN BEGIN
		PICKOFF←FALSE;
		CCREFNAME←NULL;
		GT←TRUE
	END ELSE
	IF EQUAL(CREFNAME,CCREFNAME) THEN IF CREFNAME='177 THEN DONE
		ELSE BEGIN
			LT←TRUE;
			PICKOFF←TRUE
		END;
	FLGG←IF LT THEN 0 ELSE 1;
	DSKIN←CASE FLGG OF (DSKI1,DSKI2);
	LL←CASE FLGG OF (CREFNAME&LINE,CCREFNAME&CLINE);
	DO BEGIN
		OUT(DSKOUT,LL&CRLF);
		LL←INPUT(DSKIN,TO_CRLF);
	END UNTIL EOF∨(LL≠" "∧LL≠"	");
	IF ¬FLGG THEN LINE←LL ELSE CLINE←LL
  END "X";
  OVERA←FALSE;
  DONE
END "WHILE TRUE FOR LABEL EXTERMINATION ONLY";
 CLOSE(DSKOUT); CLOSE(DSKI1); RELEASE(DSKI2);
  ENTER(DSKOUT,"DIRECT",FLAG); IF FLAG THEN USERERR(0,0,"NO DIRECT");
 EOF←FALSE;
"Step 1 -- Read in HEL2 file, hash exec names to productions"

IF DODSC THEN BEGIN "STEP1"
OUTSTR("STEP 1
");

SYMSET;

EOF←0;
LOOKUP(DSKI1,"HEL2",FLAG);

IF FLAG THEN USERERR(0,0,"HEL2 NOT FOUND");

LINE←NULL;
WHILE ¬SUBEQU("<PRODUCTIONS>",LINE) DO
LINE←READLINE(DSKI1);

HELINDEX←HELI1←0;

WHILE ¬SUBEQU("<END>",LINE) DO BEGIN "HEL1"
LINE←READLINE(DSKI1);
 TEMP1←LINE;
 TEMP←SCAN(TEMP1,TO_E,BRK);
 FLAG1←FALSE;
 IF BRK=":" ∧ TAB≠LINE≠" " THEN BEGIN "HEL2"
  FLAG1←TRUE;
  HELINDEX←HELINDEX+1;
  HELTAB[HELINDEX]←NULL;
  HELI1←0;
  TEMP←SCAN(TEMP1,TO_E,BRK)
 END "HEL2";

 WHILE BRK≠0 DO BEGIN "HEL3"
  IF BRK="E" THEN IF SUBEQU("XEC",TEMP1) THEN DONE;
   TEMP←SCAN(TEMP1,TO_E,BRK);
 END "HEL3";

 IF BRK="E" THEN BEGIN "HEL4"
  FLAG1←TRUE;
  TEMP←SCAN(TEMP1,TO_DELIM,BRK);
  WHILE ¬EQU(TEMP,"SCAN") ∧ LENGTH(TEMP) ∧
	("¬"≠TEMP1≠"#")∧("↑"≠TEMP1≠"↓") DO BEGIN "HEL5"
   TEMP←SCAN(TEMP1,OVER_DEL,BRK);
   TEMP←SCAN(TEMP1,TO_DELIM,BRK);
   IF TEMP≠"@" THEN BEGIN "HEL6"
    I←LOOKSYM(TEMP);
    IF ¬I THEN ENTERSYM(TEMP,SETI←SETI+1);
    IT←NEW(HELINDEX LSH 18 + HELI1);
    PUT IT IN REFSET[NUMBER[SYMBOL]];
   END "HEL6"
  END "HEL5"
 END "HEL4";
 HELTAB[HELINDEX]←HELTAB[HELINDEX]&LINE&0;
 HELI1←HELI1+1;
END "HEL1";
END "STEP1";
"Step 2 -- Make listing of DSCRs from EXTRACT"

 IF DODSC THEN BEGIN "STEP2"
OUTSTR("STEP 2
");
 FILNAM←"MAIN."; PAG←"1";
 BLKNAM←"MAIN."; RUNDSC←"ROUTINE DESCRIPTIONS";
 BLKDSC←NULL;


  LOOKUP(DSKI1,"EXTRACT",FLAG); IF FLAG THEN USERERR(0,0,"NO EXTRACT");
 
 WHILE ¬EOF DO BEGIN "DSCR2"

 LINE←READLINE(DSKI1);

 CHKPAG;

CREF←IDENT(LINE);
LIN←IDENT(LINE);
 IF ¬PICKUP∧SUBEQU("DSCR",LINE) THEN BEGIN "ENTER PICKUP"
  BLOUT(1);
  LINOUT(LIN&"/"&PAG&" ("&CREF&")"&BLANKS[1 FOR 13]&LINE[5 TO ∞]);
  PICKUP←TRUE
 END "ENTER PICKUP" ELSE

 IF PICKUP THEN BEGIN "HANDLE DIRECTORY ENTRY"
  FOR SPAR←"PARAMETERS:     ",
	   "RESULTS:        ",
	   "SIDE EFFECTS:   ",
	   "DESCRIPTION:    ",
	   "CALLING METHOD: ",
	   "ERROR CHECKS:   ",
	   "PRODUCTIONS:    ",
	   "SEE ALSO:       ",
	   "GARP"
  DO IF SUBEQU(SPAR[1 FOR 3],LINE) THEN BEGIN "ENTRY LINE"
	IF ¬EQU(SPAR[1 FOR 3],"PRO") THEN LINOUT(SPAR&LINE[5 TO ∞])
	ELSE BEGIN "EXEC LINES"
	   INTEGER B;
	  LINOUT(SPAR);
	  LINE←LINE[5 TO ∞];
	  DO BEGIN "EACH EXEC"
	TEMP←IDENT(LINE); B←BRK;	
	I←LOOKSYM(TEMP); 
		IF ¬I THEN LINOUT(TEMP&"--UNKNOWN EXEC")
		ELSE FOREACH IT | IT ε REFSET[NUMBER[SYMBOL]] DO
		BEGIN "ONE EXEC"
		  I←DATUM(IT);
		  LINOUT("	"&SELPROD(I))
		END "ONE EXEC"
	  END "EACH EXEC" UNTIL B=0;
	END "EXEC LINES";
	DONE
  END "ENTRY LINE";

  IF LINE="⊗" ∨ LINE=";" THEN BEGIN PICKUP←FALSE; BLOUT(1); END ELSE
  IF SPAR="G" THEN LINOUT(IF LINE=" " THEN '11&'11&LINE[2 TO ∞] ELSE LINE)

 END "HANDLE DIRECTORY ENTRY";
END "DSCR2"
END "STEP2";
"Step 3 -- Make listing of data descriptions from EXTRACT"


IF DODAT THEN BEGIN "STEP3"
 INTEGER SAVL; STRING BLKDS1;
 OUTSTR("STEP 3
");
 CLOSE(DSKI1); RUNDSC←"DATA DESCRIPTIONS";
 LINOUT('14); DODSC←FALSE; EOF←FALSE; BLKDS1←NULL;
 LOOKUP(DSKI1,"EXTRACT",FLAG); IF FLAG THEN USERERR(0,0,"NO EXTRACT");
 LINENO←0; BLKNAM←"MAIN."; PAG←"1"; PICKUP←0;

 WHILE ¬EOF DO BEGIN "DATA2"
  LINE←READLINE(DSKI1);
  CHKPG1;
  CREF←IDENT(LINE);
  LIN←IDENT(LINE);

  NEEDNEXT FOR SPAR←"DATA",	   NULL,
		    "ZERODATA",    "ZEROED ",
		    "TABLEDATA",   NULL,
		    "TABCONDATA",  "CONSTANT ",
		    "ACDATA",	   "ACCUMULATOR DEFINITIONS FOR ",
		    "AC2DATA",	   "ACCUMULATOR DEFINITIONS FOR ",
		    "BITDATA",	   "BIT DEFINITIONS FOR ",
		    "BIT2DATA",	   "BIT DEFINITIONS FOR ",
		    "BITDDATA",	   "BIT DEFINITIONS FOR ",
		    "BITD2DATA",   "BIT DEFINITIONS FOR ",
		    "GARP",	   "GARP" 
  DO IF SUBEQU(SPAR,LINE) THEN BEGIN "START_DATA"
	PICKUP←TRUE; LINENO←0;
	TEMP1←LINE[LENGTH(SPAR)+3 TO ∞];	NEXT;
	IF ¬EQU(BLKDS1,TEMP1) THEN LINENO←0 ELSE LINENO←LINENO+100;
	BLKDS1←TEMP1;
	BLKDSC←" ("&SPAR&TEMP1;			DONE
  END "START_DATA"
  ELSE NEXT;

  IF PICKUP THEN CROUT(CREF,LIN,LINE);

  IF SUBEQU("ENDDATA",LINE) THEN PICKUP←FALSE
 END "DATA2"
END "STEP3";
"Step 4 -- Make cross-reference listing of DSCRS"

IF SRDSC THEN BEGIN "STEP4"
 STRING LS;

OUTSTR("STEP 4
");

 SYMSET; CLOSE(DSKI1); SYMBOL←HELINDEX←-1;
 RUNDSC←"ROUTINE SUMMARY";
 LINENO←0;
 EOF←FALSE;
 BLKTAB[BLKIDX←0]←"MAIN.";  BLKREF[0]←0;
 LOOKUP(DSKI1,"EXTRACT",FLAG); IF FLAG THEN USERERR(0,0,"NO EXTRACT");
 DODAT←FALSE;

WHILE ¬EOF DO BEGIN "GET DSCR"
 LINE←READLINE(DSKI1); CHKPG1; CREF←IDENT(LINE); LIN←IDENT(LINE);

 IF ¬EQU(BLKNAM,BLKTAB[BLKIDX]) THEN BEGIN
	BLKTAB[BLKIDX←BLKIDX+1]←BLKNAM;
	BLKREF[BLKIDX]←CVD(BCREF)
 END;

 IF SUBEQU("DSCR",LINE) THEN BEGIN "IS DSCR"
  STRING S;
  S←FILNAM&":"&BLKNAM&"&"&LIN&"/"&PAG&"("&CREF&")";
  IF SUMMARY THEN LINOUT((LINE[6 TO ∞]&BLANKS)[1 TO 33]
			&TAB&S[1 TO 70]);
  HELTAB[HELINDEX←HELINDEX+1]←S;
  LINE←LINE[5 TO ∞];
  DO BEGIN "ONE DSCR"
	TEMP←SCL(LINE,OVER_DEL);
	TEMP←SCL(LINE,TO_COMMA);
	IF LENGTH(TEMP)=0 ∨ TEMP="-" THEN DONE;
	SYM[SYMBOL←SYMBOL+1]←TEMP;
	NUMBER[SYMBOL]←HELINDEX;
  END "ONE DSCR" UNTIL BRK≠","
 END "IS DSCR"
END "GET DSCR";

SORT(SYM,NUMBER,512);
BLKREF[BLKIDX]←99999; RUNDSC←"ROUTINE CROSS-REFERENCE";
LINENO←0; CREFSET("CRFL",DSKI1,LINE,CREFNAME,FALSE); LS←"FOONLY";

FOR I←0 STEP 1 WHILE LENGTH(TEMP1←SYM[I]) DO
IF ¬("a"≤TEMP1≤"z") ∧¬EQU(TEMP1,LS) THEN
BEGIN
 LS←TEMP1;
 LINOUT(LS&TAB&HELTAB[NUMBER[I]]);
 CREFFIND(LS);
 BLOUT(1);
END;

END "STEP4";
"Step 5 -- Make cross-reference listing of DATA"

IF SRDAT THEN BEGIN "STEP5"
 STRING LS;
 STRING ARRAY MORSTR[0:511]; INTEGER PICK1;
 OUTSTR("STEP 5
");

 SYMSET;
 CLOSE(DSKI1); LINENO←0; SYMBOL←HELINDEX←-1;
 PICKUP←SRDSC←EOF←PICK1←FALSE; RUNDSC←"DATA SUMMARY";
 BLKTAB[BLKIDX←0]←"MAIN."; BLKREF[0]←0;
 LOOKUP(DSKI1,"EXTRACT",FLAG); IF FLAG THEN USERERR(0,0,"NO EXTRACT");

WHILE  ¬EOF DO BEGIN "GET DATA"
 LINE←READLINE(DSKI1); CHKPG1; CREF←IDENT(LINE); LIN←IDENT(LINE);

 IF ¬EQU(BLKNAM,BLKTAB[BLKIDX]) THEN BEGIN
	BLKTAB[BLKIDX←BLKIDX+1]←BLKNAM;
	BLKREF[BLKIDX]←CVD(BCREF)
 END;

  NEEDNEXT FOR SPAR←"DATA",	   NULL,
		    "ZERODATA",    "ZEROED ",
		    "TABLEDATA",   NULL,
		    "TABCONDATA",  "CONSTANT ",
		    "ACDATA",	   "ACCUMULATOR DEFINITIONS FOR ",
		    "AC2DATA",	   "ACCUMULATOR DEFINITIONS FOR ",
		    "BITDATA",	   "BIT DEFINITIONS FOR ",
		    "BIT2DATA",	   "BIT DEFINITIONS FOR ",
		    "BITDDATA",	   "BIT DEFINITIONS FOR ",
		    "BITD2DATA",   "BIT DEFINITIONS FOR ",
		    "GARP",	   "GARP"
  DO IF SUBEQU(SPAR,LINE) THEN BEGIN "S_DATA"
	IF LENGTH(SPAR)<5 ∨ SPAR[∞-4 FOR 1]≠"2" THEN PICK1←TRUE;
	PICKUP←TRUE; TEMP←LINE[LENGTH(SPAR)+3 TO ∞]; NEXT;
	BLKDSC←FILNAM&":"&BLKNAM&"&"&0&" ("&SPAR&TEMP; 
	IF SUMMARY THEN BEGIN BLOUT(2);
	  LINOUT(FILNAM&":"&BLKNAM&TAB&LINE);
	  BLOUT(1)
	END;

	HELTAB[HELINDEX←HELINDEX+1]←BLKDSC; DONE
  END "S_DATA" ELSE NEXT;
  IF SUBEQU("ENDDATA",LINE) THEN PICKUP←PICK1←FALSE;
  IF PICKUP∧SPAR="G" THEN BEGIN "ENTR"
	TEMP←SCL(LINE,TO_COL);
	IF (BRK=":"∨BRK="←")∧LENGTH(TEMP)≤15 THEN BEGIN "A1"
	 STRING PP;
	 PP←NULL;
	 WHILE TEMP="↑"∨TEMP="↓" DO PP←PP&LOP(TEMP);
	 PP←(BLANKS[1 FOR 2]&PP)[∞-1 FOR 2]&BRK;
	 PP←PP&LIN&"/"&PAG&"("&CREF&")";
	IF SUMMARY THEN LINOUT(TEMP&TAB&LIN&"/"&PAG&"("&CREF&")");
	IF PICK1 THEN BEGIN
	 SYM[SYMBOL←SYMBOL+1]←TEMP;
	 NUMBER[SYMBOL]←HELINDEX LSH 18+SYMBOL;
	 MORSTR[SYMBOL]←PP;
	END
	END "A1"
   END "ENTR"
  END "GET DATA";

SORT(SYM,NUMBER,512);
BLKREF[BLKIDX+1]←99999;
LINENO←0; CREFSET("CRFL",DSKI1,LINE,CREFNAME,FALSE); RUNDSC←"DATA CROSS-REFERENCE";
LS←"FOONLY";
FOR I←0 STEP 1 WHILE LENGTH(TEMP1←SYM[I]) DO
IF ¬EQU(LS,TEMP1) THEN
BEGIN STRING T1,T2,T3;
  LS←TEMP1;
  T2←SCAN(T3←HELTAB[NUMBER[I]LSH -18],TO_0,BRK);
  T1←(TEMP←MORSTR[NUMBER[I]LAND '777777])[1 FOR 2]&LS&
	TEMP[3 FOR 1];
  T1←T1[1 FOR 13]&BLANKS[1 FOR 13-LENGTH(T1)];
  LINOUT(T1&T2&TEMP[4 TO ∞]&T3);
  CREFFIND(LS);
  BLOUT(1);
END;

END "STEP5";
RELEASE(DSKI1);
RELEASE(DSKOUT);

END "DATALIST";