-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathWideChar.cpp
134 lines (113 loc) · 2.53 KB
/
WideChar.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include "WideChar.h"
WideChar::WideChar()
{}
WideChar::~WideChar()
{}
//
// converts a single character string into a UNICODE string
//
// Note:
// IN and OUT buffers can be identical
//
BOOL WideChar::SingleToWideCharStr(IN PSTR szStr, OUT PWSTR szWideStrBuff, IN DWORD dwcBuff)
{
DWORD dwcStr, dwcWideStr;
void* pUniStr;
dwcStr = lstrlen(szStr);
if (!dwcStr)
return FALSE; // ERR
dwcWideStr = (dwcStr+1)*2;
if (dwcBuff < dwcWideStr)
return FALSE; // ERR
pUniStr = malloc(dwcWideStr);
if (!pUniStr)
return FALSE; // ERR
if (!MultiByteToWideChar(
CP_OEMCP,
MB_PRECOMPOSED | MB_USEGLYPHCHARS,
szStr, dwcStr+1,
(PWSTR)pUniStr, dwcWideStr / 2))
return FALSE; // ERR
memcpy(
(void*)szWideStrBuff,
(void*)pUniStr,
dwcWideStr);
// Cleanup
free(pUniStr);
return TRUE; // OK
}
//
// converts a UNICODE string into a single character string
//
// Args:
// dwcBuff - size of output buffer
//
// Note:
// IN and OUT buffers can be identical
//
BOOL WideChar::WideToSingleCharStr(IN PWSTR szWideStr, OUT PSTR szStrBuff, IN DWORD dwcBuff)
{
DWORD chars;
void* pStr;
chars = lstrlenW(szWideStr);
if (!chars)
return FALSE; // ERR
if (dwcBuff < (chars+1))
return FALSE; // ERR
pStr = malloc( chars+1 );
if (!pStr)
return FALSE; // ERR
if (!WideCharToMultiByte(
CP_OEMCP,
0,
szWideStr, chars + 1,
(PSTR)pStr, chars + 1,
NULL, NULL))
return FALSE; // ERR
memcpy(
(void*)szStrBuff,
(void*)pStr,
chars + 1);
// Cleanup
free(pStr);
return TRUE; // OK
}
//
// converts a UNICODE string into a single character string
//
// Args:
// dwcMaxCharToProcess - number of characters to process at "szWideStr" excluding NUL !
// dwcBuff - size of output buffer
//
// Note:
// IN and OUT buffers can be identical
//
BOOL WideChar::WideToSingleCharStrN(IN PWSTR szWideStr, IN DWORD dwcMaxCharToProcess, OUT PSTR szStrBuff, IN DWORD dwcBuff)
{
DWORD chars;
void* pStr;
chars = lstrlenW(szWideStr);
if (!chars)
return FALSE; // ERR
chars = __min(dwcMaxCharToProcess, chars);
if (dwcBuff < chars+1)
return FALSE; // ERR
pStr = malloc( chars );
if (!pStr)
return FALSE; // ERR
if (!WideCharToMultiByte(
CP_OEMCP,
0,
szWideStr, chars,
(PSTR)pStr, chars,
NULL, NULL))
return FALSE; // ERR
memcpy(
(void*)szStrBuff,
(void*)pStr,
chars + 1);
szStrBuff[chars] = 0; // insert NUL
// Cleanup
free(pStr);
return TRUE; // OK
}