1
// (c) 2001,2004 by Max Alekseyev
6
#define INCL_DOSMODULEMGR
9
typedef void* UconvObject;
10
typedef unsigned short UniChar;
12
int uni_init(int codepage);
16
int uni_toucs( /* translate to Unicode */
17
char*, /* I - input string */
18
size_t, /* I - length of input string (chars) */
19
UniChar*, /* O - output Unicode string */
20
size_t* ); /* O - length of output string (UniChars) */
22
int uni_fromucs( /* translate from Unicode */
23
UniChar*, /* I - input Unicode string */
24
size_t, /* I - length of input string (UniChars) */
25
char*, /* O - output string */
26
size_t* ); /* O - length of output string (chars) */
30
static int (*uniMapCpToUcsCp) (
31
unsigned long, /* I - Codepage to convert */
32
UniChar*, /* O - Output buffer */
33
size_t ); /* I - UniChars in output buffer */
35
static int (*uniCreateUconvObject) (
36
UniChar*, /* I - Unicode name of uconv table */
37
UconvObject* );/* O - Uconv object handle */
39
static int (*uniFreeUconvObject) (
40
UconvObject ); /* I - Uconv object handle */
42
static int (*uniUconvToUcs) (
43
UconvObject, /* I - Uconv object handle */
44
void**, /* IO - Input buffer */
45
size_t*, /* IO - Input buffer size (bytes) */
46
UniChar**, /* IO - Output buffer size */
47
size_t*, /* IO - Output size (chars) */
48
size_t* ); /* IO - Substitution count */
50
static int (*uniUconvFromUcs) (
51
UconvObject, /* I - Uconv object handle */
52
UniChar**, /* IO - Input buffer */
53
size_t*, /* IO - Input buffer size (bytes) */
54
void**, /* IO - Output buffer size */
55
size_t*, /* IO - Output size (chars) */
56
size_t* ); /* IO - Substitution count */
58
static int uni_ready = 0;
59
static HMODULE uni_UCONV;
60
static UconvObject uni_obj;
62
int uni_init(int codepage) {
68
/* DOS enviroment detected */
72
if( DosLoadModule(0,0,(PCSZ)"UCONV",&uni_UCONV) ) {
73
/* no Unicode API found (obsolete OS/2 version) */
77
if( !DosQueryProcAddr(uni_UCONV,0,(PCSZ)"UniMapCpToUcsCp", (PPFN)&uniMapCpToUcsCp ) &&
78
!DosQueryProcAddr(uni_UCONV,0,(PCSZ)"UniUconvToUcs", (PPFN)&uniUconvToUcs ) &&
79
!DosQueryProcAddr(uni_UCONV,0,(PCSZ)"UniUconvFromUcs", (PPFN)&uniUconvFromUcs ) &&
80
!DosQueryProcAddr(uni_UCONV,0,(PCSZ)"UniCreateUconvObject",(PPFN)&uniCreateUconvObject) &&
81
!DosQueryProcAddr(uni_UCONV,0,(PCSZ)"UniFreeUconvObject", (PPFN)&uniFreeUconvObject )
84
if( (!codepage || !uniMapCpToUcsCp(codepage, unistr, 256)) && !uniCreateUconvObject(unistr,&uni_obj) ) {
89
DosFreeModule(uni_UCONV);
93
int uni_toucs(char* src, size_t srclen, UniChar* dst, size_t* dstlen) {
94
size_t srcbytes, srcsize, dstsize, subsc;
96
if(!uni_ready) return -1;
98
srcbytes = srclen * sizeof(UniChar);
101
if( uniUconvToUcs(uni_obj,(void**)&src,&srclen,&dst,&dstsize,&subsc) ) {
104
*dstlen = srcbytes - dstsize;
108
int uni_fromucs(UniChar* src, size_t srclen, char* dst, size_t* dstlen) {
109
size_t srcbytes, srcsize, dstsize, subsc;
111
if(!uni_ready) return -1;
114
srcsize = dstsize = srcbytes;
116
if( uniUconvFromUcs(uni_obj,&src,&srcsize,(void**)&dst,&dstsize,&subsc) ) {
119
*dstlen = srcbytes - dstsize;
125
uniFreeUconvObject(uni_obj);
126
DosFreeModule(uni_UCONV);