//===-- 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 must 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
