blob: 78cb64872c6b91ff3f01242bc56b9b1737ecd8b5 [file] [log] [blame]
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());
}