//-------------------------------------------------------------------------- void VeBinaryIStream::GetStringAligned4(VeStringA& kStr) { VeInt32 i32Length = ReadPackedInt(); if(i32Length) { kStr = VeStringA('0', i32Length); VE_ASSERT_EQ(Read(kStr.GetString(), i32Length), i32Length); } else { kStr = ""; } VeUInt32 u32Temp = (i32Length >= 255) ? 4 : 1; u32Temp += i32Length; u32Temp = ((u32Temp + 3) & 0xfffffffc) - u32Temp; if(u32Temp) { VeUInt32 u32Zero = 0; Read(&u32Zero, u32Temp); } }
//-------------------------------------------------------------------------- void VeBinaryIStream::GetStringAligned4(VeFixedString& kStr) noexcept { VeSizeT stLength = ReadPackedInt(); if (stLength) { VeChar8* pcBuffer = VeStackAlloc(VeChar8, stLength + 1); VE_ASSERT_EQ(Read(pcBuffer, stLength), stLength); pcBuffer[stLength] = 0; kStr = pcBuffer; VeStackFree(pcBuffer); } else { kStr = ""; } VeSizeT stTemp = (stLength >= 255) ? 4 : 1; stTemp += stLength; stTemp = ((stTemp + 3) & (~3)) - stTemp; if (stTemp) { Skip(stTemp); } }
char *ReadDynamicString ( std::istream &input, int maxStringLength, const char *safeString ) { int size = ReadPackedInt(input); char *string; if ( size == -1 ) { string = NULL; } else if ( size < 0 || size > maxStringLength ) { string = newStr(safeString); } else { string = new char [size+1]; input.read( string, size ); string[size] = '\x0'; } return string; }
// Reads a length field + UTF-16 stream into a wchar_t wchar_t *ReadUnicodeString( std::istream &input, int maxLength, const wchar_t *safeString ) { int size = ReadPackedInt(input); if ( size == -1 ) { return NULL; } else if ( size < 0 || size > maxLength ) { return newStr(safeString); } else { #ifdef TARGET_OS_MACOSX UniChar *unichars = new UniChar[size]; wchar_t *wchars = new wchar_t[size+1]; CFStringRef utf16; for(int i = 0; i < size; i++) ReadNetworkValue( input, unichars[i] ); utf16 = CFStringCreateWithCharactersNoCopy(NULL, unichars, size, kCFAllocatorNull); CFStringGetBytes(utf16, CFRangeMake(0, CFStringGetLength(utf16)), kUTF32Encoding, '?', false, (UInt8 *)wchars, (size+1)*sizeof(wchar_t), NULL); wchars[size] = '\x0'; CFRelease(utf16); delete unichars; return wchars; #elif defined( TARGET_OS_LINUX ) size_t inBytesLeft = size * sizeof(unsigned short); char *utf16 = new char[inBytesLeft]; input.read( utf16, inBytesLeft ); char *inBuf = utf16; size_t bufferSize = size + 1; size_t outBytesLeft = bufferSize * 4; wchar_t *buf = new wchar_t[ bufferSize ]; char *outBuf = (char *) buf; buf[0] = L'\0'; iconv_t utf16_to_utf32 = iconv_open( "UTF32LE", "UTF16LE" ); if( utf16_to_utf32 == (iconv_t) -1 ) { perror( "Failed to open iconv" ); delete[] utf16; return buf; } size_t result = iconv( utf16_to_utf32, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft ); iconv_close( utf16_to_utf32 ); if( result == (size_t) -1 ) { perror( "Failed to convert stream to utf32le" ); delete[] utf16; return buf; } delete[] utf16; buf[size] = L'\x0'; return (wchar_t *) buf; #else wchar_t *string = new wchar_t [size+1]; for(int i = 0; i < size; i++) ReadNetworkValue( input, string[i] ); string[size] = '\x0'; return string; #endif } }