libctru/libctru/source/system/initArgv.c
2020-05-09 18:22:51 +01:00

52 lines
1.0 KiB
C

#include <3ds/types.h>
#include <3ds/env.h>
#include <string.h>
// System globals we define here
int __system_argc;
char** __system_argv;
extern char* fake_heap_start;
extern char* fake_heap_end;
void __attribute__((weak)) __system_initArgv(void)
{
int i;
const char* arglist = envGetSystemArgList();
const char* temp = arglist;
// Check if the argument list is present
if (!temp)
return;
// Retrieve argc
__system_argc = *(u32*)temp;
temp += sizeof(u32);
// Find the end of the argument data
for (i = 0; i < __system_argc; i ++)
{
for (; *temp; temp ++);
temp ++;
}
// Reserve heap memory for argv data
u32 argSize = temp - arglist - sizeof(u32);
__system_argv = (char**)fake_heap_start;
fake_heap_start += sizeof(char**)*(__system_argc + 1);
char* argCopy = fake_heap_start;
fake_heap_start += argSize;
// Fill argv array
memcpy(argCopy, &arglist[4], argSize);
temp = argCopy;
for (i = 0; i < __system_argc; i ++)
{
__system_argv[i] = (char*)temp;
for (; *temp; temp ++);
temp ++;
}
__system_argv[__system_argc] = NULL;
}