//===-- WindowsResourceDumper.cpp - Windows Resource printer --------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file implements the Windows resource (.res) dumper for llvm-readobj.
//
//===----------------------------------------------------------------------===//

#include "WindowsResourceDumper.h"
#include "Error.h"
#include "llvm/Object/WindowsResource.h"
#include "llvm/Support/ConvertUTF.h"
#include "llvm/Support/ScopedPrinter.h"

namespace llvm {
namespace object {
namespace WindowsRes {

std::string stripUTF16(const ArrayRef<UTF16> &UTF16Str) {
  std::string Result;
  Result.reserve(UTF16Str.size());

  for (UTF16 Ch : UTF16Str) {
    // UTF16Str will have swapped byte order in case of big-endian machines.
    // Swap it back in such a case.
    uint16_t ChValue = support::endian::byte_swap(Ch, support::little);
    if (ChValue <= 0xFF)
      Result += ChValue;
    else
      Result += '?';
  }
  return Result;
}

Error Dumper::printData() {
  auto EntryPtrOrErr = WinRes->getHeadEntry();
  if (!EntryPtrOrErr)
    return EntryPtrOrErr.takeError();
  auto EntryPtr = *EntryPtrOrErr;

  bool IsEnd = false;
  while (!IsEnd) {
    printEntry(EntryPtr);

    if (auto Err = EntryPtr.moveNext(IsEnd))
      return Err;
  }
  return Error::success();
}

void Dumper::printEntry(const ResourceEntryRef &Ref) {
  if (Ref.checkTypeString()) {
    auto NarrowStr = stripUTF16(Ref.getTypeString());
    SW.printString("Resource type (string)", NarrowStr);
  } else
    SW.printNumber("Resource type (int)", Ref.getTypeID());

  if (Ref.checkNameString()) {
    auto NarrowStr = stripUTF16(Ref.getNameString());
    SW.printString("Resource name (string)", NarrowStr);
  } else
    SW.printNumber("Resource name (int)", Ref.getNameID());

  SW.printNumber("Data version", Ref.getDataVersion());
  SW.printHex("Memory flags", Ref.getMemoryFlags());
  SW.printNumber("Language ID", Ref.getLanguage());
  SW.printNumber("Version (major)", Ref.getMajorVersion());
  SW.printNumber("Version (minor)", Ref.getMinorVersion());
  SW.printNumber("Characteristics", Ref.getCharacteristics());
  SW.printNumber("Data size", (uint64_t)Ref.getData().size());
  SW.printBinary("Data:", Ref.getData());
  SW.startLine() << "\n";
}

} // namespace WindowsRes
} // namespace object
} // namespace llvm
