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