summaryrefslogtreecommitdiff
path: root/ace/ace_wchar.h
blob: 2f38402e22a72b8f7e3f621a2eb3a720c50353fd (plain)
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
/* -*- C++ -*- */
// $Id$

// ============================================================================
//
// = LIBRARY
//    ace
//
// = FILENAME
//    unicode.h
//
// = AUTHOR
//    Darrell Brunsch
//
// ============================================================================

#ifndef ACE_WCHAR_H
#define ACE_WCHAR_H

#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */

#if defined (ACE_HAS_WCHAR) && defined (ACE_WIN32)
# include /**/ <tchar.h>
#endif /* ACE_HAS_WCHAR && ACE_WIN32 */


#if defined (ACE_HAS_WCHAR)
# if defined (ACE_HAS_STANDARD_CPP_LIBRARY) && \
    (ACE_HAS_STANDARD_CPP_LIBRARY != 0)
#   include /**/ <cwchar>
# elif !defined (__BORLANDC__) && !defined (ACE_HAS_WINCE)
#   include /**/ <wchar.h>
# endif /* ACE_HAS_STANDARD_CPP_LIBRARY */
#elif defined (ACE_HAS_XPG4_MULTIBYTE_CHAR)
# include /**/ <wchar.h>
#endif


// Define the unicode/wchar related macros correctly

#if defined (ACE_USES_WCHAR)
typedef wchar_t ACE_TCHAR;
# define ACE_TEXT(STRING) L##STRING
# define ACE_TEXT_ALWAYS_CHAR(STRING) ACE_Wide_To_Ascii (STRING).char_rep ()
# define ACE_TEXT_CHAR_TO_TCHAR(STRING) ACE_Ascii_To_Wide (STRING).wchar_rep ()
#else /* ACE_USES_WCHAR */
typedef char ACE_TCHAR;
# define ACE_TEXT(STRING) STRING
# define ACE_TEXT_ALWAYS_CHAR(STRING) STRING
# define ACE_TEXT_CHAR_TO_TCHAR(STRING) STRING
#endif /* ACE_USES_WCHAR */

// Because we use the CharToOem and OemToChar functions, we need user32.lib
# if defined (_MSC_VER)
#  pragma comment(lib, "user32.lib")
# endif /* _MSC_VER */

#if defined ACE_HAS_WCHAR
class ACE_Wide_To_Ascii
{
  // = TITLE
  //     A lightweight wchar* to char* string conversion class.
  //
  // = DESCRIPTION
  //     The purpose of this class is to perform conversion from
  //     wchar* to char* strings.  It is not intended for general
  //     purpose use.
public:
  ACE_Wide_To_Ascii (const wchar_t *s) : s_ (ACE_Wide_To_Ascii::convert (s)) {}
  // Ctor must take a wchar string.

  ~ACE_Wide_To_Ascii (void) { delete [] this->s_; }
  // Dtor will free up the memory.

  char *char_rep (void) { return this->s_; }
  // Return the internal char* representation.

  static char *convert (const wchar_t *wstr)
  // Converts an wchar_t string to ascii and returns a new string.
  {
    size_t len = wcslen (wstr);
    char *str = new char[len + 1];
# if defined (ACE_WIN32)
    ::CharToOemW (wstr, str);
# else /* ACE_WIN32 */
    for (size_t i = 0; i < len; i++)
      {
        wchar_t *t = ACE_const_cast (wchar_t *, wstr);
        str[i] = ACE_static_cast (char, *(t + i));
      }
# endif /* ACE_WIN32 */
    return str;
  }

private:
  char *s_;
  // Internal pointer to the converted string.

  ACE_Wide_To_Ascii (void);
  ACE_Wide_To_Ascii (ACE_Wide_To_Ascii &);
  ACE_Wide_To_Ascii& operator= (ACE_Wide_To_Ascii &);
  // Disallow these operation.
};

class ACE_Ascii_To_Wide
{
  // = TITLE
  //     A lightweight char* to wchar* string conversion class.
  //
  // = DESCRIPTION
  //     The purpose of this class is to perform conversion from
  //     char* to wchar* strings.  It is not intended for general
  //     purpose use.
public:
  ACE_Ascii_To_Wide (const char *s) : s_ (ACE_Ascii_To_Wide::convert (s)) {}
  // Ctor must take a wchar string.

  ~ACE_Ascii_To_Wide (void) { delete [] this->s_; }
  // Dtor will free up the memory.

  wchar_t *wchar_rep (void) { return this->s_; }
  // Return the internal wchar* representation.

  static wchar_t *convert (const char *str)
  // Converts an char string to unicode/wide and returns a new string.
  {
    size_t len = strlen (str);
    wchar_t *wstr = new wchar_t[len + 1];
# if defined (ACE_WIN32)
    ::OemToCharW (str, wstr);
# else /* ACE_WIN32 */
    for (size_t i = 0; i < len; i++)
      {
        char *t = ACE_const_cast (char *, str);
        wstr[i] = ACE_static_cast (wchar_t, *(t + i));
      }
# endif /* ACE_WIN32 */
    return wstr;
  }
private:
  wchar_t *s_;
  // Internal pointer to the converted string.

  ACE_Ascii_To_Wide (void);
  ACE_Ascii_To_Wide (ACE_Ascii_To_Wide &);
  ACE_Ascii_To_Wide operator= (ACE_Ascii_To_Wide &);
  // Disallow these operation.
};

