MODULE editor; (* based on the kilo editor building course*) (* Step 7 *) IMPORT FIO, SYSTEM, termios, libc, STextIO; VAR c : CHAR; p : POINTER TO CHAR; thetermios : termios.TERMIOS; raw : termios.TERMIOS; result : INTEGER; PROCEDURE disableRawMode(): INTEGER; (* PROCEDURE tcsetattr (fd: INTEGER; option: INTEGER; t: TERMIOS) : INTEGER ; *) (* PROCEDURE tcsflush () : INTEGER ; like drain, except discard any pending input *) VAR TCSAFLUSH : INTEGER; result : INTEGER; BEGIN (* we have to call this procedure because in C, it's a macro *) TCSAFLUSH := termios.tcsflush (); result := termios.tcsetattr(FIO.StdIn, TCSAFLUSH, thetermios); RETURN result; END disableRawMode; PROCEDURE enableRawMode; (* PROCEDURE tcgetattr (fd: INTEGER; t: TERMIOS) : INTEGER ; *) (* exitP = PROCEDURE () : INTEGER ; *) (* PROCEDURE atexit (proc: exitP) : [ INTEGER ] ; *) (* PROCEDURE SetFlag (t: TERMIOS; f: Flag; b: BOOLEAN) : BOOLEAN ; *) VAR TCSAFLUSH : INTEGER; result : INTEGER; bresult : BOOLEAN; BEGIN TCSAFLUSH := termios.tcsflush (); libc.atexit(disableRawMode); bresult := termios.SetFlag(raw,termios.lecho, FALSE); result := termios.tcsetattr(FIO.StdIn, TCSAFLUSH, raw); END enableRawMode; BEGIN thetermios := termios.InitTermios(); raw := termios.InitTermios(); result := termios.tcgetattr(FIO.StdIn, thetermios); result := termios.tcgetattr(FIO.StdIn, raw); enableRawMode; p := SYSTEM.ADR(c); (* PROCEDURE ReadNBytes (f: File; nBytes: CARDINAL; dest: ADDRESS) : CARDINAL ; *) WHILE (FIO.ReadNBytes(FIO.StdIn,1,p) = 1) AND (c <> "q") DO ; END; (* result := disableRawMode(); *) END editor.