editor.mod 3.3 KB

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