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