perm filename PRUNE[1,MWK] blob
sn#064372 filedate 1974-01-02 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00006 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGIN "PRUNE_DANISH" COMMENT MANAGER FOR DISK SYSTEMS
C00003 00003 BEGIN EXECUTION HERE
C00004 00004 BEGIN "DYNAMIC ALLOCATION"
C00007 00005 STRING PROCEDURE LINE(INTEGER I)
C00010 00006 OUTSTR("Type H<cr> for help. C<cr> for a list of commands.
C00022 ENDMK
C⊗;
BEGIN "PRUNE_DANISH" COMMENT MANAGER FOR DISK SYSTEMS;
COMMENT R.E. GORIN 25 MAY 72;
COMMENT TOUCHED BY RHT 11 NOV 72;
REQUIRE 2000 STRING_SPACE;
DEFINE CRLF="'15&'12",
DIRCHAN="1",
FCHAN="2",
PCHAN="3",
HEADER="""FILNAM EXT USER USE""&CRLF&CRLF";
INTEGER I,J,K,L,EOF,BRCHR,DIRSIZ;
INTEGER ARRAY LOOKUPBLOCK[0:5];
INTEGER EOF2,BRCHR2;
INTEGER FILENAME,EXT,LOSER,PPN;
BOOLEAN CHANGE;
STRING STR,COMLST;
EXTERNAL INTEGER _SKIP_;
EXTERNAL PROCEDURE SPOOL(STRING S;INTEGER IOCHAN,FLAGS);
COMMENT BEGIN EXECUTION HERE;
IF (I←CALL(0,"DSKPPN"))≠CALL(0,"GETPPN") THEN OUTSTR("PRUNING "&CVXSTR(I)&"
");
SETBREAK(3,"."&" ",NULL,"ISN");
OPEN(DIRCHAN,"DSK",'17,0,0,0,BRCHR,EOF);
LOOKUP(DIRCHAN,CVXSTR(I)&".UFD[1,1]",EOF);
IF EOF THEN USERERR(0,0,"CANT FIND UFD");
FILEINFO(LOOKUPBLOCK);
START_CODE
MOVS LOOKUPBLOCK[3];
ASH -2;
MOVNM DIRSIZ;
END;
BEGIN "DYNAMIC ALLOCATION"
INTEGER ARRAY DIRECTORY[1:DIRSIZ,0:3];
STRING ARRAY USE[1:DIRSIZ];
BOOLEAN PROCEDURE LESS(INTEGER A,B);
BEGIN
INTEGER A1,A2,B1,B2,ISLESS;
A1←DIRECTORY[A,1];
A2←DIRECTORY[A,0];
B1←DIRECTORY[B,1];
B2←DIRECTORY[B,0];
START_CODE
LABEL BAZ;
SETZM ISLESS;
HLRZ 1,A1;
HLRZ 2,B1;
CAME 1,2;
JRST BAZ;
HLRZ 1,A2;
HLRZ 2,B2;
CAME 1,2;
JRST BAZ;
HRRZ 1,A2;
HRRZ 2,B2;
BAZ: CAMLE 1,2;
SETOM ISLESS;
END;
RETURN(ISLESS);
END;
PROCEDURE SORT;
BEGIN INTEGER J,K,FATHER,SON,SON1,SON2;
FOR J ← 2 STEP 1 UNTIL DIRSIZ DO BEGIN
K ← J;
FATHER ← K LSH -1;
WHILE ((FATHER>0)∧LESS(K,FATHER)) DO BEGIN
FOR I←0 STEP 1 UNTIL 3 DO DIRECTORY[K,I]↔DIRECTORY[FATHER,I];
USE[K]↔USE[FATHER];
K ← FATHER;
FATHER ← K LSH -1;
END;
END;
FOR J ← DIRSIZ STEP -1 UNTIL 2 DO BEGIN
FOR I←0 STEP 1 UNTIL 3 DO DIRECTORY[1,I]↔DIRECTORY[J,I];
USE[1]↔USE[J];
FATHER ← 1;
SON1← FATHER LSH 1;
SON← SON2← SON1+1;
WHILE SON1 < J DO BEGIN
IF ((SON2 = J) ∨ LESS(SON1,SON2)) THEN SON ← SON1;
IF LESS(SON,FATHER) THEN BEGIN;
FOR I←0 STEP 1 UNTIL 3 DO DIRECTORY[SON,I]↔DIRECTORY[FATHER,I];
USE[SON]↔USE[FATHER];
FATHER ← SON;
SON1 ← FATHER LSH 1; SON ← SON2 ← SON1+1;
END ELSE DONE;
END;
END;
END;
STRING PROCEDURE LINE(INTEGER I);
RETURN(CVXSTR(DIRECTORY[I,0])&'11&CVXSTR(DIRECTORY[I,1])&'11&
CVXSTR(DIRECTORY[I,3])&'11&USE[I]&CRLF);
ARRYIN(DIRCHAN,DIRECTORY[1,0],(DIRSIZ)*4);
FOR J←1 STEP 1 UNTIL DIRSIZ DO IF
(K←DIRECTORY[J,0])
∧ ¬( ((L←(DIRECTORY[J,1]LAND '777777000000))=CVSIX("RPG "))
∨ ( (L=CVSIX("DAT ")) ∧ (K=CVSIX("PRUNE ")) ))
THEN BEGIN
DIRECTORY[J,1]←L;
DIRECTORY[J,3]←0;
END ELSE DIRECTORY[J,1]←-1;
SORT;
WHILE DIRECTORY[DIRSIZ,1]=-1 DO DIRSIZ←DIRSIZ-1;
RELEASE(DIRCHAN);
OPEN(FCHAN,"DSK",0,2,2,200,BRCHR2,EOF2);
LOOKUP(FCHAN,"PRUNE.DAT",EOF2);
IF ¬EOF2 THEN BEGIN
SETBREAK(1,'11&'12,'15,"ISN");
SETBREAK(2,'12,'11&'15,"ISN");
WHILE TRUE DO BEGIN
LABEL SNEXT,SERR,SERR1;
STR←INPUT(FCHAN,1);
IF EOF2 ∧ EQU(STR,NULL) THEN DONE;
IF BRCHR2≠'11 THEN BEGIN
SERR: IF BRCHR2≠'12 THEN STR←INPUT(FCHAN,2);
OUTSTR("ERROR IN PRUNE.DAT"&CRLF);
GO TO SNEXT;
END;
FILENAME←CVSIX(STR);
STR←INPUT(FCHAN,1);
IF BRCHR2≠'11 THEN GO TO SERR;
EXT←CVSIX(STR);
STR←INPUT(FCHAN,1);
IF BRCHR2≠'11 THEN GO TO SERR;
LOSER←CVSIX(STR);
STR←INPUT(FCHAN,2);
FOR J←1 STEP 1 UNTIL DIRSIZ DO
IF DIRECTORY[J,0]=FILENAME ∧ EXT = DIRECTORY[J,1] THEN
IF USE[J] THEN BEGIN
OUTSTR("REPEATED ENTRY: ");
GO TO SERR1;
END
ELSE BEGIN
DIRECTORY[J,3]←LOSER;
USE[J]←STR;
GO TO SNEXT;
END;
OUTSTR("NOT FOUND: ");
SERR1:OUTSTR(CVXSTR(FILENAME)&'11&CVXSTR(EXT)&'11&CVXSTR(LOSER)&'11&STR&CRLF);
SNEXT:END;
END;
CLOSE(FCHAN);
CHANGE←FALSE;
OUTSTR("Type H<cr> for help. C<cr> for a list of commands.
");
COMLST←"Commands:
W Write out PRUNE.DAT
F<file specifier> (Find) Types lines for specified files.
BF<file specifier> (Blank Find) Types lines for specified files with blank lines.
M<file specifier> (Modify) Changes lines for specified files.
BM<file specifier> (Blank Modify) Change lines for files with blank lines.
Z<file specifier> Edit lines specified with line editor (displays only)
D<file specifier> Delete (i.e. destroy) the named files.
BD<file specifier> Delete any specified files which have blank lines.
S<file specifier> Spool the specified files.
BS<file specifier> Spool any specified files with blank lines.
T<file specifier> Type the first few lines of the named files.
L List lines for all files on line printer
BL List lines with blank description on line printer
E Exit (Will warn of unwritten PRUNE.DAT file)
Where a <file specifer> is <filename>.<extension><tab><user>. Any of
these terms may be omitted and '*' will be assumed.
Example: 'FPRUNE' Finds all lines with PRUNE as a filename.
";
SETBREAK(7,NULL,NULL,"IAP");
WHILE TRUE DO BEGIN
INTEGER PROCEDURE FIND(INTEGER LAST);
BEGIN INTEGER I;
FOR I←LAST+1 STEP 1 UNTIL DIRSIZ DO
IF DIRECTORY[I,0] ∧
(FILENAME=CVSIX("*") ∨ FILENAME=DIRECTORY[I,0])
∧ (EXT=CVSIX("*") ∨ EXT=DIRECTORY[I,1])
∧ (PPN=CVSIX("*") ∨ PPN=DIRECTORY[I,3]) THEN RETURN(I);
RETURN(0);
END;
PROCEDURE FILESPEC;
BEGIN INTEGER BRKCHR;
IF (FILENAME←CVSIX(SCAN(STR←INCHWL,3,BRKCHR)))=0
THEN FILENAME←CVSIX("*");
IF BRKCHR≠"." ∨ (EXT←CVSIX(SCAN(STR,3,BRKCHR)))=0
THEN EXT←CVSIX("*");
IF BRKCHR≠" " ∨ (PPN←CVSIX(SCAN(STR,3,BRKCHR)))=0
THEN PPN←CVSIX("*");
END;
LABEL ERR,EAT,LIST1,FIND1,MODIFY,ZMODIFY,DEL1,SPOOL1;
BOOLEAN ALL;
INTEGER ZFLAG;
DEFINE TTYUUO="'51000000000";
INTEGER PROCEDURE ONEINLINE;
START_CODE
TTYUUO 4,1;
ANDI 1,'177; COMMENT FLUSH BUCKY BITS;
CAIL 1,'140; COMMENT CONVERT LOWER CASE TVR - OCT '72;
SUBI 1,'40
END;
EAT: OUTSTR("*");
ALL←TRUE;
CASE ONEINLINE OF BEGIN
["C"+0]BEGIN
IF INCHWL THEN GO TO ERR;
OUTSTR(COMLST);
GO TO EAT;
END;
["H"+0]BEGIN INTEGER CHN,CNT,BRK,EOF; COMMENT READ PRUNE[3,2]!;
IF INCHWL THEN GO TO ERR;
OPEN(CHN←GETCHAN,"DSK",0,2,0,CNT←80,BRK,EOF);
LOOKUP(CHN,"PRUNE[3,2]",EOF);
IF EOF THEN BEGIN OUTSTR("HELP FILE (PRUNE[3,2]) NOT FOUND");
GO TO EAT; END;
DO OUTSTR(INPUT(CHN,0)) UNTIL EOF;
RELEASE(CHN);
OUTSTR("
Type C<return> for a list of commands.
");
GO TO EAT;
END;
["B"+0]BEGIN
ALL←FALSE;
CASE ONEINLINE OF BEGIN
["F"+0]GO TO FIND1;
["M"+0]GO TO MODIFY;
["L"+0]GO TO LIST1;
["S"+0]GO TO SPOOL1;
["D"+0]GO TO DEL1
END;
END;
["W"+0]BEGIN
IF INCHWL THEN GO TO ERR;
ENTER(FCHAN,"PRUNE.DAT",EOF2);
IF EOF2 THEN OUTSTR("CAN'T ENTER PRUNE.DAT"&CRLF)
ELSE BEGIN
FOR I←1 STEP 1 UNTIL DIRSIZ DO
IF DIRECTORY[I,3] ∨ USE[I] THEN OUT(FCHAN,LINE(I));
CLOSE(FCHAN);
RENAME(FCHAN,"PRUNE.DAT",'200,EOF2);
CHANGE←FALSE;
END;
GO TO EAT;
END;
["F"+0]BEGIN
FIND1: FILESPEC;
I←0;
OUTSTR(HEADER);
WHILE I←FIND(I) DO
IF ALL ∨ ¬(DIRECTORY[I,3] ∨ USE[I]) THEN OUTSTR(LINE(I));
GO TO EAT;
END;
["M"+0]BEGIN
MODIFY: ZFLAG←FALSE;
ZMODIFY:FILESPEC;
I←0;
WHILE I←FIND(I) DO IF ALL ∨ ¬(DIRECTORY[I,3] ∨ USE[I]) THEN BEGIN
OUTSTR(LINE(I));
OUTSTR("NEW PROGRAMMER STRING?");
IF ZFLAG THEN LODED(CVXSTR(DIRECTORY[I,3])&'15);
COMMENT TVR - OCT '72;
STR←INCHWL;
IF _SKIP_='175 THEN BEGIN OUTSTR('15&'12);
DONE; END;
IF ¬EQU(STR,"∃") THEN BEGIN
DIRECTORY[I,3]←CVSIX(STR);
CHANGE←TRUE;
END;
OUTSTR("NEW USE STRING?");
IF ZFLAG THEN LODED(USE[I]&'15); COMMENT TVR - OCT '72;
STR←INCHWL;
IF _SKIP_='175 THEN BEGIN OUTSTR('15&'12); DONE; END;
IF ¬EQU(STR,"∃") THEN BEGIN
USE[I]←STR;
CHANGE←TRUE;
END;
END;
GO TO EAT;
END;
["Z"+0]BEGIN COMMENT LOAD LINE EDITOR DURING MODIFY;
START_CODE COMMENT PTGETL IS WRITTEN UP IN THE MANUAL
BUT THE COMPILER DOESN'T SEEM TO
KNOW ABOUT IT!;
SETOM ZFLAG;
TTYUUO 6,ZFLAG;
END;
IF ZFLAG LAND '420000000000 THEN GO TO ZMODIFY;
OUTSTR("I AM SORRY BUT THIS WILL NOT WORK ON A TELETYPE.
");
GO TO EAT;
END;
["L"+0]BEGIN
LIST1: IF INCHWL THEN GO TO ERR;
OPEN(PCHAN,"LPT",0,0,2,0,0,0);
OUT(PCHAN,HEADER);
FOR I←1 STEP 1 UNTIL DIRSIZ DO
IF DIRECTORY[I,0]∧
(ALL ∨ ¬(DIRECTORY[I,3] ∨ USE[I])) THEN
OUT(PCHAN,LINE(I));
RELEASE(PCHAN);
GO TO EAT;
END;
["S"+0] BEGIN
SPOOL1: FILESPEC;
I←0;
WHILE I←FIND(I) DO
IF (ALL ∨ ¬(DIRECTORY[I,3] ∨ USE[I])) THEN
BEGIN
STRING FID;
FID←CVXSTR(DIRECTORY[I,0])&"."&(CVXSTR(DIRECTORY[I,1]));
OUTSTR("SPOOL "&FID&"?");
IF EQU(STR←INCHWL,"Y") ∨ EQU(STR,"YES") THEN
SPOOL(FID,GETCHAN,0);
END;
GO TO EAT;
END;
["T"+0] BEGIN "TYPE"
FILESPEC;
I←0;
WHILE I←FIND(I) DO
BEGIN
STRING FID;INTEGER INCH;
INTEGER X,BC,CT;
FID←CVXSTR(DIRECTORY[I,0])&"."&
CVXSTR(X←DIRECTORY[I,1] LAND '777777000000);
IF X=CVSIX("DMP")∨X=CVSIX("REL")∨X=CVSIX("DAT") THEN
BEGIN
OUTSTR("DO YOU REALLY WANT TO TYPE FILE ");
OUTSTR(FID);
OUTSTR("?");
IF (INCHWL LAND '137)≠"Y" THEN CONTINUE;
END;
INCH←GETCHAN;
OPEN(INCH,"DSK",0,3,0,CT,BC,X);
LOOKUP(INCH,FID,X);
IF X THEN
BEGIN
OUTSTR("FILE NOT FOUND: ");
OUTSTR(FID);
OUTSTR('15&'12);
CONTINUE;
END;
CT←256;
OUTSTR(FID);OUTSTR(":
----------
");
DO BEGIN
OUTSTR(INPUT(INCH,7));
IF ¬X THEN
OUTSTR("
----------
Do you want to see more?")
ELSE
DONE;
END UNTIL (INCHWL LAND '137)≠"Y";
RELEASE(INCH);
OUTSTR("
↑↑↑↑↑↑↑↑↑↑
");
END;
GO TO EAT;
END;
["E"+0]IF INCHWL THEN GO TO ERR ELSE
BEGIN
IF CHANGE THEN
BEGIN
OUTSTR("FILE MODIFIED, BUT NOT WRITTEN. ARE YOU SURE YOU WANT TO EXIT?");
IF ¬(EQU(STR←INCHWL,"Y") ∨ EQU(STR,"YES")) THEN GO TO EAT;
END;
DONE;
END;
["D"+0] BEGIN
COMMENT DELETION OF FILES -- BLAME RHT FOR TROUBLES;
DEL1: FILESPEC;
I←0;
WHILE I←FIND(I) DO
IF (ALL ∨ ¬(DIRECTORY[I,3] ∨ USE[I])) THEN
BEGIN
STRING FID;
FID←CVXSTR(DIRECTORY[I,0])&"."&CVXSTR(DIRECTORY[I,1]);
OUTSTR("DO YOU REALLY WANT TO DELETE FILE "&FID&"?");
IF ¬(EQU(STR←INCHWL,"Y")∨EQU(STR,"YES")) THEN CONTINUE;
LOOKUP(FCHAN,FID,EOF2);
IF EOF2 THEN
BEGIN
OUTSTR(" LOOKUP FAILED FOR "&FID&'15&'12);
CONTINUE;
END;
RENAME(FCHAN,NULL,0,EOF2);
IF EOF2 THEN
BEGIN
OUTSTR(" RENAME FAILED FOR "&FID&'15&'12);
CONTINUE;
END;
OUTSTR("DELETED: "&FID&'15&'12);
CLOSE(FCHAN);
IF DIRECTORY[I,3] ∨ USE[I] THEN CHANGE←TRUE;
FOR J←0 STEP 1 UNTIL 3 DO DIRECTORY[I,J]←0;
USE[I]←NULL;
END;
GO TO EAT;
END;
['12]BEGIN
OUTSTR('15);
GO TO EAT;
END;
['137]BEGIN END; COMMENT SO WE DON'T GET CASE OVERFLOW! TVR - OCT '72;
['15]BEGIN
ONEINLINE;
GO TO EAT;
END
END;
INCHWL;
ERR:OUTSTR("HUH?, type 'H<cr>' for help"&CRLF);
END;
END "DYNAMIC ALLOCATION"
END "PRUNE_DANISH"