perm filename FILES.SAI[PUB,TES]1 blob sn#130586 filedate 1974-11-08 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00013 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGOF("FILES")
C00003 00003	PUBLIC SIMPLE PROCEDURE FILES! $"#
C00004 00004	PUBLIC SIMPLE PROCEDURE FINIFILES $"#
C00005 00005	IFSITE TENEX THENK
C00006 00006	IFSITE  CMUVER THENK
C00007 00007	PUBLIC INTEGER PROCEDURE OPENTOREAD(INTEGER MODE 
C00011 00008	IFSITE TENEX THENK TES 10/25/73 
C00012 00009	IFSITE TENEX THENK
C00013 00010	IFSITE TENEX THENK
C00014 00011	PUBLIC INTEGER SIMPLE PROCEDURE WRITEON(BOOLEAN BINARY STRING FILENAME) $"#
C00015 00012	IFSITE TENEX THENK
C00017 00013	FINISHED
C00018 ENDMK
C⊗;
BEGOF("FILES")

COMMENT

      *** Variations at Different Sites for Most Procedures ***
*** NB *** UNCVFIL NEEDS CASES FOR CMU AND ITS ****

Processing of input file names and opening of input files is
installation-dependent.  Most of the options are handled by a single
routine called OPENTOREAD.

Output file opening is simpler and handled by WRITEON.
;

IFC TENEX THENC
DEFINE CHANGE(A,B)= [IF NULSTR(A) AND FULSTR(B) THEN B ELSE 0];
ELSEC
DEFINE CHANGE(A,B)= [IF A=0 THEN B ELSE 0];
ENDC

PROCEDURES
PUBLIC SIMPLE PROCEDURE FILES! ;$"#
BEGIN "FILES!"
THISFILE ← "(NO FILE)" ;
MAINFILE ← INFILE ;
END "FILES!" ;
PUBLIC SIMPLE PROCEDURE FINIFILES ;$"#
BEGIN "FINIFILES"
IF GENREXT THEN OUTFILE ← OUTFILE &
    IFC CMUVER THENC (IF ABS(DEVICE)=XGP THEN ".XGO" ELSE ".DOC") ENDC
    IFC SAILVER THENC (IF ABS(DEVICE)=XGP THEN ".XGP" ELSE ".DOC") ENDC
    IFCR PARCVER THENC PARCEXT ENDC
    IFC ISIVER THENC (IF ABS(DEVICE)=XGP THEN ".XGO" ELSE ".DOC") ENDC	RT01 10/25/74;
    IFC ITSVER THENC DOCEXT ENDC;	PJ 5/27/74;
END "FINIFILES" ;
IFSITE TENEX THENK
PRIVATE SITE(TENEX) STRING SIMPLE PROCEDURE CVFIL(STRING FILENAME; REFERENCE STRING EXT, PPN) ;$"#
	BEGIN
	STRING NAME ;
	PPN ← IF FILENAME[1 FOR 1] = "<" THEN SCANTO(">", FILENAME, TRUE) ELSE NULL ;
	NAME ← SCANTO(".;", FILENAME, FALSE) ;
	EXT ← IF FILENAME[1 FOR 1] = "." THEN SCANTO(";", FILENAME, FALSE) ELSE NULL ;
	RETURN(NAME) ;
	END ;
ENDC
IFSITE  CMUVER THENK
PRIVATE SITE(CMUVER) STRING SIMPLE PROCEDURE CVPPN(INTEGER VALUE) ;$"#
BEGIN "CVPPN"
OWN SAFE INTEGER ARRAY A[0:1];
INTEGER ERRSW;
STRING S;
DEFINE CALLI="'47000000000",	DECCMU="-3";

IF VALUE = 0 THEN RETURN (NULL);

A[0]←A[1]←0;
START!CODE
    SETZM 0,ERRSW;
    MOVE 1,A;
    HRLI 1,VALUE;
    CALLI 1,DECCMU;
    SETOM 0,ERRSW;
END;

RETURN ("["&
	(  IF ERRSW THEN (CVOS(VALUE LSH -18)&","&CVOS(VALUE LAND '777777))
		    ELSE (CVSTR(A[0])&CVSTR(A[1])[1 FOR 3])  )
	& "]");

END "CVPPN";
ENDC
PUBLIC INTEGER PROCEDURE OPENTOREAD(INTEGER MODE ;
	STRING FILEKIND ; REFERENCE STRING FILENAME;
	IFC TENEX THENC STRING ELSEC INTEGER ENDC EXTDEFAULT, PPNDEFAULT) ;$"#
BEGIN TES 8/24/74 PROCEDURIZED ;
label labeltogetaroundcompilerbug;
INTEGER CHAN, C ; BOOLEAN GOTIT ;
IFC TENEX THENC STRING ELSEC INTEGER ENDC  FEXT, FPPN, EXTD, PPNI, PPND, NAME, EXT, PPN ;
STRING NF ;
STRING INDEVICE ;	RKJ: 5-17-74 ;
SETBREAK(LOCAL!TABLE,":",NULL,"IS");
INDEVICE←SCAN(INFILE,LOCAL!TABLE,DUMMY);
IF NULSTR(INFILE) THEN BEGIN INFILE←INDEVICE; INDEVICE←"DSK" END ;
IF (CHAN←GETCHAN)<0 THEN EARLYWARNING("NO CHANNELS ARE LEFT FOR INPUT!") ;
EOF ← 0 ;
OPEN(CHAN,INDEVICE,MODE, 2,0,150,BRC,EOF);
GOTIT ← FALSE ;
DO  BEGIN "NAMELOOP"
	NAME ← CVFIL(FILENAME, FEXT, FPPN) ;
	FOR C ← 0 THRU 5 DO
	    BEGIN
	    EXT ← FEXT ; PPN ← FPPN ;
	    CASE C OF
	        BEGIN "LKPCASES"
	    	BEGIN END ;
	    	IF (EXTD←EXT←CHANGE(FEXT, EXTDEFAULT)) = 0 THEN CONTINUE ;
	    	IF (PPNI←PPN←CHANGE(FPPN, INPPN)) = 0 THEN CONTINUE ;
	    	IF (EXT←EXTD) = 0 OR (PPN←PPNI) = 0 THEN CONTINUE ;
	    	IF (PPND←PPN←CHANGE(FPPN, PPNDEFAULT)) = 0 THEN CONTINUE ;
	    	IF (EXT←EXTD)=0 OR (PPN←PPND)=0 THEN CONTINUE ;
	        END "LKPCASES" ;
	    GOTIT ← XLOOKUP(CHAN,NAME,EXT,0,PPN);
	    IF GOTIT THEN DONE ;
	    END ;
	IF GOTIT THEN DONE ;
	IFC PARCVER THENC  TES 10/21/74 SO FONT 2 "SERIF" WORKS ;
	IF FILEKIND[1 TO 4] = "Font" AND FULSTR(NF←FONTEQUIV(NAME)) THEN
		FILENAME ← NF ELSE
	ENDC
	BEGIN
	IF NOT SWDBACK THEN OUTSTR(CRLF) ; SWDBACK ← TRUE ;
	OUTSTR(FILEKIND & FILENAME & " not found." & CRLF & "Read file: ");
	IFC TENEX THENC
		RELEASE(CHAN);
		OUTSTR(PPND←PPNDEFAULT) ;
		DO	BEGIN  TES 10/22/74 ;
			CHAN ← GTJFNL(PPND,'162000000000,'100000101,
				NULL,PPNDEFAULT[2 TO ∞-1],
				NAME,EXTDEFAULT[2 TO ∞],
				NULL, NULL, NULL) ;
			IF CHAN>-1 THEN DONE ;
			OUTSTR("XXX"&CRLF&"Read file: ") ; PPND←NULL ;
			END
		UNTIL FALSE ;
		SETINPUT(CHAN,150,BRC,EOF) ; TES 10/16/74 ;
		OPENF(CHAN, 2) ;
		DONE ;
	ELSEC
		FILENAME ← INCHWL ;
	ENDC
	END ;
    END "NAMELOOP"
UNTIL GOTIT ;
labeltogetaroundcompilerbug:
FILENAME ← UNCVFIL(CHAN, NAME, EXT, PPN) ;
RETURN(CHAN) ;
END "OPENTOREAD" ;

IFSITE TENEX THENK TES 10/25/73 ;
PRIVATE SITE(TENEX) STRING PROCEDURE SCANTO(STRING BRKS; REFERENCE STRING SCANNEE; BOOLEAN INCLUDE) ;$"#
	BEGIN
	INTEGER DUMMY ;
	SETBREAK(LOCAL!TABLE, BRKS, NULL, IF INCLUDE THEN "IA" ELSE "IR") ;
	RETURN(SCAN(SCANNEE, LOCAL!TABLE, DUMMY)) ;
	END ;
ENDC
IFSITE TENEX THENK
PUBLIC SITE(TENEX) SIMPLE PROCEDURE SFBSZ(INTEGER CHAN, SIZE) ;$"#
	BEGIN "SFBSZ"
	INTEGER K ;
	DEFINE JSYS=['104000000000], SFBSZ=[JSYS '46];
	K ← CVJFN(CHAN) ;
	START!CODE "BYTE16"
	MOVE 1,K; MOVE 2,SIZE; SFBSZ ;
	END "BYTE16" ;
	END "SFBSZ" ;
ENDC
IFSITE TENEX THENK
PUBLIC SITE(TENEX) SIMPLE STRING PROCEDURE UNCVFIL(INTEGER CHAN; STRING NAME, EXT, PPN) ;$"#
	RETURN(JFNS(CHAN, 0)) ;
ENDC

IFSITE NOT TENEX THENK
PUBLIC SITE(NOT TENEX) SIMPLE STRING PROCEDURE UNCVFIL(INTEGER CHAN, NAME, EXT, PPN) ;$"#
RETURN(
	IFC SAILVER THENC
		CV6STR(NAME) &
		(IF EXT=0 THEN NULL ELSE "." & CV6STR(EXT)[1 TO 3]) &
		(IF PPN=0 THEN NULL ELSE "[" & CVXSTR(PPN)[1 TO 3] &
			"," & CVXSTR(PPN)[4 TO 6] & "]")
	ENDC
	IFC CMUVER THENC
		CVXSTR(NAME) &
		(IF EXT=0 THEN NULL ELSE "." & CVXSTR(EXT)[1 TO 3]) &
		CVPPN(PPN)
	ENDC
      ) ;
ENDC
PUBLIC INTEGER SIMPLE PROCEDURE WRITEON(BOOLEAN BINARY; STRING FILENAME) ;$"#
BEGIN "WRITEON"
INTEGER CH ;
IF (CH ← GETCHAN) < 0 THEN
	BEGIN
	WARN("=",<"No channel for writing "&FILENAME>);
	RETURN(-1) ;
	END ;
K ← 0 ; OPEN(CH, "DSK", IF BINARY THEN 8 ELSE 0, 0, 2, DUMMY, DUMMY, K) ;
ENTER(CH, FILENAME, DUMMY←0) ;
IF DUMMY THEN WARN("=","ENTER failed for "&FILENAME);
RETURN(CH) ;
END "WRITEON" ;
IFSITE TENEX THENK
PUBLIC SITE(TENEX) BOOLEAN SIMPLE PROCEDURE XLOOKUP(INTEGER CHAN; STRING NAME, EXT; INTEGER JUNK; STRING PPN) ;$"#
	BEGIN COMMENT RETURNS TRUE IF SUCCESSFUL ;
	BOOLEAN FLAG ;
	LOOKUP(CHAN, PPN & NAME & EXT, FLAG) ;
	RETURN(NOT FLAG) ;
	END ;
ENDC

IFSITE NOT TENEX THENK
PUBLIC SITE(NOT TENEX) BOOLEAN SIMPLE PROCEDURE XLOOKUP(INTEGER CHAN, NAME, EXT, JUNK, PPN) ;$"#
START!CODE "XLOOKUP"
    MOVE 2,CHAN;
    LSH 2,23;
IFC ITSVER
    THENC IOR 2,['027017777774] PJ 5/28/74 ;
    ELSEC IOR 2,['076017777774] ENDC ; COMMENT LOOKUP 0,-4(17) ;
    SETO 1,0; COMMENT TRUE ;
    XCT 0,2;
    SETZ 1,0; COMMENT FALSE ;
END "XLOOKUP";
ENDC
FINISHED

ENDOF("FILES")