MODULE---------------------------------------------------------------------------; IMPORT Stdio, Rd, Wr, Text, TextSeq; IMPORT SMsg AS Msg, TextUtils, System; Confirmation
PROCEDURE---------------------------------------------------------------------------OkayStdio (<*UNUSED*> self : StdIOClosure; msg : TEXT) : BOOLEAN = VAR answer : TEXT; BEGIN LOOP TRY Wr.PutText(Stdio.stdout, msg & "? [y(es)<cr>/n(o)<cr>] "); Wr.Flush(Stdio.stdout); answer := Rd.GetLine(Stdio.stdin); answer := TextUtils.Compress(answer); EXCEPT Rd.Failure => Msg.Error("reader failure on stdin"); RETURN FALSE; | Rd.EndOfFile => Msg.Error("eof on stdin"); RETURN FALSE; | Wr.Failure => Msg.Error("writer failure on stdout"); RETURN FALSE; ELSE Msg.Error("exception while reading confirmation"); RETURN FALSE; (* if anything is wrong we don't want to continue *) END; IF Text.Equal(answer, "y") OR Text.Equal(answer, "yes") OR Text.Equal(answer, "Y") OR Text.Equal(answer, "YES") THEN RETURN TRUE; ELSIF Text.Equal(answer, "n") OR Text.Equal(answer, "no") OR Text.Equal(answer, "N") OR Text.Equal(answer, "NO") THEN RETURN FALSE; END; TRY Wr.PutText(Stdio.stdout, "\nPlease answer `yes' or `no'\n"); Wr.Flush(Stdio.stdout); EXCEPT Rd.Failure => Msg.Error("reader failure on stdin"); RETURN FALSE; | Rd.EndOfFile => Msg.Error("eof on stdin"); RETURN FALSE; | Wr.Failure => Msg.Error("writer failure on stdout"); RETURN FALSE; ELSE Msg.Error("exception while reading confirmation"); RETURN FALSE; (* if anything is wrong we don't want to continue *) END; END; END OkayStdio;
PROCEDURE---------------------------------------------------------------------------OkayExternal (self : ExternalClosure; msg : TEXT) : BOOLEAN = VAR ret : INTEGER; arg := NEW(TextSeq.T).init(); cmd := self.cmd; BEGIN arg.addhi(msg & "? "); IF cmd = NIL THEN cmd := "confirm"; END; TRY ret := System.Exec(cmd, arg); EXCEPT ELSE Msg.Error("cannot call external confirmation program " & cmd); RETURN FALSE; END; RETURN ret = 0; END OkayExternal;
PROCEDURE---------------------------------------------------------------------------Get (msg : TEXT) : BOOLEAN = BEGIN RETURN confirmation.okay(msg); END Get;
PROCEDURE---------------------------------------------------------------------------SetDefault (cl : Closure) = BEGIN confirmation := cl; END SetDefault;
VAR confirmation : Closure; BEGIN confirmation := NEW(StdIOClosure); END Confirmation.