// wchar_t to wchar_t conversion void CharConvWW(charconv* Conv, wchar_t* Out, size_t OutLen, const wchar_t* In) { if (OutLen>0) { // assume wchar_t is 16 bits even if it's not true charconv_osx *CC = (charconv_osx *)Conv; if (CC) { CFStringRef TmpIn = CFStringCreateWithBytes(NULL, (const UInt8*)In, (utf16len((const uint16_t*)In)+1)*sizeof(uint16_t), CC->EncFrom, false); assert(TmpIn); CFIndex Read; CFRange r; r.location = 0; r.length = CFStringGetLength(TmpIn); CFStringGetBytes(TmpIn, r, CC->EncTo, LOSSY_CHAR, /* no lossy conversion */ 0, /* not external representation */ (UInt8*)Out, OutLen, &Read); CFRelease(TmpIn); memset((UInt8*)Out+Read,0,sizeof(uint16_t)); } else { fprintf(stderr, "Not supported yet: %s with no CC\n", __FUNCTION__); } } }
// utf16_t to char conversion void CharConvSU(charconv* Conv, char* Out, size_t OutLen, const utf16_t* In) { if (OutLen>0) { // assume wchar_t is 16 bits even if it's not true CFStringEncoding EncFrom,EncTo; if (Conv) { EncFrom = ((charconv_osx *)Conv)->EncFrom; EncTo = ((charconv_osx *)Conv)->EncTo; } else { EncFrom = kCFStringEncodingUTF16; EncTo = kCFStringEncodingUTF8; } CFStringRef TmpIn = CFStringCreateWithBytes(NULL, (const UInt8*)In, (utf16len(In)+1)*sizeof(utf16_t), EncFrom, false); CFIndex Read; CFRange r; r.location = 0; r.length = CFStringGetLength(TmpIn); CFStringGetBytes(TmpIn, r, EncTo, LOSSY_CHAR, /* no lossy conversion */ 0, /* not external representation */ (UInt8*)Out, OutLen, &Read); CFRelease(TmpIn); Out[Read]=0; } }
void CharConvSU(charconv* CC, char* Out, size_t OutLen, const utf16_t* In) { if (OutLen>0) { ICONV_CONST char* _In = (ICONV_CONST char*)In; size_t _InLen = utf16len(In)+1; char* _Out = Out; size_t _OutLen = OutLen; if (!CC || !_InLen || iconv((iconv_t)CC, &_In, &_InLen, &_Out, &_OutLen) == -1 || iconv((iconv_t)CC, NULL, NULL, &_Out, &_OutLen) == -1) { for (;OutLen>1 && *In;++In,--OutLen,++Out) *Out = (char)(*In>255?'*':*In); *Out = 0; if (CC && _InLen) iconv((iconv_t)CC, NULL, NULL, NULL, NULL); // reset state } else *_Out=0; } }
utf16 *utf16ncpy(utf16 *dest, const utf16 *src, size_t n) { memcpy(dest, src, sizeof(utf16) * std::min(utf16len(src, n), n)); return dest; }
utf16 *utf16cpy(utf16 *dest, const utf16 *src) { size_t srcsize = utf16len(src); memcpy(dest, src, sizeof(utf16) * srcsize); return dest; }