11 * Unix Unicode-handling routines.
13 * FIXME: currently trivial stub versions assuming all codepages
17 void lpage_send(int codepage
, char *buf
, int len
, int interactive
)
19 ldisc_send(buf
, len
, interactive
);
22 void luni_send(wchar_t * widebuf
, int len
, int interactive
)
24 static char *linebuffer
= 0;
25 static int linesize
= 0;
26 int ratio
= (in_utf(term
))?
6:1;
30 if (len
* ratio
> linesize
) {
32 linebuffer
= smalloc(len
* ratio
* 2 * sizeof(wchar_t));
33 linesize
= len
* ratio
* 2;
37 /* UTF is a simple algorithm */
38 for (p
= linebuffer
, i
= 0; i
< len
; i
++) {
39 wchar_t ch
= widebuf
[i
];
41 if ((ch
&0xF800) == 0xD800) ch
= '.';
45 } else if (ch
< 0x800) {
46 *p
++ = (0xC0 | (ch
>> 6));
47 *p
++ = (0x80 | (ch
& 0x3F));
48 } else if (ch
< 0x10000) {
49 *p
++ = (0xE0 | (ch
>> 12));
50 *p
++ = (0x80 | ((ch
>> 6) & 0x3F));
51 *p
++ = (0x80 | (ch
& 0x3F));
52 } else if (ch
< 0x200000) {
53 *p
++ = (0xF0 | (ch
>> 18));
54 *p
++ = (0x80 | ((ch
>> 12) & 0x3F));
55 *p
++ = (0x80 | ((ch
>> 6) & 0x3F));
56 *p
++ = (0x80 | (ch
& 0x3F));
57 } else if (ch
< 0x4000000) {
58 *p
++ = (0xF8 | (ch
>> 24));
59 *p
++ = (0x80 | ((ch
>> 18) & 0x3F));
60 *p
++ = (0x80 | ((ch
>> 12) & 0x3F));
61 *p
++ = (0x80 | ((ch
>> 6) & 0x3F));
62 *p
++ = (0x80 | (ch
& 0x3F));
64 *p
++ = (0xFC | (ch
>> 30));
65 *p
++ = (0x80 | ((ch
>> 24) & 0x3F));
66 *p
++ = (0x80 | ((ch
>> 18) & 0x3F));
67 *p
++ = (0x80 | ((ch
>> 12) & 0x3F));
68 *p
++ = (0x80 | ((ch
>> 6) & 0x3F));
69 *p
++ = (0x80 | (ch
& 0x3F));
73 for (p
= linebuffer
, i
= 0; i
< len
; i
++) {
74 wchar_t ch
= widebuf
[i
];
82 ldisc_send(linebuffer
, p
- linebuffer
, interactive
);
85 int is_dbcs_leadbyte(int codepage
, char byte
)
87 return 0; /* we don't do DBCS */
90 int mb_to_wc(int codepage
, int flags
, char *mbstr
, int mblen
,
91 wchar_t *wcstr
, int wclen
)
94 while (mblen
> 0 && wclen
> 0) {
95 *wcstr
++ = (unsigned char) *mbstr
++;
96 mblen
--, wclen
--, ret
++;
98 return ret
; /* FIXME: check error codes! */
101 int wc_to_mb(int codepage
, int flags
, wchar_t *wcstr
, int wclen
,
102 char *mbstr
, int mblen
, char *defchr
, int *defused
)
107 while (mblen
> 0 && wclen
> 0) {
108 if (*wcstr
>= 0x100) {
116 *mbstr
++ = (unsigned char) *wcstr
;
118 mblen
--, wclen
--, ret
++;
120 return ret
; /* FIXME: check error codes! */
126 /* Find the line control characters. FIXME: this is not right. */
127 for (i
= 0; i
< 256; i
++)
128 if (i
< ' ' || (i
>= 0x7F && i
< 0xA0))
131 unitab_ctrl
[i
] = 0xFF;
133 for (i
= 0; i
< 256; i
++) {
134 unitab_line
[i
] = unitab_scoacs
[i
] = i
;
135 unitab_xterm
[i
] = (i
>= 0x5F && i
< 0x7F) ?
((i
+1) & 0x1F) : i
;