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//===----------------------------------------------------------------------===//
9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/raw_ostream.h>
10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
11affc150dc44fab1911775a49636d0ce85333b634Zonr Changusing namespace mcld;
12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// raw_ostream
15affc150dc44fab1911775a49636d0ce85333b634Zonr Changmcld::raw_fd_ostream::raw_fd_ostream(const char *pFilename,
16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                               std::string &pErrorInfo,
17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                               unsigned int pFlags,
18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                               const MCLDInfo* pLDInfo)
19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  : llvm::raw_fd_ostream(pFilename, pErrorInfo, pFlags), m_pLDInfo(pLDInfo) {
20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
22affc150dc44fab1911775a49636d0ce85333b634Zonr Changmcld::raw_fd_ostream::raw_fd_ostream(int pFD,
23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                               bool pShouldClose,
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                               bool pUnbuffered,
25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                               const MCLDInfo* pLDInfo)
26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  : llvm::raw_fd_ostream(pFD, pShouldClose, pUnbuffered), m_pLDInfo(pLDInfo) {
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
29affc150dc44fab1911775a49636d0ce85333b634Zonr Changmcld::raw_fd_ostream::~raw_fd_ostream()
30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
33affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid mcld::raw_fd_ostream::setLDInfo(const MCLDInfo& pLDInfo)
34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  m_pLDInfo = &pLDInfo;
36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
38affc150dc44fab1911775a49636d0ce85333b634Zonr Changllvm::raw_ostream &
39affc150dc44fab1911775a49636d0ce85333b634Zonr Changmcld::raw_fd_ostream::changeColor(enum llvm::raw_ostream::Colors pColor,
40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                  bool pBold,
41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                  bool pBackground)
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  if (!is_displayed())
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return *this;
45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return llvm::raw_fd_ostream::changeColor(pColor, pBold, pBackground);
46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
48affc150dc44fab1911775a49636d0ce85333b634Zonr Changllvm::raw_ostream& mcld::raw_fd_ostream::resetColor()
49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  if (!is_displayed())
51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return *this;
52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return llvm::raw_fd_ostream::resetColor();
53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// FIXME: migrate to newer LLVM
56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/**
57affc150dc44fab1911775a49636d0ce85333b634Zonr Changllvm::raw_ostream& mcld::raw_fd_ostream::reverseColor()
58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  if (!is_displayed())
60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return *this;
61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return llvm::raw_ostream::reverseColor();
62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang**/
64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
65affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool mcld::raw_fd_ostream::is_displayed() const
66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  if (NULL == m_pLDInfo)
68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return llvm::raw_fd_ostream::is_displayed();
69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return m_pLDInfo->options().color();
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//  outs(), errs(), nulls()
75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
76affc150dc44fab1911775a49636d0ce85333b634Zonr Changmcld::raw_fd_ostream& mcld::outs() {
77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // Set buffer settings to model stdout behavior.
78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // Delete the file descriptor when the program exists, forcing error
79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // detection. If you don't want this behavior, don't use outs().
80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  static mcld::raw_fd_ostream S(STDOUT_FILENO, true, NULL);
81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return S;
82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
84affc150dc44fab1911775a49636d0ce85333b634Zonr Changmcld::raw_fd_ostream& mcld::errs() {
85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // Set standard error to be unbuffered by default.
86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  static mcld::raw_fd_ostream S(STDERR_FILENO, false, true, NULL);
87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return S;
88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
90affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid mcld::InitializeOStreams(const MCLDInfo& pLDInfo)
91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  outs().setLDInfo(pLDInfo);
93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  errs().setLDInfo(pLDInfo);
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
96