1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- raw_ostream.cpp ----------------------------------------------------===// 2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// The MCLinker Project 4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source 6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details. 7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Config/Config.h" 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/raw_ostream.h" 11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#if defined(HAVE_UNISTD_H) 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <unistd.h> 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#if defined(__CYGWIN__) || defined(_MSC_VER) || defined(__MINGW32__) 17f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <io.h> 18f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#endif 19f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 20f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#if defined(_MSC_VER) || defined(__MINGW32__) 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef STDIN_FILENO 2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define STDIN_FILENO 0 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef STDOUT_FILENO 2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define STDOUT_FILENO 1 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef STDERR_FILENO 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define STDERR_FILENO 2 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// raw_ostream 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 3737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesraw_fd_ostream::raw_fd_ostream(const char* pFilename, 3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines std::error_code& pErrorCode, 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::sys::fs::OpenFlags pFlags) 4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines : llvm::raw_fd_ostream(pFilename, pErrorCode, pFlags), 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bConfigColor(false), 4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bSetColor(false) { 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 4537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesraw_fd_ostream::raw_fd_ostream(int pFD, 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool pShouldClose, 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool pUnbuffered) 4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines : llvm::raw_fd_ostream(pFD, pShouldClose, pUnbuffered), 4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bConfigColor(false), 5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_bSetColor(false) { 51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 5337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesraw_fd_ostream::~raw_fd_ostream() { 54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid raw_fd_ostream::setColor(bool pEnable) { 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_bConfigColor = true; 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_bSetColor = pEnable; 59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesllvm::raw_ostream& raw_fd_ostream::changeColor( 6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines enum llvm::raw_ostream::Colors pColor, 6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool pBold, 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool pBackground) { 65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!is_displayed()) 66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return *this; 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return llvm::raw_fd_ostream::changeColor(pColor, pBold, pBackground); 68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 7037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesllvm::raw_ostream& raw_fd_ostream::resetColor() { 71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!is_displayed()) 72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return *this; 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return llvm::raw_fd_ostream::resetColor(); 74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 7637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesllvm::raw_ostream& raw_fd_ostream::reverseColor() { 77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!is_displayed()) 78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return *this; 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return llvm::raw_ostream::reverseColor(); 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 8237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool raw_fd_ostream::is_displayed() const { 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (m_bConfigColor) 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return m_bSetColor; 85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return llvm::raw_fd_ostream::is_displayed(); 87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// outs(), errs(), nulls() 91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 9237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesraw_fd_ostream& outs() { 93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // Set buffer settings to model stdout behavior. 9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines static raw_fd_ostream S(STDOUT_FILENO, false); 95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return S; 96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 9837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesraw_fd_ostream& errs() { 99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // Set standard error to be unbuffered by default. 10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines static raw_fd_ostream S(STDERR_FILENO, false, true); 101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return S; 102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 10437b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 105