-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathargs.c
76 lines (59 loc) · 1.56 KB
/
args.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "args.h"
#include <string.h>
#include <stdio.h>
#if defined(_WIN32)
#include <windows.h>
#define strtok_r strtok_s
#endif
#define MAX_ARG_LEN 256
static void args_spawn_console(void)
{
#if defined(_WIN32)
AllocConsole();
AttachConsole(GetCurrentProcessId());
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
#endif
}
static void args_split(char *arg, char split[2][MAX_ARG_LEN])
{
split[0][0] = split[1][0] = '\0';
char tmp[MAX_ARG_LEN];
snprintf(tmp, MAX_ARG_LEN, "%s", arg);
char *ptr = NULL;
char *str = strtok_r(tmp, "=", &ptr);
if (str == NULL)
return;
snprintf(split[0], MAX_ARG_LEN, "%s", str);
str = strtok_r(NULL, "=", &ptr);
if (str != NULL)
snprintf(split[1], MAX_ARG_LEN, "%s", str);
}
static void args_assign(char split[2][MAX_ARG_LEN], struct args *args)
{
if (!strcmp(split[0], "-session")) {
if (split[1][0] != '\0')
snprintf(args->session, SESSION_ID_LEN, "%s", split[1]);
} else if (!strcmp(split[0], "-console")) {
args->console = true;
} else if (!strcmp(split[0], "-headless")) {
args->headless = true;
}
}
void args_parse(int32_t argc, char **argv, struct args *args)
{
memset(args, 0, sizeof(struct args));
for (int32_t x = 1; x < argc; x++) {
// first argument may be the .nes rom to be opened
if (x == 1 && strstr(argv[x], ".nes")) {
snprintf(args->rom, MAX_ROM_LEN, "%s", argv[x]);
// check for other arguments
} else {
char split[2][MAX_ARG_LEN];
args_split(argv[x], split);
args_assign(split, args);
}
}
if (args->console || args->headless)
args_spawn_console();
}