perm filename FILES.MAX[PUB,TES]1 blob sn#129327 filedate 1974-11-07 generic text, type T, neo UTF8
00100	BEGOF("FILES")
00200	
00300	COMMENT
00400	
00500	      *** Variations at Different Sites for Most Procedures ***
00600	*** NB *** UNCVFIL NEEDS CASES FOR CMU AND ITS ****
00700	
00800	Processing of input file names and opening of input files is
00900	installation-dependent.  Most of the options are handled by a single
01000	routine called OPENTOREAD.
01100	
01200	Output file opening is simpler and handled by WRITEON.
01300	;
01400	
01500	IFC TENEX THENC
01600	DEFINE CHANGE(A,B)= [IF NULSTR(A) AND FULSTR(B) THEN B ELSE 0];
01700	ELSEC
01800	DEFINE CHANGE(A,B)= [IF A=0 THEN B ELSE 0];
01900	ENDC
02000	
02100	PROCEDURES
     

00100	PUBLIC SIMPLE PROCEDURE FILES! ;$"#
00200	BEGIN "FILES!"
00300	THISFILE ← "(NO FILE)" ;
00400	MAINFILE ← INFILE ;
00500	END "FILES!" ;
     

00100	PUBLIC SIMPLE PROCEDURE FINIFILES ;$"#
00200	BEGIN "FINIFILES"
00300	IF GENREXT THEN OUTFILE ← OUTFILE &
00400	    IFC CMUVER THENC (IF ABS(DEVICE)=XGP THEN ".XGO" ELSE ".DOC") ENDC
00500	    IFC SAILVER THENC (IF ABS(DEVICE)=XGP THEN ".XGP" ELSE ".DOC") ENDC
00600	    IFCR PARCVER THENC PARCEXT ENDC
00650	    IFC ISIVER THENC (IF ABS(DEVICE)=XGP THEN ".XGO" ELSE ".DOC") ENDC	RT01 10/25/74;
00700	    IFC ITSVER THENC DOCEXT ENDC;	PJ 5/27/74;
00800	END "FINIFILES" ;
     

00100	IFSITE TENEX THENK
00200	PRIVATE SITE(TENEX) STRING SIMPLE PROCEDURE CVFIL(STRING FILENAME; REFERENCE STRING EXT, PPN) ;$"#
00300		BEGIN
00400		STRING NAME ;
00500		PPN ← IF FILENAME[1 FOR 1] = "<" THEN SCANTO(">", FILENAME, TRUE) ELSE NULL ;
00600		NAME ← SCANTO(".;", FILENAME, FALSE) ;
00700		EXT ← IF FILENAME[1 FOR 1] = "." THEN SCANTO(";", FILENAME, FALSE) ELSE NULL ;
00800		RETURN(NAME) ;
00900		END ;
01000	ENDC
     

