editor.mod 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. MODULE editor;
  2. (* based on the kilo editor building course*)
  3. (* Step 15 *)
  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. PROCEDURE disableRawMode(): INTEGER;
  13. VAR
  14. TCSAFLUSH : INTEGER;
  15. result : INTEGER;
  16. BEGIN
  17. TCSAFLUSH := termios.tcsflush ();
  18. result := termios.tcsetattr(FIO.StdIn, TCSAFLUSH, thetermios);
  19. RETURN result;
  20. END disableRawMode;
  21. PROCEDURE enableRawMode;
  22. VAR
  23. TCSAFLUSH : INTEGER;
  24. result : INTEGER;
  25. bresult : BOOLEAN;
  26. BEGIN
  27. TCSAFLUSH := termios.tcsflush ();
  28. libc.atexit(disableRawMode);
  29. bresult := termios.SetFlag(raw,termios.icrnl, FALSE);
  30. bresult := termios.SetFlag(raw,termios.ixon, FALSE);
  31. bresult := termios.SetFlag(raw,termios.lecho, FALSE);
  32. bresult := termios.SetFlag(raw,termios.opost, FALSE);
  33. bresult := termios.SetFlag(raw,termios.licanon, FALSE);
  34. bresult := termios.SetFlag(raw,termios.liexten, FALSE);
  35. bresult := termios.SetFlag(raw,termios.lisig, FALSE);
  36. bresult := termios.SetFlag(raw,termios.ibrkint, FALSE);
  37. bresult := termios.SetFlag(raw,termios.inpck, FALSE);
  38. bresult := termios.SetFlag(raw,termios.istrip, FALSE);
  39. bresult := termios.SetFlag(raw,termios.cs8, TRUE);
  40. result := termios.tcsetattr(FIO.StdIn, TCSAFLUSH, raw);
  41. END enableRawMode;
  42. BEGIN
  43. thetermios := termios.InitTermios();
  44. raw := termios.InitTermios();
  45. result := termios.tcgetattr(FIO.StdIn, thetermios);
  46. result := termios.tcgetattr(FIO.StdIn, raw);
  47. enableRawMode;
  48. p := SYSTEM.ADR(c);
  49. WHILE (FIO.ReadNBytes(FIO.StdIn,1,p) = 1) AND (c <> "q") DO
  50. IF ORD(c) > 32 THEN
  51. NumberIO.WriteCard(ORD(c),5);
  52. STextIO.WriteString(" ('");
  53. STextIO.WriteChar(c);
  54. STextIO.WriteString(" ')");
  55. STextIO.WriteLn;
  56. STextIO.WriteChar(CHR(13));
  57. ELSE
  58. NumberIO.WriteCard(ORD(c),5);
  59. STextIO.WriteLn;
  60. (* found how to solve the problem ....*)
  61. (* we have to send chr(13) to get the control chars to be printed out *)
  62. STextIO.WriteChar(CHR(13));
  63. END;
  64. END;
  65. END editor.