editor.mod 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. MODULE editor;
  2. (* based on the kilo editor building course*)
  3. (* Step 6 *)
  4. IMPORT FIO, SYSTEM, termios, libc, STextIO;
  5. VAR
  6. c : CHAR;
  7. p : POINTER TO CHAR;
  8. thetermios : termios.TERMIOS;
  9. result : INTEGER;
  10. PROCEDURE disableRawMode(): INTEGER;
  11. (* PROCEDURE tcsetattr (fd: INTEGER; option: INTEGER; t: TERMIOS) : INTEGER ; *)
  12. (* PROCEDURE tcsflush () : INTEGER ; like drain, except discard any pending input *)
  13. VAR
  14. TCSAFLUSH : INTEGER;
  15. result : INTEGER;
  16. BEGIN
  17. (* we have to call this procedure because in C, it's a macro *)
  18. TCSAFLUSH := termios.tcsflush ();
  19. result := termios.tcsetattr(FIO.StdOut, TCSAFLUSH, SYSTEM.ADR(thetermios));
  20. RETURN result;
  21. END disableRawMode;
  22. PROCEDURE enableRawMode;
  23. (* PROCEDURE tcgetattr (fd: INTEGER; t: TERMIOS) : INTEGER ; *)
  24. (* exitP = PROCEDURE () : INTEGER ; *)
  25. (* PROCEDURE atexit (proc: exitP) : [ INTEGER ] ; *)
  26. (* PROCEDURE SetFlag (t: TERMIOS; f: Flag; b: BOOLEAN) : BOOLEAN ; *)
  27. VAR
  28. TCSAFLUSH : INTEGER;
  29. result : INTEGER;
  30. bresult : BOOLEAN;
  31. raw : termios.TERMIOS;
  32. BEGIN
  33. TCSAFLUSH := termios.tcsflush ();
  34. result := termios.tcgetattr(2, SYSTEM.ADR(thetermios));
  35. libc.atexit(disableRawMode);
  36. raw := thetermios;
  37. bresult := termios.SetFlag(SYSTEM.ADR(raw),termios.lecho, TRUE);
  38. result := termios.tcsetattr(2, TCSAFLUSH, SYSTEM.ADR(raw));
  39. END enableRawMode;
  40. BEGIN
  41. enableRawMode;
  42. p := SYSTEM.ADR(c);
  43. (* PROCEDURE ReadNBytes (f: File; nBytes: CARDINAL; dest: ADDRESS) : CARDINAL ; *)
  44. WHILE (FIO.ReadNBytes(FIO.StdIn,1,p) = 1) AND (c <> "q") DO
  45. ;
  46. END;
  47. END editor.