Get argc/argv when using WinMain
This commit is contained in:
parent
4219b79ed8
commit
e79b95c482
1 changed files with 61 additions and 1 deletions
62
src/main.cpp
62
src/main.cpp
|
@ -9,10 +9,62 @@
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
int WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) {
|
int WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) {
|
||||||
|
int argvCapacity = 16;
|
||||||
|
int argc = 0;
|
||||||
|
char **argv = (char**)calloc(argvCapacity, sizeof(char*));
|
||||||
|
int argLength = std::strlen(lpCmdLine);
|
||||||
|
int tempCapacity = 128;
|
||||||
|
int tempSize = 0;
|
||||||
|
char *temp = (char*)malloc(sizeof(char) * tempCapacity);
|
||||||
|
for (int i = 0; i < argLength; ++i) {
|
||||||
|
if (lpCmdLine[i] == ' ') {
|
||||||
|
if (tempSize > 0) {
|
||||||
|
if (argc >= argvCapacity) {
|
||||||
|
char **newArgv = (char**)calloc(argvCapacity * 2, sizeof(char*));
|
||||||
|
std::memcpy(newArgv, argv, sizeof(char*) * argvCapacity);
|
||||||
|
free(argv);
|
||||||
|
argv = newArgv;
|
||||||
|
argvCapacity *= 2;
|
||||||
|
}
|
||||||
|
argv[argc] = (char*)malloc(sizeof(char) * (tempSize + 1));
|
||||||
|
std::memcpy(argv[argc], temp, sizeof(char) * tempSize);
|
||||||
|
argv[argc][tempSize] = 0;
|
||||||
|
++argc;
|
||||||
|
tempSize = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (tempSize >= tempCapacity) {
|
||||||
|
char *newTemp = (char*)malloc(sizeof(char) * tempCapacity * 2);
|
||||||
|
std::memcpy(newTemp, temp, sizeof(char) * tempSize);
|
||||||
|
free(temp);
|
||||||
|
temp = newTemp;
|
||||||
|
tempCapacity *= 2;
|
||||||
|
}
|
||||||
|
temp[tempSize++] = lpCmdLine[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (tempSize > 0) {
|
||||||
|
if (argc >= argvCapacity) {
|
||||||
|
char **newArgv = (char**)calloc(argvCapacity * 2, sizeof(char*));
|
||||||
|
std::memcpy(newArgv, argv, sizeof(char*) * argvCapacity);
|
||||||
|
free(argv);
|
||||||
|
argv = newArgv;
|
||||||
|
argvCapacity *= 2;
|
||||||
|
}
|
||||||
|
argv[argc] = (char*)malloc(sizeof(char) * (tempSize + 1));
|
||||||
|
std::memcpy(argv[argc], temp, sizeof(char) * tempSize);
|
||||||
|
argv[argc][tempSize] = 0;
|
||||||
|
++argc;
|
||||||
|
tempSize = 0;
|
||||||
|
}
|
||||||
|
free(temp);
|
||||||
|
|
||||||
// init
|
// init
|
||||||
Tri::State state(0, nullptr);
|
Tri::State state(argc, argv);
|
||||||
|
|
||||||
// main loop
|
// main loop
|
||||||
while(state.get_flags().test(1)) {
|
while(state.get_flags().test(1)) {
|
||||||
|
@ -20,6 +72,14 @@ int WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPS
|
||||||
state.update();
|
state.update();
|
||||||
state.draw();
|
state.draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// cleanup
|
||||||
|
|
||||||
|
for (int i = 0; i < argc; ++i) {
|
||||||
|
free(argv[i]);
|
||||||
|
}
|
||||||
|
free(argv);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
Loading…
Reference in a new issue