OS/2: Deal with UTF-8 -> codepage conversion on older OS/2 installs.
(untested attempt.)
This commit is contained in:
parent
7a26b83733
commit
69d3df3286
|
@ -95,10 +95,7 @@ static PHYSFS_ErrorCode errcodeFromAPIRET(const APIRET rc)
|
||||||
|
|
||||||
static char *cvtUtf8ToCodepage(const char *utf8str)
|
static char *cvtUtf8ToCodepage(const char *utf8str)
|
||||||
{
|
{
|
||||||
if (uconvdll)
|
const size_t len = strlen(utf8str) + 1;
|
||||||
{
|
|
||||||
int rc;
|
|
||||||
size_t len = strlen(utf8str) + 1;
|
|
||||||
const size_t uc2buflen = len * sizeof (UniChar);
|
const size_t uc2buflen = len * sizeof (UniChar);
|
||||||
UniChar *uc2ptr = (UniChar *) __PHYSFS_smallAlloc(uc2buflen);
|
UniChar *uc2ptr = (UniChar *) __PHYSFS_smallAlloc(uc2buflen);
|
||||||
UniChar *uc2str = uc2ptr;
|
UniChar *uc2str = uc2ptr;
|
||||||
|
@ -106,14 +103,34 @@ static char *cvtUtf8ToCodepage(const char *utf8str)
|
||||||
char *cpstr = NULL;
|
char *cpstr = NULL;
|
||||||
size_t subs = 0;
|
size_t subs = 0;
|
||||||
size_t unilen;
|
size_t unilen;
|
||||||
size_t cplen;
|
|
||||||
|
|
||||||
GOTO_IF(!uc2str, PHYSFS_ERR_OUT_OF_MEMORY, failed);
|
BAIL_IF(!uc2str, PHYSFS_ERR_OUT_OF_MEMORY, NULL);
|
||||||
PHYSFS_utf8ToUcs2(utf8str, (PHYSFS_uint16 *) uc2str, uc2buflen);
|
PHYSFS_utf8ToUcs2(utf8str, (PHYSFS_uint16 *) uc2str, uc2buflen);
|
||||||
for (unilen = 0; uc2str[unilen]; unilen++) { /* spin */ }
|
for (unilen = 0; uc2str[unilen]; unilen++) { /* spin */ }
|
||||||
unilen++; /* null terminator. */
|
unilen++; /* null terminator. */
|
||||||
|
|
||||||
cplen = unilen * 4; /* overallocate, just in case. */
|
if (!uconvdll)
|
||||||
|
{
|
||||||
|
/* There's really not much we can do on older OS/2s except pray this
|
||||||
|
is latin1-compatible. */
|
||||||
|
size_t i;
|
||||||
|
cpptr = (char *) allocator.Malloc(unilen);
|
||||||
|
cpstr = cpptr;
|
||||||
|
GOTO_IF(!cpptr, PHYSFS_ERR_OUT_OF_MEMORY, failed);
|
||||||
|
for (i = 0; i < unilen; i++)
|
||||||
|
{
|
||||||
|
const UniChar ch = uc2str[i];
|
||||||
|
GOTO_IF(ch > 0xFF, PHYSFS_ERR_BAD_FILENAME, failed);
|
||||||
|
cpptr[i] = (char) ((unsigned char) ch);
|
||||||
|
} /* for */
|
||||||
|
|
||||||
|
__PHYSFS_smallFree(uc2ptr);
|
||||||
|
return cpstr;
|
||||||
|
} /* if */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
const size_t cplen = unilen * 4; /* overallocate, just in case. */
|
||||||
cpptr = (char *) allocator.Malloc(cplen);
|
cpptr = (char *) allocator.Malloc(cplen);
|
||||||
GOTO_IF(!cpptr, PHYSFS_ERR_OUT_OF_MEMORY, failed);
|
GOTO_IF(!cpptr, PHYSFS_ERR_OUT_OF_MEMORY, failed);
|
||||||
cpstr = cpptr;
|
cpstr = cpptr;
|
||||||
|
@ -123,12 +140,13 @@ static char *cvtUtf8ToCodepage(const char *utf8str)
|
||||||
GOTO_IF(subs > 0, PHYSFS_ERR_BAD_FILENAME, failed);
|
GOTO_IF(subs > 0, PHYSFS_ERR_BAD_FILENAME, failed);
|
||||||
assert(unilen == 0);
|
assert(unilen == 0);
|
||||||
|
|
||||||
|
__PHYSFS_smallFree(uc2ptr);
|
||||||
return cpptr;
|
return cpptr;
|
||||||
|
} /* else */
|
||||||
|
|
||||||
failed:
|
failed:
|
||||||
__PHYSFS_smallFree(uc2ptr);
|
__PHYSFS_smallFree(uc2ptr);
|
||||||
allocator.Free(cpptr);
|
allocator.Free(cpptr);
|
||||||
} /* if */
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
} /* cvtUtf8ToCodepage */
|
} /* cvtUtf8ToCodepage */
|
||||||
|
|
Loading…
Reference in New Issue