#endif /* ACE_HAS_WCHAR */

#if defined (ACE_WIN32)
#if defined (ACE_USES_WCHAR)
#define ACE_TEXT_STARTUPINFO              STARTUPINFOW
#define ACE_TEXT_WIN32_FIND_DATA          WIN32_FIND_DATAW

#define ACE_TEXT_CreateEvent              ::CreateEventW
#define ACE_TEXT_CreateFile               ::CreateFileW
#define ACE_TEXT_CreateFileMapping        ::CreateFileMappingW
#define ACE_TEXT_CreateMutex              ::CreateMutexW
#define ACE_TEXT_CreateProcess            ::CreateProcessW
#define ACE_TEXT_CreateSemaphore          ::CreateSemaphoreW
#define ACE_TEXT_CreateService            ::CreateServiceW
#define ACE_TEXT_ExpandEnvironmentStrings ::ExpandEnvironmentStringsW
#define ACE_TEXT_FindFirstFile            ::FindFirstFileW
#define ACE_TEXT_FindNextFile             ::FindNextFileW
#define ACE_TEXT_FormatMessage            ::FormatMessageW
#define ACE_TEXT_FreeEnvironmentStrings   ::FreeEnvironmentStringsW
#define ACE_TEXT_GetComputerName          ::GetComputerNameW
#define ACE_TEXT_GetEnvironmentStrings    ::GetEnvironmentStringsW
#define ACE_TEXT_GetModuleFileName        ::GetModuleFileNameW
#define ACE_TEXT_GetTempPath              ::GetTempPathW
#define ACE_TEXT_GetUserName              ::GetUserNameW
#define ACE_TEXT_LoadLibrary              ::LoadLibraryW
#define ACE_TEXT_OpenSCManager            ::OpenSCManagerW
#define ACE_TEXT_OpenService              ::OpenServiceW
#define ACE_TEXT_RegConnectRegistry       ::RegConnectRegistryW
#define ACE_TEXT_RegCreateKeyEx           ::RegCreateKeyExW
#define ACE_TEXT_RegDeleteKey             ::RegDeleteKeyW
#define ACE_TEXT_RegDeleteValue           ::RegDeleteValueW
#define ACE_TEXT_RegEnumKeyEx             ::RegEnumKeyExW
#define ACE_TEXT_RegEnumValue             ::RegEnumValueW
#define ACE_TEXT_RegOpenKey               ::RegOpenKeyW
#define ACE_TEXT_RegOpenKeyEx             ::RegOpenKeyExW
#define ACE_TEXT_RegQueryValueEx          ::RegQueryValueExW
#define ACE_TEXT_RegSetValueEx            ::RegSetValueExW
#define ACE_TEXT_StartService             ::StartServiceW

#else /* ACE_USES_WCHAR */
#define ACE_TEXT_STARTUPINFO              STARTUPINFOA
#define ACE_TEXT_WIN32_FIND_DATA          WIN32_FIND_DATAA

#define ACE_TEXT_CreateEvent              ::CreateEventA
#define ACE_TEXT_CreateFile               ::CreateFileA
#define ACE_TEXT_CreateFileMapping        ::CreateFileMappingA
#define ACE_TEXT_CreateMutex              ::CreateMutexA
#define ACE_TEXT_CreateProcess            ::CreateProcessA
#define ACE_TEXT_CreateSemaphore          ::CreateSemaphoreA
#define ACE_TEXT_CreateService            ::CreateServiceA
#define ACE_TEXT_ExpandEnvironmentStrings ::ExpandEnvironmentStringsA
#define ACE_TEXT_FindFirstFile            ::FindFirstFileA
#define ACE_TEXT_FindNextFile             ::FindNextFileA
#define ACE_TEXT_FormatMessage            ::FormatMessageA
#define ACE_TEXT_FreeEnvironmentStrings   ::FreeEnvironmentStringsA
#define ACE_TEXT_GetComputerName          ::GetComputerNameA
#define ACE_TEXT_GetEnvironmentStrings    ::GetEnvironmentStringsA
#define ACE_TEXT_GetModuleFileName        ::GetModuleFileNameA
#define ACE_TEXT_GetTempPath              ::GetTempPathA
#define ACE_TEXT_GetUserName              ::GetUserNameA
#define ACE_TEXT_LoadLibrary              ::LoadLibraryA
#define ACE_TEXT_OpenSCManager            ::OpenSCManagerA
#define ACE_TEXT_OpenService              ::OpenServiceA
#define ACE_TEXT_RegConnectRegistry       ::RegConnectRegistryA
#define ACE_TEXT_RegCreateKeyEx           ::RegCreateKeyExA
#define ACE_TEXT_RegDeleteKey             ::RegDeleteKeyA
#define ACE_TEXT_RegDeleteValue           ::RegDeleteValueA
#define ACE_TEXT_RegEnumKeyEx             ::RegEnumKeyExA
#define ACE_TEXT_RegEnumValue             ::RegEnumValueA
#define ACE_TEXT_RegOpenKey               ::RegOpenKeyA
#define ACE_TEXT_RegOpenKeyEx             ::RegOpenKeyExA
#define ACE_TEXT_RegQueryValueEx          ::RegQueryValueExA
#define ACE_TEXT_RegSetValueEx            ::RegSetValueExA
#define ACE_TEXT_StartService             ::StartServiceA
#endif /* ACE_USES_WCHAR */
#endif /* ACE_WIN32 */

#endif /* ACE_WCHAR_H */