|  | diff --git a/third_party/def_parser/def_parser.cc b/third_party/def_parser/def_parser.cc | 
|  | index e96226a4b..07cb727b7 100644 | 
|  | --- a/third_party/def_parser/def_parser.cc | 
|  | +++ b/third_party/def_parser/def_parser.cc | 
|  | @@ -61,19 +61,24 @@ | 
|  | * Author:   Valery Fine 16/09/96  (E-mail: fine@vxcern.cern.ch) | 
|  | *---------------------------------------------------------------------- | 
|  | */ | 
|  | -#include "bindexplib.h" | 
|  | +#include "src/main/cpp/util/file_platform.h" | 
|  | +#include "third_party/def_parser/def_parser.h" | 
|  |  | 
|  | -#include "cmsys/Encoding.hxx" | 
|  | -#include "cmsys/FStream.hxx" | 
|  | +#include <algorithm> | 
|  | #include <iostream> | 
|  | +#include <fstream> | 
|  | +#include <sstream> | 
|  | #include <windows.h> | 
|  |  | 
|  | #ifndef IMAGE_FILE_MACHINE_ARMNT | 
|  | #define IMAGE_FILE_MACHINE_ARMNT 0x01c4 | 
|  | #endif | 
|  |  | 
|  | -typedef struct cmANON_OBJECT_HEADER_BIGOBJ | 
|  | -{ | 
|  | +using std::string; | 
|  | +using std::wstring; | 
|  | +using std::stringstream; | 
|  | + | 
|  | +typedef struct cmANON_OBJECT_HEADER_BIGOBJ { | 
|  | /* same as ANON_OBJECT_HEADER_V2 */ | 
|  | WORD Sig1;    // Must be IMAGE_FILE_MACHINE_UNKNOWN | 
|  | WORD Sig2;    // Must be 0xffff | 
|  | @@ -92,13 +97,10 @@ typedef struct cmANON_OBJECT_HEADER_BIGOBJ | 
|  | DWORD NumberOfSymbols; | 
|  | } cmANON_OBJECT_HEADER_BIGOBJ; | 
|  |  | 
|  | -typedef struct _cmIMAGE_SYMBOL_EX | 
|  | -{ | 
|  | -  union | 
|  | -  { | 
|  | +typedef struct _cmIMAGE_SYMBOL_EX { | 
|  | +  union { | 
|  | BYTE ShortName[8]; | 
|  | -    struct | 
|  | -    { | 
|  | +    struct { | 
|  | DWORD Short; // if 0, use LongName | 
|  | DWORD Long;  // offset into string table | 
|  | } Name; | 
|  | @@ -113,16 +115,14 @@ typedef struct _cmIMAGE_SYMBOL_EX | 
|  | typedef cmIMAGE_SYMBOL_EX UNALIGNED* cmPIMAGE_SYMBOL_EX; | 
|  |  | 
|  | PIMAGE_SECTION_HEADER GetSectionHeaderOffset( | 
|  | -  PIMAGE_FILE_HEADER pImageFileHeader) | 
|  | -{ | 
|  | +  PIMAGE_FILE_HEADER pImageFileHeader) { | 
|  | return (PIMAGE_SECTION_HEADER)((DWORD_PTR)pImageFileHeader + | 
|  | IMAGE_SIZEOF_FILE_HEADER + | 
|  | pImageFileHeader->SizeOfOptionalHeader); | 
|  | } | 
|  |  | 
|  | PIMAGE_SECTION_HEADER GetSectionHeaderOffset( | 
|  | -  cmANON_OBJECT_HEADER_BIGOBJ* pImageFileHeader) | 
|  | -{ | 
|  | +  cmANON_OBJECT_HEADER_BIGOBJ* pImageFileHeader) { | 
|  | return (PIMAGE_SECTION_HEADER)((DWORD_PTR)pImageFileHeader + | 
|  | sizeof(cmANON_OBJECT_HEADER_BIGOBJ)); | 
|  | } | 
|  | @@ -130,8 +130,7 @@ PIMAGE_SECTION_HEADER GetSectionHeaderOffset( | 
|  | /* | 
|  | + * Utility func, strstr with size | 
|  | + */ | 
|  | -const char* StrNStr(const char* start, const char* find, size_t& size) | 
|  | -{ | 
|  | +const char* StrNStr(const char* start, const char* find, size_t& size) { | 
|  | size_t len; | 
|  | const char* hint; | 
|  |  | 
|  | @@ -157,9 +156,8 @@ template < | 
|  | class ObjectHeaderType, | 
|  | // cmPIMAGE_SYMBOL_EX or PIMAGE_SYMBOL | 
|  | class SymbolTableType> | 
|  | -class DumpSymbols | 
|  | -{ | 
|  | -public: | 
|  | +class DumpSymbols { | 
|  | + public: | 
|  | /* | 
|  | *---------------------------------------------------------------------- | 
|  | * Constructor -- | 
|  | @@ -169,11 +167,10 @@ public: | 
|  | *---------------------------------------------------------------------- | 
|  | */ | 
|  |  | 
|  | -  DumpSymbols(ObjectHeaderType* ih, std::set<std::string>& symbols, | 
|  | -              std::set<std::string>& dataSymbols, bool isI386) | 
|  | +  DumpSymbols(ObjectHeaderType* ih, std::set<string>& symbols, | 
|  | +              std::set<string>& dataSymbols, bool isI386) | 
|  | : Symbols(symbols) | 
|  | -    , DataSymbols(dataSymbols) | 
|  | -  { | 
|  | +    , DataSymbols(dataSymbols) { | 
|  | this->ObjectImageHeader = ih; | 
|  | this->SymbolTable = | 
|  | (SymbolTableType*)((DWORD_PTR) this->ObjectImageHeader + | 
|  | @@ -190,7 +187,9 @@ public: | 
|  | *      Dump an object file's exported symbols. | 
|  | *---------------------------------------------------------------------- | 
|  | */ | 
|  | -  void DumpObjFile() { this->DumpExternalsObjects(); } | 
|  | +  void DumpObjFile() { | 
|  | +    this->DumpExternalsObjects(); | 
|  | +  } | 
|  |  | 
|  | /* | 
|  | *---------------------------------------------------------------------- | 
|  | @@ -199,11 +198,10 @@ public: | 
|  | *      Dumps a COFF symbol table from an OBJ. | 
|  | *---------------------------------------------------------------------- | 
|  | */ | 
|  | -  void DumpExternalsObjects() | 
|  | -  { | 
|  | +  void DumpExternalsObjects() { | 
|  | unsigned i; | 
|  | PSTR stringTable; | 
|  | -    std::string symbol; | 
|  | +    string symbol; | 
|  | DWORD SectChar; | 
|  | /* | 
|  | * The string table apparently starts right after the symbol table | 
|  | @@ -230,8 +228,8 @@ public: | 
|  | // if it starts with _ and has an @ then it is a __cdecl | 
|  | // so remove the @ stuff for the export | 
|  | if (symbol[0] == '_') { | 
|  | -            std::string::size_type posAt = symbol.find('@'); | 
|  | -            if (posAt != std::string::npos) { | 
|  | +            string::size_type posAt = symbol.find('@'); | 
|  | +            if (posAt != string::npos) { | 
|  | symbol.erase(posAt); | 
|  | } | 
|  | } | 
|  | @@ -247,14 +245,14 @@ public: | 
|  | const char* scalarPrefix = "??_G"; | 
|  | const char* vectorPrefix = "??_E"; | 
|  | // The original code had a check for | 
|  | -          //     symbol.find("real@") == std::string::npos) | 
|  | +          //     symbol.find("real@") == string::npos) | 
|  | // but this disallows member functions with the name "real". | 
|  | if (symbol.compare(0, 4, scalarPrefix) && | 
|  | symbol.compare(0, 4, vectorPrefix)) { | 
|  | SectChar = this->SectionHeaders[pSymbolTable->SectionNumber - 1] | 
|  | .Characteristics; | 
|  | // skip symbols containing a dot | 
|  | -            if (symbol.find('.') == std::string::npos) { | 
|  | +            if (symbol.find('.') == string::npos) { | 
|  | if (!pSymbolTable->Type && (SectChar & IMAGE_SCN_MEM_WRITE)) { | 
|  | // Read only (i.e. constants) must be excluded | 
|  | this->DataSymbols.insert(symbol); | 
|  | @@ -278,9 +276,9 @@ public: | 
|  | } | 
|  | } | 
|  |  | 
|  | -private: | 
|  | -  std::set<std::string>& Symbols; | 
|  | -  std::set<std::string>& DataSymbols; | 
|  | + private: | 
|  | +  std::set<string>& Symbols; | 
|  | +  std::set<string>& DataSymbols; | 
|  | DWORD_PTR SymbolCount; | 
|  | PIMAGE_SECTION_HEADER SectionHeaders; | 
|  | ObjectHeaderType* ObjectImageHeader; | 
|  | @@ -288,35 +286,56 @@ private: | 
|  | bool IsI386; | 
|  | }; | 
|  |  | 
|  | -bool DumpFile(const char* filename, std::set<std::string>& symbols, | 
|  | -              std::set<std::string>& dataSymbols) | 
|  | -{ | 
|  | +void PrintLastError() { | 
|  | +  DWORD last_error = GetLastError(); | 
|  | +  if (last_error == 0) { | 
|  | +    return; | 
|  | +  } | 
|  | + | 
|  | +  char* message_buffer; | 
|  | +  size_t size = FormatMessageA( | 
|  | +      FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | | 
|  | +          FORMAT_MESSAGE_IGNORE_INSERTS, | 
|  | +      NULL, last_error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), | 
|  | +      (LPSTR)&message_buffer, 0, NULL); | 
|  | + | 
|  | +  std::cerr << "(error: " << last_error << "): " << message_buffer; | 
|  | +  LocalFree(message_buffer); | 
|  | +} | 
|  | + | 
|  | +bool DumpFile(const char* filename, std::set<string>& symbols, | 
|  | +              std::set<string>& dataSymbols) { | 
|  | HANDLE hFile; | 
|  | HANDLE hFileMapping; | 
|  | LPVOID lpFileBase; | 
|  | PIMAGE_DOS_HEADER dosHeader; | 
|  |  | 
|  | -  hFile = CreateFileW(cmsys::Encoding::ToWide(filename).c_str(), GENERIC_READ, | 
|  | +  wstring filenameW; | 
|  | +  blaze_util::AsAbsoluteWindowsPath(filename, &filenameW); | 
|  | +  hFile = CreateFileW(filenameW.c_str(), GENERIC_READ, | 
|  | FILE_SHARE_READ, NULL, OPEN_EXISTING, | 
|  | FILE_ATTRIBUTE_NORMAL, 0); | 
|  |  | 
|  | if (hFile == INVALID_HANDLE_VALUE) { | 
|  | +    PrintLastError(); | 
|  | fprintf(stderr, "Couldn't open file '%s' with CreateFile()\n", filename); | 
|  | return false; | 
|  | } | 
|  |  | 
|  | hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); | 
|  | if (hFileMapping == 0) { | 
|  | -    CloseHandle(hFile); | 
|  | +    PrintLastError(); | 
|  | fprintf(stderr, "Couldn't open file mapping with CreateFileMapping()\n"); | 
|  | +    CloseHandle(hFile); | 
|  | return false; | 
|  | } | 
|  |  | 
|  | lpFileBase = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0); | 
|  | if (lpFileBase == 0) { | 
|  | +    PrintLastError(); | 
|  | +    fprintf(stderr, "Couldn't map view of file with MapViewOfFile()\n"); | 
|  | CloseHandle(hFileMapping); | 
|  | CloseHandle(hFile); | 
|  | -    fprintf(stderr, "Couldn't map view of file with MapViewOfFile()\n"); | 
|  | return false; | 
|  | } | 
|  |  | 
|  | @@ -348,7 +367,7 @@ bool DumpFile(const char* filename, std::set<std::string>& symbols, | 
|  | (h->Machine == IMAGE_FILE_MACHINE_I386)); | 
|  | symbolDumper.DumpObjFile(); | 
|  | } else { | 
|  | -      printf("unrecognized file format in '%s'\n", filename); | 
|  | +      printf("Unrecognized file format in '%s'\n", filename); | 
|  | return false; | 
|  | } | 
|  | } | 
|  | @@ -358,19 +377,23 @@ bool DumpFile(const char* filename, std::set<std::string>& symbols, | 
|  | return true; | 
|  | } | 
|  |  | 
|  | -bool bindexplib::AddObjectFile(const char* filename) | 
|  | -{ | 
|  | + | 
|  | +void DefParser::SetDLLName(const string& dllname) { | 
|  | +  this->DLLName = dllname; | 
|  | +} | 
|  | + | 
|  | +bool DefParser::AddObjectFile(const char* filename) { | 
|  | return DumpFile(filename, this->Symbols, this->DataSymbols); | 
|  | } | 
|  |  | 
|  | -bool bindexplib::AddDefinitionFile(const char* filename) | 
|  | -{ | 
|  | -  cmsys::ifstream infile(filename); | 
|  | +bool DefParser::AddDefinitionFile(const char* filename) { | 
|  | +  std::ifstream infile(filename); | 
|  | if (!infile) { | 
|  | +    PrintLastError(); | 
|  | fprintf(stderr, "Couldn't open definition file '%s'\n", filename); | 
|  | return false; | 
|  | } | 
|  | -  std::string str; | 
|  | +  string str; | 
|  | while (std::getline(infile, str)) { | 
|  | // skip the LIBRAY and EXPORTS lines (if any) | 
|  | if ((str.compare(0, 7, "LIBRARY") == 0) || | 
|  | @@ -380,8 +403,8 @@ bool bindexplib::AddDefinitionFile(const char* filename) | 
|  | // remove leading tabs & spaces | 
|  | str.erase(0, str.find_first_not_of(" \t")); | 
|  | std::size_t found = str.find(" \t DATA"); | 
|  | -    if (found != std::string::npos) { | 
|  | -      str.erase(found, std::string::npos); | 
|  | +    if (found != string::npos) { | 
|  | +      str.erase(found, string::npos); | 
|  | this->DataSymbols.insert(str); | 
|  | } else { | 
|  | this->Symbols.insert(str); | 
|  | @@ -391,14 +414,37 @@ bool bindexplib::AddDefinitionFile(const char* filename) | 
|  | return true; | 
|  | } | 
|  |  | 
|  | -void bindexplib::WriteFile(FILE* file) | 
|  | -{ | 
|  | +bool DefParser::IsDefFile(const string& file) { | 
|  | +  // Get file extension and convert it to lower case. | 
|  | +  string ext = file.substr(file.find_last_of(".") + 1); | 
|  | +  std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); | 
|  | +  return ext == "def"; | 
|  | +} | 
|  | + | 
|  | +bool DefParser::AddFile(const string& file) { | 
|  | +  if (IsDefFile(file)) { | 
|  | +    if (!this->AddDefinitionFile(file.c_str())) { | 
|  | +      return false; | 
|  | +    } | 
|  | +  } else { | 
|  | +    if (!this->AddObjectFile(file.c_str())) { | 
|  | +      return false; | 
|  | +    } | 
|  | +  } | 
|  | +  return true; | 
|  | +} | 
|  | + | 
|  | +void DefParser::WriteFile(FILE* file) { | 
|  | +  if (!this->DLLName.empty()) { | 
|  | +    fprintf(file, "LIBRARY %s\n", this->DLLName.c_str()); | 
|  | +  } | 
|  | + | 
|  | fprintf(file, "EXPORTS \n"); | 
|  | -  for (std::set<std::string>::const_iterator i = this->DataSymbols.begin(); | 
|  | +  for (std::set<string>::const_iterator i = this->DataSymbols.begin(); | 
|  | i != this->DataSymbols.end(); ++i) { | 
|  | fprintf(file, "\t%s \t DATA\n", i->c_str()); | 
|  | } | 
|  | -  for (std::set<std::string>::const_iterator i = this->Symbols.begin(); | 
|  | +  for (std::set<string>::const_iterator i = this->Symbols.begin(); | 
|  | i != this->Symbols.end(); ++i) { | 
|  | fprintf(file, "\t%s\n", i->c_str()); | 
|  | } |