editor.mod 3.1 KB

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