00100	IFSITE  CMUVER THENK
00200	PRIVATE SITE(CMUVER) STRING SIMPLE PROCEDURE CVPPN(INTEGER VALUE) ;$"#
00300	BEGIN "CVPPN"
00400	OWN SAFE INTEGER ARRAY A[0:1];
00500	INTEGER ERRSW;
00600	STRING S;
00700	DEFINE CALLI="'47000000000",	DECCMU="-3";
00800	
00900	IF VALUE = 0 THEN RETURN (NULL);
01000	
01100	A[0]←A[1]←0;
01200	START!CODE
01300	    SETZM 0,ERRSW;
01400	    MOVE 1,A;
01500	    HRLI 1,VALUE;
01600	    CALLI 1,DECCMU;
01700	    SETOM 0,ERRSW;
01800	END;
01900	
02000	RETURN ("["&
02100		(  IF ERRSW THEN (CVOS(VALUE LSH -18)&","&CVOS(VALUE LAND '777777))
02200			    ELSE (CVSTR(A[0])&CVSTR(A[1])[1 FOR 3])  )
02300		& "]");
02400	
02500	END "CVPPN";
02600	ENDC
     

00100	PUBLIC INTEGER PROCEDURE OPENTOREAD(INTEGER MODE ;
00200		STRING FILEKIND ; REFERENCE STRING FILENAME;
00300		IFC TENEX THENC STRING ELSEC INTEGER ENDC EXTDEFAULT, PPNDEFAULT) ;$"#
00400	BEGIN TES 8/24/74 PROCEDURIZED ;
00500	label labeltogetaroundcompilerbug;
00600	INTEGER CHAN, C ; BOOLEAN GOTIT ;
00700	IFC TENEX THENC STRING ELSEC INTEGER ENDC  FEXT, FPPN, EXTD, PPNI, PPND, NAME, EXT, PPN ;
00705	STRING NF ;
00800	STRING INDEVICE ;	RKJ: 5-17-74 ;
00900	SETBREAK(LOCAL!TABLE,":",NULL,"IS");
01000	INDEVICE←SCAN(INFILE,LOCAL!TABLE,DUMMY);
01100	IF NULSTR(INFILE) THEN BEGIN INFILE←INDEVICE; INDEVICE←"DSK" END ;
01200	IF (CHAN←GETCHAN)<0 THEN EARLYWARNING("NO CHANNELS ARE LEFT FOR INPUT!") ;
01300	EOF ← 0 ;
01400	OPEN(CHAN,INDEVICE,MODE, 2,0,150,BRC,EOF);
01500	GOTIT ← FALSE ;
01600	DO  BEGIN "NAMELOOP"
01700		NAME ← CVFIL(FILENAME, FEXT, FPPN) ;
01800		FOR C ← 0 THRU 5 DO
01900		    BEGIN
02000		    EXT ← FEXT ; PPN ← FPPN ;
02100		    CASE C OF
02200		        BEGIN "LKPCASES"
02300		    	BEGIN END ;
02400		    	IF (EXTD←EXT←CHANGE(FEXT, EXTDEFAULT)) = 0 THEN CONTINUE ;
02500		    	IF (PPNI←PPN←CHANGE(FPPN, INPPN)) = 0 THEN CONTINUE ;
02600		    	IF (EXT←EXTD) = 0 OR (PPN←PPNI) = 0 THEN CONTINUE ;
02700		    	IF (PPND←PPN←CHANGE(FPPN, PPNDEFAULT)) = 0 THEN CONTINUE ;
02800		    	IF (EXT←EXTD)=0 OR (PPN←PPND)=0 THEN CONTINUE ;
02900		        END "LKPCASES" ;
03000		    GOTIT ← XLOOKUP(CHAN,NAME,EXT,0,PPN);
03100		    IF GOTIT THEN DONE ;
03200		    END ;
03300		IF GOTIT THEN DONE ;
03320		IFC PARCVER THENC  TES 10/21/74 SO FONT 2 "SERIF" WORKS ;
03325		IF FILEKIND[1 TO 4] = "Font" AND FULSTR(NF←FONTEQUIV(NAME)) THEN
03330			FILENAME ← NF ELSE
03360		ENDC
03380		BEGIN
03390		IF NOT SWDBACK THEN OUTSTR(CRLF) ; SWDBACK ← TRUE ;
03400		OUTSTR(FILEKIND & FILENAME & " not found." & CRLF & "Read file: ");
03500		IFC TENEX THENC
03600			RELEASE(CHAN);
03700			OUTSTR(PPND←PPNDEFAULT) ;
03710			DO	BEGIN  TES 10/22/74 ;
03720				CHAN ← GTJFNL(PPND,'162000000000,'100000101,
03730					NULL,PPNDEFAULT[2 TO ∞-1],
03732					NAME,EXTDEFAULT[2 TO ∞],
03740					NULL, NULL, NULL) ;
03742				IF CHAN>-1 THEN DONE ;
03744				OUTSTR("XXX"&CRLF&"Read file: ") ; PPND←NULL ;
03746				END
03748			UNTIL FALSE ;
03750			SETINPUT(CHAN,150,BRC,EOF) ; TES 10/16/74 ;
03775			OPENF(CHAN, 2) ;
03800			DONE ;
03900		ELSEC
04000			FILENAME ← INCHWL ;
04100		ENDC
04150		END ;
04200	    END "NAMELOOP"
04300	UNTIL GOTIT ;
04400	labeltogetaroundcompilerbug:
04500	FILENAME ← UNCVFIL(CHAN, NAME, EXT, PPN) ;
04600	RETURN(CHAN) ;
04700	END "OPENTOREAD" ;
04800	
     

00100	IFSITE TENEX THENK TES 10/25/73 ;
00200	PRIVATE SITE(TENEX) STRING PROCEDURE SCANTO(STRING BRKS; REFERENCE STRING SCANNEE; BOOLEAN INCLUDE) ;$"#
00300		BEGIN
00400		INTEGER DUMMY ;
00500		SETBREAK(LOCAL!TABLE, BRKS, NULL, IF INCLUDE THEN "IA" ELSE "IR") ;
00600		RETURN(SCAN(SCANNEE, LOCAL!TABLE, DUMMY)) ;
00700		END ;
00800	ENDC
     

00100	IFSITE TENEX THENK
00200	PUBLIC SITE(TENEX) SIMPLE PROCEDURE SFBSZ(INTEGER CHAN, SIZE) ;$"#
00300		BEGIN "SFBSZ"
00400		INTEGER K ;
00500		DEFINE JSYS=['104000000000], SFBSZ=[JSYS '46];
00600		K ← CVJFN(CHAN) ;
00700		START!CODE "BYTE16"
00800		MOVE 1,K; MOVE 2,SIZE; SFBSZ ;
00900		END "BYTE16" ;
01000		END "SFBSZ" ;
01100	ENDC
     

00100	IFSITE TENEX THENK
00200	PUBLIC SITE(TENEX) SIMPLE STRING PROCEDURE UNCVFIL(INTEGER CHAN; STRING NAME, EXT, PPN) ;$"#
00300		RETURN(JFNS(CHAN, 0)) ;
00400	ENDC
00500	
00600	IFSITE NOT TENEX THENK
00700	PUBLIC SITE(NOT TENEX) SIMPLE STRING PROCEDURE UNCVFIL(INTEGER CHAN, NAME, EXT, PPN) ;$"#
00800	RETURN(
00900		IFC SAILVER THENC
01000			CVXSTR(NAME) &
01100			(IF EXT=0 THEN NULL ELSE "." & CVXSTR(EXT)[1 TO 3]) &
01200			(IF PPN=0 THEN NULL ELSE "[" & CVXSTR(PPN)[1 TO 3] &
01300				"," & CVXSTR(PPN)[4 TO 6] & "]")
01400		ENDC
01410		IFC CMUVER THENC
01420			CVXSTR(NAME) &
01430			(IF EXT=0 THEN NULL ELSE "." & CVXSTR(EXT)[1 TO 3]) &
01440			CVPPN(PPN)
01450		ENDC
01500	      ) ;
01600	ENDC
     

00100	PUBLIC INTEGER SIMPLE PROCEDURE WRITEON(BOOLEAN BINARY; STRING FILENAME) ;$"#
00200	BEGIN "WRITEON"
00300	INTEGER CH ;
00400	IF (CH ← GETCHAN) < 0 THEN
00500		BEGIN
00600		WARN("=",<"No channel for writing "&FILENAME>);
00700		RETURN(-1) ;
00800		END ;
00900	K ← 0 ; OPEN(CH, "DSK", IF BINARY THEN 8 ELSE 0, 0, 2, DUMMY, DUMMY, K) ;
01000	ENTER(CH, FILENAME, DUMMY←0) ;
01100	IF DUMMY THEN WARN("=","ENTER failed for "&FILENAME);
01200	RETURN(CH) ;
01300	END "WRITEON" ;
     

00100	IFSITE TENEX THENK
00200	PUBLIC SITE(TENEX) BOOLEAN SIMPLE PROCEDURE XLOOKUP(INTEGER CHAN; STRING NAME, EXT; INTEGER JUNK; STRING PPN) ;$"#
00300		BEGIN COMMENT RETURNS TRUE IF SUCCESSFUL ;
00400		BOOLEAN FLAG ;
00500		LOOKUP(CHAN, PPN & NAME & EXT, FLAG) ;
00600		RETURN(NOT FLAG) ;
00700		END ;
00800	ENDC
00900	
01000	IFSITE NOT TENEX THENK
01100	PUBLIC SITE(NOT TENEX) BOOLEAN SIMPLE PROCEDURE XLOOKUP(INTEGER CHAN, NAME, EXT, JUNK, PPN) ;$"#
01200	START!CODE "XLOOKUP"
01300	    MOVE 2,CHAN;
01400	    LSH 2,23;
01500	IFC ITSVER
01600	    THENC IOR 2,['027017777774] PJ 5/28/74 ;
01700	    ELSEC IOR 2,['076017777774] ENDC ; COMMENT LOOKUP 0,-4(17) ;
01800	    SETO 1,0; COMMENT TRUE ;
01900	    XCT 0,2;
02000	    SETZ 1,0; COMMENT FALSE ;
02100	END "XLOOKUP";
02200	ENDC
     

00100	FINISHED
00200	
00300	ENDOF("FILES")