annotate src/os_mac_conv.c @ 34627:5071d4c3ff2e v9.1.0202

patch 9.1.0202: leaking memory in add_user() on failure Commit: https://github.com/vim/vim/commit/7a2f217988afa1c35b9c093a9d3477198ea250b9 Author: Christian Brabandt <cb@256bit.org> Date: Sun Mar 24 09:50:03 2024 +0100 patch 9.1.0202: leaking memory in add_user() on failure Problem: leaking memory in add_user() (LuMingYinDetect) Solution: free user_copy pointer instead of the user ptr add_user() is called with a user pointer and the user pointer comes from these functions: - return value from the getpwent() function (Unix). - return value from the getpwnam() function (Unix). - return value from the NetUserEnum() function (MS Windows). For the first 2 callers, the man page for those functions directly says, one should not free the returned pointer (since it comes from static memory). For the third caller (on MS Windows), the returned buffer is already freed directly after calling the add_user() function in NetApiBufferFree(), so this would lead to a double free(). This all indicates, the user ptr is wrongly freed in the add_user() function and the intention was to free the user_copy pointer instead in case of an error. So let's just use that now. fixes: #14250 closes: #14260 Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Sun, 24 Mar 2024 10:00:09 +0100
parents 50555279168b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10042
4aead6a9b7a9 commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents: 10025
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
18
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
2891
acda456c788a updated for version 7.3.219
Bram Moolenaar <bram@vim.org>
parents: 2309
diff changeset
17
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
18 #include "vim.h"
7811
7fda54504fee commit https://github.com/vim/vim/commit/3e96c3d241ab657cf4df0913ea8de50a6cb90730
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
19
21745
35921b7fc07a patch 8.2.1422: the Mac GUI implementation is outdated
Bram Moolenaar <Bram@vim.org>
parents: 18810
diff changeset
20 #if !defined(PROTO)
2309
543ea69d037f Add clipboard support in Mac console. (Bjorn Winckler)
Bram Moolenaar <bram@vim.org>
parents: 1621
diff changeset
21 # include <CoreServices/CoreServices.h>
543ea69d037f Add clipboard support in Mac console. (Bjorn Winckler)
Bram Moolenaar <bram@vim.org>
parents: 1621
diff changeset
22 #endif
543ea69d037f Add clipboard support in Mac console. (Bjorn Winckler)
Bram Moolenaar <bram@vim.org>
parents: 1621
diff changeset
23
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
24
766
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 501
diff changeset
25 #if defined(MACOS_CONVERT) || defined(PROTO)
2309
543ea69d037f Add clipboard support in Mac console. (Bjorn Winckler)
Bram Moolenaar <bram@vim.org>
parents: 1621
diff changeset
26
766
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 501
diff changeset
27 # ifdef PROTO
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
28 // A few dummy types to be able to generate function prototypes.
766
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 501
diff changeset
29 typedef int UniChar;
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 501
diff changeset
30 typedef int *TECObjectRef;
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 501
diff changeset
31 typedef int CFStringRef;
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 501
diff changeset
32 # endif
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 501
diff changeset
33
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 3143
diff changeset
34 static char_u *mac_utf16_to_utf8(UniChar *from, size_t fromLen, size_t *actualLen);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 3143
diff changeset
35 static UniChar *mac_utf8_to_utf16(char_u *from, size_t fromLen, size_t *actualLen);
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
36
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
37 // Converter for composing decomposed HFS+ file paths
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
38 static TECObjectRef gPathConverter;
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
39 // Converter used by mac_utf16_to_utf8
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
40 static TECObjectRef gUTF16ToUTF8Converter;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
41
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
42 /*
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
43 * A Mac version of string_convert_ext() for special cases.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
44 */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
45 char_u *
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
46 mac_string_convert(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
47 char_u *ptr,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
48 int len,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
49 int *lenp,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
50 int fail_on_error,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
51 int from_enc,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
52 int to_enc,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
53 int *unconvlenp)
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
54 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
55 char_u *retval, *d;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
56 CFStringRef cfstr;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
57 int buflen, in, out, l, i;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
58 CFStringEncoding from;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
59 CFStringEncoding to;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
60
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
61 switch (from_enc)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
62 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
63 case 'l': from = kCFStringEncodingISOLatin1; break;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
64 case 'm': from = kCFStringEncodingMacRoman; break;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
65 case 'u': from = kCFStringEncodingUTF8; break;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
66 default: return NULL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
67 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
68 switch (to_enc)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
69 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
70 case 'l': to = kCFStringEncodingISOLatin1; break;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
71 case 'm': to = kCFStringEncodingMacRoman; break;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
72 case 'u': to = kCFStringEncodingUTF8; break;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
73 default: return NULL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
74 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
75
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
76 if (unconvlenp != NULL)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
77 *unconvlenp = 0;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
78 cfstr = CFStringCreateWithBytes(NULL, ptr, len, from, 0);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
79
3143
314d9368069e updated for version 7.3.342
Bram Moolenaar <bram@vim.org>
parents: 2891
diff changeset
80 if (cfstr == NULL)
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
81 fprintf(stderr, "Encoding failed\n");
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
82 // When conversion failed, try excluding bytes from the end, helps when
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
83 // there is an incomplete byte sequence. Only do up to 6 bytes to avoid
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
84 // looping a long time when there really is something unconvertible.
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
85 while (cfstr == NULL && unconvlenp != NULL && len > 1 && *unconvlenp < 6)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
86 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
87 --len;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
88 ++*unconvlenp;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
89 cfstr = CFStringCreateWithBytes(NULL, ptr, len, from, 0);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
90 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
91 if (cfstr == NULL)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
92 return NULL;
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
93
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
94 if (to == kCFStringEncodingUTF8)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
95 buflen = len * 6 + 1;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
96 else
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
97 buflen = len + 1;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
98 retval = alloc(buflen);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
99 if (retval == NULL)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
100 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
101 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
102 return NULL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
103 }
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
104
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
105 #if 0
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
106 CFRange convertRange = CFRangeMake(0, CFStringGetLength(cfstr));
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
107 // Determine output buffer size
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
108 CFStringGetBytes(cfstr, convertRange, to, NULL, FALSE, NULL, 0, (CFIndex *)&buflen);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
109 retval = (buflen > 0) ? alloc(buflen) : NULL;
31804
50555279168b patch 9.0.1234: the code style has to be checked manually
Bram Moolenaar <Bram@vim.org>
parents: 31752
diff changeset
110 if (retval == NULL)
50555279168b patch 9.0.1234: the code style has to be checked manually
Bram Moolenaar <Bram@vim.org>
parents: 31752
diff changeset
111 {
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
112 CFRelease(cfstr);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
113 return NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
114 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
115
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
116 if (lenp)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
117 *lenp = buflen / sizeof(char_u);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
118
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
119 if (!CFStringGetBytes(cfstr, convertRange, to, NULL, FALSE, retval, buflen, NULL))
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
120 #endif
501
ce2181d14aa0 updated for version 7.0139
vimboss
parents: 474
diff changeset
121 if (!CFStringGetCString(cfstr, (char *)retval, buflen, to))
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
122 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
123 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
124 if (fail_on_error)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
125 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
126 vim_free(retval);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
127 return NULL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
128 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
129
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
130 fprintf(stderr, "Trying char-by-char conversion...\n");
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
131 // conversion failed for the whole string, but maybe it will work
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
132 // for each character
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
133 for (d = retval, in = 0, out = 0; in < len && out < buflen - 1;)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
134 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
135 if (from == kCFStringEncodingUTF8)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 179
diff changeset
136 l = utf_ptr2len(ptr + in);
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
137 else
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
138 l = 1;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
139 cfstr = CFStringCreateWithBytes(NULL, ptr + in, l, from, 0);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
140 if (cfstr == NULL)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
141 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
142 *d++ = '?';
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
143 out++;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
144 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
145 else
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
146 {
501
ce2181d14aa0 updated for version 7.0139
vimboss
parents: 474
diff changeset
147 if (!CFStringGetCString(cfstr, (char *)d, buflen - out, to))
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
148 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
149 *d++ = '?';
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
150 out++;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
151 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
152 else
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
153 {
501
ce2181d14aa0 updated for version 7.0139
vimboss
parents: 474
diff changeset
154 i = STRLEN(d);
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
155 d += i;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
156 out += i;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
157 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
158 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
159 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
160 in += l;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
161 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
162 *d = NUL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
163 if (lenp != NULL)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
164 *lenp = out;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
165 return retval;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
166 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
167 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
168 if (lenp != NULL)
501
ce2181d14aa0 updated for version 7.0139
vimboss
parents: 474
diff changeset
169 *lenp = STRLEN(retval);
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
170
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
171 return retval;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
172 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
173
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
174 /*
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
175 * Conversion from Apple MacRoman char encoding to UTF-8 or latin1, using
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
176 * standard Carbon framework.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
177 * Input: "ptr[*sizep]".
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
178 * "real_size" is the size of the buffer that "ptr" points to.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
179 * output is in-place, "sizep" is adjusted.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
180 * Returns OK or FAIL.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
181 */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
182 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
183 macroman2enc(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
184 char_u *ptr,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
185 long *sizep,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
186 long real_size)
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
187 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
188 CFStringRef cfstr;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
189 CFRange r;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
190 CFIndex len = *sizep;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
191
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
192 // MacRoman is an 8-bit encoding, no need to move bytes to
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
193 // conv_rest[].
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
194 cfstr = CFStringCreateWithBytes(NULL, ptr, len,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
195 kCFStringEncodingMacRoman, 0);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
196 /*
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
197 * If there is a conversion error, try using another
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
198 * conversion.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
199 */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
200 if (cfstr == NULL)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
201 return FAIL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
202
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
203 r.location = 0;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
204 r.length = CFStringGetLength(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
205 if (r.length != CFStringGetBytes(cfstr, r,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
206 (enc_utf8) ? kCFStringEncodingUTF8 : kCFStringEncodingISOLatin1,
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
207 0, // no lossy conversion
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
208 0, // not external representation
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
209 ptr + *sizep, real_size - *sizep, &len))
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
210 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
211 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
212 return FAIL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
213 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
214 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
215 mch_memmove(ptr, ptr + *sizep, len);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
216 *sizep = len;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
217
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
218 return OK;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
219 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
220
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
221 /*
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
222 * Conversion from UTF-8 or latin1 to MacRoman.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
223 * Input: "from[fromlen]"
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
224 * Output: "to[maxtolen]" length in "*tolenp"
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
225 * Unconverted rest in rest[*restlenp].
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
226 * Returns OK or FAIL.
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
227 */
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
228 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
229 enc2macroman(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
230 char_u *from,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
231 size_t fromlen,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
232 char_u *to,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
233 int *tolenp,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
234 int maxtolen,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
235 char_u *rest,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
236 int *restlenp)
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
237 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
238 CFStringRef cfstr;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
239 CFRange r;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
240 CFIndex l;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
241
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
242 *restlenp = 0;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
243 cfstr = CFStringCreateWithBytes(NULL, from, fromlen,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
244 (enc_utf8) ? kCFStringEncodingUTF8 : kCFStringEncodingISOLatin1,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
245 0);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
246 while (cfstr == NULL && *restlenp < 3 && fromlen > 1)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
247 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
248 rest[*restlenp++] = from[--fromlen];
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
249 cfstr = CFStringCreateWithBytes(NULL, from, fromlen,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
250 (enc_utf8) ? kCFStringEncodingUTF8 : kCFStringEncodingISOLatin1,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
251 0);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
252 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
253 if (cfstr == NULL)
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
254 return FAIL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
255
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
256 r.location = 0;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
257 r.length = CFStringGetLength(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
258 if (r.length != CFStringGetBytes(cfstr, r,
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
259 kCFStringEncodingMacRoman,
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
260 0, // no lossy conversion
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
261 0, // not external representation (since vim
26771
fc859aea8cec patch 8.2.3914: various spelling mistakes in comments
Bram Moolenaar <Bram@vim.org>
parents: 22417
diff changeset
262 // handles this internally)
18
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
263 to, maxtolen, &l))
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
264 {
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
265 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
266 return FAIL;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
267 }
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
268 CFRelease(cfstr);
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
269 *tolenp = l;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
270 return OK;
293621502c4d updated for version 7.0010
vimboss
parents:
diff changeset
271 }
20
4ac1dce8dd5e updated for version 7.0012
vimboss
parents: 18
diff changeset
272
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
273 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
274 * Initializes text converters
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
275 */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
276 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
277 mac_conv_init(void)
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
278 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
279 TextEncoding utf8_encoding;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
280 TextEncoding utf8_hfsplus_encoding;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
281 TextEncoding utf8_canon_encoding;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
282 TextEncoding utf16_encoding;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
283
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
284 utf8_encoding = CreateTextEncoding(kTextEncodingUnicodeDefault,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
285 kTextEncodingDefaultVariant, kUnicodeUTF8Format);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
286 utf8_hfsplus_encoding = CreateTextEncoding(kTextEncodingUnicodeDefault,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
287 kUnicodeHFSPlusCompVariant, kUnicodeUTF8Format);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
288 utf8_canon_encoding = CreateTextEncoding(kTextEncodingUnicodeDefault,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
289 kUnicodeCanonicalCompVariant, kUnicodeUTF8Format);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
290 utf16_encoding = CreateTextEncoding(kTextEncodingUnicodeDefault,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
291 kTextEncodingDefaultVariant, kUnicode16BitFormat);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
292
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
293 if (TECCreateConverter(&gPathConverter, utf8_encoding,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
294 utf8_hfsplus_encoding) != noErr)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
295 gPathConverter = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
296
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
297 if (TECCreateConverter(&gUTF16ToUTF8Converter, utf16_encoding,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
298 utf8_canon_encoding) != noErr)
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 168
diff changeset
299 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
300 // On pre-10.3, Unicode normalization is not available so
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
301 // fall back to non-normalizing converter
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 168
diff changeset
302 if (TECCreateConverter(&gUTF16ToUTF8Converter, utf16_encoding,
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 168
diff changeset
303 utf8_encoding) != noErr)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 168
diff changeset
304 gUTF16ToUTF8Converter = NULL;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 168
diff changeset
305 }
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
306 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
307
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
308 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
309 * Destroys text converters
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
310 */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
311 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
312 mac_conv_cleanup(void)
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
313 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
314 if (gUTF16ToUTF8Converter)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
315 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
316 TECDisposeConverter(gUTF16ToUTF8Converter);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
317 gUTF16ToUTF8Converter = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
318 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
319
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
320 if (gPathConverter)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
321 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
322 TECDisposeConverter(gPathConverter);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
323 gPathConverter = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
324 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
325 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
326
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
327 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
328 * Conversion from UTF-16 UniChars to 'encoding'
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
329 * The function signature uses the real type of UniChar (as typedef'ed in
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
330 * CFBase.h) to avoid clashes with X11 header files in the .pro file
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
331 */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
332 char_u *
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
333 mac_utf16_to_enc(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
334 unsigned short *from,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
335 size_t fromLen,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
336 size_t *actualLen)
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
337 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
338 // Following code borrows somewhat from os_mswin.c
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
339 vimconv_T conv;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
340 size_t utf8_len;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
341 char_u *utf8_str;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
342 char_u *result = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
343
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
344 // Convert to utf-8 first, works better with iconv
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
345 utf8_len = 0;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
346 utf8_str = mac_utf16_to_utf8(from, fromLen, &utf8_len);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
347
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
348 if (utf8_str)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
349 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
350 // We might be called before we have p_enc set up.
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
351 conv.vc_type = CONV_NONE;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
352
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
353 // If encoding (p_enc) is any unicode, it is actually in utf-8 (vim
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
354 // internal unicode is always utf-8) so don't convert in such cases
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
355
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
356 if ((enc_canon_props(p_enc) & ENC_UNICODE) == 0)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
357 convert_setup(&conv, (char_u *)"utf-8",
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
358 p_enc? p_enc: (char_u *)"macroman");
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
359 if (conv.vc_type == CONV_NONE)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
360 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
361 // p_enc is utf-8, so we're done.
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
362 result = utf8_str;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
363 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
364 else
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
365 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
366 result = string_convert(&conv, utf8_str, (int *)&utf8_len);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
367 vim_free(utf8_str);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
368 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
369
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
370 convert_setup(&conv, NULL, NULL);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
371
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
372 if (actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
373 *actualLen = utf8_len;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
374 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
375 else if (actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
376 *actualLen = 0;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
377
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
378 return result;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
379 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
380
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
381 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
382 * Conversion from 'encoding' to UTF-16 UniChars
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
383 * The function return uses the real type of UniChar (as typedef'ed in
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
384 * CFBase.h) to avoid clashes with X11 header files in the .pro file
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
385 */
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
386 unsigned short *
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
387 mac_enc_to_utf16(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
388 char_u *from,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
389 size_t fromLen,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
390 size_t *actualLen)
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
391 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
392 // Following code borrows somewhat from os_mswin.c
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
393 vimconv_T conv;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
394 size_t utf8_len;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
395 char_u *utf8_str;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
396 UniChar *result = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
397 Boolean should_free_utf8 = FALSE;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
398
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
399 do
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
400 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
401 // Use MacRoman by default, we might be called before we have p_enc
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
402 // set up. Convert to utf-8 first, works better with iconv(). Does
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
403 // nothing if 'encoding' is "utf-8".
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
404 conv.vc_type = CONV_NONE;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
405 if ((enc_canon_props(p_enc) & ENC_UNICODE) == 0 &&
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
406 convert_setup(&conv, p_enc ? p_enc : (char_u *)"macroman",
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
407 (char_u *)"utf-8") == FAIL)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
408 break;
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 (conv.vc_type != CONV_NONE)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
411 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
412 utf8_len = fromLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
413 utf8_str = string_convert(&conv, from, (int *)&utf8_len);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
414 should_free_utf8 = TRUE;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
415 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
416 else
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
417 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
418 utf8_str = from;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
419 utf8_len = fromLen;
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 if (utf8_str == NULL)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
423 break;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
424
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
425 convert_setup(&conv, NULL, NULL);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
426
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
427 result = mac_utf8_to_utf16(utf8_str, utf8_len, actualLen);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
428
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
429 if (should_free_utf8)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
430 vim_free(utf8_str);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
431 return result;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
432 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
433 while (0);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
434
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
435 if (actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
436 *actualLen = 0;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
437
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
438 return result;
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 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
442 * Converts from UTF-16 UniChars to CFString
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
443 * The void * return type is actually a CFStringRef
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
444 */
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
445 void *
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
446 mac_enc_to_cfstring(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
447 char_u *from,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
448 size_t fromLen)
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
449 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
450 UniChar *utf16_str;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
451 size_t utf16_len;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
452 CFStringRef result = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
453
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
454 utf16_str = mac_enc_to_utf16(from, fromLen, &utf16_len);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
455 if (utf16_str)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
456 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
457 result = CFStringCreateWithCharacters(NULL, utf16_str, utf16_len/sizeof(UniChar));
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
458 vim_free(utf16_str);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
459 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
460
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
461 return (void *)result;
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
462 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
463
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
464 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
465 * Converts a decomposed HFS+ UTF-8 path to precomposed UTF-8
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
466 */
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
467 char_u *
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
468 mac_precompose_path(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
469 char_u *decompPath,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
470 size_t decompLen,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
471 size_t *precompLen)
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
472 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
473 char_u *result = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
474 size_t actualLen = 0;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
475
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
476 if (gPathConverter)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
477 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
478 result = alloc(decompLen);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
479 if (result)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
480 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
481 if (TECConvertText(gPathConverter, decompPath,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
482 decompLen, &decompLen, result,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
483 decompLen, &actualLen) != noErr)
13244
ac42c4b11dbc patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents: 12879
diff changeset
484 VIM_CLEAR(result);
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
485 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
486 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
487
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
488 if (precompLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
489 *precompLen = actualLen;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
490
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
491 return result;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
492 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
493
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
494 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
495 * Converts from UTF-16 UniChars to precomposed UTF-8
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
496 */
766
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 501
diff changeset
497 static char_u *
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
498 mac_utf16_to_utf8(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
499 UniChar *from,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
500 size_t fromLen,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
501 size_t *actualLen)
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
502 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
503 ByteCount utf8_len;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
504 ByteCount inputRead;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
505 char_u *result;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
506
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
507 if (gUTF16ToUTF8Converter)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
508 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
509 result = alloc(fromLen * 6 + 1);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
510 if (result && TECConvertText(gUTF16ToUTF8Converter, (ConstTextPtr)from,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
511 fromLen, &inputRead, result,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
512 (fromLen*6+1)*sizeof(char_u), &utf8_len) == noErr)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
513 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
514 TECFlushText(gUTF16ToUTF8Converter, result, (fromLen*6+1)*sizeof(char_u), &inputRead);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
515 utf8_len += inputRead;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
516 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
517 else
13244
ac42c4b11dbc patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents: 12879
diff changeset
518 VIM_CLEAR(result);
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
519 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
520 else
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
521 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
522 result = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
523 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
524
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
525 if (actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
526 *actualLen = result ? utf8_len : 0;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
527
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
528 return result;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
529 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
530
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
531 /*
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
532 * Converts from UTF-8 to UTF-16 UniChars
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
533 */
766
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 501
diff changeset
534 static UniChar *
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
535 mac_utf8_to_utf16(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
536 char_u *from,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
537 size_t fromLen,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
538 size_t *actualLen)
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
539 {
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
540 CFStringRef utf8_str;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
541 CFRange convertRange;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
542 UniChar *result = NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
543
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
544 utf8_str = CFStringCreateWithBytes(NULL, from, fromLen,
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
545 kCFStringEncodingUTF8, FALSE);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
546
31804
50555279168b patch 9.0.1234: the code style has to be checked manually
Bram Moolenaar <Bram@vim.org>
parents: 31752
diff changeset
547 if (utf8_str == NULL)
50555279168b patch 9.0.1234: the code style has to be checked manually
Bram Moolenaar <Bram@vim.org>
parents: 31752
diff changeset
548 {
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
549 if (actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
550 *actualLen = 0;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
551 return NULL;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
552 }
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
553
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
554 convertRange = CFRangeMake(0, CFStringGetLength(utf8_str));
16825
ce04ebdf26b8 patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents: 13244
diff changeset
555 result = ALLOC_MULT(UniChar, convertRange.length);
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
556
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
557 CFStringGetCharacters(utf8_str, convertRange, result);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
558
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
559 CFRelease(utf8_str);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
560
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
561 if (actualLen)
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
562 *actualLen = convertRange.length * sizeof(UniChar);
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
563
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
564 return result;
4d9eabb1396e updated for version 7.0051
vimboss
parents: 20
diff changeset
565 }
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
566
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
567 /*
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
568 * Sets LANG environment variable in Vim from Mac locale
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
569 */
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
570 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
571 mac_lang_init(void)
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7811
diff changeset
572 {
31752
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
573 if (mch_getenv((char_u *)"LANG") != NULL)
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
574 return;
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
575
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
576 char buf[50];
22417
68115baaf9e4 patch 8.2.1757: Mac: default locale is lacking the encoding
Bram Moolenaar <Bram@vim.org>
parents: 22379
diff changeset
577
31752
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
578 // $LANG is not set, either because it was unset or Vim was started
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
579 // from the Dock. Query the system locale.
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
580 if (LocaleRefGetPartString(NULL,
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
581 kLocaleLanguageMask | kLocaleLanguageVariantMask |
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
582 kLocaleRegionMask | kLocaleRegionVariantMask,
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
583 sizeof(buf) - 10, buf) == noErr && *buf)
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
584 {
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
585 if (strcasestr(buf, "utf-8") == NULL)
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
586 strcat(buf, ".UTF-8");
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
587 vim_setenv((char_u *)"LANG", (char_u *)buf);
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
588 # ifdef HAVE_LOCALE_H
31752
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
589 setlocale(LC_ALL, "");
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
590 # endif
30310
029c59bf78f1 patch 9.0.0491: no good reason to build without the float feature
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
591 # if defined(LC_NUMERIC)
31752
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
592 // Make sure strtod() uses a decimal point, not a comma.
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
593 setlocale(LC_NUMERIC, "C");
22379
e1e24b1dba6e patch 8.2.1738: Mac: str2float() recognizes comma instead of decimal point
Bram Moolenaar <Bram@vim.org>
parents: 21745
diff changeset
594 # endif
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
595 }
82b5078be2dd updated for version 7.2a
vimboss
parents: 1212
diff changeset
596 }
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
597 #endif // MACOS_CONVERT