mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-09-29 14:38:29 +00:00
os2: a _lot_ of coding style cleanup, sot that they match the SDL style.
also renamed the 'debug' macro to debug_os2: the former was dangerously a common name. the binary (dll) output is precisely the same as before.
This commit is contained in:
@@ -18,19 +18,21 @@
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if defined(__OS2__)
|
||||
|
||||
#include "geniconv/geniconv.h"
|
||||
|
||||
// SDL_OS2Quit() will be called from SDL_QuitSubSystem().
|
||||
|
||||
void SDL_OS2Quit()
|
||||
/* SDL_OS2Quit() will be called from SDL_QuitSubSystem() */
|
||||
void SDL_OS2Quit(void)
|
||||
{
|
||||
// Unload DLL used for iconv. We can do it at any time and use iconv again -
|
||||
// dynamic library will be loaded on first call iconv_open() (see geniconv).
|
||||
libiconv_clean();
|
||||
/* Unload DLL used for iconv. We can do it at any time and use iconv again -
|
||||
* dynamic library will be loaded on first call iconv_open() (see geniconv). */
|
||||
libiconv_clean();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
@@ -27,24 +27,26 @@
|
||||
|
||||
#ifdef OS2DEBUG
|
||||
#if (OS2DEBUG-0 >= 2)
|
||||
# define debug(s,...) SDL_LogDebug( SDL_LOG_CATEGORY_APPLICATION, \
|
||||
__func__"(): "##s, ##__VA_ARGS__ )
|
||||
# define debug_os2(s,...) SDL_LogDebug(SDL_LOG_CATEGORY_APPLICATION, \
|
||||
__func__ "(): " ##s, ##__VA_ARGS__)
|
||||
#else
|
||||
# define debug(s,...) printf( __func__"(): "##s"\n", ##__VA_ARGS__ )
|
||||
# define debug_os2(s,...) printf(__func__ "(): " ##s "\n", ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
#else
|
||||
#else /* no debug */
|
||||
|
||||
# define debug(s,...)
|
||||
# define debug_os2(s,...) do {} while (0)
|
||||
|
||||
#endif /* OS2DEBUG */
|
||||
|
||||
|
||||
/* StrUTF8New() - geniconv/sys2utf8.c */
|
||||
#define OS2_SysToUTF8(S) StrUTF8New( 1, S, SDL_strlen( S ) + 1 )
|
||||
#define OS2_UTF8ToSys(S) StrUTF8New( 0, (char *)(S), SDL_strlen( S ) + 1 )
|
||||
#define OS2_SysToUTF8(S) StrUTF8New(1, (S), SDL_strlen((S)) + 1)
|
||||
#define OS2_UTF8ToSys(S) StrUTF8New(0, (char *)(S), SDL_strlen((S)) + 1)
|
||||
|
||||
/* SDL_OS2Quit() will be called from SDL_QuitSubSystem() */
|
||||
void SDL_OS2Quit();
|
||||
void SDL_OS2Quit(void);
|
||||
|
||||
#endif /* SDL_os2_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
@@ -25,38 +25,38 @@
|
||||
Andrey Vasilkin, 2016.
|
||||
*/
|
||||
|
||||
#define INCL_DOSMODULEMGR /* Module Manager values */
|
||||
#define INCL_DOSERRORS /* Error values */
|
||||
#define INCL_DOSMODULEMGR /* Module Manager values */
|
||||
#define INCL_DOSERRORS /* Error values */
|
||||
#include <os2.h>
|
||||
|
||||
#include "geniconv.h"
|
||||
|
||||
//#define DEBUG
|
||||
/*#define DEBUG*/
|
||||
|
||||
#ifdef DEBUG
|
||||
# include <stdio.h>
|
||||
# define debug(s,...) printf(__func__"(): "##s"\n" ,##__VA_ARGS__)
|
||||
#else
|
||||
# define debug(s,...)
|
||||
# define debug(s,...) do {} while (0)
|
||||
#endif
|
||||
|
||||
// Exports from os2iconv.c.
|
||||
/* Exports from os2iconv.c */
|
||||
extern iconv_t _System os2_iconv_open(const char* tocode, const char* fromcode);
|
||||
extern size_t _System os2_iconv(iconv_t cd, char* * inbuf,
|
||||
size_t *inbytesleft, char* * outbuf,
|
||||
size_t *outbytesleft);
|
||||
extern int _System os2_iconv_close(iconv_t cd);
|
||||
|
||||
// Functions pointers types.
|
||||
/* Functions pointers types */
|
||||
typedef iconv_t _System (*FNICONV_OPEN)(const char* tocode, const char* fromcode);
|
||||
typedef size_t _System (*FNICONV)(iconv_t cd, char* * inbuf,
|
||||
size_t *inbytesleft, char* * outbuf,
|
||||
size_t *outbytesleft);
|
||||
typedef int _System (*FNICONV_CLOSE)(iconv_t cd);
|
||||
|
||||
// Used DLL module handle.
|
||||
/* Used DLL module handle */
|
||||
static HMODULE hmIconv = NULLHANDLE;
|
||||
// Functions pointers.
|
||||
/* Functions pointers */
|
||||
static FNICONV_OPEN fn_iconv_open = NULL;
|
||||
static FNICONV fn_iconv = NULL;
|
||||
static FNICONV_CLOSE fn_iconv_close = NULL;
|
||||
@@ -65,100 +65,93 @@ static FNICONV_CLOSE fn_iconv_close = NULL;
|
||||
static BOOL _loadDLL(PSZ pszName, PSZ pszIconvOpen, PSZ pszIconv,
|
||||
PSZ pszIconvClose)
|
||||
{
|
||||
ULONG ulRC;
|
||||
CHAR acError[256];
|
||||
ULONG ulRC;
|
||||
CHAR acError[256];
|
||||
|
||||
ulRC = DosLoadModule( acError, sizeof(acError), pszName, &hmIconv );
|
||||
if ( ulRC != NO_ERROR )
|
||||
{
|
||||
debug( "DLL not loaded: %s", &acError );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
ulRC = DosQueryProcAddr( hmIconv, 0, pszIconvOpen, (PFN *)&fn_iconv_open );
|
||||
if ( ulRC != NO_ERROR )
|
||||
{
|
||||
debug( "Error: cannot find entry %s in %s", pszIconvOpen, pszName );
|
||||
break;
|
||||
ulRC = DosLoadModule(acError, sizeof(acError), pszName, &hmIconv);
|
||||
if (ulRC != NO_ERROR) {
|
||||
debug("DLL not loaded: %s", &acError);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ulRC = DosQueryProcAddr( hmIconv, 0, pszIconv, (PFN *)&fn_iconv );
|
||||
if ( ulRC != NO_ERROR )
|
||||
{
|
||||
debug( "Error: cannot find entry %s in %s", pszIconv, pszName );
|
||||
break;
|
||||
}
|
||||
do {
|
||||
ulRC = DosQueryProcAddr(hmIconv, 0, pszIconvOpen, (PFN *)&fn_iconv_open);
|
||||
if (ulRC != NO_ERROR) {
|
||||
debug("Error: cannot find entry %s in %s", pszIconvOpen, pszName);
|
||||
break;
|
||||
}
|
||||
|
||||
ulRC = DosQueryProcAddr( hmIconv, 0, pszIconvClose, (PFN *)&fn_iconv_close );
|
||||
if ( ulRC != NO_ERROR )
|
||||
{
|
||||
debug( "Error: cannot find entry %s in %s", pszIconvClose, pszName );
|
||||
break;
|
||||
}
|
||||
ulRC = DosQueryProcAddr(hmIconv, 0, pszIconv, (PFN *)&fn_iconv);
|
||||
if (ulRC != NO_ERROR) {
|
||||
debug("Error: cannot find entry %s in %s", pszIconv, pszName);
|
||||
break;
|
||||
}
|
||||
|
||||
debug( "DLL %s used", pszName );
|
||||
return TRUE;
|
||||
}
|
||||
while( FALSE );
|
||||
ulRC = DosQueryProcAddr(hmIconv, 0, pszIconvClose, (PFN *)&fn_iconv_close);
|
||||
if (ulRC != NO_ERROR) {
|
||||
debug("Error: cannot find entry %s in %s", pszIconvClose, pszName);
|
||||
break;
|
||||
}
|
||||
|
||||
DosFreeModule( hmIconv );
|
||||
hmIconv = NULLHANDLE;
|
||||
return FALSE;
|
||||
}
|
||||
debug("DLL %s used", pszName);
|
||||
return TRUE;
|
||||
} while (FALSE);
|
||||
|
||||
static void _init()
|
||||
{
|
||||
if ( fn_iconv_open != NULL )
|
||||
// Already was initialized.
|
||||
return;
|
||||
|
||||
// Try to load kiconv.dll, iconv2.dll or iconv.dll.
|
||||
if ( !_loadDLL( "KICONV", "_libiconv_open", "_libiconv", "_libiconv_close" )
|
||||
&& !_loadDLL( "ICONV2", "_libiconv_open", "_libiconv", "_libiconv_close" )
|
||||
&& !_loadDLL( "ICONV", "_iconv_open", "_iconv", "_iconv_close" ) )
|
||||
{
|
||||
// No one DLL was loaded - use OS/2 conversion objects API.
|
||||
|
||||
debug( "Uni*() API used" );
|
||||
fn_iconv_open = os2_iconv_open;
|
||||
fn_iconv = os2_iconv;
|
||||
fn_iconv_close = os2_iconv_close;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Public routines.
|
||||
// ----------------
|
||||
|
||||
// Non-standard function for iconv to unload the used dynamic library.
|
||||
void libiconv_clean()
|
||||
{
|
||||
if ( hmIconv != NULLHANDLE )
|
||||
{
|
||||
DosFreeModule( hmIconv );
|
||||
DosFreeModule(hmIconv);
|
||||
hmIconv = NULLHANDLE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
fn_iconv_open = NULL;
|
||||
fn_iconv = NULL;
|
||||
fn_iconv_close = NULL;
|
||||
}
|
||||
static void _init(void)
|
||||
{
|
||||
if (fn_iconv_open != NULL) /* Already was initialized */
|
||||
return;
|
||||
|
||||
/* Try to load kiconv.dll, iconv2.dll or iconv.dll */
|
||||
if (!_loadDLL("KICONV", "_libiconv_open", "_libiconv", "_libiconv_close") &&
|
||||
!_loadDLL("ICONV2", "_libiconv_open", "_libiconv", "_libiconv_close") &&
|
||||
!_loadDLL("ICONV", "_iconv_open", "_iconv", "_iconv_close") ) {
|
||||
/* No DLL was loaded - use OS/2 conversion objects API */
|
||||
debug("Uni*() API used");
|
||||
fn_iconv_open = os2_iconv_open;
|
||||
fn_iconv = os2_iconv;
|
||||
fn_iconv_close = os2_iconv_close;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Public routines.
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
/* Non-standard function for iconv to unload the used dynamic library */
|
||||
void libiconv_clean(void)
|
||||
{
|
||||
if (hmIconv != NULLHANDLE) {
|
||||
DosFreeModule(hmIconv);
|
||||
hmIconv = NULLHANDLE;
|
||||
|
||||
fn_iconv_open = NULL;
|
||||
fn_iconv = NULL;
|
||||
fn_iconv_close = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
iconv_t libiconv_open(const char* tocode, const char* fromcode)
|
||||
{
|
||||
_init();
|
||||
return fn_iconv_open( tocode, fromcode );
|
||||
_init();
|
||||
return fn_iconv_open(tocode, fromcode);
|
||||
}
|
||||
|
||||
size_t libiconv(iconv_t cd, char* * inbuf, size_t *inbytesleft,
|
||||
char* * outbuf, size_t *outbytesleft)
|
||||
{
|
||||
return fn_iconv( cd, inbuf, inbytesleft, outbuf, outbytesleft );
|
||||
return fn_iconv(cd, inbuf, inbytesleft, outbuf, outbytesleft);
|
||||
}
|
||||
|
||||
int libiconv_close(iconv_t cd)
|
||||
{
|
||||
return fn_iconv_close( cd );
|
||||
return fn_iconv_close(cd);
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
@@ -47,34 +47,39 @@
|
||||
|
||||
#define iconv_clean libiconv_clean
|
||||
|
||||
// Non-standard function for iconv to unload the used dynamic library.
|
||||
void libiconv_clean();
|
||||
/* Non-standard function for iconv to unload the used dynamic library */
|
||||
void libiconv_clean(void);
|
||||
|
||||
iconv_t libiconv_open(const char* tocode, const char* fromcode);
|
||||
size_t libiconv(iconv_t cd, char* * inbuf, size_t *inbytesleft,
|
||||
char* * outbuf, size_t *outbytesleft);
|
||||
int libiconv_close(iconv_t cd);
|
||||
iconv_t libiconv_open (const char *tocode, const char *fromcode);
|
||||
int libiconv_close(iconv_t cd);
|
||||
size_t libiconv (iconv_t cd, char **inbuf, size_t *inbytesleft,
|
||||
char **outbuf, size_t *outbytesleft);
|
||||
|
||||
// System codepage <-> UTF-8.
|
||||
|
||||
// StrUTF8()
|
||||
// Coverts string from system cp to UTF-8 (fToUTF8 is not 0) or from UTF-8 to
|
||||
// the system cp (fToUTF8 is 0). Converted ASCIIZ string will be placed at the
|
||||
// buffer pcDst, up to cbDst - 1 (for sys->utf8) or 2 (for utf8->sys) bytes.
|
||||
// Returns the number of bytes written into pcDst, not counting the terminating
|
||||
// 0 byte(s) or -1 on error.
|
||||
/* System codepage <-> UTF-8
|
||||
*
|
||||
* StrUTF8()
|
||||
* Coverts string from system cp to UTF-8 (fToUTF8 is not 0) or from UTF-8 to
|
||||
* the system cp (fToUTF8 is 0). Converted ASCIIZ string will be placed at the
|
||||
* buffer pcDst, up to cbDst - 1 (for sys->utf8) or 2 (for utf8->sys) bytes.
|
||||
* Returns the number of bytes written into pcDst, not counting the terminating
|
||||
* 0 byte(s) or -1 on error.
|
||||
*/
|
||||
int StrUTF8(int fToUTF8, char *pcDst, int cbDst, char *pcSrc, int cbSrc);
|
||||
|
||||
// StrUTF8New()
|
||||
// Coverts string from system cp to UTF-8 (fToUTF8 is not 0) or from UTF-8 to
|
||||
// the system cp (fToUTF8 is 0). Memory for the new string is obtained by
|
||||
// using libc malloc().
|
||||
// Returns converted string, terminating two bytes 0 is appended to the result.
|
||||
// Returns null on error.
|
||||
/* StrUTF8New()
|
||||
* Coverts string from system cp to UTF-8 (fToUTF8 is not 0) or from UTF-8 to
|
||||
* the system cp (fToUTF8 is 0). Memory for the new string is obtained by
|
||||
* using libc malloc().
|
||||
* Returns converted string, terminating two bytes 0 is appended to the result.
|
||||
* Returns null on error.
|
||||
*/
|
||||
char *StrUTF8New(int fToUTF8, char *pcStr, int cbStr);
|
||||
|
||||
// StrUTF8Free()
|
||||
// Deallocates the memory block located by StrUTF8New() (just libc free()).
|
||||
/* StrUTF8Free()
|
||||
* Deallocates the memory block located by StrUTF8New() (just libc free()).
|
||||
*/
|
||||
void StrUTF8Free(char *pszStr);
|
||||
|
||||
#endif // GENICONV_H
|
||||
#endif /* GENICONV_H */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
@@ -28,17 +28,16 @@
|
||||
#include "os2cp.h"
|
||||
|
||||
typedef struct _CP2NAME {
|
||||
ULONG ulCode;
|
||||
PSZ pszName;
|
||||
ULONG ulCode;
|
||||
PSZ pszName;
|
||||
} CP2NAME;
|
||||
|
||||
typedef struct _NAME2CP {
|
||||
PSZ pszName;
|
||||
ULONG ulCode;
|
||||
PSZ pszName;
|
||||
ULONG ulCode;
|
||||
} NAME2CP;
|
||||
|
||||
static CP2NAME aCP2Name[] =
|
||||
{
|
||||
static CP2NAME aCP2Name[] = {
|
||||
{367, "ANSI_X3.4-1968"},
|
||||
{813, "ECMA-118"},
|
||||
{819, "CP819"},
|
||||
@@ -85,8 +84,7 @@ static CP2NAME aCP2Name[] =
|
||||
{62210, "HEBREW"}
|
||||
};
|
||||
|
||||
static NAME2CP aName2CP[] =
|
||||
{
|
||||
static NAME2CP aName2CP[] = {
|
||||
{"850", 850},
|
||||
{"862", 862},
|
||||
{"866", 866},
|
||||
@@ -297,109 +295,107 @@ static NAME2CP aName2CP[] =
|
||||
{"X0201", 896}
|
||||
};
|
||||
|
||||
char * os2cpToName(unsigned long cp)
|
||||
char *os2cpToName(unsigned long cp)
|
||||
{
|
||||
ULONG ulLo = 0;
|
||||
ULONG ulHi = ( sizeof(aCP2Name) / sizeof(struct _CP2NAME) ) - 1;
|
||||
ULONG ulNext;
|
||||
LONG lFound = -1;
|
||||
ULONG ulLo = 0;
|
||||
ULONG ulHi = (sizeof(aCP2Name) / sizeof(struct _CP2NAME)) - 1;
|
||||
ULONG ulNext;
|
||||
LONG lFound = -1;
|
||||
|
||||
if ( cp == SYSTEM_CP )
|
||||
{
|
||||
ULONG aulCP[3];
|
||||
ULONG cCP;
|
||||
if (cp == SYSTEM_CP) {
|
||||
ULONG aulCP[3];
|
||||
ULONG cCP;
|
||||
|
||||
if ( DosQueryCp( sizeof(aulCP), aulCP, &cCP ) != NO_ERROR )
|
||||
return NULL;
|
||||
if (DosQueryCp(sizeof(aulCP), aulCP, &cCP) != NO_ERROR)
|
||||
return NULL;
|
||||
|
||||
cp = aulCP[0];
|
||||
}
|
||||
|
||||
if ( ( aCP2Name[0].ulCode > cp ) || ( aCP2Name[ulHi].ulCode < cp ) )
|
||||
return NULL;
|
||||
|
||||
if ( aCP2Name[0].ulCode == cp )
|
||||
return aCP2Name[0].pszName;
|
||||
|
||||
if ( aCP2Name[ulHi].ulCode == cp )
|
||||
return aCP2Name[ulHi].pszName;
|
||||
|
||||
while( ( ulHi - ulLo ) > 1 )
|
||||
{
|
||||
ulNext = ( ulLo + ulHi ) / 2;
|
||||
|
||||
if ( aCP2Name[ulNext].ulCode < cp )
|
||||
ulLo = ulNext;
|
||||
else if ( aCP2Name[ulNext].ulCode > cp )
|
||||
ulHi = ulNext;
|
||||
else
|
||||
{
|
||||
lFound = ulNext;
|
||||
break;
|
||||
cp = aulCP[0];
|
||||
}
|
||||
}
|
||||
|
||||
return lFound == -1 ? NULL : aCP2Name[lFound].pszName;
|
||||
if (aCP2Name[0].ulCode > cp || aCP2Name[ulHi].ulCode < cp)
|
||||
return NULL;
|
||||
|
||||
if (aCP2Name[0].ulCode == cp)
|
||||
return aCP2Name[0].pszName;
|
||||
|
||||
if (aCP2Name[ulHi].ulCode == cp)
|
||||
return aCP2Name[ulHi].pszName;
|
||||
|
||||
while ((ulHi - ulLo) > 1) {
|
||||
ulNext = (ulLo + ulHi) / 2;
|
||||
|
||||
if (aCP2Name[ulNext].ulCode < cp)
|
||||
ulLo = ulNext;
|
||||
else if (aCP2Name[ulNext].ulCode > cp)
|
||||
ulHi = ulNext;
|
||||
else {
|
||||
lFound = ulNext;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (lFound == -1)? NULL : aCP2Name[lFound].pszName;
|
||||
}
|
||||
|
||||
unsigned long os2cpFromName(char *cp)
|
||||
{
|
||||
ULONG ulLo = 0;
|
||||
ULONG ulHi = ( sizeof(aName2CP) / sizeof(struct _NAME2CP) ) - 1;
|
||||
ULONG ulNext;
|
||||
LONG lFound = -1;
|
||||
LONG lCmp;
|
||||
PCHAR pcEnd;
|
||||
CHAR acBuf[64];
|
||||
ULONG ulLo = 0;
|
||||
ULONG ulHi = (sizeof(aName2CP) / sizeof(struct _NAME2CP)) - 1;
|
||||
ULONG ulNext;
|
||||
LONG lFound = -1;
|
||||
LONG lCmp;
|
||||
PCHAR pcEnd;
|
||||
CHAR acBuf[64];
|
||||
|
||||
if ( cp == NULL )
|
||||
{
|
||||
ULONG aulCP[3];
|
||||
ULONG cCP;
|
||||
if (cp == NULL) {
|
||||
ULONG aulCP[3];
|
||||
ULONG cCP;
|
||||
|
||||
return DosQueryCp( sizeof(aulCP), aulCP, &cCP ) != NO_ERROR ? 0 : aulCP[0];
|
||||
}
|
||||
|
||||
while( isspace( *cp ) ) cp++;
|
||||
pcEnd = strchr( cp, ' ' );
|
||||
if ( pcEnd == NULL )
|
||||
pcEnd = strchr( cp, '\0' );
|
||||
|
||||
ulNext = pcEnd - cp;
|
||||
if ( ulNext >= sizeof(acBuf) )
|
||||
return 0;
|
||||
|
||||
memcpy( acBuf, cp, ulNext );
|
||||
acBuf[ulNext] = '\0';
|
||||
strupr( acBuf );
|
||||
|
||||
lCmp = strcmp( aName2CP[0].pszName, acBuf );
|
||||
if ( lCmp > 0 )
|
||||
return 0;
|
||||
else if ( lCmp == 0 )
|
||||
return aName2CP[0].ulCode;
|
||||
|
||||
lCmp = strcmp( aName2CP[ulHi].pszName, acBuf );
|
||||
if ( lCmp < 0 )
|
||||
return 0;
|
||||
else if ( lCmp == 0 )
|
||||
return aName2CP[ulHi].ulCode;
|
||||
|
||||
while( ( ulHi - ulLo ) > 1 )
|
||||
{
|
||||
ulNext = ( ulLo + ulHi ) / 2;
|
||||
|
||||
lCmp = strcmp( aName2CP[ulNext].pszName, acBuf );
|
||||
if ( lCmp < 0 )
|
||||
ulLo = ulNext;
|
||||
else if ( lCmp > 0 )
|
||||
ulHi = ulNext;
|
||||
else
|
||||
{
|
||||
lFound = ulNext;
|
||||
break;
|
||||
return (DosQueryCp(sizeof(aulCP), aulCP, &cCP) != NO_ERROR)? 0 : aulCP[0];
|
||||
}
|
||||
}
|
||||
|
||||
return lFound == -1 ? 0 : aName2CP[lFound].ulCode;
|
||||
while (isspace(*cp))
|
||||
cp++;
|
||||
|
||||
pcEnd = strchr(cp, ' ');
|
||||
if (pcEnd == NULL)
|
||||
pcEnd = strchr(cp, '\0');
|
||||
|
||||
ulNext = pcEnd - cp;
|
||||
if (ulNext >= sizeof(acBuf))
|
||||
return 0;
|
||||
|
||||
memcpy(acBuf, cp, ulNext);
|
||||
acBuf[ulNext] = '\0';
|
||||
strupr(acBuf);
|
||||
|
||||
lCmp = strcmp(aName2CP[0].pszName, acBuf);
|
||||
if (lCmp > 0)
|
||||
return 0;
|
||||
else if (lCmp == 0)
|
||||
return aName2CP[0].ulCode;
|
||||
|
||||
lCmp = strcmp(aName2CP[ulHi].pszName, acBuf);
|
||||
if (lCmp < 0)
|
||||
return 0;
|
||||
else if (lCmp == 0)
|
||||
return aName2CP[ulHi].ulCode;
|
||||
|
||||
while ((ulHi - ulLo) > 1) {
|
||||
ulNext = (ulLo + ulHi) / 2;
|
||||
|
||||
lCmp = strcmp(aName2CP[ulNext].pszName, acBuf);
|
||||
if (lCmp < 0)
|
||||
ulLo = ulNext;
|
||||
else if (lCmp > 0)
|
||||
ulHi = ulNext;
|
||||
else {
|
||||
lFound = ulNext;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (lFound == -1)? 0 : aName2CP[lFound].ulCode;
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
@@ -24,7 +24,9 @@
|
||||
|
||||
#define SYSTEM_CP 0
|
||||
|
||||
char * os2cpToName(unsigned long cp);
|
||||
char *os2cpToName(unsigned long cp);
|
||||
unsigned long os2cpFromName(char *cp);
|
||||
|
||||
#endif // OS2CP_H
|
||||
#endif /* OS2CP_H */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
@@ -39,7 +39,7 @@
|
||||
#endif
|
||||
#include "os2cp.h"
|
||||
|
||||
#define MAX_CP_NAME_LEN 64
|
||||
#define MAX_CP_NAME_LEN 64
|
||||
|
||||
typedef struct iuconv_obj {
|
||||
UconvObject uo_tocode;
|
||||
@@ -54,232 +54,211 @@ typedef struct iuconv_obj {
|
||||
|
||||
static int _createUconvObj(const char *code, UconvObject *uobj)
|
||||
{
|
||||
UniChar uc_code[MAX_CP_NAME_LEN];
|
||||
int i;
|
||||
const char *ch = code;
|
||||
UniChar uc_code[MAX_CP_NAME_LEN];
|
||||
int i;
|
||||
const char *ch = code;
|
||||
|
||||
if ( code == NULL )
|
||||
uc_code[0] = 0;
|
||||
else
|
||||
{
|
||||
for( i = 0; i < MAX_CP_NAME_LEN; i++ )
|
||||
{
|
||||
uc_code[i] = (unsigned short)*ch;
|
||||
if ( !(*ch) ) break;
|
||||
ch++;
|
||||
if (code == NULL)
|
||||
uc_code[0] = 0;
|
||||
else {
|
||||
for (i = 0; i < MAX_CP_NAME_LEN; i++) {
|
||||
uc_code[i] = (unsigned short)*ch;
|
||||
if (! (*ch))
|
||||
break;
|
||||
ch++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return UniCreateUconvObject( uc_code, uobj );
|
||||
return UniCreateUconvObject(uc_code, uobj);
|
||||
}
|
||||
|
||||
static int uconv_open(const char *code, UconvObject *uobj)
|
||||
{
|
||||
int rc;
|
||||
int rc;
|
||||
|
||||
if ( !stricmp( code, "UTF-16" ) )
|
||||
{
|
||||
*uobj = NULL;
|
||||
return ULS_SUCCESS;
|
||||
}
|
||||
if (!stricmp(code, "UTF-16")) {
|
||||
*uobj = NULL;
|
||||
return ULS_SUCCESS;
|
||||
}
|
||||
|
||||
rc = _createUconvObj( code, uobj );
|
||||
if ( rc != ULS_SUCCESS )
|
||||
{
|
||||
unsigned long cp = os2cpFromName( (char *)code );
|
||||
char cp_name[16];
|
||||
rc = _createUconvObj(code, uobj);
|
||||
if (rc != ULS_SUCCESS) {
|
||||
unsigned long cp = os2cpFromName((char *)code);
|
||||
char cp_name[16];
|
||||
|
||||
if ( cp != 0 && _snprintf( cp_name, sizeof(cp_name), "IBM-%u", cp ) > 0 )
|
||||
rc = _createUconvObj( cp_name, uobj );
|
||||
}
|
||||
if (cp != 0 && _snprintf(cp_name, sizeof(cp_name), "IBM-%u", cp) > 0)
|
||||
rc = _createUconvObj(cp_name, uobj);
|
||||
}
|
||||
|
||||
return rc;
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
extern iconv_t _System os2_iconv_open(const char* tocode, const char* fromcode)
|
||||
{
|
||||
UconvObject uo_tocode;
|
||||
UconvObject uo_fromcode;
|
||||
int rc;
|
||||
iuconv_obj *iuobj;
|
||||
UconvObject uo_tocode;
|
||||
UconvObject uo_fromcode;
|
||||
int rc;
|
||||
iuconv_obj *iuobj;
|
||||
|
||||
if ( tocode == NULL )
|
||||
tocode = "";
|
||||
if (tocode == NULL)
|
||||
tocode = "";
|
||||
|
||||
if ( fromcode == NULL )
|
||||
fromcode = "";
|
||||
if (fromcode == NULL)
|
||||
fromcode = "";
|
||||
|
||||
if ( stricmp(tocode, fromcode) != 0 )
|
||||
{
|
||||
rc = uconv_open( fromcode, &uo_fromcode );
|
||||
if ( rc != ULS_SUCCESS )
|
||||
{
|
||||
errno = EINVAL;
|
||||
return (iconv_t)(-1);
|
||||
if (stricmp(tocode, fromcode) != 0) {
|
||||
rc = uconv_open(fromcode, &uo_fromcode);
|
||||
if (rc != ULS_SUCCESS) {
|
||||
errno = EINVAL;
|
||||
return (iconv_t)(-1);
|
||||
}
|
||||
|
||||
rc = uconv_open(tocode, &uo_tocode);
|
||||
if (rc != ULS_SUCCESS) {
|
||||
UniFreeUconvObject(uo_fromcode);
|
||||
errno = EINVAL;
|
||||
return (iconv_t)(-1);
|
||||
}
|
||||
} else {
|
||||
uo_tocode = NULL;
|
||||
uo_fromcode = NULL;
|
||||
}
|
||||
|
||||
rc = uconv_open( tocode, &uo_tocode );
|
||||
if ( rc != ULS_SUCCESS )
|
||||
{
|
||||
UniFreeUconvObject( uo_fromcode );
|
||||
errno = EINVAL;
|
||||
return (iconv_t)(-1);
|
||||
}
|
||||
}
|
||||
else {
|
||||
uo_tocode = NULL;
|
||||
uo_fromcode = NULL;
|
||||
}
|
||||
|
||||
iuobj = malloc( sizeof(iuconv_obj) );
|
||||
iuobj->uo_tocode = uo_tocode;
|
||||
iuobj->uo_fromcode = uo_fromcode;
|
||||
iuobj->buf_len = 0;
|
||||
iuobj->buf = NULL;
|
||||
iuobj = malloc(sizeof(iuconv_obj));
|
||||
iuobj->uo_tocode = uo_tocode;
|
||||
iuobj->uo_fromcode = uo_fromcode;
|
||||
iuobj->buf_len = 0;
|
||||
iuobj->buf = NULL;
|
||||
#ifdef ICONV_THREAD_SAFE
|
||||
DosCreateMutexSem( NULL, &iuobj->hMtx, 0, FALSE );
|
||||
DosCreateMutexSem(NULL, &iuobj->hMtx, 0, FALSE);
|
||||
#endif
|
||||
|
||||
return iuobj;
|
||||
return iuobj;
|
||||
}
|
||||
|
||||
extern size_t _System os2_iconv(iconv_t cd, char* * inbuf,
|
||||
size_t *inbytesleft,
|
||||
char* * outbuf, size_t *outbytesleft)
|
||||
{
|
||||
UconvObject uo_tocode = ((iuconv_obj *)(cd))->uo_tocode;
|
||||
UconvObject uo_fromcode = ((iuconv_obj *)(cd))->uo_fromcode;
|
||||
size_t nonIdenticalConv = 0;
|
||||
UniChar *uc_buf;
|
||||
size_t uc_buf_len;
|
||||
UniChar **uc_str;
|
||||
size_t *uc_str_len;
|
||||
int rc;
|
||||
size_t ret = (size_t)(-1);
|
||||
UconvObject uo_tocode = ((iuconv_obj *)(cd))->uo_tocode;
|
||||
UconvObject uo_fromcode = ((iuconv_obj *)(cd))->uo_fromcode;
|
||||
size_t nonIdenticalConv = 0;
|
||||
UniChar *uc_buf;
|
||||
size_t uc_buf_len;
|
||||
UniChar **uc_str;
|
||||
size_t *uc_str_len;
|
||||
int rc;
|
||||
size_t ret = (size_t)(-1);
|
||||
|
||||
if ( uo_tocode == NULL && uo_fromcode == NULL )
|
||||
{
|
||||
uc_buf_len = min( *inbytesleft, *outbytesleft );
|
||||
memcpy( *outbuf, *inbuf, uc_buf_len );
|
||||
*inbytesleft -= uc_buf_len;
|
||||
*outbytesleft -= uc_buf_len;
|
||||
outbuf += uc_buf_len;
|
||||
inbuf += uc_buf_len;
|
||||
return uc_buf_len;
|
||||
}
|
||||
if (uo_tocode == NULL && uo_fromcode == NULL) {
|
||||
uc_buf_len = min(*inbytesleft, *outbytesleft);
|
||||
memcpy(*outbuf, *inbuf, uc_buf_len);
|
||||
*inbytesleft -= uc_buf_len;
|
||||
*outbytesleft -= uc_buf_len;
|
||||
outbuf += uc_buf_len;
|
||||
inbuf += uc_buf_len;
|
||||
return uc_buf_len;
|
||||
}
|
||||
|
||||
#ifdef ICONV_THREAD_SAFE
|
||||
DosRequestMutexSem( ((iuconv_obj *)(cd))->hMtx, SEM_INDEFINITE_WAIT );
|
||||
DosRequestMutexSem(((iuconv_obj *)(cd))->hMtx, SEM_INDEFINITE_WAIT);
|
||||
#endif
|
||||
|
||||
if ( uo_tocode && uo_fromcode &&
|
||||
(( ((iuconv_obj *)(cd))->buf_len >> 1 ) < (*inbytesleft)) )
|
||||
{
|
||||
if ( ( ((iuconv_obj *)(cd))->buf ) != NULL )
|
||||
free( ((iuconv_obj *)(cd))->buf );
|
||||
((iuconv_obj *)(cd))->buf_len = *inbytesleft << 1;
|
||||
((iuconv_obj *)(cd))->buf = (UniChar *)malloc( ((iuconv_obj *)(cd))->buf_len );
|
||||
}
|
||||
if (uo_tocode && uo_fromcode &&
|
||||
(((iuconv_obj *)cd)->buf_len >> 1) < *inbytesleft) {
|
||||
if (((iuconv_obj *)cd)->buf != NULL)
|
||||
free(((iuconv_obj *)cd)->buf);
|
||||
((iuconv_obj *)cd)->buf_len = *inbytesleft << 1;
|
||||
((iuconv_obj *)cd)->buf = (UniChar *)malloc(((iuconv_obj *)cd)->buf_len);
|
||||
}
|
||||
|
||||
if ( uo_fromcode )
|
||||
{
|
||||
if ( uo_tocode )
|
||||
{
|
||||
uc_buf = ((iuconv_obj *)(cd))->buf;
|
||||
uc_buf_len = ((iuconv_obj *)(cd))->buf_len;
|
||||
uc_str = &uc_buf;
|
||||
}
|
||||
else {
|
||||
uc_str = (UniChar **)outbuf;
|
||||
uc_buf_len = *outbytesleft;
|
||||
}
|
||||
uc_buf_len = uc_buf_len >> 1;
|
||||
uc_str_len = &uc_buf_len;
|
||||
rc = UniUconvToUcs( uo_fromcode, (void **)inbuf, inbytesleft,
|
||||
uc_str, uc_str_len, &nonIdenticalConv );
|
||||
uc_buf_len = uc_buf_len << 1;
|
||||
if ( !uo_tocode )
|
||||
*outbytesleft = uc_buf_len;
|
||||
if (uo_fromcode) {
|
||||
if (uo_tocode) {
|
||||
uc_buf = ((iuconv_obj *)cd)->buf;
|
||||
uc_buf_len = ((iuconv_obj *)cd)->buf_len;
|
||||
uc_str = &uc_buf;
|
||||
} else {
|
||||
uc_str = (UniChar **)outbuf;
|
||||
uc_buf_len = *outbytesleft;
|
||||
}
|
||||
uc_buf_len = uc_buf_len >> 1;
|
||||
uc_str_len = &uc_buf_len;
|
||||
rc = UniUconvToUcs(uo_fromcode, (void **)inbuf, inbytesleft,
|
||||
uc_str, uc_str_len, &nonIdenticalConv);
|
||||
uc_buf_len = uc_buf_len << 1;
|
||||
if (!uo_tocode)
|
||||
*outbytesleft = uc_buf_len;
|
||||
|
||||
if ( rc != ULS_SUCCESS )
|
||||
{
|
||||
errno = EILSEQ;
|
||||
goto done;
|
||||
if (rc != ULS_SUCCESS) {
|
||||
errno = EILSEQ;
|
||||
goto done;
|
||||
} else if (*inbytesleft && !*uc_str_len) {
|
||||
errno = E2BIG;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!uo_tocode)
|
||||
return nonIdenticalConv;
|
||||
|
||||
uc_buf = ((iuconv_obj *)cd)->buf;
|
||||
uc_buf_len = ((iuconv_obj *)cd)->buf_len - uc_buf_len;
|
||||
uc_str = &uc_buf;
|
||||
uc_str_len = &uc_buf_len;
|
||||
} else {
|
||||
uc_str = (UniChar **)inbuf;
|
||||
uc_str_len = inbytesleft;
|
||||
}
|
||||
else
|
||||
if ( *inbytesleft && !*uc_str_len )
|
||||
{
|
||||
|
||||
*uc_str_len = *uc_str_len>>1;
|
||||
rc = UniUconvFromUcs(uo_tocode, uc_str, uc_str_len, (void **)outbuf,
|
||||
outbytesleft, &nonIdenticalConv);
|
||||
if (rc != ULS_SUCCESS) {
|
||||
switch (rc) {
|
||||
case ULS_BUFFERFULL:
|
||||
errno = E2BIG;
|
||||
break;
|
||||
case ULS_ILLEGALSEQUENCE:
|
||||
errno = EILSEQ;
|
||||
break;
|
||||
case ULS_INVALID:
|
||||
errno = EINVAL;
|
||||
break;
|
||||
}
|
||||
goto done;
|
||||
} else if (*uc_str_len && !*outbytesleft) {
|
||||
errno = E2BIG;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if ( !uo_tocode )
|
||||
return nonIdenticalConv;
|
||||
|
||||
uc_buf = ((iuconv_obj *)(cd))->buf;
|
||||
uc_buf_len = ((iuconv_obj *)(cd))->buf_len - uc_buf_len;
|
||||
uc_str = &uc_buf;
|
||||
uc_str_len = &uc_buf_len;
|
||||
}
|
||||
else {
|
||||
uc_str = (UniChar **)inbuf;
|
||||
uc_str_len = inbytesleft;
|
||||
}
|
||||
|
||||
*uc_str_len = *uc_str_len>>1;
|
||||
rc = UniUconvFromUcs( uo_tocode, uc_str, uc_str_len, (void **)outbuf,
|
||||
outbytesleft, &nonIdenticalConv );
|
||||
if ( rc != ULS_SUCCESS )
|
||||
{
|
||||
switch ( rc )
|
||||
{
|
||||
case ULS_BUFFERFULL:
|
||||
errno = E2BIG;
|
||||
break;
|
||||
case ULS_ILLEGALSEQUENCE:
|
||||
errno = EILSEQ;
|
||||
break;
|
||||
case ULS_INVALID:
|
||||
errno = EINVAL;
|
||||
break;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
else
|
||||
if ( *uc_str_len && !*outbytesleft )
|
||||
{
|
||||
errno = E2BIG;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = nonIdenticalConv;
|
||||
ret = nonIdenticalConv;
|
||||
|
||||
done:
|
||||
|
||||
#ifdef ICONV_THREAD_SAFE
|
||||
DosReleaseMutexSem( ((iuconv_obj *)(cd))->hMtx );
|
||||
DosReleaseMutexSem(((iuconv_obj *)cd)->hMtx);
|
||||
#endif
|
||||
return ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
extern int _System os2_iconv_close(iconv_t cd)
|
||||
int _System os2_iconv_close(iconv_t cd)
|
||||
{
|
||||
if ( !cd )
|
||||
return 0;
|
||||
if (!cd) return 0;
|
||||
|
||||
#ifdef ICONV_THREAD_SAFE
|
||||
DosCloseMutexSem( ((iuconv_obj *)(cd))->hMtx );
|
||||
DosCloseMutexSem(((iuconv_obj *)cd)->hMtx);
|
||||
#endif
|
||||
if ( ((iuconv_obj *)(cd))->uo_tocode != NULL )
|
||||
UniFreeUconvObject( ((iuconv_obj *)(cd))->uo_tocode );
|
||||
if ( ((iuconv_obj *)(cd))->uo_fromcode != NULL )
|
||||
UniFreeUconvObject( ((iuconv_obj *)(cd))->uo_fromcode );
|
||||
if (((iuconv_obj *)cd)->uo_tocode != NULL)
|
||||
UniFreeUconvObject(((iuconv_obj *)cd)->uo_tocode);
|
||||
if (((iuconv_obj *)cd)->uo_fromcode != NULL)
|
||||
UniFreeUconvObject(((iuconv_obj *)cd)->uo_fromcode);
|
||||
|
||||
if ( ( ((iuconv_obj *)(cd))->buf ) != NULL )
|
||||
free( ((iuconv_obj *)(cd))->buf );
|
||||
if (((iuconv_obj *)cd)->buf != NULL)
|
||||
free(((iuconv_obj *)cd)->buf);
|
||||
|
||||
free(cd);
|
||||
free(cd);
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
@@ -24,94 +24,84 @@
|
||||
|
||||
int StrUTF8(int fToUTF8, char *pcDst, int cbDst, char *pcSrc, int cbSrc)
|
||||
{
|
||||
size_t rc;
|
||||
char *pcDstStart = pcDst;
|
||||
iconv_t cd;
|
||||
char *pszToCP, *pszFromCP;
|
||||
int fError = 0;
|
||||
size_t rc;
|
||||
char *pcDstStart = pcDst;
|
||||
iconv_t cd;
|
||||
char *pszToCP, *pszFromCP;
|
||||
int fError = 0;
|
||||
|
||||
if ( cbDst < 4 )
|
||||
return -1;
|
||||
if (cbDst < 4)
|
||||
return -1;
|
||||
|
||||
if ( fToUTF8 )
|
||||
{
|
||||
pszToCP = "UTF-8";
|
||||
pszFromCP = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
pszToCP = "";
|
||||
pszFromCP = "UTF-8";
|
||||
}
|
||||
|
||||
cd = iconv_open( pszToCP, pszFromCP );
|
||||
if ( cd == (iconv_t)-1 )
|
||||
return -1;
|
||||
|
||||
while( cbSrc > 0 )
|
||||
{
|
||||
rc = iconv( cd, &pcSrc, (size_t *)&cbSrc, &pcDst, (size_t *)&cbDst );
|
||||
if ( rc == (size_t)-1 )
|
||||
{
|
||||
if ( errno == EILSEQ )
|
||||
{
|
||||
// Try to skip invalid character.
|
||||
pcSrc++;
|
||||
cbSrc--;
|
||||
continue;
|
||||
}
|
||||
|
||||
fError = 1;
|
||||
break;
|
||||
if (fToUTF8) {
|
||||
pszToCP = "UTF-8";
|
||||
pszFromCP = "";
|
||||
} else {
|
||||
pszToCP = "";
|
||||
pszFromCP = "UTF-8";
|
||||
}
|
||||
}
|
||||
|
||||
iconv_close( cd );
|
||||
cd = iconv_open(pszToCP, pszFromCP);
|
||||
if (cd == (iconv_t)-1)
|
||||
return -1;
|
||||
|
||||
// Write trailing ZERO (1 byte for UTF-8, 2 bytes for the system cp).
|
||||
if ( fToUTF8 )
|
||||
{
|
||||
if ( cbDst < 1 )
|
||||
{
|
||||
pcDst--;
|
||||
fError = 1; // The destination buffer overflow.
|
||||
while (cbSrc > 0) {
|
||||
rc = iconv(cd, &pcSrc, (size_t *)&cbSrc, &pcDst, (size_t *)&cbDst);
|
||||
if (rc == (size_t)-1) {
|
||||
if (errno == EILSEQ) {
|
||||
/* Try to skip invalid character */
|
||||
pcSrc++;
|
||||
cbSrc--;
|
||||
continue;
|
||||
}
|
||||
|
||||
fError = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
*pcDst = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( cbDst < 2 )
|
||||
{
|
||||
pcDst -= ( cbDst == 0 ) ? 2 : 1;
|
||||
fError = 1; // The destination buffer overflow.
|
||||
}
|
||||
*((short *)pcDst) = '\0';
|
||||
}
|
||||
|
||||
return fError ? -1 : ( pcDst - pcDstStart );
|
||||
iconv_close(cd);
|
||||
|
||||
/* Write trailing ZERO (1 byte for UTF-8, 2 bytes for the system cp) */
|
||||
if (fToUTF8) {
|
||||
if (cbDst < 1) {
|
||||
pcDst--;
|
||||
fError = 1; /* The destination buffer overflow */
|
||||
}
|
||||
*pcDst = '\0';
|
||||
} else {
|
||||
if (cbDst < 2) {
|
||||
pcDst -= (cbDst == 0)? 2 : 1;
|
||||
fError = 1; /* The destination buffer overflow */
|
||||
}
|
||||
*((short *)pcDst) = '\0';
|
||||
}
|
||||
|
||||
return (fError) ? -1 : (pcDst - pcDstStart);
|
||||
}
|
||||
|
||||
char *StrUTF8New(int fToUTF8, char *pcStr, int cbStr)
|
||||
{
|
||||
int cbNewStr = ( ( cbStr > 4 ? cbStr : 4 ) + 1 ) * 2;
|
||||
char *pszNewStr = malloc( cbNewStr );
|
||||
int cbNewStr = (((cbStr > 4)? cbStr : 4) + 1) * 2;
|
||||
char *pszNewStr = malloc(cbNewStr);
|
||||
|
||||
if ( pszNewStr == NULL )
|
||||
if (pszNewStr == NULL)
|
||||
return NULL;
|
||||
|
||||
cbNewStr = StrUTF8(fToUTF8, pszNewStr, cbNewStr, pcStr, cbStr);
|
||||
if (cbNewStr != -1) {
|
||||
pcStr = realloc(pszNewStr, cbNewStr + ((fToUTF8)? 1 : sizeof(short)));
|
||||
if (pcStr != NULL)
|
||||
return pcStr;
|
||||
}
|
||||
|
||||
free(pszNewStr);
|
||||
return NULL;
|
||||
|
||||
cbNewStr = StrUTF8( fToUTF8, pszNewStr, cbNewStr, pcStr, cbStr );
|
||||
if ( cbNewStr != -1 )
|
||||
{
|
||||
pcStr = realloc( pszNewStr, cbNewStr + ( fToUTF8 ? 1 : sizeof(short) ) );
|
||||
if ( pcStr != NULL )
|
||||
return pcStr;
|
||||
}
|
||||
|
||||
free( pszNewStr );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void StrUTF8Free(char *pszStr)
|
||||
{
|
||||
free( pszStr );
|
||||
free(pszStr);
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
@@ -26,43 +26,44 @@
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char acBuf[128];
|
||||
char *inbuf = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; // KOI8-R string.
|
||||
size_t inbytesleft = strlen( inbuf );
|
||||
char *outbuf = &acBuf;
|
||||
size_t outbytesleft = sizeof( acBuf );
|
||||
iconv_t ic;
|
||||
char acBuf[128];
|
||||
char *inbuf = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; /* KOI8-R string */
|
||||
size_t inbytesleft = strlen(inbuf);
|
||||
char *outbuf = acBuf;
|
||||
size_t outbytesleft = sizeof(acBuf);
|
||||
iconv_t ic;
|
||||
|
||||
// KOI8 -> system cp.
|
||||
/* KOI8 -> system cp */
|
||||
ic = iconv_open("", "KOI8-R");
|
||||
if (ic == (iconv_t)(-1)) {
|
||||
puts("iconv_open() fail");
|
||||
return 1;
|
||||
}
|
||||
|
||||
ic = iconv_open( "", "KOI8-R" );
|
||||
if ( ic == (iconv_t)(-1) )
|
||||
{
|
||||
puts( "iconv_open() fail" );
|
||||
return 1;
|
||||
}
|
||||
iconv(ic, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
|
||||
printf("KOI8-R to system cp: %s\n", acBuf);
|
||||
|
||||
iconv( ic, &inbuf, &inbytesleft, &outbuf, &outbytesleft );
|
||||
printf( "KOI8-R to system cp.: %s\n", &acBuf );
|
||||
iconv_close(ic);
|
||||
|
||||
iconv_close( ic );
|
||||
/* System cp -> UTF-8 -> system cp: */
|
||||
|
||||
// System cp. -> UTF-8 -> system cp.
|
||||
/* System cp -> UTF-8 by StrUTF8New() */
|
||||
inbuf = StrUTF8New(1, acBuf, strlen(acBuf));
|
||||
|
||||
// System cp. -> UTF-8 by StrUTF8New().
|
||||
inbuf = StrUTF8New( 1, &acBuf, strlen( &acBuf ) );
|
||||
/* UTF-8 -> system cp. by StrUTF8() */
|
||||
if (StrUTF8(0, &acBuf, sizeof(acBuf), inbuf, strlen(inbuf)) == -1) {
|
||||
puts("StrUTF8() failed");
|
||||
} else {
|
||||
printf("system cp. -> UTF-8 -> system cp.: %s\n", &acBuf);
|
||||
}
|
||||
|
||||
// UTF-8 -> system cp. by StrUTF8().
|
||||
if ( StrUTF8( 0, &acBuf, sizeof(acBuf), inbuf, strlen( inbuf ) ) == -1 )
|
||||
puts( "StrUTF8() failed" );
|
||||
else
|
||||
printf( "system cp. -> UTF-8 -> system cp.: %s\n", &acBuf );
|
||||
free(inbuf);
|
||||
|
||||
free( inbuf );
|
||||
/* Unload used DLL */
|
||||
iconv_clean();
|
||||
|
||||
// Unload used DLL.
|
||||
iconv_clean();
|
||||
|
||||
puts( "Done." );
|
||||
return 0;
|
||||
puts("Done.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
Reference in New Issue
Block a user