-
Notifications
You must be signed in to change notification settings - Fork 53
/
flags.cpp
154 lines (134 loc) · 4.33 KB
/
flags.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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
//
// Created by Ameen Maali on 6/1/20.
//
#include <array>
#include <iostream>
#include <vector>
#include "flags.hpp"
// clang-format off
const auto flags = std::array {
Flag{
.short_name="-h",
.long_name="--help",
.usage="Usage/help info for urldedupe",
.required=false,
.is_switch=true },
Flag{
.short_name="-u",
.long_name="--urls",
.usage="Filename containing urls (use this if you don't pipe urls via stdin)",
.required=false,
.is_switch=false },
Flag{
.short_name="-V",
.long_name="--version",
.usage="Get current version for urldedupe",
.required=false,
.is_switch=true },
Flag{
.short_name="-r",
.long_name="--regex-parse",
.usage="This is significantly slower than normal parsing, but may be more thorough or accurate",
.required=false,
.is_switch=true },
Flag{
.short_name="-s",
.long_name="--similar",
.usage="Remove similar URLs (based on integers and image/font files) - i.e. /api/user/1 & /api/user/2 deduplicated",
.required=false,
.is_switch=true },
Flag{
.short_name="-qs",
.long_name="--query-strings-only",
.usage="Only include URLs if they have query strings",
.required=false,
.is_switch=true },
Flag{
.short_name="-ne",
.long_name="--no-extensions",
.usage="Do not include URLs if they have an extension (i.e. .png, .jpg, .woff, .js, .html)",
.required=false,
.is_switch=true },
Flag{
.short_name="-m",
.long_name="--mode",
.usage="The mode/filters to be enabled (can be 1 or more, comma separated). Default is none, available options are the other flags (--mode \"r,s,qs,ne\")",
.required=false,
.is_switch=false },
};
// clang-format on
std::vector<Option> parse_flags(int argc, char **argv)
{
std::vector<Option> options {};
for (int i {0}; i < argc; i++)
{
for (const auto &flag: flags)
{
if (argv[i] == flag.short_name || argv[i] == flag.long_name)
{
if (i + 1 >= argc && !flag.is_switch)
{
std::cerr << "Flag " << flag.long_name << " exists, but requires a value" << std::endl;
continue;
}
Option opt;
if (!flag.is_switch)
{
opt = {.flag = flag, .value = argv[i + 1]};
}
else
{
opt = {.flag = flag, .value = ""};
}
options.push_back(opt);
}
}
}
return options;
}
void parse_cli_options(const Option &option, CliOptions &cli_options)
{
if (option.flag.short_name == "-u")
cli_options.filename = option.value;
if (option.flag.short_name == "-r")
cli_options.regex_mode = true;
if (option.flag.short_name == "-s")
cli_options.similar_mode = true;
if (option.flag.short_name == "-qs")
cli_options.query_strings_only = true;
if (option.flag.short_name == "-ne")
cli_options.no_extensions_only = true;
if (option.flag.short_name == "-m")
{
std::string mode {option.value};
if (mode.empty())
return;
size_t current;
std::string token {};
mode += ',';
while ((current = mode.find(',')) != std::string::npos)
{
token = mode.substr(0, current);
mode.erase(0, current + 1);
if (token == "r" || token == "regex-mode")
cli_options.regex_mode = true;
if (token == "s" || token == "similar")
cli_options.similar_mode = true;
if (token == "qs" || token == "query-strings-only")
cli_options.query_strings_only = true;
if (token == "ne" || token == "no-extensions")
cli_options.no_extensions_only = true;
}
}
}
void print_version(const std::string &version)
{
std::cout << "Current urldedupe version is " << version << std::endl;
}
void print_usage()
{
for (const auto &flag: flags)
{
std::cout << "(" << flag.short_name << "|" << flag.long_name << ") - " << flag.usage << std::endl;
}
}