Running vim under Mac OS X terminal do not support copy to/from
system clipboard currently, this patch add this feature. To have
this feature in mainstream, we receive the following benifits:
1. We can copy from/to system clipboard without running GUI.
(Default vim builds shipped with Mac OS X do not have GUI
enabled, so it can share this feature.)
2. We don't need to duplicate code in GUI implementations like
MacVim or vim-cocoa.
The clipboard handling code is derived from MacVim.
To use Cocoa APIs, we need to convert os_macosx.c into an Obj-C
file. Other changes are trivial.
---
src/Makefile | 4 +-
src/configure.in | 4 +-
src/main.c | 4 +
src/os_macosx.c | 611 -----------------------------------------------
src/os_macosx.m | 694 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/vim.h | 1 +
6 files changed, 703 insertions(+), 615 deletions(-)
delete mode 100644 src/os_macosx.c
create mode 100644 src/os_macosx.m
diff --git a/src/Makefile b/src/Makefile
index 707a20e..e6d5bbb 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2512,8 +2512,8 @@ objects/os_beos.o: os_beos.c
objects/os_qnx.o: os_qnx.c
$(CCC) -o $@ os_qnx.c
-objects/os_macosx.o: os_macosx.c
- $(CCC) -o $@ os_macosx.c
+objects/os_macosx.o: os_macosx.m
+ $(CCC) -o $@ os_macosx.m
objects/os_mac_conv.o: os_mac_conv.c
$(CCC) -o $@ os_mac_conv.c
diff --git a/src/configure.in b/src/configure.in
index b911b81..af8abd2 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -101,7 +101,7 @@ if test "`(uname) 2>/dev/null`" = Darwin; then
if test "$enable_darwin" = "yes"; then
AC_MSG_RESULT(no)
AC_MSG_CHECKING(if Darwin files are there)
- if test -f os_macosx.c; then
+ if test -f os_macosx.m; then
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT([no, Darwin support disabled])
@@ -152,7 +152,7 @@ if test "`(uname) 2>/dev/null`" = Darwin; then
if test "$enable_darwin" = "yes"; then
MACOSX=yes
- OS_EXTRA_SRC="os_macosx.c os_mac_conv.c";
+ OS_EXTRA_SRC="os_macosx.m os_mac_conv.c";
OS_EXTRA_OBJ="objects/os_macosx.o objects/os_mac_conv.o"
dnl TODO: use -arch i386 on Intel machines
CPPFLAGS="$CPPFLAGS -DMACOS_X_UNIX -no-cpp-precomp"
diff --git a/src/main.c b/src/main.c
index 8a5aa98..991b865 100644
--- a/src/main.c
+++ b/src/main.c
@@ -706,6 +706,10 @@ main
qnx_clip_init();
#endif
+#if defined(MACOS_X_UNIX) && defined(FEAT_CLIPBOARD)
+ clip_init(TRUE);
+#endif
+
#ifdef FEAT_XCLIPBOARD
/* Start using the X clipboard, unless the GUI was started. */
# ifdef FEAT_GUI
diff --git a/src/os_macosx.c b/src/os_macosx.c
deleted file mode 100644
index 48023e3..0000000
--- a/src/os_macosx.c
+++ /dev/null
@@ -1,611 +0,0 @@
-/* vi:set ts=8 sts=4 sw=4:
- *
- * VIM - Vi IMproved by Bram Moolenaar
- *
- * Do ":help uganda" in Vim to read copying and usage conditions.
- * Do ":help credits" in Vim to see a list of people who contributed.
- * See README.txt for an overview of the Vim source code.
- */
-
-/*
- * os_macosx.c -- Mac specific things for Mac OS/X.
- */
-
-#ifdef MACOS_X_UNIX
-# ifdef HAVE_CONFIG_H /* Using Makefile. */
-# include "vim.h"
-# else
-# include "os_unix.c" /* Using Project Builder */
-# endif
-#else
- Error: MACOS 9 is no longer supported in Vim 7
-#endif
-
-#ifdef _DEBUG
- void
-Trace(char* fmt, ...)
-{
- char buf[2048];
- va_list args;
-
- va_start(args, fmt);
- /* vsnprintf(buf, sizeof(buf), fmt, args);*/
- fprintf(stderr, "%s", buf);
- va_end(args);
-}
-#endif
-
-#ifdef MACOS_X_ICONVEMU
-/*
- * Libiconv emulation layer
- */
-
-struct _iconv_t
-{
- TECObjectRef tec;
- TECObjectRef tecReverse;
- TECSnifferObjectRef sniff;
- TextEncoding from;
- TextEncoding to;
-};
-/* typedef struct _iconv_t *iconv_t; */
-
-
-static int last_errno = 0;
-
-/*
- * Get TextEncoding from iconv's encoding name
- */
- static TextEncoding
-get_textencoding(const char* encodename)
-{
- static struct {
- const char* name;
- TextEncoding encode;
- } encodetable[] = {
- /* ISO-8859 encodings family */
- {"latin1", kTextEncodingISOLatin1},
- {"latin2", kTextEncodingISOLatin2},
- {"latin3", kTextEncodingISOLatin3},
- {"latin4", kTextEncodingISOLatin4},
- {"latin5", kTextEncodingISOLatin5},
- {"latin6", kTextEncodingISOLatin6},
- {"latin7", kTextEncodingISOLatin7},
- {"latin8", kTextEncodingISOLatin8},
- {"latin9", kTextEncodingISOLatin9},
- {"iso-8859-1", kTextEncodingISOLatin1},
- {"iso-8859-2", kTextEncodingISOLatin2},
- {"iso-8859-3", kTextEncodingISOLatin3},
- {"iso-8859-4", kTextEncodingISOLatin4},
- {"iso-8859-5", kTextEncodingISOLatinCyrillic},
- {"iso-8859-6", kTextEncodingISOLatinArabic},
- {"iso-8859-7", kTextEncodingISOLatinGreek},
- {"iso-8859-8", kTextEncodingISOLatinHebrew},
- {"iso-8859-9", kTextEncodingISOLatin5},
- {"iso-8859-10", kTextEncodingISOLatin6},
- {"iso-8859-15", kTextEncodingISOLatin9},
-
- /* Unicode encodings. */
- /* TODO: Add other type of unicode */
- {"ucs-2", kTextEncodingMacUnicode},
-
- /* Japanese encoding aliases */
- {"cp932", kTextEncodingShiftJIS},
- {"shift-jis", kTextEncodingShiftJIS},
- {"euc-jp", kTextEncodingEUC_JP},
- {"iso-2022-jp", kTextEncodingISO_2022_JP},
- {"iso-2022-jp-1", kTextEncodingISO_2022_JP_1},
- {"iso-2022-jp-2", kTextEncodingISO_2022_JP_2},
- {"iso-2022-jp-3", kTextEncodingISO_2022_JP_3},
-
- /* Other aliases. These aliases in this block are just guessed. */
- /* TODO: Must be verified. */
- {"gb2312", kTextEncodingGB_2312_80},
- {"cp936", kTextEncodingMacChineseSimp},
- {"euc-cn", kTextEncodingEUC_CN},
- {"cp950", kTextEncodingMacChineseTrad},
- {"euc-tw", kTextEncodingEUC_TW},
- {"cp949", kTextEncodingMacKorean},
- {"euc-kr", kTextEncodingEUC_KR},
-
- /*
- * All encodings supported by Macintosh. You can find these values
- * in a file:
- * /System/Library/Frameworks/CoreServices.framework/Versions/A/
- * Frameworks/CarbonCore.framework/Versions/A/Headers/TextCommon.h
- */
- {"MacRoman", kTextEncodingMacRoman},
- {"MacJapanese", kTextEncodingMacJapanese},
- {"MacChineseTrad", kTextEncodingMacChineseTrad},
- {"MacKorean", kTextEncodingMacKorean},
- {"MacArabic", kTextEncodingMacArabic},
- {"MacHebrew", kTextEncodingMacHebrew},
- {"MacGreek", kTextEncodingMacGreek},
- {"MacCyrillic", kTextEncodingMacCyrillic},
- {"MacDevanagari", kTextEncodingMacDevanagari},
- {"MacGurmukhi", kTextEncodingMacGurmukhi},
- {"MacGujarati", kTextEncodingMacGujarati},
- {"MacOriya", kTextEncodingMacOriya},
- {"MacBengali", kTextEncodingMacBengali},
- {"MacTamil", kTextEncodingMacTamil},
- {"MacTelugu", kTextEncodingMacTelugu},
- {"MacKannada", kTextEncodingMacKannada},
- {"MacMalayalam", kTextEncodingMacMalayalam},
- {"MacSinhalese", kTextEncodingMacSinhalese},
- {"MacBurmese", kTextEncodingMacBurmese},
- {"MacKhmer", kTextEncodingMacKhmer},
- {"MacThai", kTextEncodingMacThai},
- {"MacLaotian", kTextEncodingMacLaotian},
- {"MacGeorgian", kTextEncodingMacGeorgian},
- {"MacArmenian", kTextEncodingMacArmenian},
- {"MacChineseSimp", kTextEncodingMacChineseSimp},
- {"MacTibetan", kTextEncodingMacTibetan},
- {"MacMongolian", kTextEncodingMacMongolian},
- {"MacEthiopic", kTextEncodingMacEthiopic},
- {"MacCentralEurRoman", kTextEncodingMacCentralEurRoman},
- {"MacVietnamese", kTextEncodingMacVietnamese},
- {"MacExtArabic", kTextEncodingMacExtArabic},
- {"MacSymbol", kTextEncodingMacSymbol},
- {"MacDingbats", kTextEncodingMacDingbats},
- {"MacTurkish", kTextEncodingMacTurkish},
- {"MacCroatian", kTextEncodingMacCroatian},
- {"MacIcelandic", kTextEncodingMacIcelandic},
- {"MacRomanian", kTextEncodingMacRomanian},
- {"MacCeltic", kTextEncodingMacCeltic},
- {"MacGaelic", kTextEncodingMacGaelic},
- {"MacKeyboardGlyphs", kTextEncodingMacKeyboardGlyphs},
- {"MacTradChinese", kTextEncodingMacTradChinese},
- {"MacRSymbol", kTextEncodingMacRSymbol},
- {"MacSimpChinese", kTextEncodingMacSimpChinese},
- {"MacGeez", kTextEncodingMacGeez},
- {"MacEastEurRoman", kTextEncodingMacEastEurRoman},
- {"MacUninterp", kTextEncodingMacUninterp},
- {"MacUnicode", kTextEncodingMacUnicode},
- {"MacFarsi", kTextEncodingMacFarsi},
- {"MacUkrainian", kTextEncodingMacUkrainian},
- {"MacInuit", kTextEncodingMacInuit},
- {"MacVT100", kTextEncodingMacVT100},
- {"MacHFS", kTextEncodingMacHFS},
- {"UnicodeDefault", kTextEncodingUnicodeDefault},
- {"UnicodeV1_1", kTextEncodingUnicodeV1_1},
- {"ISO10646_1993", kTextEncodingISO10646_1993},
- {"UnicodeV2_0", kTextEncodingUnicodeV2_0},
- {"UnicodeV2_1", kTextEncodingUnicodeV2_1},
- {"UnicodeV3_0", kTextEncodingUnicodeV3_0},
- {"UnicodeV3_1", kTextEncodingUnicodeV3_1},
- {"UnicodeV3_2", kTextEncodingUnicodeV3_2},
- {"ISOLatin1", kTextEncodingISOLatin1},
- {"ISOLatin2", kTextEncodingISOLatin2},
- {"ISOLatin3", kTextEncodingISOLatin3},
- {"ISOLatin4", kTextEncodingISOLatin4},
- {"ISOLatinCyrillic", kTextEncodingISOLatinCyrillic},
- {"ISOLatinArabic", kTextEncodingISOLatinArabic},
- {"ISOLatinGreek", kTextEncodingISOLatinGreek},
- {"ISOLatinHebrew", kTextEncodingISOLatinHebrew},
- {"ISOLatin5", kTextEncodingISOLatin5},
- {"ISOLatin6", kTextEncodingISOLatin6},
- {"ISOLatin7", kTextEncodingISOLatin7},
- {"ISOLatin8", kTextEncodingISOLatin8},
- {"ISOLatin9", kTextEncodingISOLatin9},
- {"DOSLatinUS", kTextEncodingDOSLatinUS},
- {"DOSGreek", kTextEncodingDOSGreek},
- {"DOSBalticRim", kTextEncodingDOSBalticRim},
- {"DOSLatin1", kTextEncodingDOSLatin1},
- {"DOSGreek1", kTextEncodingDOSGreek1},
- {"DOSLatin2", kTextEncodingDOSLatin2},
- {"DOSCyrillic", kTextEncodingDOSCyrillic},
- {"DOSTurkish", kTextEncodingDOSTurkish},
- {"DOSPortuguese", kTextEncodingDOSPortuguese},
- {"DOSIcelandic", kTextEncodingDOSIcelandic},
- {"DOSHebrew", kTextEncodingDOSHebrew},
- {"DOSCanadianFrench", kTextEncodingDOSCanadianFrench},
- {"DOSArabic", kTextEncodingDOSArabic},
- {"DOSNordic", kTextEncodingDOSNordic},
- {"DOSRussian", kTextEncodingDOSRussian},
- {"DOSGreek2", kTextEncodingDOSGreek2},
- {"DOSThai", kTextEncodingDOSThai},
- {"DOSJapanese", kTextEncodingDOSJapanese},
- {"DOSChineseSimplif", kTextEncodingDOSChineseSimplif},
- {"DOSKorean", kTextEncodingDOSKorean},
- {"DOSChineseTrad", kTextEncodingDOSChineseTrad},
- {"WindowsLatin1", kTextEncodingWindowsLatin1},
- {"WindowsANSI", kTextEncodingWindowsANSI},
- {"WindowsLatin2", kTextEncodingWindowsLatin2},
- {"WindowsCyrillic", kTextEncodingWindowsCyrillic},
- {"WindowsGreek", kTextEncodingWindowsGreek},
- {"WindowsLatin5", kTextEncodingWindowsLatin5},
- {"WindowsHebrew", kTextEncodingWindowsHebrew},
- {"WindowsArabic", kTextEncodingWindowsArabic},
- {"WindowsBalticRim", kTextEncodingWindowsBalticRim},
- {"WindowsVietnamese", kTextEncodingWindowsVietnamese},
- {"WindowsKoreanJohab", kTextEncodingWindowsKoreanJohab},
- {"US_ASCII", kTextEncodingUS_ASCII},
- {"JIS_X0201_76", kTextEncodingJIS_X0201_76},
- {"JIS_X0208_83", kTextEncodingJIS_X0208_83},
- {"JIS_X0208_90", kTextEncodingJIS_X0208_90},
- {"JIS_X0212_90", kTextEncodingJIS_X0212_90},
- {"JIS_C6226_78", kTextEncodingJIS_C6226_78},
- {"ShiftJIS_X0213_00", kTextEncodingShiftJIS_X0213_00},
- {"GB_2312_80", kTextEncodingGB_2312_80},
- {"GBK_95", kTextEncodingGBK_95},
- {"GB_18030_2000", kTextEncodingGB_18030_2000},
- {"KSC_5601_87", kTextEncodingKSC_5601_87},
- {"KSC_5601_92_Johab", kTextEncodingKSC_5601_92_Johab},
- {"CNS_11643_92_P1", kTextEncodingCNS_11643_92_P1},
- {"CNS_11643_92_P2", kTextEncodingCNS_11643_92_P2},
- {"CNS_11643_92_P3", kTextEncodingCNS_11643_92_P3},
- {"ISO_2022_JP", kTextEncodingISO_2022_JP},
- {"ISO_2022_JP_2", kTextEncodingISO_2022_JP_2},
- {"ISO_2022_JP_1", kTextEncodingISO_2022_JP_1},
- {"ISO_2022_JP_3", kTextEncodingISO_2022_JP_3},
- {"ISO_2022_CN", kTextEncodingISO_2022_CN},
- {"ISO_2022_CN_EXT", kTextEncodingISO_2022_CN_EXT},
- {"ISO_2022_KR", kTextEncodingISO_2022_KR},
- {"EUC_JP", kTextEncodingEUC_JP},
- {"EUC_CN", kTextEncodingEUC_CN},
- {"EUC_TW", kTextEncodingEUC_TW},
- {"EUC_KR", kTextEncodingEUC_KR},
- {"ShiftJIS", kTextEncodingShiftJIS},
- {"KOI8_R", kTextEncodingKOI8_R},
- {"Big5", kTextEncodingBig5},
- {"MacRomanLatin1", kTextEncodingMacRomanLatin1},
- {"HZ_GB_2312", kTextEncodingHZ_GB_2312},
- {"Big5_HKSCS_1999", kTextEncodingBig5_HKSCS_1999},
- {"NextStepLatin", kTextEncodingNextStepLatin},
- {"EBCDIC_US", kTextEncodingEBCDIC_US},
- {"EBCDIC_CP037", kTextEncodingEBCDIC_CP037},
- {"MultiRun", kTextEncodingMultiRun},
-
- /* Terminator */
- {NULL, -1},
- };
- int i;
-
- i = 0;
- for (i = 0; encodetable[i].name != NULL; ++i)
- {
- if (STRICMP(encodename, encodetable[i].name) == 0)
- break;
- }
- return encodetable[i].encode;
-}
-
-/*
- * iconv interfaces
- */
-
- iconv_t
-iconv_open(const char* tocode, const char* fromcode)
-{
- TextEncoding toEnc, fromEnc;
- iconv_t cd = NULL;
- OSStatus st;
-
- /* Verify to/from encoding name */
- toEnc = get_textencoding(tocode);
- fromEnc = get_textencoding(fromcode);
- if (toEnc < 0 || fromEnc < 0)
- goto ICONV_OPEN_ERR;
-
- /* Allocate memory to object */
- cd = (iconv_t)alloc(sizeof(struct _iconv_t));
- if (!cd)
- goto ICONV_OPEN_ERR;
- memset(cd, 0, sizeof(struct _iconv_t));
-
- /* Create converter */
- if (fromEnc != toEnc)
- {
- TRACE("*** fromEnc=%d toEnc=%d\n", (int)fromEnc, (int)toEnc);
- st = TECCreateConverter(&cd->tec, fromEnc, toEnc);
- if (st != 0)
- {
- TRACE("*** TECCreateConverter()=%d\n", (int)st);
- goto ICONV_OPEN_ERR;
- }
- /* Create reverse converter */
- st = TECCreateConverter(&cd->tecReverse, toEnc, fromEnc);
- if (st != 0)
- {
- TRACE("*** TECCreateConverter()=%d (reverse)\n", (int)st);
- goto ICONV_OPEN_ERR;
- }
- /* Create Sniffer */
- st = TECCreateSniffer(&cd->sniff, &fromEnc, 1);
- if (st != 0)
- {
- TRACE("*** TECCreateSniffer()=%d\n", (int)st);
- goto ICONV_OPEN_ERR;
- }
- }
-
- cd->from = fromEnc;
- cd->to = toEnc;
- last_errno = 0;
- return cd;
-
-ICONV_OPEN_ERR:
- if (cd)
- iconv_close(cd);
- last_errno = EINVAL;
- return (iconv_t)-1;
-}
-
-/*
- * Used when there are same value in 'from encoding' and 'to encoding'.
- * TEC doesn't support conversion between same encodings, and
- * TECCreateConverter() failed.
- */
- static size_t
-null_conv(iconv_t cd, const char **inbuf, size_t *inbytesleft,
- char **outbuf, size_t *outbytesleft)
-{
- const char* buf_in = inbuf && *inbuf ? *inbuf : NULL;
- char* buf_out = outbuf && *outbuf ? *outbuf : NULL;
-
- if (buf_in)
- {
- int in_len = inbytesleft ? *inbytesleft : 0;
- int out_len = outbytesleft ? *outbytesleft : 0;
-
- if (!buf_out || out_len <= 0)
- {
- last_errno = E2BIG;
- return -1;
- }
- else if (in_len > 0)
- {
- int len = in_len < out_len ? in_len : out_len;
-
- memcpy (buf_out, buf_in, len);
- *inbuf += len;
- *outbuf += len;
- *inbytesleft -= len;
- *outbytesleft -= len;
- if (*outbytesleft <= 0)
- {
- last_errno = E2BIG;
- return -1;
- }
- }
- }
- last_errno = 0;
- return 0;
-}
-
- size_t
-iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft,
- char **outbuf, size_t *outbytesleft)
-{
- ConstTextPtr buf_in;
- TextPtr buf_out;
- ByteCount out_len, out_true;
- ByteCount in_len, in_true;
- OSStatus st;
-
- if (!cd)
- {
- last_errno = ENOENT; /* TODO: Another error code should be set */
- return -1;
- }
- if (cd->from == cd->to)
- return null_conv(cd, inbuf, inbytesleft, outbuf, outbytesleft) ;
-
- buf_in = (TextPtr) inbuf ;
- buf_out = (TextPtr) outbuf ;
- out_len = out_true = -1;
- in_len = in_true = -1;
-
- if (buf_in && buf_out)
- {
- ItemCount error, feature;
-
- /* Normal convert mode */
- if (!inbytesleft || !outbytesleft)
- {
- last_errno = EFAULT;
- return -1;
- }
- in_len = *inbytesleft;
- out_len = *outbytesleft;
-
- /* Check stream is form in expected encoding or not */
- st = TECSniffTextEncoding(cd->sniff, (TextPtr)buf_in, in_len,
- &cd->from, 1, &error, 1, &feature, 1);
- TRACE("TECSniffTextEncoding()=%d error=%d feature=%d\n",
- (int)st, (int)error, (int)feature);
- if ((error != 0 || feature == 0)
- && !(error == 0xffffffff && feature == 0xffffffff))
- /* Not expected encoding */
- st = kTECUnmappableElementErr;
- else
- {
- /* Do convert */
- st = TECConvertText(cd->tec,
- buf_in, in_len, &in_true,
- buf_out, out_len, &out_true);
- /* Verify converted text. Compare original text with reverse
- * converted text. If not match, there is some problem on
- * converting. */
- if (st == 0 && in_true > 0)
- {
- ByteCount rev_in, rev_out;
- TextPtr buf_rev = (TextPtr)alloc(in_true);
-
- if (buf_rev)
- {
- st = TECConvertText(cd->tecReverse,
- buf_out, out_true, &rev_in,
- buf_rev, in_true, &rev_out);
- if (st != 0 || rev_in != out_true || rev_out != in_true
- || memcmp(buf_rev, buf_in, rev_out) != 0)
- {
-#ifdef ICONVOSX_DEBUG
- fprintf(stderr, " reverse conversion failed.\n");
-#endif
- st = kTECUnmappableElementErr;
- }
- vim_free(buf_rev);
- }
- else
- st = kTECUnmappableElementErr;
- }
- }
- }
- else if (!buf_in && buf_out)
- {
- /* Flush all buffered strings to buffer, and reset status */
- if (!outbytesleft)
- {
- last_errno = EFAULT;
- return -1;
- }
- out_len = *outbytesleft;
- st = TECFlushText(cd->tec,
- buf_out, out_len, &out_true);
- }
- else if (!buf_in && !buf_out)
- {
- /* Reset cd's status and cancel buffered strings */
- unsigned char tmp_out[256];
-
- buf_out = tmp_out;
- out_len = sizeof(tmp_out);
- st = TECFlushText(cd->tec,
- buf_out, out_len, &out_true);
- }
- else
- {
- last_errno = EFAULT;
- return -1;
- }
- TRACE("st=%d, buf_in=%p, in_len=%d, in_true=%d\n"
- " buf_out=%p, out_len=%d, out_true=%d\n", (int)st,
- buf_in, (int)in_len, (int)in_true,
- buf_out, (int)out_len, (int)out_true);
-
- switch (st)
- {
- case 0:
- /* No error */
- if (inbytesleft)
- *inbytesleft -= in_true;
- if (outbytesleft)
- *outbytesleft -= out_true;
- if (inbuf && *inbuf)
- *inbuf += in_true;
- if (outbuf && *outbuf)
- *outbuf += out_true;
- last_errno = 0;
- return 0; /* No error */
- case kTECUnmappableElementErr:
- last_errno = EILSEQ;
- case kTECIncompleteElementErr:
- last_errno = EINVAL;
- case kTECOutputBufferFullStatus:
- last_errno = E2BIG;
- return -1;
- default:
- TRACE("iconv(%p, %p, %p, %p, %p) failed. (%d)\n",
- cd, inbuf, inbytesleft, outbuf, outbytesleft, (int)st);
- last_errno = EFAULT;
- return -1;
- }
-}
-
- int
-iconv_close(iconv_t cd)
-{
- if (cd)
- {
- /* Free all elements of iconv_t */
- if (cd->tec)
- TECDisposeConverter(cd->tec);
- if (cd->tecReverse)
- TECDisposeConverter(cd->tecReverse);
- if (cd->sniff)
- TECDisposeSniffer(cd->sniff);
- vim_free(cd);
- last_errno = 0;
- return 0;
- }
- else
- {
- last_errno = EINVAL;
- return -1;
- }
-}
-
- int *
-iconv_errno()
-{
- return &last_errno;
-}
-#endif /* MACOS_X_ICONVEMU */
-
-#ifdef USE_MCH_GETTEXT
-
-#define GETTEXT_BUFNUM 64
-#define GETTEXT_BUFSIZE 256
-
- char *
-mch_gettext(const char *msgid)
-{
- static char buf[GETTEXT_BUFNUM][GETTEXT_BUFSIZE];
- static int bufnum = 0;
- const char *msg = NULL;
- CFStringRef strkey = NULL, strmsg = NULL;
- CFStringEncoding enc;
-
- if (!msgid)
- goto MCH_GETTEXT_FINISH;
- enc = CFStringGetSystemEncoding();
- TRACE("mch_gettext(%s)\n", msgid);
-
- strkey = CFStringCreateWithCString(NULL, msgid, enc);
- if (!strkey)
- {
- TRACE(" Can't create a CFString for msgid.\n");
- goto MCH_GETTEXT_FINISH;
- }
-
- strmsg = CFCopyLocalizedString(strkey, NULL);
- if (!strmsg)
- {
- TRACE(" No localized strings for msgid.\n");
- goto MCH_GETTEXT_FINISH;
- }
-
- msg = CFStringGetCStringPtr(strmsg, enc);
- if (!msg)
- {
- /* This is as backup when CFStringGetCStringPtr was failed */
- CFStringGetCString(strmsg, buf[bufnum], GETTEXT_BUFSIZE, enc);
- msg = buf[bufnum];
- if (++bufnum >= GETTEXT_BUFNUM)
- bufnum = 0;
- }
- TRACE(" Localized to: %s\n", msg);
-
-MCH_GETTEXT_FINISH:
- if (strkey)
- CFRelease(strkey);
- if (strmsg)
- CFRelease(strmsg);
- return (char *)(msg ? msg : msgid);
-}
-
- char *
-mch_bindtextdomain(const char *domain, const char *dirname)
-{
- TRACE("mch_bindtextdomain(%s, %s)\n", domain, dirname);
- return (char*)dirname;
-}
-
- char *
-mch_textdomain(const char *domain)
-{
- TRACE("mch_textdomain(%s)\n", domain);
- return (char*)domain;
-}
-#endif
diff --git a/src/os_macosx.m b/src/os_macosx.m
new file mode 100644
index 0000000..bac5e79
--- /dev/null
+++ b/src/os_macosx.m
@@ -0,0 +1,694 @@
+/* vi:set ts=8 sts=4 sw=4:
+ *
+ * VIM - Vi IMproved by Bram Moolenaar
+ *
+ * Do ":help uganda" in Vim to read copying and usage conditions.
+ * Do ":help credits" in Vim to see a list of people who contributed.
+ * See README.txt for an overview of the Vim source code.
+ */
+
+/*
+ * os_macosx.c -- Mac specific things for Mac OS/X.
+ */
+
+#ifdef MACOS_X_UNIX
+# ifdef HAVE_CONFIG_H /* Using Makefile. */
+# include "vim.h"
+# else
+# include "os_unix.c" /* Using Project Builder */
+# endif
+#else
+ Error: MACOS 9 is no longer supported in Vim 7
+#endif
+
+#ifdef FEAT_CLIPBOARD
+
+#include <Cocoa/Cocoa.h>
+
+void clip_mch_lose_selection(VimClipboard *cbd)
+{
+}
+
+int clip_mch_own_selection(VimClipboard *cbd)
+{
+ return OK;
+}
+
+/* copy from system clipboard, paste to vim */
+void clip_mch_set_selection(VimClipboard *cbd)
+{
+ // If the '*' register isn't already filled in, fill it in now.
+ cbd->owned = TRUE;
+ clip_get_selection(cbd);
+ cbd->owned = FALSE;
+
+ // Get the text to put on the pasteboard.
+ long_u len = 0; char_u *str = 0;
+ int type = clip_convert_selection(&str, &len, cbd);
+ if (type < 0)
+ return;
+
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ NSString *string = [[NSString alloc] initWithBytes: str
+ length: len
+ encoding: NSUTF8StringEncoding];
+
+ NSPasteboard *pb = [NSPasteboard generalPasteboard];
+
+ [pb declareTypes: [NSArray arrayWithObject: NSStringPboardType] owner:
nil];
+ [pb setString: string
+ forType: NSStringPboardType];
+
+ [string release];
+ [pool release];
+ vim_free(str);
+}
+
+/* copy from vim, paste to system clipboard */
+void clip_mch_request_selection(VimClipboard *cbd)
+{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ NSPasteboard *pb = [NSPasteboard generalPasteboard];
+ NSString *type = [pb availableTypeFromArray: [NSArray arrayWithObject:
NSStringPboardType]];
+
+ if (type)
+ {
+ NSMutableString *string = [[pb stringForType: NSStringPboardType]
mutableCopy];
+
+ // Replace unrecognized end-of-line sequences with \x0a (line feed).
+ NSRange range = NSMakeRange(0, [string length]);
+ unsigned n = [string replaceOccurrencesOfString: @"\x0d\x0a"
+ withString: @"\x0a"
+ options: 0
+ range: range];
+ if (n == 0)
+ n = [string replaceOccurrencesOfString: @"\x0d"
+ withString: @"\x0a"
+ options: 0
+ range: range];
+
+ // Scan for newline character to decide whether the string should be
+ // pasted linewise or characterwise.
+ int char_type = MCHAR;
+ if (0 < n || NSNotFound != [string rangeOfString: @"\n"].location)
+ char_type = MLINE;
+
+ const char *utf8chars = [string UTF8String];
+ clip_yank_selection(char_type, (char_u*) utf8chars, strlen(utf8chars),
cbd);
+ }
+
+ [pool release];
+}
+
+#endif
+
+#ifdef _DEBUG
+ void
+Trace(char* fmt, ...)
+{
+ char buf[2048];
+ va_list args;
+
+ va_start(args, fmt);
+ /* vsnprintf(buf, sizeof(buf), fmt, args);*/
+ fprintf(stderr, "%s", buf);
+ va_end(args);
+}
+#endif
+
+#ifdef MACOS_X_ICONVEMU
+/*
+ * Libiconv emulation layer
+ */
+
+struct _iconv_t
+{
+ TECObjectRef tec;
+ TECObjectRef tecReverse;
+ TECSnifferObjectRef sniff;
+ TextEncoding from;
+ TextEncoding to;
+};
+/* typedef struct _iconv_t *iconv_t; */
+
+
+static int last_errno = 0;
+
+/*
+ * Get TextEncoding from iconv's encoding name
+ */
+ static TextEncoding
+get_textencoding(const char* encodename)
+{
+ static struct {
+ const char* name;
+ TextEncoding encode;
+ } encodetable[] = {
+ /* ISO-8859 encodings family */
+ {"latin1", kTextEncodingISOLatin1},
+ {"latin2", kTextEncodingISOLatin2},
+ {"latin3", kTextEncodingISOLatin3},
+ {"latin4", kTextEncodingISOLatin4},
+ {"latin5", kTextEncodingISOLatin5},
+ {"latin6", kTextEncodingISOLatin6},
+ {"latin7", kTextEncodingISOLatin7},
+ {"latin8", kTextEncodingISOLatin8},
+ {"latin9", kTextEncodingISOLatin9},
+ {"iso-8859-1", kTextEncodingISOLatin1},
+ {"iso-8859-2", kTextEncodingISOLatin2},
+ {"iso-8859-3", kTextEncodingISOLatin3},
+ {"iso-8859-4", kTextEncodingISOLatin4},
+ {"iso-8859-5", kTextEncodingISOLatinCyrillic},
+ {"iso-8859-6", kTextEncodingISOLatinArabic},
+ {"iso-8859-7", kTextEncodingISOLatinGreek},
+ {"iso-8859-8", kTextEncodingISOLatinHebrew},
+ {"iso-8859-9", kTextEncodingISOLatin5},
+ {"iso-8859-10", kTextEncodingISOLatin6},
+ {"iso-8859-15", kTextEncodingISOLatin9},
+
+ /* Unicode encodings. */
+ /* TODO: Add other type of unicode */
+ {"ucs-2", kTextEncodingMacUnicode},
+
+ /* Japanese encoding aliases */
+ {"cp932", kTextEncodingShiftJIS},
+ {"shift-jis", kTextEncodingShiftJIS},
+ {"euc-jp", kTextEncodingEUC_JP},
+ {"iso-2022-jp", kTextEncodingISO_2022_JP},
+ {"iso-2022-jp-1", kTextEncodingISO_2022_JP_1},
+ {"iso-2022-jp-2", kTextEncodingISO_2022_JP_2},
+ {"iso-2022-jp-3", kTextEncodingISO_2022_JP_3},
+
+ /* Other aliases. These aliases in this block are just guessed. */
+ /* TODO: Must be verified. */
+ {"gb2312", kTextEncodingGB_2312_80},
+ {"cp936", kTextEncodingMacChineseSimp},
+ {"euc-cn", kTextEncodingEUC_CN},
+ {"cp950", kTextEncodingMacChineseTrad},
+ {"euc-tw", kTextEncodingEUC_TW},
+ {"cp949", kTextEncodingMacKorean},
+ {"euc-kr", kTextEncodingEUC_KR},
+
+ /*
+ * All encodings supported by Macintosh. You can find these values
+ * in a file:
+ * /System/Library/Frameworks/CoreServices.framework/Versions/A/
+ * Frameworks/CarbonCore.framework/Versions/A/Headers/TextCommon.h
+ */
+ {"MacRoman", kTextEncodingMacRoman},
+ {"MacJapanese", kTextEncodingMacJapanese},
+ {"MacChineseTrad", kTextEncodingMacChineseTrad},
+ {"MacKorean", kTextEncodingMacKorean},
+ {"MacArabic", kTextEncodingMacArabic},
+ {"MacHebrew", kTextEncodingMacHebrew},
+ {"MacGreek", kTextEncodingMacGreek},
+ {"MacCyrillic", kTextEncodingMacCyrillic},
+ {"MacDevanagari", kTextEncodingMacDevanagari},
+ {"MacGurmukhi", kTextEncodingMacGurmukhi},
+ {"MacGujarati", kTextEncodingMacGujarati},
+ {"MacOriya", kTextEncodingMacOriya},
+ {"MacBengali", kTextEncodingMacBengali},
+ {"MacTamil", kTextEncodingMacTamil},
+ {"MacTelugu", kTextEncodingMacTelugu},
+ {"MacKannada", kTextEncodingMacKannada},
+ {"MacMalayalam", kTextEncodingMacMalayalam},
+ {"MacSinhalese", kTextEncodingMacSinhalese},
+ {"MacBurmese", kTextEncodingMacBurmese},
+ {"MacKhmer", kTextEncodingMacKhmer},
+ {"MacThai", kTextEncodingMacThai},
+ {"MacLaotian", kTextEncodingMacLaotian},
+ {"MacGeorgian", kTextEncodingMacGeorgian},
+ {"MacArmenian", kTextEncodingMacArmenian},
+ {"MacChineseSimp", kTextEncodingMacChineseSimp},
+ {"MacTibetan", kTextEncodingMacTibetan},
+ {"MacMongolian", kTextEncodingMacMongolian},
+ {"MacEthiopic", kTextEncodingMacEthiopic},
+ {"MacCentralEurRoman", kTextEncodingMacCentralEurRoman},
+ {"MacVietnamese", kTextEncodingMacVietnamese},
+ {"MacExtArabic", kTextEncodingMacExtArabic},
+ {"MacSymbol", kTextEncodingMacSymbol},
+ {"MacDingbats", kTextEncodingMacDingbats},
+ {"MacTurkish", kTextEncodingMacTurkish},
+ {"MacCroatian", kTextEncodingMacCroatian},
+ {"MacIcelandic", kTextEncodingMacIcelandic},
+ {"MacRomanian", kTextEncodingMacRomanian},
+ {"MacCeltic", kTextEncodingMacCeltic},
+ {"MacGaelic", kTextEncodingMacGaelic},
+ {"MacKeyboardGlyphs", kTextEncodingMacKeyboardGlyphs},
+ {"MacTradChinese", kTextEncodingMacTradChinese},
+ {"MacRSymbol", kTextEncodingMacRSymbol},
+ {"MacSimpChinese", kTextEncodingMacSimpChinese},
+ {"MacGeez", kTextEncodingMacGeez},
+ {"MacEastEurRoman", kTextEncodingMacEastEurRoman},
+ {"MacUninterp", kTextEncodingMacUninterp},
+ {"MacUnicode", kTextEncodingMacUnicode},
+ {"MacFarsi", kTextEncodingMacFarsi},
+ {"MacUkrainian", kTextEncodingMacUkrainian},
+ {"MacInuit", kTextEncodingMacInuit},
+ {"MacVT100", kTextEncodingMacVT100},
+ {"MacHFS", kTextEncodingMacHFS},
+ {"UnicodeDefault", kTextEncodingUnicodeDefault},
+ {"UnicodeV1_1", kTextEncodingUnicodeV1_1},
+ {"ISO10646_1993", kTextEncodingISO10646_1993},
+ {"UnicodeV2_0", kTextEncodingUnicodeV2_0},
+ {"UnicodeV2_1", kTextEncodingUnicodeV2_1},
+ {"UnicodeV3_0", kTextEncodingUnicodeV3_0},
+ {"UnicodeV3_1", kTextEncodingUnicodeV3_1},
+ {"UnicodeV3_2", kTextEncodingUnicodeV3_2},
+ {"ISOLatin1", kTextEncodingISOLatin1},
+ {"ISOLatin2", kTextEncodingISOLatin2},
+ {"ISOLatin3", kTextEncodingISOLatin3},
+ {"ISOLatin4", kTextEncodingISOLatin4},
+ {"ISOLatinCyrillic", kTextEncodingISOLatinCyrillic},
+ {"ISOLatinArabic", kTextEncodingISOLatinArabic},
+ {"ISOLatinGreek", kTextEncodingISOLatinGreek},
+ {"ISOLatinHebrew", kTextEncodingISOLatinHebrew},
+ {"ISOLatin5", kTextEncodingISOLatin5},
+ {"ISOLatin6", kTextEncodingISOLatin6},
+ {"ISOLatin7", kTextEncodingISOLatin7},
+ {"ISOLatin8", kTextEncodingISOLatin8},
+ {"ISOLatin9", kTextEncodingISOLatin9},
+ {"DOSLatinUS", kTextEncodingDOSLatinUS},
+ {"DOSGreek", kTextEncodingDOSGreek},
+ {"DOSBalticRim", kTextEncodingDOSBalticRim},
+ {"DOSLatin1", kTextEncodingDOSLatin1},
+ {"DOSGreek1", kTextEncodingDOSGreek1},
+ {"DOSLatin2", kTextEncodingDOSLatin2},
+ {"DOSCyrillic", kTextEncodingDOSCyrillic},
+ {"DOSTurkish", kTextEncodingDOSTurkish},
+ {"DOSPortuguese", kTextEncodingDOSPortuguese},
+ {"DOSIcelandic", kTextEncodingDOSIcelandic},
+ {"DOSHebrew", kTextEncodingDOSHebrew},
+ {"DOSCanadianFrench", kTextEncodingDOSCanadianFrench},
+ {"DOSArabic", kTextEncodingDOSArabic},
+ {"DOSNordic", kTextEncodingDOSNordic},
+ {"DOSRussian", kTextEncodingDOSRussian},
+ {"DOSGreek2", kTextEncodingDOSGreek2},
+ {"DOSThai", kTextEncodingDOSThai},
+ {"DOSJapanese", kTextEncodingDOSJapanese},
+ {"DOSChineseSimplif", kTextEncodingDOSChineseSimplif},
+ {"DOSKorean", kTextEncodingDOSKorean},
+ {"DOSChineseTrad", kTextEncodingDOSChineseTrad},
+ {"WindowsLatin1", kTextEncodingWindowsLatin1},
+ {"WindowsANSI", kTextEncodingWindowsANSI},
+ {"WindowsLatin2", kTextEncodingWindowsLatin2},
+ {"WindowsCyrillic", kTextEncodingWindowsCyrillic},
+ {"WindowsGreek", kTextEncodingWindowsGreek},
+ {"WindowsLatin5", kTextEncodingWindowsLatin5},
+ {"WindowsHebrew", kTextEncodingWindowsHebrew},
+ {"WindowsArabic", kTextEncodingWindowsArabic},
+ {"WindowsBalticRim", kTextEncodingWindowsBalticRim},
+ {"WindowsVietnamese", kTextEncodingWindowsVietnamese},
+ {"WindowsKoreanJohab", kTextEncodingWindowsKoreanJohab},
+ {"US_ASCII", kTextEncodingUS_ASCII},
+ {"JIS_X0201_76", kTextEncodingJIS_X0201_76},
+ {"JIS_X0208_83", kTextEncodingJIS_X0208_83},
+ {"JIS_X0208_90", kTextEncodingJIS_X0208_90},
+ {"JIS_X0212_90", kTextEncodingJIS_X0212_90},
+ {"JIS_C6226_78", kTextEncodingJIS_C6226_78},
+ {"ShiftJIS_X0213_00", kTextEncodingShiftJIS_X0213_00},
+ {"GB_2312_80", kTextEncodingGB_2312_80},
+ {"GBK_95", kTextEncodingGBK_95},
+ {"GB_18030_2000", kTextEncodingGB_18030_2000},
+ {"KSC_5601_87", kTextEncodingKSC_5601_87},
+ {"KSC_5601_92_Johab", kTextEncodingKSC_5601_92_Johab},
+ {"CNS_11643_92_P1", kTextEncodingCNS_11643_92_P1},
+ {"CNS_11643_92_P2", kTextEncodingCNS_11643_92_P2},
+ {"CNS_11643_92_P3", kTextEncodingCNS_11643_92_P3},
+ {"ISO_2022_JP", kTextEncodingISO_2022_JP},
+ {"ISO_2022_JP_2", kTextEncodingISO_2022_JP_2},
+ {"ISO_2022_JP_1", kTextEncodingISO_2022_JP_1},
+ {"ISO_2022_JP_3", kTextEncodingISO_2022_JP_3},
+ {"ISO_2022_CN", kTextEncodingISO_2022_CN},
+ {"ISO_2022_CN_EXT", kTextEncodingISO_2022_CN_EXT},
+ {"ISO_2022_KR", kTextEncodingISO_2022_KR},
+ {"EUC_JP", kTextEncodingEUC_JP},
+ {"EUC_CN", kTextEncodingEUC_CN},
+ {"EUC_TW", kTextEncodingEUC_TW},
+ {"EUC_KR", kTextEncodingEUC_KR},
+ {"ShiftJIS", kTextEncodingShiftJIS},
+ {"KOI8_R", kTextEncodingKOI8_R},
+ {"Big5", kTextEncodingBig5},
+ {"MacRomanLatin1", kTextEncodingMacRomanLatin1},
+ {"HZ_GB_2312", kTextEncodingHZ_GB_2312},
+ {"Big5_HKSCS_1999", kTextEncodingBig5_HKSCS_1999},
+ {"NextStepLatin", kTextEncodingNextStepLatin},
+ {"EBCDIC_US", kTextEncodingEBCDIC_US},
+ {"EBCDIC_CP037", kTextEncodingEBCDIC_CP037},
+ {"MultiRun", kTextEncodingMultiRun},
+
+ /* Terminator */
+ {NULL, -1},
+ };
+ int i;
+
+ i = 0;
+ for (i = 0; encodetable[i].name != NULL; ++i)
+ {
+ if (STRICMP(encodename, encodetable[i].name) == 0)
+ break;
+ }
+ return encodetable[i].encode;
+}
+
+/*
+ * iconv interfaces
+ */
+
+ iconv_t
+iconv_open(const char* tocode, const char* fromcode)
+{
+ TextEncoding toEnc, fromEnc;
+ iconv_t cd = NULL;
+ OSStatus st;
+
+ /* Verify to/from encoding name */
+ toEnc = get_textencoding(tocode);
+ fromEnc = get_textencoding(fromcode);
+ if (toEnc < 0 || fromEnc < 0)
+ goto ICONV_OPEN_ERR;
+
+ /* Allocate memory to object */
+ cd = (iconv_t)alloc(sizeof(struct _iconv_t));
+ if (!cd)
+ goto ICONV_OPEN_ERR;
+ memset(cd, 0, sizeof(struct _iconv_t));
+
+ /* Create converter */
+ if (fromEnc != toEnc)
+ {
+ TRACE("*** fromEnc=%d toEnc=%d\n", (int)fromEnc, (int)toEnc);
+ st = TECCreateConverter(&cd->tec, fromEnc, toEnc);
+ if (st != 0)
+ {
+ TRACE("*** TECCreateConverter()=%d\n", (int)st);
+ goto ICONV_OPEN_ERR;
+ }
+ /* Create reverse converter */
+ st = TECCreateConverter(&cd->tecReverse, toEnc, fromEnc);
+ if (st != 0)
+ {
+ TRACE("*** TECCreateConverter()=%d (reverse)\n", (int)st);
+ goto ICONV_OPEN_ERR;
+ }
+ /* Create Sniffer */
+ st = TECCreateSniffer(&cd->sniff, &fromEnc, 1);
+ if (st != 0)
+ {
+ TRACE("*** TECCreateSniffer()=%d\n", (int)st);
+ goto ICONV_OPEN_ERR;
+ }
+ }
+
+ cd->from = fromEnc;
+ cd->to = toEnc;
+ last_errno = 0;
+ return cd;
+
+ICONV_OPEN_ERR:
+ if (cd)
+ iconv_close(cd);
+ last_errno = EINVAL;
+ return (iconv_t)-1;
+}
+
+/*
+ * Used when there are same value in 'from encoding' and 'to encoding'.
+ * TEC doesn't support conversion between same encodings, and
+ * TECCreateConverter() failed.
+ */
+ static size_t
+null_conv(iconv_t cd, const char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft)
+{
+ const char* buf_in = inbuf && *inbuf ? *inbuf : NULL;
+ char* buf_out = outbuf && *outbuf ? *outbuf : NULL;
+
+ if (buf_in)
+ {
+ int in_len = inbytesleft ? *inbytesleft : 0;
+ int out_len = outbytesleft ? *outbytesleft : 0;
+
+ if (!buf_out || out_len <= 0)
+ {
+ last_errno = E2BIG;
+ return -1;
+ }
+ else if (in_len > 0)
+ {
+ int len = in_len < out_len ? in_len : out_len;
+
+ memcpy (buf_out, buf_in, len);
+ *inbuf += len;
+ *outbuf += len;
+ *inbytesleft -= len;
+ *outbytesleft -= len;
+ if (*outbytesleft <= 0)
+ {
+ last_errno = E2BIG;
+ return -1;
+ }
+ }
+ }
+ last_errno = 0;
+ return 0;
+}
+
+ size_t
+iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft)
+{
+ ConstTextPtr buf_in;
+ TextPtr buf_out;
+ ByteCount out_len, out_true;
+ ByteCount in_len, in_true;
+ OSStatus st;
+
+ if (!cd)
+ {
+ last_errno = ENOENT; /* TODO: Another error code should be set */
+ return -1;
+ }
+ if (cd->from == cd->to)
+ return null_conv(cd, inbuf, inbytesleft, outbuf, outbytesleft) ;
+
+ buf_in = (TextPtr) inbuf ;
+ buf_out = (TextPtr) outbuf ;
+ out_len = out_true = -1;
+ in_len = in_true = -1;
+
+ if (buf_in && buf_out)
+ {
+ ItemCount error, feature;
+
+ /* Normal convert mode */
+ if (!inbytesleft || !outbytesleft)
+ {
+ last_errno = EFAULT;
+ return -1;
+ }
+ in_len = *inbytesleft;
+ out_len = *outbytesleft;
+
+ /* Check stream is form in expected encoding or not */
+ st = TECSniffTextEncoding(cd->sniff, (TextPtr)buf_in, in_len,
+ &cd->from, 1, &error, 1, &feature, 1);
+ TRACE("TECSniffTextEncoding()=%d error=%d feature=%d\n",
+ (int)st, (int)error, (int)feature);
+ if ((error != 0 || feature == 0)
+ && !(error == 0xffffffff && feature == 0xffffffff))
+ /* Not expected encoding */
+ st = kTECUnmappableElementErr;
+ else
+ {
+ /* Do convert */
+ st = TECConvertText(cd->tec,
+ buf_in, in_len, &in_true,
+ buf_out, out_len, &out_true);
+ /* Verify converted text. Compare original text with reverse
+ * converted text. If not match, there is some problem on
+ * converting. */
+ if (st == 0 && in_true > 0)
+ {
+ ByteCount rev_in, rev_out;
+ TextPtr buf_rev = (TextPtr)alloc(in_true);
+
+ if (buf_rev)
+ {
+ st = TECConvertText(cd->tecReverse,
+ buf_out, out_true, &rev_in,
+ buf_rev, in_true, &rev_out);
+ if (st != 0 || rev_in != out_true || rev_out != in_true
+ || memcmp(buf_rev, buf_in, rev_out) != 0)
+ {
+#ifdef ICONVOSX_DEBUG
+ fprintf(stderr, " reverse conversion failed.\n");
+#endif
+ st = kTECUnmappableElementErr;
+ }
+ vim_free(buf_rev);
+ }
+ else
+ st = kTECUnmappableElementErr;
+ }
+ }
+ }
+ else if (!buf_in && buf_out)
+ {
+ /* Flush all buffered strings to buffer, and reset status */
+ if (!outbytesleft)
+ {
+ last_errno = EFAULT;
+ return -1;
+ }
+ out_len = *outbytesleft;
+ st = TECFlushText(cd->tec,
+ buf_out, out_len, &out_true);
+ }
+ else if (!buf_in && !buf_out)
+ {
+ /* Reset cd's status and cancel buffered strings */
+ unsigned char tmp_out[256];
+
+ buf_out = tmp_out;
+ out_len = sizeof(tmp_out);
+ st = TECFlushText(cd->tec,
+ buf_out, out_len, &out_true);
+ }
+ else
+ {
+ last_errno = EFAULT;
+ return -1;
+ }
+ TRACE("st=%d, buf_in=%p, in_len=%d, in_true=%d\n"
+ " buf_out=%p, out_len=%d, out_true=%d\n", (int)st,
+ buf_in, (int)in_len, (int)in_true,
+ buf_out, (int)out_len, (int)out_true);
+
+ switch (st)
+ {
+ case 0:
+ /* No error */
+ if (inbytesleft)
+ *inbytesleft -= in_true;
+ if (outbytesleft)
+ *outbytesleft -= out_true;
+ if (inbuf && *inbuf)
+ *inbuf += in_true;
+ if (outbuf && *outbuf)
+ *outbuf += out_true;
+ last_errno = 0;
+ return 0; /* No error */
+ case kTECUnmappableElementErr:
+ last_errno = EILSEQ;
+ case kTECIncompleteElementErr:
+ last_errno = EINVAL;
+ case kTECOutputBufferFullStatus:
+ last_errno = E2BIG;
+ return -1;
+ default:
+ TRACE("iconv(%p, %p, %p, %p, %p) failed. (%d)\n",
+ cd, inbuf, inbytesleft, outbuf, outbytesleft, (int)st);
+ last_errno = EFAULT;
+ return -1;
+ }
+}
+
+ int
+iconv_close(iconv_t cd)
+{
+ if (cd)
+ {
+ /* Free all elements of iconv_t */
+ if (cd->tec)
+ TECDisposeConverter(cd->tec);
+ if (cd->tecReverse)
+ TECDisposeConverter(cd->tecReverse);
+ if (cd->sniff)
+ TECDisposeSniffer(cd->sniff);
+ vim_free(cd);
+ last_errno = 0;
+ return 0;
+ }
+ else
+ {
+ last_errno = EINVAL;
+ return -1;
+ }
+}
+
+ int *
+iconv_errno()
+{
+ return &last_errno;
+}
+#endif /* MACOS_X_ICONVEMU */
+
+#ifdef USE_MCH_GETTEXT
+
+#define GETTEXT_BUFNUM 64
+#define GETTEXT_BUFSIZE 256
+
+ char *
+mch_gettext(const char *msgid)
+{
+ static char buf[GETTEXT_BUFNUM][GETTEXT_BUFSIZE];
+ static int bufnum = 0;
+ const char *msg = NULL;
+ CFStringRef strkey = NULL, strmsg = NULL;
+ CFStringEncoding enc;
+
+ if (!msgid)
+ goto MCH_GETTEXT_FINISH;
+ enc = CFStringGetSystemEncoding();
+ TRACE("mch_gettext(%s)\n", msgid);
+
+ strkey = CFStringCreateWithCString(NULL, msgid, enc);
+ if (!strkey)
+ {
+ TRACE(" Can't create a CFString for msgid.\n");
+ goto MCH_GETTEXT_FINISH;
+ }
+
+ strmsg = CFCopyLocalizedString(strkey, NULL);
+ if (!strmsg)
+ {
+ TRACE(" No localized strings for msgid.\n");
+ goto MCH_GETTEXT_FINISH;
+ }
+
+ msg = CFStringGetCStringPtr(strmsg, enc);
+ if (!msg)
+ {
+ /* This is as backup when CFStringGetCStringPtr was failed */
+ CFStringGetCString(strmsg, buf[bufnum], GETTEXT_BUFSIZE, enc);
+ msg = buf[bufnum];
+ if (++bufnum >= GETTEXT_BUFNUM)
+ bufnum = 0;
+ }
+ TRACE(" Localized to: %s\n", msg);
+
+MCH_GETTEXT_FINISH:
+ if (strkey)
+ CFRelease(strkey);
+ if (strmsg)
+ CFRelease(strmsg);
+ return (char *)(msg ? msg : msgid);
+}
+
+ char *
+mch_bindtextdomain(const char *domain, const char *dirname)
+{
+ TRACE("mch_bindtextdomain(%s, %s)\n", domain, dirname);
+ return (char*)dirname;
+}
+
+ char *
+mch_textdomain(const char *domain)
+{
+ TRACE("mch_textdomain(%s)\n", domain);
+ return (char*)domain;
+}
+#endif
diff --git a/src/vim.h b/src/vim.h
index 0370b53..98d8af1 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -74,6 +74,7 @@
#endif
#if defined(MACOS_X_UNIX)
# define MACOS_X
+# define FEAT_CLIPBOARD
# ifndef HAVE_CONFIG_H
# define UNIX
# endif
--
1.6.0.4
--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---