editor.mod 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. MODULE editor;
  2. (* based on the kilo editor building course*)
  3. (* Step 21 *)
  4. (*** IMPORTS ***)
  5. IMPORT IO, termios, FIO, libc, CharClass, NumberIO, ASCII ;
  6. IMPORT STextIO, Strings;
  7. (*** data ***)
  8. VAR
  9. c : CHAR;
  10. theTermios : termios.TERMIOS;
  11. TCSAFLUSH : INTEGER;
  12. i : CARDINAL;
  13. (*** Terminal ***)
  14. PROCEDURE CtrlKey(c: CHAR) : CARDINAL;
  15. VAR
  16. n : BITSET;
  17. BEGIN
  18. n := BITSET(ORD(c));
  19. n := n * BITSET(1FH);
  20. RETURN CARDINAL(n)
  21. END CtrlKey;
  22. PROCEDURE die (s : ARRAY OF CHAR);
  23. BEGIN
  24. libc.perror(s);
  25. FOR i := 0 TO Strings.Length(s) DO
  26. IO.Write(s[i])
  27. END;
  28. HALT
  29. END die;
  30. PROCEDURE disablerawMode() : INTEGER;
  31. VAR
  32. result : INTEGER;
  33. BEGIN
  34. IO.BufferedMode(0,TRUE);
  35. IO.BufferedMode(1,TRUE);
  36. result := termios.tcsetattr(FIO.StdIn, TCSAFLUSH, theTermios);
  37. IF result = -1 THEN
  38. theTermios := termios.KillTermios(theTermios);
  39. die("tcsetattr")
  40. ELSE
  41. RETURN result
  42. END;
  43. END disablerawMode;
  44. PROCEDURE enablerawMode;
  45. BEGIN
  46. libc.atexit(disablerawMode);
  47. theTermios := termios.InitTermios();
  48. IF termios.tcgetattr(FIO.StdIn, theTermios) = -1 THEN
  49. die("tcgetattr")
  50. END;
  51. IO.UnBufferedMode(0,TRUE);
  52. IO.UnBufferedMode(1,TRUE);
  53. END enablerawMode;
  54. PROCEDURE editorReadKey() : CHAR;
  55. VAR
  56. c : CHAR;
  57. BEGIN
  58. IO.Read(c);
  59. RETURN c
  60. END editorReadKey;
  61. (*** Input ***)
  62. PROCEDURE editorProcessKeypress;
  63. VAR
  64. c : CHAR;
  65. BEGIN
  66. c := editorReadKey();
  67. CASE ORD(c) OF
  68. 17 : HALT;
  69. END
  70. END editorProcessKeypress;
  71. (*** Init ***)
  72. BEGIN
  73. TCSAFLUSH := termios.tcsflush ();
  74. enablerawMode;
  75. LOOP
  76. editorProcessKeypress;
  77. END;
  78. END editor.