annotate src/os_mac_conv.c @ 501:ce2181d14aa0 v7.0139

updated for version 7.0139
author vimboss
date Tue, 30 Aug 2005 21:55:26 +0000
parents a5fcf36ef512
children f0d0d3d3a1e2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4:
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
2 *
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
4 *
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
8 */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
9 /*
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
10 * os_mac_conv.c: Code specifically for Mac string conversions.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
11 *
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
12 * This code has been put in a separate file to avoid the conflicts that are
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
13 * caused by including both the X11 and Carbon header files.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
14 */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
15
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
16 #define NO_X11_INCLUDES
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
17 #include "vim.h"
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
18
20
4ac1dce8dd5e updated for version 7.0012
vimboss
parents: 18
diff changeset
19 #ifdef FEAT_MBYTE
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
20 static char_u *mac_utf16_to_utf8 __ARGS((UniChar *from, size_t fromLen, size_t *actualLen));
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
21 static UniChar *mac_utf8_to_utf16 __ARGS((char_u *from, size_t fromLen, size_t *actualLen));
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
22
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
23 /* Converter for composing decomposed HFS+ file paths */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
24 static TECObjectRef gPathConverter;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
25 /* Converter used by mac_utf16_to_utf8 */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
26 static TECObjectRef gUTF16ToUTF8Converter;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
27
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
28 /*
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
29 * A Mac version of string_convert_ext() for special cases.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
30 */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
31 char_u *
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
32 mac_string_convert(ptr, len, lenp, fail_on_error, from_enc, to_enc, unconvlenp)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
33 char_u *ptr;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
34 int len;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
35 int *lenp;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
36 int fail_on_error;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
37 int from_enc;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
38 int to_enc;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
39 int *unconvlenp;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
40 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
41 char_u *retval, *d;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
42 CFStringRef cfstr;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
43 int buflen, in, out, l, i;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
44 CFStringEncoding from;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
45 CFStringEncoding to;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
46
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
47 switch (from_enc)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
48 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
49 case 'l': from = kCFStringEncodingISOLatin1; break;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
50 case 'm': from = kCFStringEncodingMacRoman; break;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
51 case 'u': from = kCFStringEncodingUTF8; break;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
52 default: return NULL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
53 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
54 switch (to_enc)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
55 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
56 case 'l': to = kCFStringEncodingISOLatin1; break;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
57 case 'm': to = kCFStringEncodingMacRoman; break;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
58 case 'u': to = kCFStringEncodingUTF8; break;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
59 default: return NULL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
60 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
61
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
62 if (unconvlenp != NULL)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
63 *unconvlenp = 0;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
64 cfstr = CFStringCreateWithBytes(NULL, ptr, len, from, 0);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
65
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
66 if(cfstr == NULL)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
67 fprintf(stderr, "Encoding failed\n");
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
68 /* When conversion failed, try excluding bytes from the end, helps when
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
69 * there is an incomplete byte sequence. Only do up to 6 bytes to avoid
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
70 * looping a long time when there really is something unconvertable. */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
71 while (cfstr == NULL && unconvlenp != NULL && len > 1 && *unconvlenp < 6)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
72 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
73 --len;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
74 ++*unconvlenp;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
75 cfstr = CFStringCreateWithBytes(NULL, ptr, len, from, 0);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
76 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
77 if (cfstr == NULL)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
78 return NULL;
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
79
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
80 if (to == kCFStringEncodingUTF8)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
81 buflen = len * 6 + 1;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
82 else
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
83 buflen = len + 1;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
84 retval = alloc(buflen);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
85 if (retval == NULL)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
86 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
87 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
88 return NULL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
89 }
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
90
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
91 #if 0
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
92 CFRange convertRange = CFRangeMake(0, CFStringGetLength(cfstr));
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
93 /* Determine output buffer size */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
94 CFStringGetBytes(cfstr, convertRange, to, NULL, FALSE, NULL, 0, (CFIndex *)&buflen);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
95 retval = (buflen > 0) ? alloc(buflen) : NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
96 if (retval == NULL) {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
97 CFRelease(cfstr);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
98 return NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
99 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
100
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
101 if (lenp)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
102 *lenp = buflen / sizeof(char_u);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
103
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
104 if (!CFStringGetBytes(cfstr, convertRange, to, NULL, FALSE, retval, buflen, NULL))
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
105 #endif
501
ce2181d14aa0 updated for version 7.0139
vimboss
parents: 474
diff changeset
106 if (!CFStringGetCString(cfstr, (char *)retval, buflen, to))
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
107 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
108 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
109 if (fail_on_error)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
110 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
111 vim_free(retval);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
112 return NULL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
113 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
114
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
115 fprintf(stderr, "Trying char-by-char conversion...\n");
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
116 /* conversion failed for the whole string, but maybe it will work
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
117 * for each character */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
118 for (d = retval, in = 0, out = 0; in < len && out < buflen - 1;)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
119 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
120 if (from == kCFStringEncodingUTF8)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 179
diff changeset
121 l = utf_ptr2len(ptr + in);
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
122 else
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
123 l = 1;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
124 cfstr = CFStringCreateWithBytes(NULL, ptr + in, l, from, 0);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
125 if (cfstr == NULL)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
126 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
127 *d++ = '?';
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
128 out++;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
129 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
130 else
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
131 {
501
ce2181d14aa0 updated for version 7.0139
vimboss
parents: 474
diff changeset
132 if (!CFStringGetCString(cfstr, (char *)d, buflen - out, to))
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
133 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
134 *d++ = '?';
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
135 out++;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
136 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
137 else
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
138 {
501
ce2181d14aa0 updated for version 7.0139
vimboss
parents: 474
diff changeset
139 i = STRLEN(d);
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
140 d += i;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
141 out += i;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
142 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
143 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
144 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
145 in += l;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
146 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
147 *d = NUL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
148 if (lenp != NULL)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
149 *lenp = out;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
150 return retval;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
151 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
152 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
153 if (lenp != NULL)
501
ce2181d14aa0 updated for version 7.0139
vimboss
parents: 474
diff changeset
154 *lenp = STRLEN(retval);
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
155
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
156 return retval;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
157 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
158
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
159 /*
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
160 * Conversion from Apple MacRoman char encoding to UTF-8 or latin1, using
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
161 * standard Carbon framework.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
162 * Input: "ptr[*sizep]".
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
163 * "real_size" is the size of the buffer that "ptr" points to.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
164 * output is in-place, "sizep" is adjusted.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
165 * Returns OK or FAIL.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
166 */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
167 int
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
168 macroman2enc(ptr, sizep, real_size)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
169 char_u *ptr;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
170 long *sizep;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
171 long real_size;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
172 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
173 CFStringRef cfstr;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
174 CFRange r;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
175 CFIndex len = *sizep;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
176
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
177 /* MacRoman is an 8-bit encoding, no need to move bytes to
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
178 * conv_rest[]. */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
179 cfstr = CFStringCreateWithBytes(NULL, ptr, len,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
180 kCFStringEncodingMacRoman, 0);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
181 /*
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
182 * If there is a conversion error, try using another
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
183 * conversion.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
184 */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
185 if (cfstr == NULL)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
186 return FAIL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
187
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
188 r.location = 0;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
189 r.length = CFStringGetLength(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
190 if (r.length != CFStringGetBytes(cfstr, r,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
191 (enc_utf8) ? kCFStringEncodingUTF8 : kCFStringEncodingISOLatin1,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
192 0, /* no lossy conversion */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
193 0, /* not external representation */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
194 ptr + *sizep, real_size - *sizep, &len))
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
195 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
196 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
197 return FAIL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
198 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
199 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
200 mch_memmove(ptr, ptr + *sizep, len);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
201 *sizep = len;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
202
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
203 return OK;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
204 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
205
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
206 /*
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
207 * Conversion from UTF-8 or latin1 to MacRoman.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
208 * Input: "from[fromlen]"
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
209 * Output: "to[maxtolen]" length in "*tolenp"
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
210 * Unconverted rest in rest[*restlenp].
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
211 * Returns OK or FAIL.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
212 */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
213 int
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
214 enc2macroman(from, fromlen, to, tolenp, maxtolen, rest, restlenp)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
215 char_u *from;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
216 size_t fromlen;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
217 char_u *to;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
218 int *tolenp;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
219 int maxtolen;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
220 char_u *rest;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
221 int *restlenp;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
222 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
223 CFStringRef cfstr;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
224 CFRange r;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
225 CFIndex l;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
226
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
227 *restlenp = 0;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
228 cfstr = CFStringCreateWithBytes(NULL, from, fromlen,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
229 (enc_utf8) ? kCFStringEncodingUTF8 : kCFStringEncodingISOLatin1,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
230 0);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
231 while (cfstr == NULL && *restlenp < 3 && fromlen > 1)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
232 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
233 rest[*restlenp++] = from[--fromlen];
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
234 cfstr = CFStringCreateWithBytes(NULL, from, fromlen,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
235 (enc_utf8) ? kCFStringEncodingUTF8 : kCFStringEncodingISOLatin1,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
236 0);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
237 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
238 if (cfstr == NULL)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
239 return FAIL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
240
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
241 r.location = 0;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
242 r.length = CFStringGetLength(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
243 if (r.length != CFStringGetBytes(cfstr, r,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
244 kCFStringEncodingMacRoman,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
245 0, /* no lossy conversion */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
246 0, /* not external representation (since vim
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
247 * handles this internally */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
248 to, maxtolen, &l))
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
249 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
250 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
251 return FAIL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
252 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
253 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
254 *tolenp = l;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
255 return OK;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
256 }
20
4ac1dce8dd5e updated for version 7.0012
vimboss
parents: 18
diff changeset
257
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
258 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
259 * Initializes text converters
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
260 */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
261 void
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
262 mac_conv_init()
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
263 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
264 TextEncoding utf8_encoding;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
265 TextEncoding utf8_hfsplus_encoding;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
266 TextEncoding utf8_canon_encoding;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
267 TextEncoding utf16_encoding;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
268
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
269 utf8_encoding = CreateTextEncoding(kTextEncodingUnicodeDefault,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
270 kTextEncodingDefaultVariant, kUnicodeUTF8Format);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
271 utf8_hfsplus_encoding = CreateTextEncoding(kTextEncodingUnicodeDefault,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
272 kUnicodeHFSPlusCompVariant, kUnicodeUTF8Format);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
273 utf8_canon_encoding = CreateTextEncoding(kTextEncodingUnicodeDefault,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
274 kUnicodeCanonicalCompVariant, kUnicodeUTF8Format);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
275 utf16_encoding = CreateTextEncoding(kTextEncodingUnicodeDefault,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
276 kTextEncodingDefaultVariant, kUnicode16BitFormat);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
277
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
278 if (TECCreateConverter(&gPathConverter, utf8_encoding,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
279 utf8_hfsplus_encoding) != noErr)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
280 gPathConverter = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
281
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
282 if (TECCreateConverter(&gUTF16ToUTF8Converter, utf16_encoding,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
283 utf8_canon_encoding) != noErr)
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 168
diff changeset
284 {
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 168
diff changeset
285 /* On pre-10.3, Unicode normalization is not available so
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 168
diff changeset
286 * fall back to non-normalizing converter */
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 168
diff changeset
287 if (TECCreateConverter(&gUTF16ToUTF8Converter, utf16_encoding,
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 168
diff changeset
288 utf8_encoding) != noErr)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 168
diff changeset
289 gUTF16ToUTF8Converter = NULL;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 168
diff changeset
290 }
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
291 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
292
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
293 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
294 * Destroys text converters
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
295 */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
296 void
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
297 mac_conv_cleanup()
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
298 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
299 if (gUTF16ToUTF8Converter)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
300 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
301 TECDisposeConverter(gUTF16ToUTF8Converter);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
302 gUTF16ToUTF8Converter = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
303 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
304
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
305 if (gPathConverter)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
306 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
307 TECDisposeConverter(gPathConverter);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
308 gPathConverter = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
309 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
310 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
311
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
312 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
313 * Conversion from UTF-16 UniChars to 'encoding'
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
314 */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
315 char_u *
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
316 mac_utf16_to_enc(from, fromLen, actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
317 UniChar *from;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
318 size_t fromLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
319 size_t *actualLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
320 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
321 /* Following code borrows somewhat from os_mswin.c */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
322 vimconv_T conv;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
323 size_t utf8_len;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
324 char_u *utf8_str;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
325 char_u *result = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
326
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
327 /* Convert to utf-8 first, works better with iconv */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
328 utf8_len = 0;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
329 utf8_str = mac_utf16_to_utf8(from, fromLen, &utf8_len);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
330
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
331 if (utf8_str)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
332 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
333 /* We might be called before we have p_enc set up. */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
334 conv.vc_type = CONV_NONE;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
335
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
336 /* If encoding (p_enc) is any unicode, it is actually in utf-8 (vim
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
337 * internal unicode is always utf-8) so don't convert in such cases */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
338
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
339 if ((enc_canon_props(p_enc) & ENC_UNICODE) == 0)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
340 convert_setup(&conv, (char_u *)"utf-8",
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
341 p_enc? p_enc: (char_u *)"macroman");
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
342 if (conv.vc_type == CONV_NONE)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
343 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
344 /* p_enc is utf-8, so we're done. */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
345 result = utf8_str;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
346 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
347 else
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
348 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
349 result = string_convert(&conv, utf8_str, (int *)&utf8_len);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
350 vim_free(utf8_str);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
351 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
352
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
353 convert_setup(&conv, NULL, NULL);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
354
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
355 if (actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
356 *actualLen = utf8_len;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
357 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
358 else if (actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
359 *actualLen = 0;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
360
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
361 return result;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
362 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
363
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
364 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
365 * Conversion from 'encoding' to UTF-16 UniChars
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
366 */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
367 UniChar *
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
368 mac_enc_to_utf16(from, fromLen, actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
369 char_u *from;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
370 size_t fromLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
371 size_t *actualLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
372 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
373 /* Following code borrows somewhat from os_mswin.c */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
374 vimconv_T conv;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
375 size_t utf8_len;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
376 char_u *utf8_str;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
377 UniChar *result = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
378 Boolean should_free_utf8 = FALSE;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
379
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
380 do
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
381 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
382 /* Use MacRoman by default, we might be called before we have p_enc
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
383 * set up. Convert to utf-8 first, works better with iconv(). Does
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
384 * nothing if 'encoding' is "utf-8". */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
385 conv.vc_type = CONV_NONE;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
386 if ((enc_canon_props(p_enc) & ENC_UNICODE) == 0 &&
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
387 convert_setup(&conv, p_enc ? p_enc : (char_u *)"macroman",
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
388 (char_u *)"utf-8") == FAIL)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
389 break;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
390
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
391 if (conv.vc_type != CONV_NONE)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
392 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
393 utf8_len = fromLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
394 utf8_str = string_convert(&conv, from, (int *)&utf8_len);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
395 should_free_utf8 = TRUE;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
396 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
397 else
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
398 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
399 utf8_str = from;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
400 utf8_len = fromLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
401 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
402
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
403 if (utf8_str == NULL)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
404 break;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
405
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
406 convert_setup(&conv, NULL, NULL);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
407
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
408 result = mac_utf8_to_utf16(utf8_str, utf8_len, actualLen);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
409
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
410 if (should_free_utf8)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
411 vim_free(utf8_str);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
412 return result;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
413 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
414 while (0);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
415
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
416 if (actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
417 *actualLen = 0;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
418
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
419 return result;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
420 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
421
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
422 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
423 * Converts from UTF-16 UniChars to CFString
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
424 */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
425 CFStringRef
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
426 mac_enc_to_cfstring(from, fromLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
427 char_u *from;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
428 size_t fromLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
429 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
430 UniChar *utf16_str;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
431 size_t utf16_len;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
432 CFStringRef result = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
433
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
434 utf16_str = mac_enc_to_utf16(from, fromLen, &utf16_len);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
435 if (utf16_str)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
436 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
437 result = CFStringCreateWithCharacters(NULL, utf16_str, utf16_len/sizeof(UniChar));
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
438 vim_free(utf16_str);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
439 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
440
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
441 return result;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
442 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
443
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
444 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
445 * Converts a decomposed HFS+ UTF-8 path to precomposed UTF-8
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
446 */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
447 char_u *
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
448 mac_precompose_path(decompPath, decompLen, precompLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
449 char_u *decompPath;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
450 size_t decompLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
451 size_t *precompLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
452 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
453 char_u *result = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
454 size_t actualLen = 0;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
455
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
456 if (gPathConverter)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
457 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
458 result = alloc(decompLen);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
459 if (result)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
460 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
461 if (TECConvertText(gPathConverter, decompPath,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
462 decompLen, &decompLen, result,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
463 decompLen, &actualLen) != noErr)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
464 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
465 vim_free(result);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
466 result = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
467 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
468 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
469 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
470
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
471 if (precompLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
472 *precompLen = actualLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
473
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
474 return result;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
475 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
476
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
477 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
478 * Converts from UTF-16 UniChars to precomposed UTF-8
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
479 */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
480 char_u *
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
481 mac_utf16_to_utf8(from, fromLen, actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
482 UniChar *from;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
483 size_t fromLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
484 size_t *actualLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
485 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
486 ByteCount utf8_len;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
487 ByteCount inputRead;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
488 char_u *result;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
489
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
490 if (gUTF16ToUTF8Converter)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
491 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
492 result = alloc(fromLen * 6 + 1);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
493 if (result && TECConvertText(gUTF16ToUTF8Converter, (ConstTextPtr)from,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
494 fromLen, &inputRead, result,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
495 (fromLen*6+1)*sizeof(char_u), &utf8_len) == noErr)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
496 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
497 TECFlushText(gUTF16ToUTF8Converter, result, (fromLen*6+1)*sizeof(char_u), &inputRead);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
498 utf8_len += inputRead;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
499 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
500 else
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
501 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
502 vim_free(result);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
503 result = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
504 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
505 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
506 else
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
507 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
508 result = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
509 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
510
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
511 if (actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
512 *actualLen = result ? utf8_len : 0;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
513
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
514 return result;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
515 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
516
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
517 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
518 * Converts from UTF-8 to UTF-16 UniChars
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
519 */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
520 UniChar *
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
521 mac_utf8_to_utf16(from, fromLen, actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
522 char_u *from;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
523 size_t fromLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
524 size_t *actualLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
525 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
526 CFStringRef utf8_str;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
527 CFRange convertRange;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
528 UniChar *result = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
529
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
530 utf8_str = CFStringCreateWithBytes(NULL, from, fromLen,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
531 kCFStringEncodingUTF8, FALSE);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
532
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
533 if (utf8_str == NULL) {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
534 if (actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
535 *actualLen = 0;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
536 return NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
537 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
538
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
539 convertRange = CFRangeMake(0, CFStringGetLength(utf8_str));
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
540 result = (UniChar *)alloc(convertRange.length * sizeof(UniChar));
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
541
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
542 CFStringGetCharacters(utf8_str, convertRange, result);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
543
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
544 CFRelease(utf8_str);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
545
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
546 if (actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
547 *actualLen = convertRange.length * sizeof(UniChar);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
548
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
549 return result;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
550 }
20
4ac1dce8dd5e updated for version 7.0012
vimboss
parents: 18
diff changeset
551 #endif /* FEAT_MBYTE */