-- CType.mesa -- Cat command for CIFS -- L. Stewart 19-Apr-82 16:26:03 -- Gifford July 7, 1982 4:47 pm -- February 3, 1983 2:41 pm by Schroeder DIRECTORY Ascii, CIFS, UserExec: TYPE USING [GetStreams, RegisterCommand, UserAbort, ResetUserAbort, CommandProc], FileIO: TYPE USING [StreamFromOpenFile], IO, Rope, UECP, ViewerIO: TYPE USING [CreateViewerStreams]; CType: PROGRAM IMPORTS CIFS, UECP, UserExec, FileIO, IO, ViewerIO = { -- Type a file typeC: Rope.ROPE = "Type Usage: type path The contents of path will be typed."; Type: UserExec.CommandProc = TRUSTED { fh: CIFS.OpenFile; riS: IO.Handle; argv: UECP.Argv _ UECP.Parse[event.commandLine]; n: NAT; h: IO.Handle = exec.GetStreams[].out; buffer: REF TEXT _ NEW[TEXT[256]]; IF argv.argc=1 THEN RETURN; { ENABLE { CIFS.Error => { h.PutF["%s\n", IO.rope[error]]; CONTINUE; }; IO.EndOfStream => { h.PutChar['\n]; CONTINUE; }; }; fh _ CIFS.Open[name: argv[1], mode: CIFS.read]; riS _ FileIO.StreamFromOpenFile[openFile: fh]; DO IF UserExec.UserAbort[exec] THEN EXIT; n _ riS.GetBlock[buffer]; h.PutBlock[buffer]; IF n # 256 THEN EXIT; ENDLOOP; IF n>0 AND buffer[n-1]#'\n THEN h.PutChar['\n]; }; UserExec.ResetUserAbort[exec]; IF riS#NIL THEN riS.Close[]; IF fh#NIL THEN CIFS.Close[fh]; }; -- Create a file by typing into it makeC: Rope.ROPE = "Make File Usage: make path A window will be created to accept input, and the input will be stored in the file named path."; Make: UserExec.CommandProc = TRUSTED { fh: CIFS.OpenFile; riS: IO.Handle; in, out: IO.Handle; argv: UECP.Argv _ UECP.Parse[event.commandLine]; continue: BOOL; buffer: REF TEXT _ NEW[TEXT[256]]; FillBuf: PROC RETURNS [BOOL] = { c: CHAR; buffer.length _ 0; DO c _ in.GetChar[! IO.EndOfStream => TRUSTED {GOTO done}; IO.Signal => TRUSTED {GOTO done}]; IF c = Ascii.ControlD THEN RETURN[FALSE]; buffer[buffer.length] _ c; buffer.length _ buffer.length + 1; IF buffer.length = buffer.maxLength THEN RETURN[TRUE]; ENDLOOP; EXITS done => RETURN[FALSE]; }; IF argv.argc=1 THEN RETURN; { ENABLE { CIFS.Error => { exec.GetStreams[].out.PutF["%s\n", IO.rope[error]]; CONTINUE; }; IO.EndOfStream => TRUSTED { exec.GetStreams[].out.PutChar['\n]; CONTINUE; }; }; fh _ CIFS.Open[name: argv[1], mode: CIFS.write+CIFS.replace]; riS _ FileIO.StreamFromOpenFile[openFile: fh]; -- create window to get input [in, out] _ ViewerIO.CreateViewerStreams["Input File. ^D ends input."]; in _ IO.CreateEditedStream[in, out]; DO continue _ FillBuf[]; IF buffer.length>0 THEN riS.PutBlock[buffer]; IF NOT continue THEN EXIT; ENDLOOP; IF buffer.length>0 AND buffer[buffer.length-1]#'\n THEN exec.GetStreams[].out.PutChar['\n]; }; IF riS#NIL THEN { riS.SetLength[riS.GetIndex[]]; riS.Close[]; }; IF fh#NIL THEN CIFS.Close[fh]; IF in#NIL THEN in.Close[]; }; -- Mainline UserExec.RegisterCommand["Type.~", Type, "Type file", typeC]; UserExec.RegisterCommand["Make.~", Make, "Input file", makeC]; }. Ę6˜JšˆĪc‘œĪk œ žœžœžœWžœžœžœ žœžœžœ"žœžœžœžœžœœžœbžœ žœžœžœžœ"žœ žœ-žœžœžœžœ žœ žœžœ žœ žœžœžœ žœ+žœžœžœ?žœžœžœžœBžœ žœžœžœžœžœžœ?žœžœžœžœžœžœžœ#œžœŖžœ žœžœžœžœžœ)žœžœžœžœžœ Īnœžœžœžœžœ!žœžœžœžœžœ žœžœ žœžœžœžœDžœ"žœžœžœžœžœžœžœžœ žœžœ žœ žœ0žœžœ žœžœ0žœžœžœžœBœVžœ"žœ#žœžœžœžœ žœžœžœžœžœžœ0žœžœžœHžœžœžœžœžœžœžœ œ†˜ã—…— æ"