//===- FuzzerIO.cpp - IO utils. -------------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// IO functions.
//===----------------------------------------------------------------------===//
#include "FuzzerInternal.h"
#include <iostream>
#include <iterator>
#include <fstream>
#include <dirent.h>
namespace fuzzer {

static std::vector<std::string> ListFilesInDir(const std::string &Dir) {
  std::vector<std::string> V;
  DIR *D = opendir(Dir.c_str());
  if (!D) return V;
  while (auto E = readdir(D)) {
    if (E->d_type == DT_REG || E->d_type == DT_LNK)
      V.push_back(E->d_name);
  }
  closedir(D);
  return V;
}

Unit FileToVector(const std::string &Path) {
  std::ifstream T(Path);
  return Unit((std::istreambuf_iterator<char>(T)),
              std::istreambuf_iterator<char>());
}

std::string FileToString(const std::string &Path) {
  std::ifstream T(Path);
  return std::string((std::istreambuf_iterator<char>(T)),
                     std::istreambuf_iterator<char>());
}

void CopyFileToErr(const std::string &Path) {
  std::ifstream T(Path);
  std::copy(std::istreambuf_iterator<char>(T), std::istreambuf_iterator<char>(),
            std::ostream_iterator<char>(std::cerr, ""));
}

void WriteToFile(const Unit &U, const std::string &Path) {
  std::ofstream OF(Path);
  OF.write((const char*)U.data(), U.size());
}

void ReadDirToVectorOfUnits(const char *Path, std::vector<Unit> *V) {
  for (auto &X : ListFilesInDir(Path))
    V->push_back(FileToVector(DirPlusFile(Path, X)));
}

std::string DirPlusFile(const std::string &DirPath,
                        const std::string &FileName) {
  return DirPath + "/" + FileName;
}

}  // namespace fuzzer
