Fixes for compiling on linux

This commit is contained in:
baldurk
2014-06-08 11:19:22 +01:00
parent 0f080d1f44
commit d7e752f7e9
2 changed files with 58 additions and 14 deletions
+50 -13
View File
@@ -29,6 +29,43 @@
using std::string;
using std::wstring;
uint32_t wtoi(wchar_t *str)
{
uint32_t ret = 0;
while(str && *str)
{
if(*str > L'9' || *str < L'0')
break;
uint32_t digit = uint32_t(*str-L'0');
ret *= 10;
ret += digit;
str++;
}
return ret;
}
bool argequal(const wchar_t *a, const wchar_t *b)
{
if(a == NULL || b == NULL) return false;
while(*a && *b)
{
if(towlower(*a) != towlower(*b))
break;
a++;
b++;
}
// if both reached null terminator then strings are equal
return *a == 0 && *b == 0;
}
// defined in *_specific.cpp
void DisplayRendererPreview(ReplayRenderer *renderer);
wstring GetUsername();
@@ -44,7 +81,7 @@ int renderdoccmd(int argc, wchar_t **argv)
if(argc >= 2)
{
// fall through and print usage
if(!_wcsicmp(argv[1], L"--help") || !_wcsicmp(argv[1], L"-h"))
if(argequal(argv[1], L"--help") || argequal(argv[1], L"-h"))
{
}
// if we were given a logfile, load it and continually replay it.
@@ -57,11 +94,11 @@ int renderdoccmd(int argc, wchar_t **argv)
if(renderer && status == eReplayCreate_Success)
DisplayRendererPreview(renderer);
delete renderer;
ReplayRenderer_Shutdown(renderer);
return 0;
}
// replay a logfile
else if(!_wcsicmp(argv[1], L"--replay") || !_wcsicmp(argv[1], L"-r"))
else if(argequal(argv[1], L"--replay") || argequal(argv[1], L"-r"))
{
if(argc >= 3)
{
@@ -72,7 +109,7 @@ int renderdoccmd(int argc, wchar_t **argv)
if(renderer && status == eReplayCreate_Success)
DisplayRendererPreview(renderer);
delete renderer;
ReplayRenderer_Shutdown(renderer);
return 0;
}
else
@@ -98,7 +135,7 @@ int renderdoccmd(int argc, wchar_t **argv)
}
#endif
// capture a program with default capture options
else if(!_wcsicmp(argv[1], L"--capture") || !_wcsicmp(argv[1], L"-c"))
else if(argequal(argv[1], L"--capture") || argequal(argv[1], L"-c"))
{
if(argc >= 3)
{
@@ -117,21 +154,21 @@ int renderdoccmd(int argc, wchar_t **argv)
}
}
// inject into a running process with default capture options
else if(!_wcsicmp(argv[1], L"--inject") || !_wcsicmp(argv[1], L"-i"))
else if(argequal(argv[1], L"--inject") || argequal(argv[1], L"-i"))
{
if(argc >= 3)
{
wchar_t *pid = argv[2];
while(*pid == L'"' || iswspace(*pid)) pid++;
uint32_t pidNum = (uint32_t)_wtoi(pid);
uint32_t pidNum = (uint32_t)wtoi(pid);
uint32_t ident = RENDERDOC_InjectIntoProcess(pidNum, NULL, &opts, false);
if(ident == 0)
printf("Failed to inject to %u\n", pid);
printf("Failed to inject to %u\n", pidNum);
else
printf("Injected to %u as %d\n", pid, ident);
printf("Injected to %u as %u\n", pidNum, ident);
return ident;
}
@@ -141,13 +178,13 @@ int renderdoccmd(int argc, wchar_t **argv)
}
}
// spawn remote replay host
else if(!_wcsicmp(argv[1], L"--replayhost") || !_wcsicmp(argv[1], L"-rh"))
else if(argequal(argv[1], L"--replayhost") || argequal(argv[1], L"-rh"))
{
RENDERDOC_SpawnReplayHost(NULL);
return 1;
}
// replay a logfile over the network on a remote host
else if(!_wcsicmp(argv[1], L"--remotereplay") || !_wcsicmp(argv[1], L"-rr"))
else if(argequal(argv[1], L"--remotereplay") || argequal(argv[1], L"-rr"))
{
if(argc >= 4)
{
@@ -174,14 +211,14 @@ int renderdoccmd(int argc, wchar_t **argv)
}
}
// not documented/useful for manual use on the cmd line, used internally
else if(!_wcsicmp(argv[1], L"--cap32for64"))
else if(argequal(argv[1], L"--cap32for64"))
{
if(argc >= 5)
{
wchar_t *pid = argv[2];
while(*pid == L'"' || iswspace(*pid)) pid++;
uint32_t pidNum = (uint32_t)_wtoi(pid);
uint32_t pidNum = (uint32_t)wtoi(pid);
wchar_t *log = argv[3];
+8 -1
View File
@@ -28,12 +28,18 @@
#include <locale.h>
#include <iconv.h>
#include <unistd.h>
#include <replay/renderdoc.h>
using std::wstring;
wstring GetUsername()
{
char buf[256] = {0};
getlogin_r(buf, 255);
return wstring(buf, buf+strlen(buf));
}
void DisplayRendererPreview(ReplayRenderer *renderer)
@@ -67,7 +73,8 @@ int main(int argc, char *argv[])
for(int i=0; i < argc; i++)
{
size_t len = strlen(argv[i]);
wargv[i] = new wchar_t[len];
wargv[i] = new wchar_t[len+2];
memset(wargv[i], 0, (len+2)*sizeof(wchar_t));
char *inbuf = argv[i];
size_t insize = len+1; // include null terminator