summaryrefslogtreecommitdiffstats
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp142
1 files changed, 84 insertions, 58 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 7ac2972..110589d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -14,6 +14,32 @@ double
#include "../VERSION"
;
+#ifdef UNICODE
+#define T_toupper towupper
+#define T_getdcwd _wgetdcwd
+#define T_strlen wcslen
+#define T_strcpy wcscpy
+#define T_strcat wcscat
+#define T_strstr wcsstr
+#define T_strtod wcstod
+#define T_strrchr wcsrchr
+#define T_unlink _wremove
+#define T_main wmain
+#define SARG "%S"
+#else
+#define T_toupper toupper
+#define T_getdcwd _getdcwd
+#define T_strlen strlen
+#define T_strcpy strcpy
+#define T_strcat strcat
+#define T_strstr strstr
+#define T_strtod strtod
+#define T_strrchr strrchr
+#define T_unlink unlink
+#define T_main main
+#define SARG "%s"
+#endif
+
void fatal(const char *message, ...)
{
va_list argptr;
@@ -24,18 +50,18 @@ void fatal(const char *message, ...)
exit(1);
}
-void makefullpath(char* pdbname)
+void makefullpath(TCHAR* pdbname)
{
- char* pdbstart = pdbname;
- char fullname[260];
- char* pfullname = fullname;
+ TCHAR* pdbstart = pdbname;
+ TCHAR fullname[260];
+ TCHAR* pfullname = fullname;
int drive = 0;
if (pdbname[0] && pdbname[1] == ':')
{
if (pdbname[2] == '\\' || pdbname[2] == '/')
return;
- drive = toupper (pdbname[0]);
+ drive = T_toupper (pdbname[0]);
pdbname += 2;
}
else
@@ -45,8 +71,8 @@ void makefullpath(char* pdbname)
if (*pdbname != '\\' && *pdbname != '/')
{
- _getdcwd(drive, pfullname, sizeof(fullname) - 2);
- pfullname += strlen(pfullname);
+ T_getdcwd(drive, pfullname, sizeof(fullname)/sizeof(fullname[0]) - 2);
+ pfullname += T_strlen(pfullname);
if (pfullname[-1] != '\\')
*pfullname++ = '\\';
}
@@ -55,42 +81,30 @@ void makefullpath(char* pdbname)
*pfullname++ = 'a' - 1 + drive;
*pfullname++ = ':';
}
- strcpy(pfullname, pdbname);
- strcpy(pdbstart, fullname);
+ T_strcpy(pfullname, pdbname);
+ T_strcpy(pdbstart, fullname);
- for(char*p = pdbstart; *p; p++)
+ for(TCHAR*p = pdbstart; *p; p++)
if (*p == '/')
*p = '\\';
// remove relative parts "./" and "../"
- while (char* p = strstr (pdbstart, "\\.\\"))
- strcpy(p, p + 2);
+ while (TCHAR* p = T_strstr (pdbstart, TEXT("\\.\\")))
+ T_strcpy(p, p + 2);
- while (char* p = strstr (pdbstart, "\\..\\"))
+ while (TCHAR* p = T_strstr (pdbstart, TEXT("\\..\\")))
{
- for (char* q = p - 1; q >= pdbstart; q--)
+ for (TCHAR* q = p - 1; q >= pdbstart; q--)
if (*q == '\\')
{
- strcpy(q, p + 3);
+ T_strcpy(q, p + 3);
break;
}
}
}
-int main(int argc, char** argv)
+int T_main(int argc, TCHAR* argv[])
{
- if (argc < 2)
- {
- printf("Convert DMD CodeView/DWARF debug information to PDB files, Version %g\n", VERSION);
- printf("Copyright (c) 2009-2012 by Rainer Schuetze, All Rights Reserved\n");
- printf("\n");
- printf("License for redistribution is given by the Artistic License 2.0\n");
- printf("see file LICENSE for further details\n");
- printf("\n");
- printf("usage: %s [-Dversion|-C|-n|-sC] <exe-file> [new-exe-file] [pdb-file]\n", argv[0]);
- return -1;
- }
-
PEImage img;
double Dversion = 2.043;
@@ -101,7 +115,7 @@ int main(int argc, char** argv)
if (argv[0][1] == '-')
break;
if (argv[0][1] == 'D')
- Dversion = strtod (argv[0] + 2, 0);
+ Dversion = T_strtod(argv[0] + 2, 0);
else if (argv[0][1] == 'C')
Dversion = 0;
else if (argv[0][1] == 'n')
@@ -109,91 +123,103 @@ int main(int argc, char** argv)
else if (argv[0][1] == 'e')
useTypedefEnum = true;
else if (argv[0][1] == 's' && argv[0][2])
- dotReplacementChar = argv[0][2];
+ dotReplacementChar = (char)argv[0][2];
else
- fatal("unknown option: %s", argv[0]);
+ fatal("unknown option: " SARG, argv[0]);
+ }
+
+ if (argc < 2)
+ {
+ printf("Convert DMD CodeView/DWARF debug information to PDB files, Version %g\n", VERSION);
+ printf("Copyright (c) 2009-2012 by Rainer Schuetze, All Rights Reserved\n");
+ printf("\n");
+ printf("License for redistribution is given by the Artistic License 2.0\n");
+ printf("see file LICENSE for further details\n");
+ printf("\n");
+ printf("usage: " SARG " [-Dversion|-C|-n|-sC] <exe-file> [new-exe-file] [pdb-file]\n", argv[0]);
+ return -1;
}
if (!img.load(argv[1]))
- fatal("%s: %s", argv[1], img.getLastError());
+ fatal(SARG ": %s", argv[1], img.getLastError());
if (img.countCVEntries() == 0 && !img.hasDWARF())
- fatal("%s: no codeview debug entries found", argv[1]);
+ fatal(SARG ": no codeview debug entries found", argv[1]);
CV2PDB cv2pdb(img);
cv2pdb.Dversion = Dversion;
cv2pdb.initLibraries();
- char* outname = argv[1];
+ TCHAR* outname = argv[1];
if (argc > 2 && argv[2][0])
outname = argv[2];
- char pdbname[260];
+ TCHAR pdbname[260];
if (argc > 3)
- strcpy (pdbname, argv[3]);
+ T_strcpy (pdbname, argv[3]);
else
{
- strcpy (pdbname, outname);
- char *pDot = strrchr (pdbname, '.');
- if (!pDot || pDot <= strrchr (pdbname, '/') || pDot <= strrchr (pdbname, '\\'))
- strcat (pdbname, ".pdb");
+ T_strcpy (pdbname, outname);
+ TCHAR *pDot = T_strrchr (pdbname, '.');
+ if (!pDot || pDot <= T_strrchr (pdbname, '/') || pDot <= T_strrchr (pdbname, '\\'))
+ T_strcat (pdbname, TEXT(".pdb"));
else
- strcpy (pDot, ".pdb");
+ T_strcpy (pDot, TEXT(".pdb"));
}
makefullpath(pdbname);
- unlink(pdbname);
+ T_unlink(pdbname);
if(!cv2pdb.openPDB(pdbname))
- fatal("%s: %s", pdbname, cv2pdb.getLastError());
+ fatal(SARG ": %s", pdbname, cv2pdb.getLastError());
if(img.hasDWARF())
{
if(!cv2pdb.relocateDebugLineInfo())
- fatal("%s: %s", argv[1], cv2pdb.getLastError());
+ fatal(SARG ": %s", argv[1], cv2pdb.getLastError());
if(!cv2pdb.createDWARFModules())
- fatal("%s: %s", pdbname, cv2pdb.getLastError());
+ fatal(SARG ": %s", pdbname, cv2pdb.getLastError());
if(!cv2pdb.addDWARFTypes())
- fatal("%s: %s", pdbname, cv2pdb.getLastError());
+ fatal(SARG ": %s", pdbname, cv2pdb.getLastError());
if(!cv2pdb.addDWARFLines())
- fatal("%s: %s", pdbname, cv2pdb.getLastError());
+ fatal(SARG ": %s", pdbname, cv2pdb.getLastError());
if (!cv2pdb.addDWARFPublics())
- fatal("%s: %s", pdbname, cv2pdb.getLastError());
+ fatal(SARG ": %s", pdbname, cv2pdb.getLastError());
if (!cv2pdb.writeDWARFImage(outname))
- fatal("%s: %s", outname, cv2pdb.getLastError());
+ fatal(SARG ": %s", outname, cv2pdb.getLastError());
}
else
{
if (!cv2pdb.initSegMap())
- fatal("%s: %s", argv[1], cv2pdb.getLastError());
+ fatal(SARG ": %s", argv[1], cv2pdb.getLastError());
if (!cv2pdb.initGlobalSymbols())
- fatal("%s: %s", argv[1], cv2pdb.getLastError());
+ fatal(SARG ": %s", argv[1], cv2pdb.getLastError());
if (!cv2pdb.initGlobalTypes())
- fatal("%s: %s", argv[1], cv2pdb.getLastError());
+ fatal(SARG ": %s", argv[1], cv2pdb.getLastError());
if (!cv2pdb.createModules())
- fatal("%s: %s", pdbname, cv2pdb.getLastError());
+ fatal(SARG ": %s", pdbname, cv2pdb.getLastError());
if (!cv2pdb.addTypes())
- fatal("%s: %s", pdbname, cv2pdb.getLastError());
+ fatal(SARG ": %s", pdbname, cv2pdb.getLastError());
if (!cv2pdb.addSymbols())
- fatal("%s: %s", pdbname, cv2pdb.getLastError());
+ fatal(SARG ": %s", pdbname, cv2pdb.getLastError());
if (!cv2pdb.addSrcLines())
- fatal("%s: %s", pdbname, cv2pdb.getLastError());
+ fatal(SARG ": %s", pdbname, cv2pdb.getLastError());
if (!cv2pdb.addPublics())
- fatal("%s: %s", pdbname, cv2pdb.getLastError());
+ fatal(SARG ": %s", pdbname, cv2pdb.getLastError());
if (!cv2pdb.writeImage(outname))
- fatal("%s: %s", outname, cv2pdb.getLastError());
+ fatal(SARG ": %s", outname, cv2pdb.getLastError());
}
return 0;