MODULE editor; (* based on the kilo editor building course*) (* Step 16 *) IMPORT FIO, SYSTEM, termios, STextIO, NumberIO; IMPORT CharClass, STextIO, libc; VAR c : CHAR; p : POINTER TO CHAR; thetermios : termios.TERMIOS; raw : termios.TERMIOS; result : INTEGER; number : CARDINAL; PROCEDURE disableRawMode(): INTEGER; VAR TCSAFLUSH : INTEGER; result : INTEGER; BEGIN TCSAFLUSH := termios.tcsflush (); result := termios.tcsetattr(FIO.StdIn, TCSAFLUSH, thetermios); RETURN result; END disableRawMode; PROCEDURE enableRawMode; VAR TCSAFLUSH : INTEGER; result : INTEGER; bresult : BOOLEAN; BEGIN TCSAFLUSH := termios.tcsflush (); libc.atexit(disableRawMode); bresult := termios.SetFlag(raw,termios.icrnl, FALSE); bresult := termios.SetFlag(raw,termios.ixon, FALSE); bresult := termios.SetFlag(raw,termios.lecho, FALSE); bresult := termios.SetFlag(raw,termios.opost, FALSE); bresult := termios.SetFlag(raw,termios.licanon, FALSE); bresult := termios.SetFlag(raw,termios.liexten, FALSE); bresult := termios.SetFlag(raw,termios.lisig, FALSE); bresult := termios.SetFlag(raw,termios.ibrkint, FALSE); bresult := termios.SetFlag(raw,termios.inpck, FALSE); bresult := termios.SetFlag(raw,termios.istrip, FALSE); bresult := termios.SetFlag(raw,termios.cs8, TRUE); result := termios.tcsetattr(FIO.StdIn, TCSAFLUSH, raw); (* PROCEDURE SetChar (t: TERMIOS; c: ControlChar; ch: CHAR) : BOOLEAN ; *) (* termios.vmin := 0; termios.vtime := 1; *) bresult := termios.SetChar(raw,termios.vmin,CHR(0)); bresult := termios.SetChar(raw,termios.vtime,CHR(1)); 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); LOOP c := CHR(0); number := (FIO.ReadNBytes(FIO.StdIn,1,p)); IF ORD(c) < 32 THEN NumberIO.WriteCard(ORD(c),5); STextIO.WriteLn; STextIO.WriteChar(CHR(13)); ELSE NumberIO.WriteCard(ORD(c),5); STextIO.WriteString(" ('"); STextIO.WriteChar(c); STextIO.WriteString(" ')"); STextIO.WriteLn; STextIO.WriteChar(CHR(13)); END; IF c = "q" THEN EXIT END; END; END editor.