Console.txt 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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 OpenBSD
  7. *)
  8. IMPORT SYSTEM, Console, Libc := LinLibc, Codecs := EncCodecs, HostLang;
  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 (cons: Cons) ReadLn (OUT s: ARRAY OF CHAR);
  19. CONST
  20. maxLineLen = 1023; (* without null terminating shortchar *)
  21. VAR
  22. i: INTEGER;
  23. str: Libc.PtrSTR;
  24. ss: ARRAY maxLineLen+1 OF SHORTCHAR;
  25. fR, fLen, tW: INTEGER;
  26. st: BOOLEAN;
  27. BEGIN
  28. ss[LEN(ss)-1] := 0X;
  29. str := Libc.fgets(ss, LEN(ss), SYSTEM.ADR(Libc.__sF[0]) (* stdin *));
  30. IF (str # NIL) & (ss[LEN(ss)-1] = 0X) THEN
  31. fLen := LEN(ss$);
  32. IF fLen < LEN(s) THEN
  33. IF d # NIL THEN
  34. d.Reset;
  35. fR := 0; tW := 0;
  36. d.Decode(ss, fR, fLen, s, tW, st);
  37. IF (fLen = 0) & ~st THEN
  38. s[tW] := 0X
  39. ELSE
  40. s[0] := 0X
  41. END
  42. ELSE
  43. i := 0;
  44. WHILE (ss[i] > 0X) & (ss[i] < 80X) DO
  45. s[i] := ss[i];
  46. INC(i)
  47. END;
  48. IF ss[i] = 0X THEN
  49. s[i] := 0X
  50. ELSE
  51. s[0] := 0X
  52. END
  53. END
  54. ELSE
  55. s[0] := 0X
  56. END
  57. ELSE
  58. s[0] := 0X
  59. END
  60. END ReadLn;
  61. PROCEDURE Printf (IN s: ARRAY OF CHAR; len: INTEGER);
  62. CONST
  63. maxShortCharsPerChar = 3; (* UTF-8 *)
  64. ssLen = 128; (* >= maxShortCharsPerChar + 1 *)
  65. VAR
  66. ss: ARRAY ssLen OF SHORTCHAR;
  67. res: INTEGER;
  68. fR, fLen, tW, n: INTEGER;
  69. BEGIN
  70. fR := 0;
  71. WHILE len > 0 DO
  72. tW := 0;
  73. IF e # NIL THEN
  74. fLen := MIN(len, (LEN(ss) - 1) DIV maxShortCharsPerChar); n := fLen;
  75. REPEAT
  76. e.Encode(s, fR, fLen, ss, tW);
  77. IF fLen # 0 THEN
  78. ss[tW] := defCh; INC(tW);
  79. INC(fR); DEC(fLen)
  80. END
  81. UNTIL fLen = 0
  82. ELSE
  83. fLen := MIN(len, LEN(ss) - 1); n := fLen;
  84. WHILE fLen > 0 DO
  85. IF s[fR] < 80X THEN
  86. ss[tW] := SHORT(s[fR])
  87. ELSE
  88. ss[tW] := defCh
  89. END;
  90. INC(tW);
  91. INC(fR); DEC(fLen)
  92. END
  93. END;
  94. ss[tW] := 0X;
  95. res := Libc.printf(ss);
  96. res := Libc.fflush(Libc.NULL);
  97. len := len - n
  98. END
  99. END Printf;
  100. PROCEDURE (cons: Cons) WriteChar (c: CHAR);
  101. VAR s: ARRAY 1 OF CHAR;
  102. BEGIN
  103. s[0] := c;
  104. Printf(s, 1)
  105. END WriteChar;
  106. PROCEDURE (cons: Cons) WriteStr (IN text: ARRAY OF CHAR);
  107. BEGIN
  108. Printf(text, LEN(text$))
  109. END WriteStr;
  110. PROCEDURE (cons: Cons) WriteLn;
  111. BEGIN
  112. Printf(0AX, 1)
  113. END WriteLn;
  114. PROCEDURE Init;
  115. BEGIN
  116. IF Codecs.dir # NIL THEN
  117. e := Codecs.dir.NewEncoder(HostLang.enc);
  118. d := Codecs.dir.NewDecoder(HostLang.enc)
  119. END;
  120. NEW(cons);
  121. Console.SetConsole(cons)
  122. END Init;
  123. BEGIN
  124. Init
  125. END HostConsole.