source: trunk/src/user32/cp_cvt.cpp@ 21348

Last change on this file since 21348 was 21348, checked in by vladest, 16 years ago

Fixed double chars in standalone apps
Fixed umlaut and other national characters suppot in inputline

File size: 2.7 KB
Line 
1#include <os2wrap.h>
2
3#include <uconv.h>
4#include <stdlib.h>
5#include <string.h>
6
7int cp2cp(char *cp1, char *cp2, char *src, char *dst, int len)
8{
9 UconvObject ucSrc = 0;
10 UconvObject ucDst = 0;
11
12 size_t uBytes;
13 size_t uUniChars;
14 size_t uSubs;
15
16 UniChar* pUniBuf;
17 UniChar* pUniPtr;
18
19 UniChar UniCP1[64];
20 UniChar UniCP2[64];
21
22 char *pStr;
23
24 int rc = 0;
25
26 /* Check parameters */
27
28 if(!cp1 || !cp2 || !src || !dst || len < 0)
29 return -1;
30
31 USHORT selFS = RestoreOS2FS();
32
33 /* Convert codepage names to UniChar */
34 rc = UniCreateUconvObject((UniChar *)L"", &ucSrc);
35
36 if(rc)
37 {
38 SetFS(selFS);
39 return rc;
40
41 }
42
43 pStr = cp1;
44 uBytes = strlen(cp1)+1; /* convert including trailing 0 */
45 pUniPtr = UniCP1;
46 uUniChars = (sizeof(UniCP1)/sizeof(UniChar)) + 1;
47
48 rc = UniUconvToUcs(ucSrc, (void **)&pStr, &uBytes, &pUniPtr, &uUniChars, &uSubs);
49
50 if(rc)
51 {
52 UniFreeUconvObject(ucSrc);
53 SetFS(selFS);
54 return rc;
55 }
56
57 pStr = cp2;
58 uBytes = strlen(cp2)+1; /* convert including trailing 0 */
59 pUniPtr = UniCP2;
60 uUniChars = (sizeof(UniCP2)/sizeof(UniChar)) + 1;
61
62 rc = UniUconvToUcs(ucSrc, (void **)&pStr, &uBytes, &pUniPtr, &uUniChars, &uSubs);
63
64 /* conversion object is no more required */
65
66 UniFreeUconvObject(ucSrc);
67
68 if(rc)
69 {
70 SetFS(selFS);
71 return rc;
72 }
73
74 /* Codepages is prepared, create conversion objects */
75
76 rc = UniCreateUconvObject(UniCP1, &ucSrc);
77
78 if(rc)
79 {
80 SetFS(selFS);
81 return rc;
82 }
83
84 rc = UniCreateUconvObject(UniCP2, &ucDst);
85
86 if(rc)
87 {
88 UniFreeUconvObject(ucSrc);
89 SetFS(selFS);
90 return rc;
91 }
92
93 /* Conversion objects are created, prepare buffers */
94
95 pStr = src;
96 uBytes = len;
97 uUniChars = len;
98
99 pUniBuf = (UniChar*) malloc(uUniChars * sizeof(UniChar));
100
101 if(!pUniBuf)
102 {
103 UniFreeUconvObject(ucSrc);
104 UniFreeUconvObject(ucDst);
105 SetFS(selFS);
106 return -2;
107 }
108
109 pUniPtr = pUniBuf;
110
111 rc = UniUconvToUcs(ucSrc, (void **)&pStr, &uBytes, &pUniPtr, &uUniChars, &uSubs);
112
113 if(rc)
114 {
115 UniFreeUconvObject(ucSrc);
116 UniFreeUconvObject(ucDst);
117 free(pUniBuf);
118 SetFS(selFS);
119 return rc;
120 }
121
122 pStr = dst;
123 uBytes = len;
124 uUniChars = len;
125
126 pUniPtr = pUniBuf;
127
128 rc = UniUconvFromUcs(ucDst, &pUniPtr, &uUniChars, (void **)&pStr, &uBytes, &uSubs);
129
130 UniFreeUconvObject(ucSrc);
131 UniFreeUconvObject(ucDst);
132 free(pUniBuf);
133
134 SetFS(selFS);
135 return rc;
136}
137
Note: See TracBrowser for help on using the repository browser.