-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathparse_cli.cpp
107 lines (100 loc) · 3.16 KB
/
parse_cli.cpp
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <ostream>
#include <string>
#include <vector>
#include <map>
#include "parse_cli.hpp"
Arg::Arg(char sn, std::string ln, ArgType t) {
short_name = sn;
long_name = ln;
type = t;
}
ArgParse::ArgParse(std::vector<Arg> a) {
args = a;
}
void ArgParse::parse_args(int argc, char* argv[]) {
for (int i = 1; i < argc; i++) {
if(std::string(argv[i]) == ""){
continue;
}
if (argv[i][0] == '-') {
if (argv[i][1] == '-') {
bool found = false;
for (int j = 0; j < args.size(); j++) {
if (args[j].type == ArgType::flag) {
if (std::string(argv[i]) == ("--" + args[j].long_name)) {
adds[args[j].long_name] = "";
found = true;
break;
}
} else if (args[j].type == ArgType::value | args[j].type == ArgType::val_always_sep) {
if (std::string(argv[i]) == ("--" + args[j].long_name)) {
if(++i >= argc) {
std::cout << "Error: flag '" << args[j].long_name << "' requires a value" << std::endl;
exit(-1);
}
adds[args[j].long_name] = argv[i];
found = true;
break;
}
}
}
if(!found){
std::cout << "Error: unknown flag '" << argv[i] << "'" << std::endl;
exit(-1);
}
} else {
bool found = false;
for (int j = 0; j < args.size(); j++) {
if (argv[i][1] == args[j].short_name) {
if (args[j].type == ArgType::flag) {
adds[args[j].long_name] = "";
found = true;
break;
}else if (args[j].type == ArgType::value) {
if(argv[i][2] == '\0'){
std::cout << "Error: flag '" << args[j].long_name << "' requires a value" << std::endl;
exit(-1);
}
adds[args[j].long_name] = std::string(argv[i]).substr(2);
found = true;
break;
}else if(args[j].type == ArgType::val_always_sep){
if(++i >= argc) {
std::cout << "Error: flag '" << args[j].long_name << "' requires a value" << std::endl;
exit(-1);
}
adds[args[j].long_name] = argv[i];
found = true;
break;
}
}
}
if(!found){
std::cout << "Error: unknown flag '" << argv[i] << "'" << std::endl;
}
}
} else {
files.push_back(argv[i]);
}
}
}
//Example Usage
/*
int main(int argc, char* argv[]) {
ArgParse args({
Arg('h', "help", ArgType::flag),
Arg('v', "version", ArgType::flag),
Arg('O', "optimize", ArgType::value),
Arg('o', "output", ArgType::val_always_sep),
});
args.parse_args(argc, argv);
for (auto pair : args.adds) {
std::cout << pair.first << " " << pair.second << std::endl;
}
std::cout << "FILES:" << std::endl;
for (int i = 0; i < args.files.size(); i++) {
std::cout << args.files[i] << std::endl;
}
}
*/