MoreImpl.mesa
Copyright Ó 1988 by Xerox Corporation. All rights reserved.
Swinehart, September 20, 1988 9:12:08 am PDT
DIRECTORY
Ascii USING [ DEL ],
Commander USING [CommandProc, GetProperty, Register],
CommandTool USING [ NextArgument ],
Convert USING [ IntFromRope ],
EditedStream USING [GetEcho, Rubout, SetEcho ],
IO,
Rope USING [ROPE]
;
MoreImpl: CEDAR PROGRAM
IMPORTS Commander, CommandTool, Convert, EditedStream, IO ~ {
OPEN IO;
MoreCmd: Commander.CommandProc = {
[cmd: Commander.Handle] RETURNS [result: REF ANYNIL, msg: ROPENIL]
controlStream: IO.STREAMNARROW[
Commander.GetProperty[key: $ErrorInputStream, aList: cmd.propertyList]];
echoStream: IO.STREAM;
RestoreEchoStream: PROC = {
IF echoStream#NIL THEN EditedStream.SetEcho[controlStream, echoStream];
echoStream ← NIL;
};
numLinesR: Rope.ROPE ← CommandTool.NextArgument[cmd];
numLines: INT ← 0;
lineCount: INT ← 0;
IF numLinesR#NIL THEN numLines ← Convert.IntFromRope[numLinesR];
IF controlStream = NIL THEN RETURN[$Failed, "*** No error stream ***"];
echoStream ← EditedStream.GetEcho[controlStream];
IF echoStream#NIL THEN EditedStream.SetEcho[controlStream, NIL];
{
ENABLE {
IO.EndOfStream => { RestoreEchoStream[]; CONTINUE; };
IO.Error => GOTO Failed;
UNWIND => RestoreEchoStream[];
};
controlChar: CHAR;
waiting: BOOLFALSE;
pleaseWait: BOOLFALSE;
controlStream: IO.STREAMNARROW[
Commander.GetProperty[key: $ErrorInputStream, aList: cmd.propertyList]];
WHILE TRUE DO
controlChar ← Ascii.DEL;
IF controlStream.CharsAvail[]=0 AND ~waiting THEN {
c: CHAR ← cmd.in.GetChar[];
cmd.out.PutChar[c];
IF c = '\n THEN {
lineCount ← lineCount+1;
IF pleaseWait THEN waiting ← TRUE
ELSE IF numLines#0 AND lineCount MOD numLines = 0 THEN {
cmd.err.PutRope["***More?"]; waiting ← TRUE;
};
};
}
ELSE {
controlChar ← Ascii.DEL;
controlChar← controlStream.GetChar[!EditedStream.Rubout => CONTINUE];
SELECT controlChar FROM
Ascii.DEL, '. => { RestoreEchoStream[]; RETURN[$ManualTermination, "-- <del>"]; };
ENDCASE => IF waiting THEN { waiting ← pleaseWait ← FALSE; lineCount ← 0; }
ELSE pleaseWait ← ~pleaseWait;
};
ENDLOOP;
RestoreEchoStream[];
EXITS
Failed => { RestoreEchoStream[]; RETURN[$Failed, "*** Uncaught IO Error ***"]};
};
};
Commander.Register["More", MoreCmd, "Repeats its input"];
}.