editor.mod 1.9 KB

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