xref: /aosp_15_r20/external/lzma/CPP/Common/StdOutStream.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Common/StdOutStream.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
6*f6dc9357SAndroid Build Coastguard Worker #include <tchar.h>
7*f6dc9357SAndroid Build Coastguard Worker #endif
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "IntToString.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "StdOutStream.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "StringConvert.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "UTFConvert.h"
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker CStdOutStream g_StdOut(stdout);
15*f6dc9357SAndroid Build Coastguard Worker CStdOutStream g_StdErr(stderr);
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker /*
18*f6dc9357SAndroid Build Coastguard Worker // #define kFileOpenMode "wt"
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker bool CStdOutStream::Open(const char *fileName) throw()
21*f6dc9357SAndroid Build Coastguard Worker {
22*f6dc9357SAndroid Build Coastguard Worker   Close();
23*f6dc9357SAndroid Build Coastguard Worker   _stream = fopen(fileName, kFileOpenMode);
24*f6dc9357SAndroid Build Coastguard Worker   _streamIsOpen = (_stream != 0);
25*f6dc9357SAndroid Build Coastguard Worker   return _streamIsOpen;
26*f6dc9357SAndroid Build Coastguard Worker }
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker bool CStdOutStream::Close() throw()
29*f6dc9357SAndroid Build Coastguard Worker {
30*f6dc9357SAndroid Build Coastguard Worker   if (!_streamIsOpen)
31*f6dc9357SAndroid Build Coastguard Worker     return true;
32*f6dc9357SAndroid Build Coastguard Worker   if (fclose(_stream) != 0)
33*f6dc9357SAndroid Build Coastguard Worker     return false;
34*f6dc9357SAndroid Build Coastguard Worker   _stream = 0;
35*f6dc9357SAndroid Build Coastguard Worker   _streamIsOpen = false;
36*f6dc9357SAndroid Build Coastguard Worker   return true;
37*f6dc9357SAndroid Build Coastguard Worker }
38*f6dc9357SAndroid Build Coastguard Worker */
39*f6dc9357SAndroid Build Coastguard Worker 
Flush()40*f6dc9357SAndroid Build Coastguard Worker bool CStdOutStream::Flush() throw()
41*f6dc9357SAndroid Build Coastguard Worker {
42*f6dc9357SAndroid Build Coastguard Worker   return (fflush(_stream) == 0);
43*f6dc9357SAndroid Build Coastguard Worker }
44*f6dc9357SAndroid Build Coastguard Worker 
endl(CStdOutStream & outStream)45*f6dc9357SAndroid Build Coastguard Worker CStdOutStream & endl(CStdOutStream & outStream) throw()
46*f6dc9357SAndroid Build Coastguard Worker {
47*f6dc9357SAndroid Build Coastguard Worker   return outStream << '\n';
48*f6dc9357SAndroid Build Coastguard Worker }
49*f6dc9357SAndroid Build Coastguard Worker 
operator <<(const wchar_t * s)50*f6dc9357SAndroid Build Coastguard Worker CStdOutStream & CStdOutStream::operator<<(const wchar_t *s)
51*f6dc9357SAndroid Build Coastguard Worker {
52*f6dc9357SAndroid Build Coastguard Worker   AString temp;
53*f6dc9357SAndroid Build Coastguard Worker   UString s2(s);
54*f6dc9357SAndroid Build Coastguard Worker   PrintUString(s2, temp);
55*f6dc9357SAndroid Build Coastguard Worker   return *this;
56*f6dc9357SAndroid Build Coastguard Worker }
57*f6dc9357SAndroid Build Coastguard Worker 
PrintUString(const UString & s,AString & temp)58*f6dc9357SAndroid Build Coastguard Worker void CStdOutStream::PrintUString(const UString &s, AString &temp)
59*f6dc9357SAndroid Build Coastguard Worker {
60*f6dc9357SAndroid Build Coastguard Worker   Convert_UString_to_AString(s, temp);
61*f6dc9357SAndroid Build Coastguard Worker   *this << (const char *)temp;
62*f6dc9357SAndroid Build Coastguard Worker }
63*f6dc9357SAndroid Build Coastguard Worker 
Convert_UString_to_AString(const UString & src,AString & dest)64*f6dc9357SAndroid Build Coastguard Worker void CStdOutStream::Convert_UString_to_AString(const UString &src, AString &dest)
65*f6dc9357SAndroid Build Coastguard Worker {
66*f6dc9357SAndroid Build Coastguard Worker   int codePage = CodePage;
67*f6dc9357SAndroid Build Coastguard Worker   if (codePage == -1)
68*f6dc9357SAndroid Build Coastguard Worker     codePage = CP_OEMCP;
69*f6dc9357SAndroid Build Coastguard Worker   if ((unsigned)codePage == CP_UTF8)
70*f6dc9357SAndroid Build Coastguard Worker     ConvertUnicodeToUTF8(src, dest);
71*f6dc9357SAndroid Build Coastguard Worker   else
72*f6dc9357SAndroid Build Coastguard Worker     UnicodeStringToMultiByte2(dest, src, (UINT)(unsigned)codePage);
73*f6dc9357SAndroid Build Coastguard Worker }
74*f6dc9357SAndroid Build Coastguard Worker 
75*f6dc9357SAndroid Build Coastguard Worker 
76*f6dc9357SAndroid Build Coastguard Worker static const wchar_t kReplaceChar = '_';
77*f6dc9357SAndroid Build Coastguard Worker 
78*f6dc9357SAndroid Build Coastguard Worker /*
79*f6dc9357SAndroid Build Coastguard Worker void CStdOutStream::Normalize_UString_LF_Allowed(UString &s)
80*f6dc9357SAndroid Build Coastguard Worker {
81*f6dc9357SAndroid Build Coastguard Worker   if (!IsTerminalMode)
82*f6dc9357SAndroid Build Coastguard Worker     return;
83*f6dc9357SAndroid Build Coastguard Worker 
84*f6dc9357SAndroid Build Coastguard Worker   const unsigned len = s.Len();
85*f6dc9357SAndroid Build Coastguard Worker   wchar_t *d = s.GetBuf();
86*f6dc9357SAndroid Build Coastguard Worker 
87*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < len; i++)
88*f6dc9357SAndroid Build Coastguard Worker     {
89*f6dc9357SAndroid Build Coastguard Worker       const wchar_t c = d[i];
90*f6dc9357SAndroid Build Coastguard Worker       if (c == 0x1b || (c <= 13 && c >= 7 && c != '\n'))
91*f6dc9357SAndroid Build Coastguard Worker         d[i] = kReplaceChar;
92*f6dc9357SAndroid Build Coastguard Worker     }
93*f6dc9357SAndroid Build Coastguard Worker }
94*f6dc9357SAndroid Build Coastguard Worker */
95*f6dc9357SAndroid Build Coastguard Worker 
Normalize_UString(UString & s)96*f6dc9357SAndroid Build Coastguard Worker void CStdOutStream::Normalize_UString(UString &s)
97*f6dc9357SAndroid Build Coastguard Worker {
98*f6dc9357SAndroid Build Coastguard Worker   const unsigned len = s.Len();
99*f6dc9357SAndroid Build Coastguard Worker   wchar_t *d = s.GetBuf();
100*f6dc9357SAndroid Build Coastguard Worker 
101*f6dc9357SAndroid Build Coastguard Worker   if (IsTerminalMode)
102*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < len; i++)
103*f6dc9357SAndroid Build Coastguard Worker     {
104*f6dc9357SAndroid Build Coastguard Worker       const wchar_t c = d[i];
105*f6dc9357SAndroid Build Coastguard Worker       if ((c <= 13 && c >= 7) || c == 0x1b)
106*f6dc9357SAndroid Build Coastguard Worker         d[i] = kReplaceChar;
107*f6dc9357SAndroid Build Coastguard Worker     }
108*f6dc9357SAndroid Build Coastguard Worker   else
109*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < len; i++)
110*f6dc9357SAndroid Build Coastguard Worker     {
111*f6dc9357SAndroid Build Coastguard Worker       const wchar_t c = d[i];
112*f6dc9357SAndroid Build Coastguard Worker       if (c == '\n')
113*f6dc9357SAndroid Build Coastguard Worker         d[i] = kReplaceChar;
114*f6dc9357SAndroid Build Coastguard Worker     }
115*f6dc9357SAndroid Build Coastguard Worker }
116*f6dc9357SAndroid Build Coastguard Worker 
Normalize_UString_Path(UString & s)117*f6dc9357SAndroid Build Coastguard Worker void CStdOutStream::Normalize_UString_Path(UString &s)
118*f6dc9357SAndroid Build Coastguard Worker {
119*f6dc9357SAndroid Build Coastguard Worker   if (ListPathSeparatorSlash.Def)
120*f6dc9357SAndroid Build Coastguard Worker   {
121*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
122*f6dc9357SAndroid Build Coastguard Worker     if (ListPathSeparatorSlash.Val)
123*f6dc9357SAndroid Build Coastguard Worker       s.Replace(L'\\', L'/');
124*f6dc9357SAndroid Build Coastguard Worker #else
125*f6dc9357SAndroid Build Coastguard Worker     if (!ListPathSeparatorSlash.Val)
126*f6dc9357SAndroid Build Coastguard Worker       s.Replace(L'/', L'\\');
127*f6dc9357SAndroid Build Coastguard Worker #endif
128*f6dc9357SAndroid Build Coastguard Worker   }
129*f6dc9357SAndroid Build Coastguard Worker   Normalize_UString(s);
130*f6dc9357SAndroid Build Coastguard Worker }
131*f6dc9357SAndroid Build Coastguard Worker 
132*f6dc9357SAndroid Build Coastguard Worker 
133*f6dc9357SAndroid Build Coastguard Worker /*
134*f6dc9357SAndroid Build Coastguard Worker void CStdOutStream::Normalize_UString(UString &src)
135*f6dc9357SAndroid Build Coastguard Worker {
136*f6dc9357SAndroid Build Coastguard Worker   const wchar_t *s = src.Ptr();
137*f6dc9357SAndroid Build Coastguard Worker   const unsigned len = src.Len();
138*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
139*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < len; i++)
140*f6dc9357SAndroid Build Coastguard Worker   {
141*f6dc9357SAndroid Build Coastguard Worker     const wchar_t c = s[i];
142*f6dc9357SAndroid Build Coastguard Worker #if 0 && !defined(_WIN32)
143*f6dc9357SAndroid Build Coastguard Worker     if (c == '\\') // IsTerminalMode &&
144*f6dc9357SAndroid Build Coastguard Worker       break;
145*f6dc9357SAndroid Build Coastguard Worker #endif
146*f6dc9357SAndroid Build Coastguard Worker     if ((unsigned)c < 0x20)
147*f6dc9357SAndroid Build Coastguard Worker       break;
148*f6dc9357SAndroid Build Coastguard Worker   }
149*f6dc9357SAndroid Build Coastguard Worker   if (i == len)
150*f6dc9357SAndroid Build Coastguard Worker     return;
151*f6dc9357SAndroid Build Coastguard Worker 
152*f6dc9357SAndroid Build Coastguard Worker   UString temp;
153*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < len; i++)
154*f6dc9357SAndroid Build Coastguard Worker   {
155*f6dc9357SAndroid Build Coastguard Worker     wchar_t c = s[i];
156*f6dc9357SAndroid Build Coastguard Worker #if 0 && !defined(_WIN32)
157*f6dc9357SAndroid Build Coastguard Worker     if (c == '\\')
158*f6dc9357SAndroid Build Coastguard Worker       temp += (wchar_t)L'\\';
159*f6dc9357SAndroid Build Coastguard Worker     else
160*f6dc9357SAndroid Build Coastguard Worker #endif
161*f6dc9357SAndroid Build Coastguard Worker     if ((unsigned)c < 0x20)
162*f6dc9357SAndroid Build Coastguard Worker     {
163*f6dc9357SAndroid Build Coastguard Worker       if (c == '\n'
164*f6dc9357SAndroid Build Coastguard Worker         || (IsTerminalMode && (c == 0x1b || (c <= 13 && c >= 7))))
165*f6dc9357SAndroid Build Coastguard Worker       {
166*f6dc9357SAndroid Build Coastguard Worker #if 1 || defined(_WIN32)
167*f6dc9357SAndroid Build Coastguard Worker         c = (wchar_t)kReplaceChar;
168*f6dc9357SAndroid Build Coastguard Worker #else
169*f6dc9357SAndroid Build Coastguard Worker         temp += (wchar_t)L'\\';
170*f6dc9357SAndroid Build Coastguard Worker              if (c == '\n') c = L'n';
171*f6dc9357SAndroid Build Coastguard Worker         else if (c == '\r') c = L'r';
172*f6dc9357SAndroid Build Coastguard Worker         else if (c == '\a') c = L'a';
173*f6dc9357SAndroid Build Coastguard Worker         else if (c == '\b') c = L'b';
174*f6dc9357SAndroid Build Coastguard Worker         else if (c == '\t') c = L't';
175*f6dc9357SAndroid Build Coastguard Worker         else if (c == '\v') c = L'v';
176*f6dc9357SAndroid Build Coastguard Worker         else if (c == '\f') c = L'f';
177*f6dc9357SAndroid Build Coastguard Worker         else
178*f6dc9357SAndroid Build Coastguard Worker         {
179*f6dc9357SAndroid Build Coastguard Worker           temp += (wchar_t)(L'0' + (unsigned)c / 64);
180*f6dc9357SAndroid Build Coastguard Worker           temp += (wchar_t)(L'0' + (unsigned)c / 8 % 8);
181*f6dc9357SAndroid Build Coastguard Worker           c     = (wchar_t)(L'0' + (unsigned)c % 8);
182*f6dc9357SAndroid Build Coastguard Worker         }
183*f6dc9357SAndroid Build Coastguard Worker #endif
184*f6dc9357SAndroid Build Coastguard Worker       }
185*f6dc9357SAndroid Build Coastguard Worker     }
186*f6dc9357SAndroid Build Coastguard Worker     temp += c;
187*f6dc9357SAndroid Build Coastguard Worker   }
188*f6dc9357SAndroid Build Coastguard Worker   src = temp;
189*f6dc9357SAndroid Build Coastguard Worker }
190*f6dc9357SAndroid Build Coastguard Worker */
191*f6dc9357SAndroid Build Coastguard Worker 
NormalizePrint_UString_Path(const UString & s,UString & tempU,AString & tempA)192*f6dc9357SAndroid Build Coastguard Worker void CStdOutStream::NormalizePrint_UString_Path(const UString &s, UString &tempU, AString &tempA)
193*f6dc9357SAndroid Build Coastguard Worker {
194*f6dc9357SAndroid Build Coastguard Worker   tempU = s;
195*f6dc9357SAndroid Build Coastguard Worker   Normalize_UString_Path(tempU);
196*f6dc9357SAndroid Build Coastguard Worker   PrintUString(tempU, tempA);
197*f6dc9357SAndroid Build Coastguard Worker }
198*f6dc9357SAndroid Build Coastguard Worker 
NormalizePrint_UString_Path(const UString & s)199*f6dc9357SAndroid Build Coastguard Worker void CStdOutStream::NormalizePrint_UString_Path(const UString &s)
200*f6dc9357SAndroid Build Coastguard Worker {
201*f6dc9357SAndroid Build Coastguard Worker   UString tempU;
202*f6dc9357SAndroid Build Coastguard Worker   AString tempA;
203*f6dc9357SAndroid Build Coastguard Worker   NormalizePrint_UString_Path(s, tempU, tempA);
204*f6dc9357SAndroid Build Coastguard Worker }
205*f6dc9357SAndroid Build Coastguard Worker 
NormalizePrint_wstr_Path(const wchar_t * s)206*f6dc9357SAndroid Build Coastguard Worker void CStdOutStream::NormalizePrint_wstr_Path(const wchar_t *s)
207*f6dc9357SAndroid Build Coastguard Worker {
208*f6dc9357SAndroid Build Coastguard Worker   UString tempU = s;
209*f6dc9357SAndroid Build Coastguard Worker   Normalize_UString_Path(tempU);
210*f6dc9357SAndroid Build Coastguard Worker   AString tempA;
211*f6dc9357SAndroid Build Coastguard Worker   PrintUString(tempU, tempA);
212*f6dc9357SAndroid Build Coastguard Worker }
213*f6dc9357SAndroid Build Coastguard Worker 
NormalizePrint_UString(const UString & s)214*f6dc9357SAndroid Build Coastguard Worker void CStdOutStream::NormalizePrint_UString(const UString &s)
215*f6dc9357SAndroid Build Coastguard Worker {
216*f6dc9357SAndroid Build Coastguard Worker   UString tempU = s;
217*f6dc9357SAndroid Build Coastguard Worker   Normalize_UString(tempU);
218*f6dc9357SAndroid Build Coastguard Worker   AString tempA;
219*f6dc9357SAndroid Build Coastguard Worker   PrintUString(tempU, tempA);
220*f6dc9357SAndroid Build Coastguard Worker }
221*f6dc9357SAndroid Build Coastguard Worker 
operator <<(Int32 number)222*f6dc9357SAndroid Build Coastguard Worker CStdOutStream & CStdOutStream::operator<<(Int32 number) throw()
223*f6dc9357SAndroid Build Coastguard Worker {
224*f6dc9357SAndroid Build Coastguard Worker   char s[32];
225*f6dc9357SAndroid Build Coastguard Worker   ConvertInt64ToString(number, s);
226*f6dc9357SAndroid Build Coastguard Worker   return operator<<(s);
227*f6dc9357SAndroid Build Coastguard Worker }
228*f6dc9357SAndroid Build Coastguard Worker 
operator <<(Int64 number)229*f6dc9357SAndroid Build Coastguard Worker CStdOutStream & CStdOutStream::operator<<(Int64 number) throw()
230*f6dc9357SAndroid Build Coastguard Worker {
231*f6dc9357SAndroid Build Coastguard Worker   char s[32];
232*f6dc9357SAndroid Build Coastguard Worker   ConvertInt64ToString(number, s);
233*f6dc9357SAndroid Build Coastguard Worker   return operator<<(s);
234*f6dc9357SAndroid Build Coastguard Worker }
235*f6dc9357SAndroid Build Coastguard Worker 
operator <<(UInt32 number)236*f6dc9357SAndroid Build Coastguard Worker CStdOutStream & CStdOutStream::operator<<(UInt32 number) throw()
237*f6dc9357SAndroid Build Coastguard Worker {
238*f6dc9357SAndroid Build Coastguard Worker   char s[16];
239*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt32ToString(number, s);
240*f6dc9357SAndroid Build Coastguard Worker   return operator<<(s);
241*f6dc9357SAndroid Build Coastguard Worker }
242*f6dc9357SAndroid Build Coastguard Worker 
operator <<(UInt64 number)243*f6dc9357SAndroid Build Coastguard Worker CStdOutStream & CStdOutStream::operator<<(UInt64 number) throw()
244*f6dc9357SAndroid Build Coastguard Worker {
245*f6dc9357SAndroid Build Coastguard Worker   char s[32];
246*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt64ToString(number, s);
247*f6dc9357SAndroid Build Coastguard Worker   return operator<<(s);
248*f6dc9357SAndroid Build Coastguard Worker }
249