Console.txt 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. s := ss$
  44. END
  45. ELSE
  46. s[0] := 0X
  47. END
  48. ELSE
  49. s[0] := 0X
  50. END
  51. END ReadLn;
  52. PROCEDURE Printf (IN s: ARRAY OF CHAR; len: INTEGER);
  53. CONST
  54. maxShortCharsPerChar = 3; (* UTF-8 *)
  55. ssLen = 128; (* >= maxShortCharsPerChar + 1 *)
  56. VAR
  57. ss: ARRAY ssLen OF SHORTCHAR;
  58. res: INTEGER;
  59. fR, fLen, tW, n: INTEGER;
  60. BEGIN
  61. fR := 0;
  62. WHILE len > 0 DO
  63. tW := 0;
  64. IF e # NIL THEN
  65. fLen := MIN(len, (LEN(ss) - 1) DIV maxShortCharsPerChar); n := fLen;
  66. REPEAT
  67. e.Encode(s, fR, fLen, ss, tW);
  68. IF fLen # 0 THEN
  69. ss[tW] := '?'; INC(tW);
  70. INC(fR); DEC(fLen)
  71. END
  72. UNTIL fLen = 0
  73. ELSE
  74. fLen := MIN(len, LEN(ss) - 1); n := fLen;
  75. WHILE fLen > 0 DO
  76. ss[tW] := SHORT(s[fR]);
  77. INC(tW);
  78. INC(fR); DEC(fLen)
  79. END
  80. END;
  81. ss[tW] := 0X;
  82. res := Libc.printf(ss);
  83. res := Libc.fflush(Libc.NULL);
  84. len := len - n
  85. END
  86. END Printf;
  87. PROCEDURE (cons: Cons) WriteChar (c: CHAR);
  88. VAR s: ARRAY 1 OF CHAR;
  89. BEGIN
  90. s[0] := c;
  91. Printf(s, 1)
  92. END WriteChar;
  93. PROCEDURE (cons: Cons) WriteStr (IN text: ARRAY OF CHAR);
  94. BEGIN
  95. Printf(text, LEN(text$))
  96. END WriteStr;
  97. PROCEDURE (cons: Cons) WriteLn;
  98. BEGIN
  99. Printf(0AX, 1)
  100. END WriteLn;
  101. PROCEDURE Init;
  102. BEGIN
  103. IF Codecs.dir # NIL THEN
  104. e := Codecs.dir.NewEncoder(HostLang.enc);
  105. d := Codecs.dir.NewDecoder(HostLang.enc)
  106. END;
  107. NEW(cons);
  108. Console.SetConsole(cons)
  109. END Init;
  110. BEGIN
  111. Init
  112. END HostConsole.