c31f6c61 |
1 | /* $Id: macucs.c,v 1.4 2003/01/14 19:42:00 ben Exp $ */ |
d082ac49 |
2 | |
3 | #include <stdio.h> |
4 | #include <stdlib.h> |
5 | #include <ctype.h> |
6 | |
7 | #include <time.h> |
8 | #include "putty.h" |
9 | #include "terminal.h" |
10 | #include "misc.h" |
2f9549c7 |
11 | #include "mac.h" |
d082ac49 |
12 | |
13 | /* |
14 | * Mac Unicode-handling routines. |
15 | * |
16 | * FIXME: currently trivial stub versions assuming all codepages |
17 | * are ISO8859-1. |
18 | * |
19 | * What we _should_ do is to use the Text Encoding Conversion Manager |
20 | * when it's available, and have our own routines for converting to |
21 | * standard Mac OS scripts when it's not. Support for ATSUI might be |
22 | * nice, too. |
23 | */ |
24 | |
e530c9fa |
25 | /* |
26 | * Determine whether a byte is the first byte of a double-byte |
27 | * character in a system character set. Only MI use is by clipme() |
28 | * when copying direct-to-font text to the clipboard. |
29 | */ |
d082ac49 |
30 | int is_dbcs_leadbyte(int codepage, char byte) |
31 | { |
32 | return 0; /* we don't do DBCS */ |
33 | } |
34 | |
e530c9fa |
35 | /* |
36 | * Convert from Unicode to a system character set. MI uses are: |
37 | * (1) by lpage_send(), whose only MI use is to convert the answerback |
38 | * string to Unicode, and |
39 | * (2) by clipme() when copying direct-to-font text to the clipboard. |
40 | */ |
d082ac49 |
41 | int mb_to_wc(int codepage, int flags, char *mbstr, int mblen, |
42 | wchar_t *wcstr, int wclen) |
43 | { |
44 | int ret = 0; |
45 | while (mblen > 0 && wclen > 0) { |
46 | *wcstr++ = (unsigned char) *mbstr++; |
47 | mblen--, wclen--, ret++; |
48 | } |
49 | return ret; /* FIXME: check error codes! */ |
50 | } |
51 | |
e530c9fa |
52 | /* |
53 | * Convert from a system character set to Unicode. Used by luni_send |
54 | * to convert Unicode into the line character set. |
55 | */ |
d082ac49 |
56 | int wc_to_mb(int codepage, int flags, wchar_t *wcstr, int wclen, |
c31f6c61 |
57 | char *mbstr, int mblen, char *defchr, int *defused, |
58 | struct unicode_data *ucsdata) |
d082ac49 |
59 | { |
60 | int ret = 0; |
61 | if (defused) |
62 | *defused = 0; |
63 | while (mblen > 0 && wclen > 0) { |
64 | if (*wcstr >= 0x100) { |
65 | if (defchr) |
66 | *mbstr++ = *defchr; |
67 | else |
68 | *mbstr++ = '.'; |
69 | if (defused) |
70 | *defused = 1; |
71 | } else |
72 | *mbstr++ = (unsigned char) *wcstr; |
73 | wcstr++; |
74 | mblen--, wclen--, ret++; |
75 | } |
76 | return ret; /* FIXME: check error codes! */ |
77 | } |
78 | |
c31f6c61 |
79 | void init_ucs(Session *s) |
d082ac49 |
80 | { |
81 | int i; |
c31f6c61 |
82 | |
d082ac49 |
83 | /* Find the line control characters. FIXME: this is not right. */ |
84 | for (i = 0; i < 256; i++) |
85 | if (i < ' ' || (i >= 0x7F && i < 0xA0)) |
c31f6c61 |
86 | s->ucsdata.unitab_ctrl[i] = i; |
d082ac49 |
87 | else |
c31f6c61 |
88 | s->ucsdata.unitab_ctrl[i] = 0xFF; |
d082ac49 |
89 | |
90 | for (i = 0; i < 256; i++) { |
c31f6c61 |
91 | s->ucsdata.unitab_line[i] = s->ucsdata.unitab_scoacs[i] = i; |
92 | s->ucsdata.unitab_xterm[i] = |
93 | (i >= 0x5F && i < 0x7F) ? ((i+1) & 0x1F) : i; |
d082ac49 |
94 | } |
95 | } |