//===-- ReadStdin.cpp -----------------------------------------------------===//
//
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//
//===----------------------------------------------------------------------===//
//
// Gollvm driver helper class "ReadStdin" methods.
//
//===----------------------------------------------------------------------===//

#include "ReadStdin.h"

#include "Compilation.h"
#include "Driver.h"

#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/FileSystem.h"

namespace gollvm {
namespace driver {


ReadStdin::ReadStdin(ToolChain &tc, bool mustBeEmpty)
    : InternalTool("stdinreader", tc),
      mustBeEmpty_(mustBeEmpty)
{
}

ReadStdin::~ReadStdin()
{
}

bool ReadStdin::performAction(Compilation &compilation,
                              const Action &jobAction,
                              const ArtifactList &inputArtifacts,
                              const Artifact &output)
{
  assert(inputArtifacts.empty());

  // Read in standard input, the LLVM way...
  llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> stdinBufferOrErr =
      llvm::MemoryBuffer::getSTDIN();
  if (std::error_code errc = stdinBufferOrErr.getError()) {
    llvm::errs() << compilation.driver().progname()
                 << ": error reading stdin: " << errc.message();
    return false;
  }
  std::unique_ptr<llvm::MemoryBuffer> stdinBuf =
      std::move(stdinBufferOrErr.get());

  // Enforce the "must be empty" requirement if appropriate.
  if (mustBeEmpty_ && stdinBuf->getBufferSize() != 0) {
    llvm::errs() << compilation.driver().progname()
                 << ": unsupported language for -x, "
                 << "stdin be empty\n";
    return false;
  }

  // Emit to the output artifact.
  std::error_code errc;
  llvm::raw_fd_ostream ostr(output.file(), errc,
                            llvm::sys::fs::OpenFlags::OF_None);
  if (errc) {
    llvm::errs() << compilation.driver().progname()
                 << ": cannot open " << output.file() << " for writing: "
                 << errc.message();
    return false;
  }

  ostr.write(stdinBuf->getBufferStart(), stdinBuf->getBufferSize());
  return true;
}

} // end namespace driver
} // end namespace gollvm
