blob: 8e9d55d38a990fcf5626d85cb5dd202803fbc9b5 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001/* vi:set ts=8 sts=4 sw=4:
2 *
3 * VIM - Vi IMproved by Bram Moolenaar
4 *
5 * Do ":help uganda" in Vim to read copying and usage conditions.
6 * Do ":help credits" in Vim to see a list of people who contributed.
7 * See README.txt for an overview of the Vim source code.
8 */
9
10/*
11 * os_macosx.c -- election of os_mac.c or os_unix.c
12 *
13 */
14
15#ifdef MACOS_X_UNIX
16# ifdef HAVE_CONFIG_H /* Using Makefile. */
17# include "vim.h"
18# else
19# include "os_unix.c" /* Using Project Builder */
20# endif
21#else
22# include "os_mac.c"
23# include <TextEncodingConverter.h>
24#endif
25
26#ifdef _DEBUG
27 void
28Trace(char* fmt, ...)
29{
30 char buf[2048];
31 va_list args;
32
33 va_start(args, fmt);
34 /* vsnprintf(buf, sizeof(buf), fmt, args);*/
35 fprintf(stderr, "%s", buf);
36 va_end(args);
37}
38#endif
39
40#ifdef MACOS_X_ICONVEMU
41/*
42 * Libiconv emulation layer
43 */
44
45struct _iconv_t
46{
47 TECObjectRef tec;
48 TECObjectRef tecReverse;
49 TECSnifferObjectRef sniff;
50 TextEncoding from;
51 TextEncoding to;
52};
53/* typedef struct _iconv_t *iconv_t; */
54
55
56static int last_errno = 0;
57
58/*
59 * Get TextEncoding from iconv's encoding name
60 */
61 static TextEncoding
62get_textencoding(const char* encodename)
63{
64 static struct {
65 const char* name;
66 TextEncoding encode;
67 } encodetable[] = {
68 /* ISO-8859 encodings family */
69 {"latin1", kTextEncodingISOLatin1},
70 {"latin2", kTextEncodingISOLatin2},
71 {"latin3", kTextEncodingISOLatin3},
72 {"latin4", kTextEncodingISOLatin4},
73 {"latin5", kTextEncodingISOLatin5},
74 {"latin6", kTextEncodingISOLatin6},
75 {"latin7", kTextEncodingISOLatin7},
76 {"latin8", kTextEncodingISOLatin8},
77 {"latin9", kTextEncodingISOLatin9},
78 {"iso-8859-1", kTextEncodingISOLatin1},
79 {"iso-8859-2", kTextEncodingISOLatin2},
80 {"iso-8859-3", kTextEncodingISOLatin3},
81 {"iso-8859-4", kTextEncodingISOLatin4},
82 {"iso-8859-5", kTextEncodingISOLatinCyrillic},
83 {"iso-8859-6", kTextEncodingISOLatinArabic},
84 {"iso-8859-7", kTextEncodingISOLatinGreek},
85 {"iso-8859-8", kTextEncodingISOLatinHebrew},
86 {"iso-8859-9", kTextEncodingISOLatin5},
87 {"iso-8859-10", kTextEncodingISOLatin6},
Bram Moolenaar78622822005-08-23 21:00:13 +000088 {"iso-8859-15", kTextEncodingISOLatin9},
Bram Moolenaar071d4272004-06-13 20:20:40 +000089
90 /* Unicode encodings. */
91 /* TODO: Add other type of unicode */
92 {"ucs-2", kTextEncodingMacUnicode},
93
94 /* Japanese encoding aliases */
95 {"cp932", kTextEncodingShiftJIS},
96 {"shift-jis", kTextEncodingShiftJIS},
97 {"euc-jp", kTextEncodingEUC_JP},
98 {"iso-2022-jp", kTextEncodingISO_2022_JP},
99 {"iso-2022-jp-1", kTextEncodingISO_2022_JP_1},
100 {"iso-2022-jp-2", kTextEncodingISO_2022_JP_2},
101 {"iso-2022-jp-3", kTextEncodingISO_2022_JP_3},
102
103 /* Other aliases. These aliases in this block are just guessed. */
104 /* TODO: Must be verified. */
105 {"gb2312", kTextEncodingGB_2312_80},
106 {"cp936", kTextEncodingMacChineseSimp},
107 {"euc-cn", kTextEncodingEUC_CN},
108 {"cp950", kTextEncodingMacChineseTrad},
109 {"euc-tw", kTextEncodingEUC_TW},
110 {"cp949", kTextEncodingMacKorean},
111 {"euc-kr", kTextEncodingEUC_KR},
112
113 /*
114 * All encodings supported by Macintosh. You can find these values
115 * in a file:
116 * /System/Library/Frameworks/CoreServices.framework/Versions/A/
117 * Frameworks/CarbonCore.framework/Versions/A/Headers/TextCommon.h
118 */
119 {"MacRoman", kTextEncodingMacRoman},
120 {"MacJapanese", kTextEncodingMacJapanese},
121 {"MacChineseTrad", kTextEncodingMacChineseTrad},
122 {"MacKorean", kTextEncodingMacKorean},
123 {"MacArabic", kTextEncodingMacArabic},
124 {"MacHebrew", kTextEncodingMacHebrew},
125 {"MacGreek", kTextEncodingMacGreek},
126 {"MacCyrillic", kTextEncodingMacCyrillic},
127 {"MacDevanagari", kTextEncodingMacDevanagari},
128 {"MacGurmukhi", kTextEncodingMacGurmukhi},
129 {"MacGujarati", kTextEncodingMacGujarati},
130 {"MacOriya", kTextEncodingMacOriya},
131 {"MacBengali", kTextEncodingMacBengali},
132 {"MacTamil", kTextEncodingMacTamil},
133 {"MacTelugu", kTextEncodingMacTelugu},
134 {"MacKannada", kTextEncodingMacKannada},
135 {"MacMalayalam", kTextEncodingMacMalayalam},
136 {"MacSinhalese", kTextEncodingMacSinhalese},
137 {"MacBurmese", kTextEncodingMacBurmese},
138 {"MacKhmer", kTextEncodingMacKhmer},
139 {"MacThai", kTextEncodingMacThai},
140 {"MacLaotian", kTextEncodingMacLaotian},
141 {"MacGeorgian", kTextEncodingMacGeorgian},
142 {"MacArmenian", kTextEncodingMacArmenian},
143 {"MacChineseSimp", kTextEncodingMacChineseSimp},
144 {"MacTibetan", kTextEncodingMacTibetan},
145 {"MacMongolian", kTextEncodingMacMongolian},
146 {"MacEthiopic", kTextEncodingMacEthiopic},
147 {"MacCentralEurRoman", kTextEncodingMacCentralEurRoman},
148 {"MacVietnamese", kTextEncodingMacVietnamese},
149 {"MacExtArabic", kTextEncodingMacExtArabic},
150 {"MacSymbol", kTextEncodingMacSymbol},
151 {"MacDingbats", kTextEncodingMacDingbats},
152 {"MacTurkish", kTextEncodingMacTurkish},
153 {"MacCroatian", kTextEncodingMacCroatian},
154 {"MacIcelandic", kTextEncodingMacIcelandic},
155 {"MacRomanian", kTextEncodingMacRomanian},
156 {"MacCeltic", kTextEncodingMacCeltic},
157 {"MacGaelic", kTextEncodingMacGaelic},
158 {"MacKeyboardGlyphs", kTextEncodingMacKeyboardGlyphs},
159 {"MacTradChinese", kTextEncodingMacTradChinese},
160 {"MacRSymbol", kTextEncodingMacRSymbol},
161 {"MacSimpChinese", kTextEncodingMacSimpChinese},
162 {"MacGeez", kTextEncodingMacGeez},
163 {"MacEastEurRoman", kTextEncodingMacEastEurRoman},
164 {"MacUninterp", kTextEncodingMacUninterp},
165 {"MacUnicode", kTextEncodingMacUnicode},
166 {"MacFarsi", kTextEncodingMacFarsi},
167 {"MacUkrainian", kTextEncodingMacUkrainian},
168 {"MacInuit", kTextEncodingMacInuit},
169 {"MacVT100", kTextEncodingMacVT100},
170 {"MacHFS", kTextEncodingMacHFS},
171 {"UnicodeDefault", kTextEncodingUnicodeDefault},
172 {"UnicodeV1_1", kTextEncodingUnicodeV1_1},
173 {"ISO10646_1993", kTextEncodingISO10646_1993},
174 {"UnicodeV2_0", kTextEncodingUnicodeV2_0},
175 {"UnicodeV2_1", kTextEncodingUnicodeV2_1},
176 {"UnicodeV3_0", kTextEncodingUnicodeV3_0},
177 {"UnicodeV3_1", kTextEncodingUnicodeV3_1},
178 {"UnicodeV3_2", kTextEncodingUnicodeV3_2},
179 {"ISOLatin1", kTextEncodingISOLatin1},
180 {"ISOLatin2", kTextEncodingISOLatin2},
181 {"ISOLatin3", kTextEncodingISOLatin3},
182 {"ISOLatin4", kTextEncodingISOLatin4},
183 {"ISOLatinCyrillic", kTextEncodingISOLatinCyrillic},
184 {"ISOLatinArabic", kTextEncodingISOLatinArabic},
185 {"ISOLatinGreek", kTextEncodingISOLatinGreek},
186 {"ISOLatinHebrew", kTextEncodingISOLatinHebrew},
187 {"ISOLatin5", kTextEncodingISOLatin5},
188 {"ISOLatin6", kTextEncodingISOLatin6},
189 {"ISOLatin7", kTextEncodingISOLatin7},
190 {"ISOLatin8", kTextEncodingISOLatin8},
191 {"ISOLatin9", kTextEncodingISOLatin9},
192 {"DOSLatinUS", kTextEncodingDOSLatinUS},
193 {"DOSGreek", kTextEncodingDOSGreek},
194 {"DOSBalticRim", kTextEncodingDOSBalticRim},
195 {"DOSLatin1", kTextEncodingDOSLatin1},
196 {"DOSGreek1", kTextEncodingDOSGreek1},
197 {"DOSLatin2", kTextEncodingDOSLatin2},
198 {"DOSCyrillic", kTextEncodingDOSCyrillic},
199 {"DOSTurkish", kTextEncodingDOSTurkish},
200 {"DOSPortuguese", kTextEncodingDOSPortuguese},
201 {"DOSIcelandic", kTextEncodingDOSIcelandic},
202 {"DOSHebrew", kTextEncodingDOSHebrew},
203 {"DOSCanadianFrench", kTextEncodingDOSCanadianFrench},
204 {"DOSArabic", kTextEncodingDOSArabic},
205 {"DOSNordic", kTextEncodingDOSNordic},
206 {"DOSRussian", kTextEncodingDOSRussian},
207 {"DOSGreek2", kTextEncodingDOSGreek2},
208 {"DOSThai", kTextEncodingDOSThai},
209 {"DOSJapanese", kTextEncodingDOSJapanese},
210 {"DOSChineseSimplif", kTextEncodingDOSChineseSimplif},
211 {"DOSKorean", kTextEncodingDOSKorean},
212 {"DOSChineseTrad", kTextEncodingDOSChineseTrad},
213 {"WindowsLatin1", kTextEncodingWindowsLatin1},
214 {"WindowsANSI", kTextEncodingWindowsANSI},
215 {"WindowsLatin2", kTextEncodingWindowsLatin2},
216 {"WindowsCyrillic", kTextEncodingWindowsCyrillic},
217 {"WindowsGreek", kTextEncodingWindowsGreek},
218 {"WindowsLatin5", kTextEncodingWindowsLatin5},
219 {"WindowsHebrew", kTextEncodingWindowsHebrew},
220 {"WindowsArabic", kTextEncodingWindowsArabic},
221 {"WindowsBalticRim", kTextEncodingWindowsBalticRim},
222 {"WindowsVietnamese", kTextEncodingWindowsVietnamese},
223 {"WindowsKoreanJohab", kTextEncodingWindowsKoreanJohab},
224 {"US_ASCII", kTextEncodingUS_ASCII},
225 {"JIS_X0201_76", kTextEncodingJIS_X0201_76},
226 {"JIS_X0208_83", kTextEncodingJIS_X0208_83},
227 {"JIS_X0208_90", kTextEncodingJIS_X0208_90},
228 {"JIS_X0212_90", kTextEncodingJIS_X0212_90},
229 {"JIS_C6226_78", kTextEncodingJIS_C6226_78},
230 {"ShiftJIS_X0213_00", kTextEncodingShiftJIS_X0213_00},
231 {"GB_2312_80", kTextEncodingGB_2312_80},
232 {"GBK_95", kTextEncodingGBK_95},
233 {"GB_18030_2000", kTextEncodingGB_18030_2000},
234 {"KSC_5601_87", kTextEncodingKSC_5601_87},
235 {"KSC_5601_92_Johab", kTextEncodingKSC_5601_92_Johab},
236 {"CNS_11643_92_P1", kTextEncodingCNS_11643_92_P1},
237 {"CNS_11643_92_P2", kTextEncodingCNS_11643_92_P2},
238 {"CNS_11643_92_P3", kTextEncodingCNS_11643_92_P3},
239 {"ISO_2022_JP", kTextEncodingISO_2022_JP},
240 {"ISO_2022_JP_2", kTextEncodingISO_2022_JP_2},
241 {"ISO_2022_JP_1", kTextEncodingISO_2022_JP_1},
242 {"ISO_2022_JP_3", kTextEncodingISO_2022_JP_3},
243 {"ISO_2022_CN", kTextEncodingISO_2022_CN},
244 {"ISO_2022_CN_EXT", kTextEncodingISO_2022_CN_EXT},
245 {"ISO_2022_KR", kTextEncodingISO_2022_KR},
246 {"EUC_JP", kTextEncodingEUC_JP},
247 {"EUC_CN", kTextEncodingEUC_CN},
248 {"EUC_TW", kTextEncodingEUC_TW},
249 {"EUC_KR", kTextEncodingEUC_KR},
250 {"ShiftJIS", kTextEncodingShiftJIS},
251 {"KOI8_R", kTextEncodingKOI8_R},
252 {"Big5", kTextEncodingBig5},
253 {"MacRomanLatin1", kTextEncodingMacRomanLatin1},
254 {"HZ_GB_2312", kTextEncodingHZ_GB_2312},
255 {"Big5_HKSCS_1999", kTextEncodingBig5_HKSCS_1999},
256 {"NextStepLatin", kTextEncodingNextStepLatin},
257 {"EBCDIC_US", kTextEncodingEBCDIC_US},
258 {"EBCDIC_CP037", kTextEncodingEBCDIC_CP037},
259 {"MultiRun", kTextEncodingMultiRun},
260
261 /* Terminator */
262 {NULL, -1},
263 };
264 int i;
265
266 i = 0;
267 for (i = 0; encodetable[i].name != NULL; ++i)
268 {
269 if (STRICMP(encodename, encodetable[i].name) == 0)
270 break;
271 }
272 return encodetable[i].encode;
273}
274
275/*
276 * iconv interfaces
277 */
278
279 iconv_t
280iconv_open(const char* tocode, const char* fromcode)
281{
282 TextEncoding toEnc, fromEnc;
283 iconv_t cd = NULL;
284 OSStatus st;
285
286 /* Verify to/from encoding name */
287 toEnc = get_textencoding(tocode);
288 fromEnc = get_textencoding(fromcode);
289 if (toEnc < 0 || fromEnc < 0)
290 goto ICONV_OPEN_ERR;
291
292 /* Allocate memory to object */
293 cd = (iconv_t)alloc(sizeof(struct _iconv_t));
294 if (!cd)
295 goto ICONV_OPEN_ERR;
296 memset(cd, 0, sizeof(struct _iconv_t));
297
298 /* Create converter */
299 if (fromEnc != toEnc)
300 {
301 TRACE("*** fromEnc=%d toEnc=%d\n", (int)fromEnc, (int)toEnc);
302 st = TECCreateConverter(&cd->tec, fromEnc, toEnc);
303 if (st != 0)
304 {
305 TRACE("*** TECCreateConverter()=%d\n", (int)st);
306 goto ICONV_OPEN_ERR;
307 }
308 /* Create reverse converter */
309 st = TECCreateConverter(&cd->tecReverse, toEnc, fromEnc);
310 if (st != 0)
311 {
312 TRACE("*** TECCreateConverter()=%d (reverse)\n", (int)st);
313 goto ICONV_OPEN_ERR;
314 }
315 /* Create Sniffer */
316 st = TECCreateSniffer(&cd->sniff, &fromEnc, 1);
317 if (st != 0)
318 {
319 TRACE("*** TECCreateSniffer()=%d\n", (int)st);
320 goto ICONV_OPEN_ERR;
321 }
322 }
323
324 cd->from = fromEnc;
325 cd->to = toEnc;
326 last_errno = 0;
327 return cd;
328
329ICONV_OPEN_ERR:
330 if (cd)
331 iconv_close(cd);
332 last_errno = EINVAL;
333 return (iconv_t)-1;
334}
335
336/*
337 * Used when there are same value in 'from encoding' and 'to encoding'.
338 * TEC doesn't support conversion between same encodings, and
339 * TECCreateConverter() failed.
340 */
341 static size_t
Bram Moolenaarab79bcb2004-07-18 21:34:53 +0000342null_conv(iconv_t cd, const char **inbuf, size_t *inbytesleft,
343 char **outbuf, size_t *outbytesleft)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000344{
345 const char* buf_in = inbuf && *inbuf ? *inbuf : NULL;
346 char* buf_out = outbuf && *outbuf ? *outbuf : NULL;
347
348 if (buf_in)
349 {
350 int in_len = inbytesleft ? *inbytesleft : 0;
351 int out_len = outbytesleft ? *outbytesleft : 0;
352
353 if (!buf_out || out_len <= 0)
354 {
355 last_errno = E2BIG;
356 return -1;
357 }
358 else if (in_len > 0)
359 {
360 int len = in_len < out_len ? in_len : out_len;
361
362 memcpy (buf_out, buf_in, len);
363 *inbuf += len;
364 *outbuf += len;
365 *inbytesleft -= len;
366 *outbytesleft -= len;
367 if (*outbytesleft <= 0)
368 {
369 last_errno = E2BIG;
370 return -1;
371 }
372 }
373 }
374 last_errno = 0;
375 return 0;
376}
377
378 size_t
Bram Moolenaarab79bcb2004-07-18 21:34:53 +0000379iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft,
380 char **outbuf, size_t *outbytesleft)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000381{
Bram Moolenaarab79bcb2004-07-18 21:34:53 +0000382 ConstTextPtr buf_in;
383 TextPtr buf_out;
384 ByteCount out_len, out_true;
385 ByteCount in_len, in_true;
386 OSStatus st;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000387
388 if (!cd)
389 {
390 last_errno = ENOENT; /* TODO: Another error code should be set */
391 return -1;
392 }
393 if (cd->from == cd->to)
394 return null_conv(cd, inbuf, inbytesleft, outbuf, outbytesleft) ;
395
396 buf_in = (TextPtr) inbuf ;
397 buf_out = (TextPtr) outbuf ;
398 out_len = out_true = -1;
399 in_len = in_true = -1;
400
401 if (buf_in && buf_out)
402 {
403 ItemCount error, feature;
404
405 /* Normal convert mode */
406 if (!inbytesleft || !outbytesleft)
407 {
408 last_errno = EFAULT;
409 return -1;
410 }
411 in_len = *inbytesleft;
412 out_len = *outbytesleft;
413
414 /* Check stream is form in expected encoding or not */
415 st = TECSniffTextEncoding(cd->sniff, (TextPtr)buf_in, in_len,
416 &cd->from, 1, &error, 1, &feature, 1);
417 TRACE("TECSniffTextEncoding()=%d error=%d feature=%d\n",
418 (int)st, (int)error, (int)feature);
419 if ((error != 0 || feature == 0)
420 && !(error == 0xffffffff && feature == 0xffffffff))
421 /* Not expected encoding */
422 st = kTECUnmappableElementErr;
423 else
424 {
425 /* Do convert */
426 st = TECConvertText(cd->tec,
427 buf_in, in_len, &in_true,
428 buf_out, out_len, &out_true);
429 /* Verify converted text. Compare original text with reverse
430 * converted text. If not match, there is some problem on
431 * converting. */
432 if (st == 0 && in_true > 0)
433 {
434 ByteCount rev_in, rev_out;
435 TextPtr buf_rev = (TextPtr)alloc(in_true);
436
437 if (buf_rev)
438 {
439 st = TECConvertText(cd->tecReverse,
440 buf_out, out_true, &rev_in,
441 buf_rev, in_true, &rev_out);
442 if (st != 0 || rev_in != out_true || rev_out != in_true
443 || memcmp(buf_rev, buf_in, rev_out) != 0)
444 {
445#ifdef ICONVOSX_DEBUG
446 fprintf(stderr, " reverse conversion failed.\n");
447#endif
448 st = kTECUnmappableElementErr;
449 }
450 vim_free(buf_rev);
451 }
452 else
453 st = kTECUnmappableElementErr;
454 }
455 }
456 }
457 else if (!buf_in && buf_out)
458 {
459 /* Flush all buffered strings to buffer, and reset status */
460 if (!outbytesleft)
461 {
462 last_errno = EFAULT;
463 return -1;
464 }
465 out_len = *outbytesleft;
466 st = TECFlushText(cd->tec,
467 buf_out, out_len, &out_true);
468 }
469 else if (!buf_in && !buf_out)
470 {
471 /* Reset cd's status and cancel buffered strings */
472 unsigned char tmp_out[256];
473
474 buf_out = tmp_out;
475 out_len = sizeof(tmp_out);
476 st = TECFlushText(cd->tec,
477 buf_out, out_len, &out_true);
478 }
479 else
480 {
481 last_errno = EFAULT;
482 return -1;
483 }
484 TRACE("st=%d, buf_in=%p, in_len=%d, in_true=%d\n"
485 " buf_out=%p, out_len=%d, out_true=%d\n", (int)st,
486 buf_in, (int)in_len, (int)in_true,
487 buf_out, (int)out_len, (int)out_true);
488
489 switch (st)
490 {
491 case 0:
492 /* No error */
493 if (inbytesleft)
494 *inbytesleft -= in_true;
495 if (outbytesleft)
496 *outbytesleft -= out_true;
497 if (inbuf && *inbuf)
498 *inbuf += in_true;
499 if (outbuf && *outbuf)
500 *outbuf += out_true;
501 last_errno = 0;
502 return 0; /* No error */
503 case kTECUnmappableElementErr:
504 last_errno = EILSEQ;
505 case kTECIncompleteElementErr:
506 last_errno = EINVAL;
507 case kTECOutputBufferFullStatus:
508 last_errno = E2BIG;
509 return -1;
510 default:
511 TRACE("iconv(%p, %p, %p, %p, %p) failed. (%d)\n",
512 cd, inbuf, inbytesleft, outbuf, outbytesleft, (int)st);
513 last_errno = EFAULT;
514 return -1;
515 }
516}
517
518 int
519iconv_close(iconv_t cd)
520{
521 if (cd)
522 {
523 /* Free all elements of iconv_t */
524 if (cd->tec)
525 TECDisposeConverter(cd->tec);
526 if (cd->tecReverse)
527 TECDisposeConverter(cd->tecReverse);
528 if (cd->sniff)
529 TECDisposeSniffer(cd->sniff);
530 vim_free(cd);
531 last_errno = 0;
532 return 0;
533 }
534 else
535 {
536 last_errno = EINVAL;
537 return -1;
538 }
539}
540
Bram Moolenaarab79bcb2004-07-18 21:34:53 +0000541 int *
Bram Moolenaar071d4272004-06-13 20:20:40 +0000542iconv_errno()
543{
544 return &last_errno;
545}
546#endif /* MACOS_X_ICONVEMU */
547
548#ifdef USE_MCH_GETTEXT
549
550#define GETTEXT_BUFNUM 64
551#define GETTEXT_BUFSIZE 256
552
Bram Moolenaarab79bcb2004-07-18 21:34:53 +0000553 char *
554mch_gettext(const char *msgid)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000555{
556 static char buf[GETTEXT_BUFNUM][GETTEXT_BUFSIZE];
557 static int bufnum = 0;
558 const char *msg = NULL;
559 CFStringRef strkey = NULL, strmsg = NULL;
560 CFStringEncoding enc;
561
562 if (!msgid)
563 goto MCH_GETTEXT_FINISH;
564 enc = CFStringGetSystemEncoding();
565 TRACE("mch_gettext(%s)\n", msgid);
566
567 strkey = CFStringCreateWithCString(NULL, msgid, enc);
568 if (!strkey)
569 {
570 TRACE(" Can't create a CFString for msgid.\n");
571 goto MCH_GETTEXT_FINISH;
572 }
573
574 strmsg = CFCopyLocalizedString(strkey, NULL);
575 if (!strmsg)
576 {
577 TRACE(" No localized strings for msgid.\n");
578 goto MCH_GETTEXT_FINISH;
579 }
580
581 msg = CFStringGetCStringPtr(strmsg, enc);
582 if (!msg)
583 {
584 /* This is as backup when CFStringGetCStringPtr was failed */
585 CFStringGetCString(strmsg, buf[bufnum], GETTEXT_BUFSIZE, enc);
586 msg = buf[bufnum];
587 if (++bufnum >= GETTEXT_BUFNUM)
588 bufnum = 0;
589 }
590 TRACE(" Localized to: %s\n", msg);
591
592MCH_GETTEXT_FINISH:
593 if (strkey)
594 CFRelease(strkey);
595 if (strmsg)
596 CFRelease(strmsg);
Bram Moolenaarab79bcb2004-07-18 21:34:53 +0000597 return (char *)(msg ? msg : msgid);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000598}
599
Bram Moolenaarab79bcb2004-07-18 21:34:53 +0000600 char *
601mch_bindtextdomain(const char *domain, const char *dirname)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000602{
603 TRACE("mch_bindtextdomain(%s, %s)\n", domain, dirname);
604 return (char*)dirname;
605}
606
Bram Moolenaarab79bcb2004-07-18 21:34:53 +0000607 char *
608mch_textdomain(const char *domain)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000609{
610 TRACE("mch_textdomain(%s)\n", domain);
611 return (char*)domain;
612}
613#endif