10 * Unix Unicode-handling routines.
12 * FIXME: currently trivial stub versions assuming all codepages
16 void lpage_send(int codepage
, char *buf
, int len
, int interactive
)
18 ldisc_send(buf
, len
, interactive
);
21 void luni_send(wchar_t * widebuf
, int len
, int interactive
)
23 static char *linebuffer
= 0;
24 static int linesize
= 0;
25 int ratio
= (in_utf
)?
6:1;
29 if (len
* ratio
> linesize
) {
31 linebuffer
= smalloc(len
* ratio
* 2 * sizeof(wchar_t));
32 linesize
= len
* ratio
* 2;
36 /* UTF is a simple algorithm */
37 for (p
= linebuffer
, i
= 0; i
< len
; i
++) {
38 wchar_t ch
= widebuf
[i
];
40 if ((ch
&0xF800) == 0xD800) ch
= '.';
44 } else if (ch
< 0x800) {
45 *p
++ = (0xC0 | (ch
>> 6));
46 *p
++ = (0x80 | (ch
& 0x3F));
47 } else if (ch
< 0x10000) {
48 *p
++ = (0xE0 | (ch
>> 12));
49 *p
++ = (0x80 | ((ch
>> 6) & 0x3F));
50 *p
++ = (0x80 | (ch
& 0x3F));
51 } else if (ch
< 0x200000) {
52 *p
++ = (0xF0 | (ch
>> 18));
53 *p
++ = (0x80 | ((ch
>> 12) & 0x3F));
54 *p
++ = (0x80 | ((ch
>> 6) & 0x3F));
55 *p
++ = (0x80 | (ch
& 0x3F));
56 } else if (ch
< 0x4000000) {
57 *p
++ = (0xF8 | (ch
>> 24));
58 *p
++ = (0x80 | ((ch
>> 18) & 0x3F));
59 *p
++ = (0x80 | ((ch
>> 12) & 0x3F));
60 *p
++ = (0x80 | ((ch
>> 6) & 0x3F));
61 *p
++ = (0x80 | (ch
& 0x3F));
63 *p
++ = (0xFC | (ch
>> 30));
64 *p
++ = (0x80 | ((ch
>> 24) & 0x3F));
65 *p
++ = (0x80 | ((ch
>> 18) & 0x3F));
66 *p
++ = (0x80 | ((ch
>> 12) & 0x3F));
67 *p
++ = (0x80 | ((ch
>> 6) & 0x3F));
68 *p
++ = (0x80 | (ch
& 0x3F));
72 for (p
= linebuffer
, i
= 0; i
< len
; i
++) {
73 wchar_t ch
= widebuf
[i
];
81 ldisc_send(linebuffer
, p
- linebuffer
, interactive
);
84 int is_dbcs_leadbyte(int codepage
, char byte
)
86 return 0; /* we don't do DBCS */
89 int mb_to_wc(int codepage
, int flags
, char *mbstr
, int mblen
,
90 wchar_t *wcstr
, int wclen
)
93 while (mblen
> 0 && wclen
> 0) {
94 *wcstr
++ = (unsigned char) *mbstr
++;
95 mblen
--, wclen
--, ret
++;
97 return ret
; /* FIXME: check error codes! */
100 int wc_to_mb(int codepage
, int flags
, wchar_t *wcstr
, int wclen
,
101 char *mbstr
, int mblen
, char *defchr
, int *defused
)
106 while (mblen
> 0 && wclen
> 0) {
107 if (*wcstr
>= 0x100) {
115 *mbstr
++ = (unsigned char) *wcstr
;
117 mblen
--, wclen
--, ret
++;
119 return ret
; /* FIXME: check error codes! */
125 /* Find the line control characters. FIXME: this is not right. */
126 for (i
= 0; i
< 256; i
++)
127 if (i
< ' ' || (i
>= 0x7F && i
< 0xA0))
130 unitab_ctrl
[i
] = 0xFF;
132 for (i
= 0; i
< 256; i
++) {
133 unitab_line
[i
] = unitab_scoacs
[i
] = i
;
134 unitab_xterm
[i
] = (i
+1) & 0x1F;