Console.txt 3.6 KB

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