mirror of
https://github.com/boostorg/quickbook.git
synced 2026-01-30 20:12:37 +00:00
215 lines
5.2 KiB
C++
215 lines
5.2 KiB
C++
/*=============================================================================
|
|
Copyright (c) 2009 Daniel James
|
|
|
|
Use, modification and distribution is subject to the Boost Software
|
|
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|
http://www.boost.org/LICENSE_1_0.txt)
|
|
=============================================================================*/
|
|
|
|
#include "stream.hpp"
|
|
#include "files.hpp"
|
|
#include "path.hpp"
|
|
|
|
#if QUICKBOOK_WIDE_PATHS || QUICKBOOK_WIDE_STREAMS
|
|
#include <fcntl.h>
|
|
#include <io.h>
|
|
#endif
|
|
|
|
namespace quickbook
|
|
{
|
|
namespace detail
|
|
{
|
|
namespace
|
|
{
|
|
bool ms_errors = false;
|
|
}
|
|
|
|
void set_ms_errors(bool x) { ms_errors = x; }
|
|
|
|
#if QUICKBOOK_WIDE_STREAMS
|
|
|
|
void initialise_output()
|
|
{
|
|
if (_isatty(_fileno(stdout))) _setmode(_fileno(stdout), _O_U16TEXT);
|
|
if (_isatty(_fileno(stderr))) _setmode(_fileno(stderr), _O_U16TEXT);
|
|
}
|
|
|
|
void write_utf8(ostream::base_ostream& out, quickbook::string_view x)
|
|
{
|
|
out << from_utf8(x);
|
|
}
|
|
|
|
ostream& out()
|
|
{
|
|
static ostream x(std::wcout);
|
|
return x;
|
|
}
|
|
|
|
namespace
|
|
{
|
|
inline ostream& error_stream()
|
|
{
|
|
static ostream x(std::wcerr);
|
|
return x;
|
|
}
|
|
}
|
|
|
|
#else
|
|
|
|
void initialise_output() {}
|
|
|
|
void write_utf8(ostream::base_ostream& out, quickbook::string_view x)
|
|
{
|
|
out << x;
|
|
}
|
|
|
|
ostream& out()
|
|
{
|
|
static ostream x(std::cout);
|
|
return x;
|
|
}
|
|
|
|
namespace
|
|
{
|
|
inline ostream& error_stream()
|
|
{
|
|
static ostream x(std::clog);
|
|
return x;
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
ostream& outerr() { return error_stream() << "Error: "; }
|
|
|
|
ostream& outerr(fs::path const& file, std::ptrdiff_t line)
|
|
{
|
|
if (line >= 0) {
|
|
if (ms_errors)
|
|
return error_stream() << path_to_stream(file) << "(" << line
|
|
<< "): error: ";
|
|
else
|
|
return error_stream() << path_to_stream(file) << ":" << line
|
|
<< ": error: ";
|
|
}
|
|
else {
|
|
return error_stream() << path_to_stream(file) << ": error: ";
|
|
}
|
|
}
|
|
|
|
ostream& outerr(file_ptr const& f, string_iterator pos)
|
|
{
|
|
return outerr(f->path, f->position_of(pos).line);
|
|
}
|
|
|
|
ostream& outwarn(fs::path const& file, std::ptrdiff_t line)
|
|
{
|
|
if (line >= 0) {
|
|
if (ms_errors)
|
|
return error_stream() << path_to_stream(file) << "(" << line
|
|
<< "): warning: ";
|
|
else
|
|
return error_stream() << path_to_stream(file) << ":" << line
|
|
<< ": warning: ";
|
|
}
|
|
else {
|
|
return error_stream() << path_to_stream(file) << ": warning: ";
|
|
}
|
|
}
|
|
|
|
ostream& outwarn(file_ptr const& f, string_iterator pos)
|
|
{
|
|
return outwarn(f->path, f->position_of(pos).line);
|
|
}
|
|
|
|
ostream& ostream::operator<<(char c)
|
|
{
|
|
assert(c && !(c & 0x80));
|
|
base << c;
|
|
return *this;
|
|
}
|
|
|
|
inline bool check_ascii(char const* x)
|
|
{
|
|
for (; *x; ++x)
|
|
if (*x & 0x80) return false;
|
|
return true;
|
|
}
|
|
|
|
ostream& ostream::operator<<(char const* x)
|
|
{
|
|
assert(check_ascii(x));
|
|
base << x;
|
|
return *this;
|
|
}
|
|
|
|
ostream& ostream::operator<<(std::string const& x)
|
|
{
|
|
write_utf8(base, x);
|
|
return *this;
|
|
}
|
|
|
|
ostream& ostream::operator<<(quickbook::string_view x)
|
|
{
|
|
write_utf8(base, x);
|
|
return *this;
|
|
}
|
|
|
|
ostream& ostream::operator<<(int x)
|
|
{
|
|
base << x;
|
|
return *this;
|
|
}
|
|
|
|
ostream& ostream::operator<<(unsigned int x)
|
|
{
|
|
base << x;
|
|
return *this;
|
|
}
|
|
|
|
ostream& ostream::operator<<(long x)
|
|
{
|
|
base << x;
|
|
return *this;
|
|
}
|
|
|
|
ostream& ostream::operator<<(unsigned long x)
|
|
{
|
|
base << x;
|
|
return *this;
|
|
}
|
|
|
|
#if !defined(BOOST_NO_LONG_LONG)
|
|
ostream& ostream::operator<<(boost::long_long_type x)
|
|
{
|
|
base << x;
|
|
return *this;
|
|
}
|
|
|
|
ostream& ostream::operator<<(boost::ulong_long_type x)
|
|
{
|
|
base << x;
|
|
return *this;
|
|
}
|
|
#endif
|
|
|
|
ostream& ostream::operator<<(fs::path const& x)
|
|
{
|
|
base << path_to_stream(x);
|
|
return *this;
|
|
}
|
|
|
|
ostream& ostream::operator<<(base_ostream& (*x)(base_ostream&))
|
|
{
|
|
base << x;
|
|
return *this;
|
|
}
|
|
|
|
ostream& ostream::operator<<(base_ios& (*x)(base_ios&))
|
|
{
|
|
base << x;
|
|
return *this;
|
|
}
|
|
}
|
|
}
|