mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-09-24 10:19:06 +00:00
Allow a null destination pointer for cellL10n functions.
This commit is contained in:
parent
3055de0444
commit
5a18c3f8ea
1 changed files with 48 additions and 17 deletions
|
@ -207,30 +207,61 @@ s32 _ConvertStr(s32 src_code, const void *src, s32 src_len, s32 dst_code, void *
|
||||||
std::string wrapped_source = std::string(static_cast<const char *>(src), src_len);
|
std::string wrapped_source = std::string(static_cast<const char *>(src), src_len);
|
||||||
std::string target = _OemToOem(srcCode, dstCode, wrapped_source);
|
std::string target = _OemToOem(srcCode, dstCode, wrapped_source);
|
||||||
|
|
||||||
if (target.length() > *dst_len) return DSTExhausted;
|
if (dst != NULL)
|
||||||
|
{
|
||||||
memcpy(dst, target.c_str(), target.length());
|
if (target.length() > *dst_len) return DSTExhausted;
|
||||||
|
memcpy(dst, target.c_str(), target.length());
|
||||||
|
}
|
||||||
*dst_len = target.length();
|
*dst_len = target.length();
|
||||||
|
|
||||||
return ConversionOK;
|
return ConversionOK;
|
||||||
#else
|
#else
|
||||||
s32 retValue = ConversionOK;
|
s32 retValue = ConversionOK;
|
||||||
iconv_t ict = iconv_open(dstCode, srcCode);
|
iconv_t ict = iconv_open(dstCode, srcCode);
|
||||||
size_t srcLen = src_len, dstLen = *dst_len;
|
size_t srcLen = src_len;
|
||||||
size_t ictd = iconv(ict, (char **)&src, &srcLen, (char **)&dst, &dstLen);
|
if (dst != NULL)
|
||||||
*dst_len -= dstLen;
|
|
||||||
if (ictd == -1)
|
|
||||||
{
|
{
|
||||||
if (errno == EILSEQ)
|
size_t dstLen = *dst_len;
|
||||||
retValue = SRCIllegal; //Invalid multi-byte sequence
|
size_t ictd = iconv(ict, (char **)&src, &srcLen, (char **)&dst, &dstLen);
|
||||||
else if (errno == E2BIG)
|
*dst_len -= dstLen;
|
||||||
retValue = DSTExhausted;//Not enough space
|
if (ictd == -1)
|
||||||
else if (errno == EINVAL)
|
|
||||||
{
|
{
|
||||||
if (allowIncomplete)
|
if (errno == EILSEQ)
|
||||||
*dst_len = -1; // TODO: correct value?
|
retValue = SRCIllegal; //Invalid multi-byte sequence
|
||||||
else
|
else if (errno == E2BIG)
|
||||||
retValue = SRCIllegal;
|
retValue = DSTExhausted;//Not enough space
|
||||||
|
else if (errno == EINVAL)
|
||||||
|
{
|
||||||
|
if (allowIncomplete)
|
||||||
|
*dst_len = -1; // TODO: correct value?
|
||||||
|
else
|
||||||
|
retValue = SRCIllegal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*dst_len = 0;
|
||||||
|
char buf[16];
|
||||||
|
while (srcLen > 0)
|
||||||
|
{
|
||||||
|
char *bufPtr = buf;
|
||||||
|
size_t bufLeft = sizeof(buf);
|
||||||
|
size_t ictd = iconv(ict, (char **)&src, &srcLen, (char **)&bufPtr, &bufLeft);
|
||||||
|
*dst_len += sizeof(buf) - bufLeft;
|
||||||
|
if (ictd == -1 && errno != E2BIG)
|
||||||
|
{
|
||||||
|
if (errno == EILSEQ)
|
||||||
|
retValue = SRCIllegal;
|
||||||
|
else if (errno == EINVAL)
|
||||||
|
{
|
||||||
|
if (allowIncomplete)
|
||||||
|
*dst_len = -1; // TODO: correct value?
|
||||||
|
else
|
||||||
|
retValue = SRCIllegal;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
iconv_close(ict);
|
iconv_close(ict);
|
||||||
|
@ -241,7 +272,7 @@ s32 _ConvertStr(s32 src_code, const void *src, s32 src_len, s32 dst_code, void *
|
||||||
s32 _L10nConvertStr(s32 src_code, vm::cptr<void> src, vm::cptr<s32> src_len, s32 dst_code, vm::ptr<void> dst, vm::ptr<s32> dst_len)
|
s32 _L10nConvertStr(s32 src_code, vm::cptr<void> src, vm::cptr<s32> src_len, s32 dst_code, vm::ptr<void> dst, vm::ptr<s32> dst_len)
|
||||||
{
|
{
|
||||||
s32 dstLen = *dst_len;
|
s32 dstLen = *dst_len;
|
||||||
s32 result = _ConvertStr(src_code, src.get_ptr(), *src_len, dst_code, dst.get_ptr(), &dstLen, false);
|
s32 result = _ConvertStr(src_code, src.get_ptr(), *src_len, dst_code, dst == vm::null ? NULL : dst.get_ptr(), &dstLen, false);
|
||||||
*dst_len = dstLen;
|
*dst_len = dstLen;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue