Beispiel #1
0
//--------------------------------------------------------------------------
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);
	}
}
Beispiel #2
0
//--------------------------------------------------------------------------
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
	}
}