editor.mod 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. MODULE editor;
  2. (* based on the kilo editor building course*)
  3. (* Step 18 *)
  4. IMPORT FIO, SYSTEM, termios, STextIO, NumberIO;
  5. IMPORT CharClass, STextIO, libc;
  6. VAR
  7. c : CHAR;
  8. p : POINTER TO CHAR;
  9. thetermios : termios.TERMIOS;
  10. raw : termios.TERMIOS;
  11. result : INTEGER;
  12. number : CARDINAL;
  13. PROCEDURE die (s : ARRAY OF CHAR);
  14. BEGIN
  15. libc.perror(s);
  16. HALT
  17. END die;
  18. PROCEDURE disableRawMode(): INTEGER;
  19. VAR
  20. TCSAFLUSH : INTEGER;
  21. result : INTEGER;
  22. BEGIN
  23. TCSAFLUSH := termios.tcsflush ();
  24. IF termios.tcsetattr(FIO.StdIn, TCSAFLUSH, thetermios) = -1 THEN
  25. die("tcsetattr")
  26. END;
  27. RETURN result;
  28. END disableRawMode;
  29. PROCEDURE enableRawMode;
  30. VAR
  31. TCSAFLUSH : INTEGER;
  32. result : INTEGER;
  33. bresult : BOOLEAN;
  34. BEGIN
  35. TCSAFLUSH := termios.tcsflush ();
  36. libc.atexit(disableRawMode);
  37. bresult := termios.SetFlag(raw,termios.icrnl, FALSE);
  38. bresult := termios.SetFlag(raw,termios.ixon, FALSE);
  39. bresult := termios.SetFlag(raw,termios.lecho, FALSE);
  40. bresult := termios.SetFlag(raw,termios.opost, FALSE);
  41. bresult := termios.SetFlag(raw,termios.licanon, FALSE);
  42. bresult := termios.SetFlag(raw,termios.liexten, FALSE);
  43. bresult := termios.SetFlag(raw,termios.lisig, FALSE);
  44. bresult := termios.SetFlag(raw,termios.ibrkint, FALSE);
  45. bresult := termios.SetFlag(raw,termios.inpck, FALSE);
  46. bresult := termios.SetFlag(raw,termios.istrip, FALSE);
  47. bresult := termios.SetFlag(raw,termios.cs8, TRUE);
  48. IF termios.tcsetattr(FIO.StdIn, TCSAFLUSH, raw) = -1 THEN
  49. die("tcsetattr")
  50. END;
  51. (* PROCEDURE SetChar (t: TERMIOS; c: ControlChar; ch: CHAR) : BOOLEAN ; *)
  52. (* termios.vmin := 0;
  53. termios.vtime := 1; *)
  54. bresult := termios.SetChar(raw,termios.vmin,CHR(0));
  55. bresult := termios.SetChar(raw,termios.vtime,CHR(1));
  56. END enableRawMode;
  57. BEGIN
  58. thetermios := termios.InitTermios();
  59. raw := termios.InitTermios();
  60. IF termios.tcgetattr(FIO.StdIn, thetermios) = -1 THEN
  61. die("tcgetattr")
  62. END;
  63. IF termios.tcgetattr(FIO.StdIn, raw) = -1 THEN
  64. die("tcgetattr")
  65. END;
  66. enableRawMode;
  67. p := SYSTEM.ADR(c);
  68. LOOP
  69. c := CHR(0);
  70. number := (FIO.ReadNBytes(FIO.StdIn,1,p));
  71. IF ORD(c) < 32 THEN
  72. NumberIO.WriteCard(ORD(c),5);
  73. STextIO.WriteLn;
  74. STextIO.WriteChar(CHR(13));
  75. ELSE
  76. NumberIO.WriteCard(ORD(c),5);
  77. STextIO.WriteString(" ('");
  78. STextIO.WriteChar(c);
  79. STextIO.WriteString(" ')");
  80. STextIO.WriteLn;
  81. STextIO.WriteChar(CHR(13));
  82. END;
  83. IF c = "q" THEN
  84. EXIT
  85. END;
  86. END;
  87. END editor.