#include "StdAfx.h"
#include <tchar.h>
#include "IntToString.h"
#include "StdOutStream.h"
#include "StringConvert.h"
#include "UTFConvert.h"
#ifdef _MSC_VER
#pragma warning(disable : 4996 )
#endif
static
const
char
kNewLineChar =
'\n'
;
static
const
char
*kFileOpenMode =
"wt"
;
extern
int
g_CodePage;
CStdOutStream g_StdOut(stdout);
CStdOutStream g_StdErr(stderr);
bool
CStdOutStream::Open(
const
char
*fileName)
{
Close();
_stream =
fopen
(fileName, kFileOpenMode);
_streamIsOpen = (_stream != 0);
return
_streamIsOpen;
}
bool
CStdOutStream::Close()
{
if
(!_streamIsOpen)
return
true
;
if
(
fclose
(_stream) != 0)
return
false
;
_stream = 0;
_streamIsOpen =
false
;
return
true
;
}
bool
CStdOutStream::Flush()
{
return
(
fflush
(_stream) == 0);
}
CStdOutStream::~CStdOutStream ()
{
Close();
}
CStdOutStream & CStdOutStream::operator<<(CStdOutStream & (*aFunction)(CStdOutStream &))
{
(*aFunction)(*
this
);
return
*
this
;
}
CStdOutStream & endl(CStdOutStream & outStream)
{
return
outStream << kNewLineChar;
}
CStdOutStream & CStdOutStream::operator<<(
const
char
*s)
{
fputs
(s, _stream);
return
*
this
;
}
CStdOutStream & CStdOutStream::operator<<(
const
wchar_t
*s)
{
int
codePage = g_CodePage;
if
(codePage == -1)
codePage = CP_OEMCP;
AString dest;
if
(codePage == CP_UTF8)
ConvertUnicodeToUTF8(s, dest);
else
dest = UnicodeStringToMultiByte(s, (
UINT
)codePage);
*
this
<< (
const
char
*)dest;
return
*
this
;
}
CStdOutStream & CStdOutStream::operator<<(
char
c)
{
fputc
(c, _stream);
return
*
this
;
}
CStdOutStream & CStdOutStream::operator<<(
int
number)
{
char
textString[32];
ConvertInt64ToString(number, textString);
return
operator<<(textString);
}
CStdOutStream & CStdOutStream::operator<<(UInt64 number)
{
char
textString[32];
ConvertUInt64ToString(number, textString);
return
operator<<(textString);
}