1// Common/StringConvert.cpp
2
3#include "StdAfx.h"
4
5#include "StringConvert.h"
6
7#ifndef _WIN32
8#include <stdlib.h>
9#endif
10
11#ifdef _WIN32
12UString MultiByteToUnicodeString(const AString &srcString, UINT codePage)
13{
14  UString resultString;
15  if (!srcString.IsEmpty())
16  {
17    int numChars = MultiByteToWideChar(codePage, 0, srcString,
18        srcString.Len(), resultString.GetBuffer(srcString.Len()),
19        srcString.Len() + 1);
20    if (numChars == 0)
21      throw 282228;
22    resultString.ReleaseBuffer(numChars);
23  }
24  return resultString;
25}
26
27void MultiByteToUnicodeString2(UString &dest, const AString &srcString, UINT codePage)
28{
29  dest.Empty();
30  if (!srcString.IsEmpty())
31  {
32    wchar_t *destBuf = dest.GetBuffer(srcString.Len());
33    const char *sp = (const char *)srcString;
34    unsigned i;
35    for (i = 0;;)
36    {
37      char c = sp[i];
38      if ((Byte)c >= 0x80 || c == 0)
39        break;
40      destBuf[i++] = (wchar_t)c;
41    }
42
43    if (i != srcString.Len())
44    {
45      unsigned numChars = MultiByteToWideChar(codePage, 0, sp + i,
46          srcString.Len() - i, destBuf + i,
47          srcString.Len() + 1 - i);
48      if (numChars == 0)
49        throw 282228;
50      i += numChars;
51    }
52    dest.ReleaseBuffer(i);
53  }
54}
55
56void UnicodeStringToMultiByte2(AString &dest, const UString &s, UINT codePage, char defaultChar, bool &defaultCharWasUsed)
57{
58  dest.Empty();
59  defaultCharWasUsed = false;
60  if (!s.IsEmpty())
61  {
62    unsigned numRequiredBytes = s.Len() * 2;
63    char *destBuf = dest.GetBuffer(numRequiredBytes);
64    unsigned i;
65    const wchar_t *sp = (const wchar_t *)s;
66    for (i = 0;;)
67    {
68      wchar_t c = sp[i];
69      if (c >= 0x80 || c == 0)
70        break;
71      destBuf[i++] = (char)c;
72    }
73    defaultCharWasUsed = false;
74    if (i != s.Len())
75    {
76      BOOL defUsed;
77      unsigned numChars = WideCharToMultiByte(codePage, 0, sp + i, s.Len() - i,
78          destBuf + i, numRequiredBytes + 1 - i,
79          &defaultChar, &defUsed);
80      defaultCharWasUsed = (defUsed != FALSE);
81      if (numChars == 0)
82        throw 282229;
83      i += numChars;
84    }
85    dest.ReleaseBuffer(i);
86  }
87}
88
89void UnicodeStringToMultiByte2(AString &dest, const UString &srcString, UINT codePage)
90{
91  bool defaultCharWasUsed;
92  UnicodeStringToMultiByte2(dest, srcString, codePage, '_', defaultCharWasUsed);
93}
94
95AString UnicodeStringToMultiByte(const UString &s, UINT codePage, char defaultChar, bool &defaultCharWasUsed)
96{
97  AString dest;
98  defaultCharWasUsed = false;
99  if (!s.IsEmpty())
100  {
101    unsigned numRequiredBytes = s.Len() * 2;
102    BOOL defUsed;
103    int numChars = WideCharToMultiByte(codePage, 0, s, s.Len(),
104        dest.GetBuffer(numRequiredBytes), numRequiredBytes + 1,
105        &defaultChar, &defUsed);
106    defaultCharWasUsed = (defUsed != FALSE);
107    if (numChars == 0)
108      throw 282229;
109    dest.ReleaseBuffer(numChars);
110  }
111  return dest;
112}
113
114AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage)
115{
116  bool defaultCharWasUsed;
117  return UnicodeStringToMultiByte(srcString, codePage, '_', defaultCharWasUsed);
118}
119
120#ifndef UNDER_CE
121AString SystemStringToOemString(const CSysString &srcString)
122{
123  AString result;
124  CharToOem(srcString, result.GetBuffer(srcString.Len() * 2));
125  result.ReleaseBuffer();
126  return result;
127}
128#endif
129
130#else
131
132UString MultiByteToUnicodeString(const AString &srcString, UINT codePage)
133{
134  UString resultString;
135  for (unsigned i = 0; i < srcString.Len(); i++)
136    resultString += (wchar_t)srcString[i];
137  /*
138  if (!srcString.IsEmpty())
139  {
140    int numChars = mbstowcs(resultString.GetBuffer(srcString.Len()), srcString, srcString.Len() + 1);
141    if (numChars < 0) throw "Your environment does not support UNICODE";
142    resultString.ReleaseBuffer(numChars);
143  }
144  */
145  return resultString;
146}
147
148AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage)
149{
150  AString resultString;
151  for (unsigned i = 0; i < srcString.Len(); i++)
152    resultString += (char)srcString[i];
153  /*
154  if (!srcString.IsEmpty())
155  {
156    int numRequiredBytes = srcString.Len() * 6 + 1;
157    int numChars = wcstombs(resultString.GetBuffer(numRequiredBytes), srcString, numRequiredBytes);
158    if (numChars < 0) throw "Your environment does not support UNICODE";
159    resultString.ReleaseBuffer(numChars);
160  }
161  */
162  return resultString;
163}
164
165#endif
166