1 // Common/StdOutStream.cpp
2 
3 #include "StdAfx.h"
4 
5 #include <tchar.h>
6 
7 #include "IntToString.h"
8 #include "StdOutStream.h"
9 #include "StringConvert.h"
10 #include "UTFConvert.h"
11 
12 #define kFileOpenMode "wt"
13 
14 extern int g_CodePage;
15 
16 CStdOutStream g_StdOut(stdout);
17 CStdOutStream g_StdErr(stderr);
18 
Open(const char * fileName)19 bool CStdOutStream::Open(const char *fileName) throw()
20 {
21   Close();
22   _stream = fopen(fileName, kFileOpenMode);
23   _streamIsOpen = (_stream != 0);
24   return _streamIsOpen;
25 }
26 
Close()27 bool CStdOutStream::Close() throw()
28 {
29   if (!_streamIsOpen)
30     return true;
31   if (fclose(_stream) != 0)
32     return false;
33   _stream = 0;
34   _streamIsOpen = false;
35   return true;
36 }
37 
Flush()38 bool CStdOutStream::Flush() throw()
39 {
40   return (fflush(_stream) == 0);
41 }
42 
endl(CStdOutStream & outStream)43 CStdOutStream & endl(CStdOutStream & outStream) throw()
44 {
45   return outStream << '\n';
46 }
47 
operator <<(const wchar_t * s)48 CStdOutStream & CStdOutStream::operator<<(const wchar_t *s)
49 {
50   int codePage = g_CodePage;
51   if (codePage == -1)
52     codePage = CP_OEMCP;
53   AString dest;
54   if (codePage == CP_UTF8)
55     ConvertUnicodeToUTF8(s, dest);
56   else
57     UnicodeStringToMultiByte2(dest, s, (UINT)codePage);
58   return operator<<((const char *)dest);
59 }
60 
StdOut_Convert_UString_to_AString(const UString & s,AString & temp)61 void StdOut_Convert_UString_to_AString(const UString &s, AString &temp)
62 {
63   int codePage = g_CodePage;
64   if (codePage == -1)
65     codePage = CP_OEMCP;
66   if (codePage == CP_UTF8)
67     ConvertUnicodeToUTF8(s, temp);
68   else
69     UnicodeStringToMultiByte2(temp, s, (UINT)codePage);
70 }
71 
PrintUString(const UString & s,AString & temp)72 void CStdOutStream::PrintUString(const UString &s, AString &temp)
73 {
74   StdOut_Convert_UString_to_AString(s, temp);
75   *this << (const char *)temp;
76 }
77 
78 
79 static const wchar_t kReplaceChar = '_';
80 
Normalize_UString__LF_Allowed(UString & s)81 void CStdOutStream::Normalize_UString__LF_Allowed(UString &s)
82 {
83   unsigned len = s.Len();
84   wchar_t *d = s.GetBuf();
85 
86   if (IsTerminalMode)
87     for (unsigned i = 0; i < len; i++)
88     {
89       wchar_t c = d[i];
90       if (c <= 13 && c >= 7 && c != '\n')
91         d[i] = kReplaceChar;
92     }
93 }
94 
Normalize_UString(UString & s)95 void CStdOutStream::Normalize_UString(UString &s)
96 {
97   unsigned len = s.Len();
98   wchar_t *d = s.GetBuf();
99 
100   if (IsTerminalMode)
101     for (unsigned i = 0; i < len; i++)
102     {
103       wchar_t c = d[i];
104       if (c <= 13 && c >= 7)
105         d[i] = kReplaceChar;
106     }
107   else
108     for (unsigned i = 0; i < len; i++)
109     {
110       wchar_t c = d[i];
111       if (c == '\n')
112         d[i] = kReplaceChar;
113     }
114 }
115 
NormalizePrint_UString(const UString & s,UString & tempU,AString & tempA)116 void CStdOutStream::NormalizePrint_UString(const UString &s, UString &tempU, AString &tempA)
117 {
118   tempU = s;
119   Normalize_UString(tempU);
120   PrintUString(tempU, tempA);
121 }
122 
NormalizePrint_UString(const UString & s)123 void CStdOutStream::NormalizePrint_UString(const UString &s)
124 {
125   NormalizePrint_wstr(s);
126 }
127 
NormalizePrint_wstr(const wchar_t * s)128 void CStdOutStream::NormalizePrint_wstr(const wchar_t *s)
129 {
130   UString tempU = s;
131   Normalize_UString(tempU);
132   AString tempA;
133   PrintUString(tempU, tempA);
134 }
135 
136 
operator <<(Int32 number)137 CStdOutStream & CStdOutStream::operator<<(Int32 number) throw()
138 {
139   char s[32];
140   ConvertInt64ToString(number, s);
141   return operator<<(s);
142 }
143 
operator <<(Int64 number)144 CStdOutStream & CStdOutStream::operator<<(Int64 number) throw()
145 {
146   char s[32];
147   ConvertInt64ToString(number, s);
148   return operator<<(s);
149 }
150 
operator <<(UInt32 number)151 CStdOutStream & CStdOutStream::operator<<(UInt32 number) throw()
152 {
153   char s[16];
154   ConvertUInt32ToString(number, s);
155   return operator<<(s);
156 }
157 
operator <<(UInt64 number)158 CStdOutStream & CStdOutStream::operator<<(UInt64 number) throw()
159 {
160   char s[32];
161   ConvertUInt64ToString(number, s);
162   return operator<<(s);
163 }
164