+
+ size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const
+ {
+ CreateIfNeeded() ;
+ OSStatus status = noErr ;
+ ByteCount byteOutLen ;
+ ByteCount byteInLen = strlen(psz) + 1;
+ wchar_t *tbuf = NULL ;
+ UniChar* ubuf = NULL ;
+ size_t res = 0 ;
+
+ if (buf == NULL)
+ {
+ // Apple specs say at least 32
+ n = wxMax( 32, byteInLen ) ;
+ tbuf = (wchar_t*) malloc( n * SIZEOF_WCHAR_T ) ;
+ }
+
+ ByteCount byteBufferLen = n * sizeof( UniChar ) ;
+
+#if SIZEOF_WCHAR_T == 4
+ ubuf = (UniChar*) malloc( byteBufferLen + 2 ) ;
+#else
+ ubuf = (UniChar*) (buf ? buf : tbuf) ;
+#endif
+
+ ByteCount dcubuflen = byteBufferLen * 2 + 2 ;
+ ByteCount dcubufread , dcubufwritten ;
+ UniChar *dcubuf = (UniChar*) malloc( dcubuflen ) ;
+
+ status = TECConvertText(
+ m_MB2WC_converter, (ConstTextPtr) psz, byteInLen, &byteInLen,
+ (TextPtr) dcubuf, dcubuflen, &byteOutLen);
+ // we have to terminate here, because n might be larger for the trailing zero, and if UniChar
+ // is not properly terminated we get random characters at the end
+ dcubuf[byteOutLen / sizeof( UniChar ) ] = 0 ;
+
+ // now from the decomposed UniChar to properly composed uniChar
+ ConvertFromUnicodeToText( m_uniBack , byteOutLen , dcubuf ,
+ kUnicodeDefaultDirectionMask, 0, NULL, NULL, NULL, dcubuflen , &dcubufread , &dcubufwritten , ubuf ) ;
+
+ free( dcubuf );
+ byteOutLen = dcubufwritten ;
+ ubuf[byteOutLen / sizeof( UniChar ) ] = 0 ;
+
+
+#if SIZEOF_WCHAR_T == 4
+ wxMBConvUTF16 converter ;
+ res = converter.MB2WC( (buf ? buf : tbuf), (const char*)ubuf, n ) ;
+ free( ubuf ) ;
+#else
+ res = byteOutLen / sizeof( UniChar ) ;
+#endif
+
+ if ( buf == NULL )
+ free(tbuf) ;
+
+ if ( buf && res < n)
+ buf[res] = 0;
+
+ return res ;
+ }
+