editor.mod 2.6 KB

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