forked from AutoHotkey/AutoHotkey
-
Notifications
You must be signed in to change notification settings - Fork 0
/
StringConv.h
146 lines (124 loc) · 4.9 KB
/
StringConv.h
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
135
136
137
138
139
140
141
142
143
144
145
146
#pragma once
#ifdef _WIN32
#define IsValidUTF8(str, cch) MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, (str), (cch), NULL, 0)
#define IsValidACP(str, cch) MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, (str), (cch), NULL, 0)
LPCWSTR StringUTF8ToWChar(LPCSTR sUTF8, CStringW &sWChar, int iChars = -1);
LPCWSTR StringCharToWChar(LPCSTR sChar, CStringW &sWChar, int iChars = -1, UINT codepage = CP_ACP);
LPCSTR StringWCharToUTF8(LPCWSTR sWChar, CStringA &sUTF8, int iChars = -1);
LPCSTR StringCharToUTF8(LPCSTR sChar, CStringA &sUTF8, int iChars = -1, UINT codepage = CP_ACP);
LPCSTR StringWCharToChar(LPCWSTR sWChar, CStringA &sChar, int iChars = -1, char chDef = '?', UINT codepage = CP_ACP);
LPCSTR StringUTF8ToChar(LPCSTR sUTF8, CStringA &sChar, int iChars = -1, char chDef = '?', UINT codepage = CP_ACP);
LPCWSTR _StringDummyConvW(LPCWSTR sSrc, CStringW &sDest, int iChars = -1);
LPCSTR _StringDummyConvA(LPCSTR sSrc, CStringA &sDest, int iChars = -1);
#ifdef UNICODE
#define StringTCharToWChar _StringDummyConvW
#define StringTCharToUTF8 StringWCharToUTF8
#define StringTCharToChar StringWCharToChar
inline LPCWSTR StringWCharToTChar(LPCWSTR sWChar, CStringW &sTChar, int iChars = -1, char chDef = '?')
{ return _StringDummyConvW(sWChar, sTChar, iChars); }
inline LPCWSTR StringUTF8ToTChar(LPCSTR sUTF8, CStringW &sTChar, int iChars = -1, char chDef = '?')
{ return StringUTF8ToWChar(sUTF8, sTChar, iChars); }
#define StringCharToTChar StringCharToWChar
#else
// ! _UNICODE
#define StringTCharToWChar StringCharToWChar
#define StringTCharToUTF8 StringCharToUTF8
#define StringTCharToChar _StringDummyConvA
#define StringWCharToTChar StringWCharToChar
#define StringUTF8ToTChar StringUTF8ToChar
#define StringCharToTChar _StringDummyConvA
#endif // _UNICODE
class CStringWCharFromUTF8 : public CStringW
{
public:
CStringWCharFromUTF8(LPCSTR sUTF8, int iChars = -1)
{ StringUTF8ToWChar(sUTF8, *this, iChars); }
};
class CStringWCharFromChar : public CStringW
{
public:
CStringWCharFromChar(LPCSTR sChar, int iChars = -1, UINT codepage = CP_ACP)
{ StringCharToWChar(sChar, *this, iChars, codepage); }
};
class CStringUTF8FromWChar : public CStringA
{
public:
CStringUTF8FromWChar(LPCWSTR sWChar, int iChars = -1)
{ StringWCharToUTF8(sWChar, *this, iChars); }
};
class CStringUTF8FromChar : public CStringA
{
public:
CStringUTF8FromChar(LPCSTR sChar, int iChars = -1, UINT codepage = CP_ACP)
{ StringCharToUTF8(sChar, *this, iChars, codepage); }
};
class CStringCharFromWChar : public CStringA
{
public:
CStringCharFromWChar(LPCWSTR sWChar, int iChars = -1, char chDef = '?', UINT codepage = CP_ACP)
{ StringWCharToChar(sWChar, *this, iChars, chDef, codepage); }
};
class CStringCharFromUTF8 : public CStringA
{
public:
CStringCharFromUTF8(LPCSTR sUTF8, int iChars = -1, char chDef = '?', UINT codepage = CP_ACP)
{ StringUTF8ToChar(sUTF8, *this, iChars, chDef, codepage); }
};
#ifdef UNICODE
#define CStringTCharFromWCharIfNeeded(s, ...) (s)
#define CStringWCharFromTCharIfNeeded(s, ...) (s)
#define CStringTCharFromCharIfNeeded(s, ...) CStringTCharFromChar((s), __VA_ARGS__)
#define CStringCharFromTCharIfNeeded(s, ...) CStringCharFromTChar((s), __VA_ARGS__)
class CStringTCharFromWChar : public CStringW
{
public:
CStringTCharFromWChar(LPCWSTR sWChar, int iChars = -1, char chDef = '?')
{ _StringDummyConvW(sWChar, *this, iChars); }
};
class CStringTCharFromUTF8 : public CStringW
{
public:
CStringTCharFromUTF8(LPCSTR sUTF8, int iChars = -1, char chDef = '?')
{ StringUTF8ToWChar(sUTF8, *this, iChars); }
};
typedef CStringWCharFromChar CStringTCharFromChar;
typedef CStringW CStringWCharFromTChar;
typedef CStringUTF8FromWChar CStringUTF8FromTChar;
typedef CStringCharFromWChar CStringCharFromTChar;
#else
// ! _UNICODE
#define CStringTCharFromWCharIfNeeded(s, ...) CStringTCharFromWChar((s), __VA_ARGS__)
#define CStringWCharFromTCharIfNeeded(s, ...) CStringWCharFromTChar((s), __VA_ARGS__)
#define CStringTCharFromCharIfNeeded(s, ...) (s)
#define CStringCharFromTCharIfNeeded(s, ...) (s)
typedef CStringCharFromWChar CStringTCharFromWChar;
typedef CStringCharFromUTF8 CStringTCharFromUTF8;
typedef CStringA CStringTCharFromChar;
typedef CStringWCharFromChar CStringWCharFromTChar;
typedef CStringUTF8FromChar CStringUTF8FromTChar;
typedef CStringA CStringCharFromTChar;
#endif // _UNICODE
typedef CStringTCharFromWChar CStringFromWChar;
typedef CStringTCharFromUTF8 CStringFromUTF8;
typedef CStringTCharFromChar CStringFromChar;
#endif // _WIN32
template <typename CHAR_T>
void CharConvEndian(CHAR_T *pChar)
{
BYTE *pCh = (BYTE *) pChar, chTemp;
int i, j;
for (i = 0, j = sizeof(CHAR_T) - 1;i < (sizeof(CHAR_T) >> 1);i , j--) {
chTemp = pCh[i];
pCh[i] = pCh[j];
pCh[j] = chTemp;
}
}
// uChars = 0 ==> treat 'sSrc' as NULL-terminal
template <typename CHAR_T>
unsigned long StringConvEndian(CHAR_T *sSrc, ULONG_PTR uChars = 0)
{
ULONG_PTR i;
for (i = 0;sSrc[i] && (uChars == 0 || i < uChars);i )
CharConvEndian(sSrc i);
return i;
}