-- 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 TEXTNEW[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 TEXTNEW[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];

}.