Console.txt 2.6 KB

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