| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- 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.
|