DEADSOFTWARE

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