-- Grapevine: Lily: misc input/output procedures
-- [Juniper]<Grapevine>Lily>LilySend.mesa
-- Andrew Birrell 4-Jan-82 15:27:32
DIRECTORY
Ascii,
GlassDefs USING[ Handle, StringType ],
LilyIODefs USING[ Confirmation ],
LogDefs USING[ WriteLine, WriteLogEntry ],
MailParse USING[ endOfInput ],
String USING[ AppendDecimal, AppendString];
LilyIO: PROGRAM
IMPORTS LogDefs, String
EXPORTS LilyIODefs =
BEGIN
AppendFromInput: PUBLIC PROC[str: GlassDefs.Handle,
firstChar: CHARACTER,
write: PROC[CHARACTER],
unwrite: PROC RETURNS[CHARACTER],
type: GlassDefs.StringType]
RETURNS[end: CHARACTER] =
BEGIN
OPEN str;
dummy: CHARACTER = '*; --used for echo if type = pwd--
MyUnwrite: PROCEDURE =
BEGIN
prev: CHARACTER = unwrite[];
IF prev # MailParse.endOfInput
THEN BEGIN
WriteChar['\];
WriteChar[IF type = pwd THEN dummy ELSE prev];
END;
END;
ClearWord: PROCEDURE =
BEGIN
state: { alpha, other } ← other;
DO prev: CHARACTER = unwrite[];
SELECT prev FROM
MailParse.endOfInput => EXIT;
IN ['a..'z], IN ['A..'Z], IN ['0..'9] => state ← alpha;
ENDCASE => IF state # other THEN { write[prev]; EXIT };
WriteChar['\];
WriteChar[IF type = pwd THEN dummy ELSE prev];
ENDLOOP;
END;
end ← firstChar;
DO SELECT end FROM
Ascii.ControlA, Ascii.BS => MyUnwrite[];
Ascii.ControlW => ClearWord[];
Ascii.ControlR => {WriteString["↑R"L]; WriteChar[Ascii.CR]; EXIT};
ENDCASE =>
BEGIN
SELECT end FROM
Ascii.SP => IF type # line AND type # any THEN EXIT;
Ascii.CR => IF type # any THEN EXIT;
Ascii.ESC, Ascii.DEL => EXIT;
ENDCASE => NULL;
write[end]; WriteChar[end];
END;
end ← ReadChar[];
ENDLOOP;
END;
Confirm: PUBLIC PROC[ str: GlassDefs.Handle]
RETURNS[ answer: LilyIODefs.Confirmation ] =
BEGIN
OPEN str;
DO WriteString[" [Confirm] "L];
SELECT ReadChar[] FROM
'y, 'Y, Ascii.SP, Ascii.CR => { answer ← yes; EXIT };
'n, 'N => { answer ← no; EXIT };
Ascii.DEL => { answer ← del; EXIT };
ENDCASE =>
WriteChar['?];
ENDLOOP;
WriteString[SELECT answer FROM
yes => "yes ... "L,
no => "no"L,
ENDCASE => "XXX"L];
SendNow[];
END;
Type: PUBLIC PROC[str: GlassDefs.Handle,
readChar: PROC RETURNS[ CHARACTER ],
lastChar: CHARACTER] =
BEGIN
str.WriteChar[Ascii.CR];
DO c: CHARACTER = readChar[]; IF c = lastChar THEN EXIT;
IF str.DelTyped[] THEN EXIT;
str.WriteChar[c];
ENDLOOP;
END;
LogAction: PUBLIC PROC[n: CARDINAL, action: STRING] =
BEGIN
log: STRING = [128];
IF n = 0 THEN RETURN;
String.AppendString[log, "Lily: connection #"L];
String.AppendDecimal[log, n];
String.AppendString[log, ": "L];
String.AppendString[log, action];
LogDefs.WriteLine[log]; LogDefs.WriteLogEntry[log];
END;
END.