mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-07 19:36:06 +03:00

llvm::OStream provides all std::ostream functionality (by holding a std::ostream* internally), but * doesn't include <iostream>, avoiding per-file overhead. * allows the stream pointer to be null, and the (inlined) operators do nothing when that's the case. (This also allows removal of the ofstream("/dev/null") hack Logger used when disabled, which presumably wasn't very portable)
83 lines
1.6 KiB
C++
83 lines
1.6 KiB
C++
#include <cassert>
|
|
#include <cstdarg>
|
|
#include <cstdio>
|
|
#include <cstdlib>
|
|
#include <fstream>
|
|
#include <string>
|
|
|
|
#include "mars.h"
|
|
|
|
#include "llvm/Support/CommandLine.h"
|
|
#include "gen/logger.h"
|
|
|
|
namespace Logger
|
|
{
|
|
static std::string indent_str;
|
|
|
|
llvm::cl::opt<bool> _enabled("vv",
|
|
llvm::cl::desc("Very verbose"),
|
|
llvm::cl::ZeroOrMore);
|
|
|
|
void indent()
|
|
{
|
|
if (_enabled) {
|
|
indent_str += "* ";
|
|
}
|
|
}
|
|
void undent()
|
|
{
|
|
if (_enabled) {
|
|
assert(!indent_str.empty());
|
|
indent_str.resize(indent_str.size()-2);
|
|
}
|
|
}
|
|
llvm::OStream cout()
|
|
{
|
|
if (_enabled)
|
|
return llvm::cout << indent_str;
|
|
else
|
|
return 0;
|
|
}
|
|
void println(const char* fmt,...)
|
|
{
|
|
if (_enabled) {
|
|
printf("%s", indent_str.c_str());
|
|
va_list va;
|
|
va_start(va,fmt);
|
|
vprintf(fmt,va);
|
|
va_end(va);
|
|
printf("\n");
|
|
}
|
|
}
|
|
void print(const char* fmt,...)
|
|
{
|
|
if (_enabled) {
|
|
printf("%s", indent_str.c_str());
|
|
va_list va;
|
|
va_start(va,fmt);
|
|
vprintf(fmt,va);
|
|
va_end(va);
|
|
}
|
|
}
|
|
void enable()
|
|
{
|
|
_enabled = true;
|
|
}
|
|
void disable()
|
|
{
|
|
_enabled = false;
|
|
}
|
|
bool enabled()
|
|
{
|
|
return _enabled;
|
|
}
|
|
void attention(const Loc& loc, const char* fmt,...)
|
|
{
|
|
printf("Warning: %s: ", loc.toChars());
|
|
va_list va;
|
|
va_start(va,fmt);
|
|
vprintf(fmt,va);
|
|
va_end(va);
|
|
printf("\n");
|
|
}
|
|
}
|