Ansi.mod 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. IMPLEMENTATION MODULE Ansi;
  2. IMPORT ASCII;
  3. FROM STextIO IMPORT WriteChar, WriteString;
  4. FROM NumberIO IMPORT WriteCard;
  5. IMPORT IO, termios, FIO;
  6. VAR
  7. savedTerm : termios.TERMIOS;
  8. flushFlag : INTEGER;
  9. haveTerm : BOOLEAN;
  10. PROCEDURE CSI;
  11. BEGIN WriteChar(ASCII.esc); WriteChar("["); END CSI;
  12. PROCEDURE CSIq;
  13. BEGIN WriteChar(ASCII.esc); WriteString("[?"); END CSIq;
  14. PROCEDURE CSIe;
  15. BEGIN WriteChar(ASCII.esc); WriteString("[="); END CSIe;
  16. PROCEDURE ESC1(c : CHAR);
  17. BEGIN WriteChar(ASCII.esc); WriteChar(c); END ESC1;
  18. (* Cursor *)
  19. PROCEDURE Home; BEGIN CSI; WriteChar("H"); END Home;
  20. PROCEDURE Position(line, col : CARDINAL);
  21. BEGIN CSI; WriteCard(line, 1); WriteChar(";"); WriteCard(col, 1); WriteChar("H"); END Position;
  22. PROCEDURE HVPosition(line, col : CARDINAL);
  23. BEGIN CSI; WriteCard(line, 1); WriteChar(";"); WriteCard(col, 1); WriteChar("f"); END HVPosition;
  24. PROCEDURE Up(n : CARDINAL); BEGIN CSI; WriteCard(n, 1); WriteChar("A"); END Up;
  25. PROCEDURE Down(n : CARDINAL); BEGIN CSI; WriteCard(n, 1); WriteChar("B"); END Down;
  26. PROCEDURE Right(n : CARDINAL); BEGIN CSI; WriteCard(n, 1); WriteChar("C"); END Right;
  27. PROCEDURE Left(n : CARDINAL); BEGIN CSI; WriteCard(n, 1); WriteChar("D"); END Left;
  28. PROCEDURE NextLine(n : CARDINAL); BEGIN CSI; WriteCard(n, 1); WriteChar("E"); END NextLine;
  29. PROCEDURE PrevLine(n : CARDINAL); BEGIN CSI; WriteCard(n, 1); WriteChar("F"); END PrevLine;
  30. PROCEDURE ToColumn(n : CARDINAL); BEGIN CSI; WriteCard(n, 1); WriteChar("G"); END ToColumn;
  31. PROCEDURE CursorUpScroll; BEGIN ESC1("M"); END CursorUpScroll;
  32. PROCEDURE SaveDEC; BEGIN ESC1("7"); END SaveDEC;
  33. PROCEDURE RestoreDEC; BEGIN ESC1("8"); END RestoreDEC;
  34. PROCEDURE SaveSCO; BEGIN CSI; WriteChar("s"); END SaveSCO;
  35. PROCEDURE RestoreSCO; BEGIN CSI; WriteChar("u"); END RestoreSCO;
  36. PROCEDURE RequestPosition; BEGIN CSI; WriteString("6n"); END RequestPosition;
  37. (* Erase *)
  38. PROCEDURE EraseDown; BEGIN CSI; WriteChar("J"); END EraseDown;
  39. PROCEDURE EraseUp; BEGIN CSI; WriteString("1J"); END EraseUp;
  40. PROCEDURE EraseScreen; BEGIN CSI; WriteString("2J"); END EraseScreen;
  41. PROCEDURE EraseSavedLines; BEGIN CSI; WriteString("3J"); END EraseSavedLines;
  42. PROCEDURE EraseLineRight; BEGIN CSI; WriteChar("K"); END EraseLineRight;
  43. PROCEDURE EraseLineLeft; BEGIN CSI; WriteString("1K"); END EraseLineLeft;
  44. PROCEDURE EraseLine; BEGIN CSI; WriteString("2K"); END EraseLine;
  45. (* SGR *)
  46. PROCEDURE SGRCode(n : CARDINAL);
  47. BEGIN CSI; WriteCard(n, 1); WriteChar("m"); END SGRCode;
  48. PROCEDURE SGR(a : Attr);
  49. BEGIN
  50. CASE a OF
  51. ResetA : SGRCode(0) |
  52. BoldA : SGRCode(1) |
  53. DimA : SGRCode(2) |
  54. ItalicA : SGRCode(3) |
  55. UnderlineA : SGRCode(4) |
  56. BlinkA : SGRCode(5) |
  57. InverseA : SGRCode(7) |
  58. HiddenA : SGRCode(8) |
  59. StrikeA : SGRCode(9)
  60. END;
  61. END SGR;
  62. PROCEDURE SGRReset; BEGIN SGRCode(0); END SGRReset;
  63. PROCEDURE SGRResetBoldDim; BEGIN CSI; WriteString("22m"); END SGRResetBoldDim;
  64. PROCEDURE SGRResetItalic; BEGIN CSI; WriteString("23m"); END SGRResetItalic;
  65. PROCEDURE SGRResetUnderline; BEGIN CSI; WriteString("24m"); END SGRResetUnderline;
  66. PROCEDURE SGRResetBlink; BEGIN CSI; WriteString("25m"); END SGRResetBlink;
  67. PROCEDURE SGRResetInverse; BEGIN CSI; WriteString("27m"); END SGRResetInverse;
  68. PROCEDURE SGRResetHidden; BEGIN CSI; WriteString("28m"); END SGRResetHidden;
  69. PROCEDURE SGRResetStrike; BEGIN CSI; WriteString("29m"); END SGRResetStrike;
  70. PROCEDURE FGCode(n : CARDINAL);
  71. BEGIN CSI; WriteCard(n, 1); WriteChar("m"); END FGCode;
  72. PROCEDURE FGNum(c : Color) : CARDINAL;
  73. BEGIN
  74. CASE c OF
  75. Black : RETURN 30 |
  76. Red : RETURN 31 |
  77. Green : RETURN 32 |
  78. Yellow : RETURN 33 |
  79. Blue : RETURN 34 |
  80. Magenta : RETURN 35 |
  81. Cyan : RETURN 36 |
  82. White : RETURN 37 |
  83. Default : RETURN 39 |
  84. BrightBlack : RETURN 90 |
  85. BrightRed : RETURN 91 |
  86. BrightGreen : RETURN 92 |
  87. BrightYellow : RETURN 93 |
  88. BrightBlue : RETURN 94 |
  89. BrightMagenta : RETURN 95 |
  90. BrightCyan : RETURN 96 |
  91. BrightWhite : RETURN 97
  92. END;
  93. END FGNum;
  94. PROCEDURE BGNum(c : Color) : CARDINAL;
  95. BEGIN
  96. CASE c OF
  97. Black : RETURN 40 |
  98. Red : RETURN 41 |
  99. Green : RETURN 42 |
  100. Yellow : RETURN 43 |
  101. Blue : RETURN 44 |
  102. Magenta : RETURN 45 |
  103. Cyan : RETURN 46 |
  104. White : RETURN 47 |
  105. Default : RETURN 49 |
  106. BrightBlack : RETURN 100 |
  107. BrightRed : RETURN 101 |
  108. BrightGreen : RETURN 102 |
  109. BrightYellow : RETURN 103 |
  110. BrightBlue : RETURN 104 |
  111. BrightMagenta : RETURN 105 |
  112. BrightCyan : RETURN 106 |
  113. BrightWhite : RETURN 107
  114. END;
  115. END BGNum;
  116. PROCEDURE AttrNum(a : Attr) : CARDINAL;
  117. BEGIN
  118. CASE a OF
  119. ResetA : RETURN 0 |
  120. BoldA : RETURN 1 |
  121. DimA : RETURN 2 |
  122. ItalicA : RETURN 3 |
  123. UnderlineA : RETURN 4 |
  124. BlinkA : RETURN 5 |
  125. InverseA : RETURN 7 |
  126. HiddenA : RETURN 8 |
  127. StrikeA : RETURN 9
  128. END;
  129. END AttrNum;
  130. PROCEDURE FG(c : Color); BEGIN FGCode(FGNum(c)); END FG;
  131. PROCEDURE BG(c : Color); BEGIN FGCode(BGNum(c)); END BG;
  132. PROCEDURE SetAttr(a : Attr; fg, bg : Color);
  133. BEGIN
  134. CSI; WriteCard(AttrNum(a), 1); WriteChar(";");
  135. WriteCard(FGNum(fg), 1); WriteChar(";");
  136. WriteCard(BGNum(bg), 1); WriteChar("m");
  137. END SetAttr;
  138. PROCEDURE FG256(id : CARDINAL);
  139. BEGIN CSI; WriteString("38;5;"); WriteCard(id, 1); WriteChar("m"); END FG256;
  140. PROCEDURE BG256(id : CARDINAL);
  141. BEGIN CSI; WriteString("48;5;"); WriteCard(id, 1); WriteChar("m"); END BG256;
  142. PROCEDURE FGRGB(r, g, b : CARDINAL);
  143. BEGIN CSI; WriteString("38;2;"); WriteCard(r, 1); WriteChar(";");
  144. WriteCard(g, 1); WriteChar(";"); WriteCard(b, 1); WriteChar("m"); END FGRGB;
  145. PROCEDURE BGRGB(r, g, b : CARDINAL);
  146. BEGIN CSI; WriteString("48;2;"); WriteCard(r, 1); WriteChar(";");
  147. WriteCard(g, 1); WriteChar(";"); WriteCard(b, 1); WriteChar("m"); END BGRGB;
  148. (* DOS modes *)
  149. PROCEDURE DosMode(v : CARDINAL);
  150. BEGIN CSIe; WriteCard(v, 1); WriteChar("h"); END DosMode;
  151. PROCEDURE DosModeReset(v : CARDINAL);
  152. BEGIN CSIe; WriteCard(v, 1); WriteChar("l"); END DosModeReset;
  153. PROCEDURE WrapOn; BEGIN CSIe; WriteString("7h"); END WrapOn;
  154. PROCEDURE WrapOff; BEGIN CSIe; WriteString("7l"); END WrapOff;
  155. (* Private *)
  156. PROCEDURE CursorInvisible; BEGIN CSIq; WriteString("25l"); END CursorInvisible;
  157. PROCEDURE CursorVisible; BEGIN CSIq; WriteString("25h"); END CursorVisible;
  158. PROCEDURE ScreenSave; BEGIN CSIq; WriteString("47h"); END ScreenSave;
  159. PROCEDURE ScreenRestore; BEGIN CSIq; WriteString("47l"); END ScreenRestore;
  160. PROCEDURE AltBufferOn; BEGIN CSIq; WriteString("1049h"); END AltBufferOn;
  161. PROCEDURE AltBufferOff; BEGIN CSIq; WriteString("1049l"); END AltBufferOff;
  162. (* Print *)
  163. PROCEDURE PrintScreen; BEGIN CSI; WriteChar("i"); END PrintScreen;
  164. PROCEDURE PrintLine; BEGIN CSI; WriteString("1i"); END PrintLine;
  165. PROCEDURE StopLog; BEGIN CSI; WriteString("4i"); END StopLog;
  166. PROCEDURE StartLog; BEGIN CSI; WriteString("5i"); END StartLog;
  167. (* Control chars *)
  168. PROCEDURE Bell; BEGIN WriteChar(CHR(7)); END Bell;
  169. PROCEDURE Backspace; BEGIN WriteChar(CHR(8)); END Backspace;
  170. PROCEDURE HTab; BEGIN WriteChar(CHR(9)); END HTab;
  171. PROCEDURE LineFeed; BEGIN WriteChar(CHR(10)); END LineFeed;
  172. PROCEDURE VTab; BEGIN WriteChar(CHR(11)); END VTab;
  173. PROCEDURE FormFeed; BEGIN WriteChar(CHR(12)); END FormFeed;
  174. PROCEDURE CarriageReturn; BEGIN WriteChar(CHR(13)); END CarriageReturn;
  175. (* Terminal input mode (cf. Editor/Tests/T17.mod): Unbuffered
  176. saves the termios state and disables line buffering so device
  177. replies can be read char by char; Buffered restores it. *)
  178. PROCEDURE Unbuffered;
  179. BEGIN
  180. flushFlag := termios.tcsflush();
  181. savedTerm := termios.InitTermios();
  182. haveTerm := termios.tcgetattr(FIO.StdIn, savedTerm) # -1;
  183. IO.UnBufferedMode(0, TRUE);
  184. IO.UnBufferedMode(1, TRUE);
  185. END Unbuffered;
  186. PROCEDURE Buffered;
  187. VAR res : INTEGER;
  188. BEGIN
  189. IO.BufferedMode(0, TRUE);
  190. IO.BufferedMode(1, TRUE);
  191. IF haveTerm THEN
  192. haveTerm := FALSE;
  193. res := termios.tcsetattr(FIO.StdIn, flushFlag, savedTerm);
  194. END;
  195. END Buffered;
  196. END Ansi.