Console.txt 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. MODULE HostConsole;
  2. (* THIS IS TEXT COPY OF Console.odc *)
  3. (* DO NOT EDIT *)
  4. (*
  5. A. V. Shiryaev, 2012.10
  6. Console implementation for Linux
  7. *)
  8. IMPORT SYSTEM, Console, Libc := LinLibc, Codecs := EncCodecs;
  9. CONST
  10. defEnc = "ASCII";
  11. defCh = '?';
  12. TYPE
  13. Cons = POINTER TO RECORD (Console.Console) END;
  14. VAR
  15. cons: Cons;
  16. e: Codecs.Encoder;
  17. d: Codecs.Decoder;
  18. PROCEDURE GetEnc (OUT enc: Codecs.Encoding);
  19. VAR lang: Libc.PtrSTR;
  20. i, j: INTEGER;
  21. BEGIN
  22. lang := Libc.getenv("LANG");
  23. IF lang # NIL THEN
  24. IF lang$ = "C" THEN
  25. enc := "ASCII"
  26. ELSE
  27. i := 0; WHILE (lang[i] # 0X) & (lang[i] # '.') DO INC(i) END;
  28. IF lang[i] # 0X THEN
  29. INC(i);
  30. j := 0;
  31. WHILE (j < LEN(enc) - 1) & (lang[i] # 0X) DO
  32. enc[j] := lang[i];
  33. INC(j);
  34. INC(i)
  35. END;
  36. IF j < LEN(enc) - 1 THEN
  37. enc[j] := 0X
  38. ELSE
  39. enc := defEnc
  40. END
  41. ELSE
  42. enc := defEnc
  43. END
  44. END
  45. ELSE
  46. enc := defEnc
  47. END
  48. END GetEnc;
  49. PROCEDURE (cons: Cons) ReadLn (OUT s: ARRAY OF CHAR);
  50. CONST
  51. maxLineLen = 1023; (* without null terminating shortchar *)
  52. VAR
  53. i: INTEGER;
  54. str: Libc.PtrSTR;
  55. ss: ARRAY maxLineLen+1 OF SHORTCHAR;
  56. fR, fLen, tW: INTEGER;
  57. st: BOOLEAN;
  58. BEGIN
  59. ss[LEN(ss)-1] := 0X;
  60. str := Libc.fgets(ss, LEN(ss), Libc.stdin);
  61. IF (str # NIL) & (ss[LEN(ss)-1] = 0X) THEN
  62. fLen := LEN(ss$);
  63. IF fLen < LEN(s) THEN
  64. IF d # NIL THEN
  65. d.Reset;
  66. fR := 0; tW := 0;
  67. d.Decode(ss, fR, fLen, s, tW, st);
  68. IF (fLen = 0) & ~st THEN
  69. s[tW] := 0X
  70. ELSE
  71. s[0] := 0X
  72. END
  73. ELSE
  74. s := ss$
  75. END
  76. ELSE
  77. s[0] := 0X
  78. END
  79. ELSE
  80. s[0] := 0X
  81. END
  82. END ReadLn;
  83. PROCEDURE Printf (IN s: ARRAY OF CHAR; len: INTEGER);
  84. CONST
  85. maxShortCharsPerChar = 3; (* UTF-8 *)
  86. ssLen = 128; (* >= maxShortCharsPerChar + 1 *)
  87. VAR
  88. ss: ARRAY ssLen OF SHORTCHAR;
  89. res: INTEGER;
  90. fR, fLen, tW, n: INTEGER;
  91. BEGIN
  92. fR := 0;
  93. WHILE len > 0 DO
  94. tW := 0;
  95. IF e # NIL THEN
  96. fLen := MIN(len, (LEN(ss) - 1) DIV maxShortCharsPerChar); n := fLen;
  97. REPEAT
  98. e.Encode(s, fR, fLen, ss, tW);
  99. IF fLen # 0 THEN
  100. ss[tW] := '?'; INC(tW);
  101. INC(fR); DEC(fLen)
  102. END
  103. UNTIL fLen = 0
  104. ELSE
  105. fLen := MIN(len, LEN(ss) - 1); n := fLen;
  106. WHILE fLen > 0 DO
  107. ss[tW] := SHORT(s[fR]);
  108. INC(tW);
  109. INC(fR); DEC(fLen)
  110. END
  111. END;
  112. ss[tW] := 0X;
  113. res := Libc.printf(ss);
  114. res := Libc.fflush(Libc.NULL);
  115. len := len - n
  116. END
  117. END Printf;
  118. PROCEDURE (cons: Cons) WriteChar (c: CHAR);
  119. VAR s: ARRAY 1 OF CHAR;
  120. BEGIN
  121. s[0] := c;
  122. Printf(s, 1)
  123. END WriteChar;
  124. PROCEDURE (cons: Cons) WriteStr (IN text: ARRAY OF CHAR);
  125. BEGIN
  126. Printf(text, LEN(text$))
  127. END WriteStr;
  128. PROCEDURE (cons: Cons) WriteLn;
  129. BEGIN
  130. Printf(0AX, 1)
  131. END WriteLn;
  132. PROCEDURE Init;
  133. VAR enc: Codecs.Encoding;
  134. BEGIN
  135. IF Codecs.dir # NIL THEN
  136. GetEnc(enc);
  137. e := Codecs.dir.NewEncoder(enc);
  138. d := Codecs.dir.NewDecoder(enc)
  139. END;
  140. NEW(cons);
  141. Console.SetConsole(cons)
  142. END Init;
  143. BEGIN
  144. Init
  145. END HostConsole.