C++程序  |  105行  |  2.75 KB

//===- raw_ostream.cpp ----------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "mcld/Config/Config.h"
#include "mcld/Support/raw_ostream.h"

#if defined(HAVE_UNISTD_H)
#include <unistd.h>
#endif

#if defined(__CYGWIN__) || defined(_MSC_VER) || defined(__MINGW32__)
#include <io.h>
#endif

#if defined(_MSC_VER) || defined(__MINGW32__)
#ifndef STDIN_FILENO
#define STDIN_FILENO 0
#endif
#ifndef STDOUT_FILENO
#define STDOUT_FILENO 1
#endif
#ifndef STDERR_FILENO
#define STDERR_FILENO 2
#endif
#endif

namespace mcld {

//===----------------------------------------------------------------------===//
// raw_ostream
//===----------------------------------------------------------------------===//
raw_fd_ostream::raw_fd_ostream(const char* pFilename,
                               std::error_code& pErrorCode,
                               llvm::sys::fs::OpenFlags pFlags)
    : llvm::raw_fd_ostream(pFilename, pErrorCode, pFlags),
      m_bConfigColor(false),
      m_bSetColor(false) {
}

raw_fd_ostream::raw_fd_ostream(int pFD,
                               bool pShouldClose,
                               bool pUnbuffered)
    : llvm::raw_fd_ostream(pFD, pShouldClose, pUnbuffered),
      m_bConfigColor(false),
      m_bSetColor(false) {
}

raw_fd_ostream::~raw_fd_ostream() {
}

void raw_fd_ostream::setColor(bool pEnable) {
  m_bConfigColor = true;
  m_bSetColor = pEnable;
}

llvm::raw_ostream& raw_fd_ostream::changeColor(
    enum llvm::raw_ostream::Colors pColor,
    bool pBold,
    bool pBackground) {
  if (!is_displayed())
    return *this;
  return llvm::raw_fd_ostream::changeColor(pColor, pBold, pBackground);
}

llvm::raw_ostream& raw_fd_ostream::resetColor() {
  if (!is_displayed())
    return *this;
  return llvm::raw_fd_ostream::resetColor();
}

llvm::raw_ostream& raw_fd_ostream::reverseColor() {
  if (!is_displayed())
    return *this;
  return llvm::raw_ostream::reverseColor();
}

bool raw_fd_ostream::is_displayed() const {
  if (m_bConfigColor)
    return m_bSetColor;

  return llvm::raw_fd_ostream::is_displayed();
}

//===----------------------------------------------------------------------===//
//  outs(), errs(), nulls()
//===----------------------------------------------------------------------===//
raw_fd_ostream& outs() {
  // Set buffer settings to model stdout behavior.
  static raw_fd_ostream S(STDOUT_FILENO, false);
  return S;
}

raw_fd_ostream& errs() {
  // Set standard error to be unbuffered by default.
  static raw_fd_ostream S(STDERR_FILENO, false, true);
  return S;
}

}  // namespace mcld