Skip to content

Commit

Permalink
Store index of args in raw CL input in ParsedArgument
Browse files Browse the repository at this point in the history
This change reflects the same idea implemented in ParsedOption
  • Loading branch information
daljit46 committed Jun 7, 2024
1 parent 3e9d50e commit c3eeefe
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 11 deletions.
6 changes: 3 additions & 3 deletions core/app.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -886,20 +886,20 @@ const Option *match_option(std::string_view arg) {
void sort_arguments(const std::vector<std::string> &arguments) {
auto it = arguments.begin();
while (it != arguments.end()) {
const size_t index = std::distance(arguments.begin(), it);
const Option *opt = match_option(*it);
if (opt != nullptr) {
if (it + opt->size() >= arguments.end()) {
throw Exception(std::string("not enough parameters to option \"-") + opt->id + "\"");
}

const size_t index = std::distance(arguments.begin(), it);
std::vector<std::string> option_args;
std::copy_n(it + 1, opt->size(), std::back_inserter(option_args));
std::transform(option_args.begin(), option_args.end(), option_args.begin(), without_leading_dash);
option.push_back(ParsedOption(opt, option_args, index));
it += opt->size();
} else {
argument.push_back(ParsedArgument(nullptr, nullptr, *it));
argument.push_back(ParsedArgument(nullptr, nullptr, *it, index));
}
++it;
}
Expand Down Expand Up @@ -1400,7 +1400,7 @@ ParsedOption::ParsedOption(const Option *option, const std::vector<std::string>

ParsedArgument ParsedOption::operator[](size_t num) const {
assert(num < opt->size());
return ParsedArgument(opt, &(*opt)[num], args[num]);
return ParsedArgument(opt, &(*opt)[num], args[num], index + num + 1);
}

bool ParsedOption::operator==(const char *match) const {
Expand Down
4 changes: 4 additions & 0 deletions core/app.h
Original file line number Diff line number Diff line change
Expand Up @@ -168,10 +168,14 @@ class ParsedArgument {

const char *c_str() const { return p.c_str(); }

//! the index of this argument in the raw command-line arguments list
size_t index() const { return index_; }

private:
const Option *opt;
const Argument *arg;
std::string p;
size_t index_;

ParsedArgument(const Option *option, const Argument *argument, std::string text, size_t index);

Expand Down
9 changes: 1 addition & 8 deletions src/gui/mrview/window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -721,14 +721,7 @@ void Window::parse_arguments() {
if (!MR::App::argument.empty()) {
if (!MR::App::option.empty()) {
// check that first non-standard option appears after last argument:
const auto last_arg = std::find(
MR::App::raw_arguments_list.rbegin(), MR::App::raw_arguments_list.rend(), MR::App::argument.back().c_str());

if (last_arg == MR::App::raw_arguments_list.rend()) {
throw Exception("FIXME: error determining position of last argument!");
}

const auto last_arg_pos = std::distance(last_arg, MR::App::raw_arguments_list.rend()) - 1;
const auto last_arg_pos = MR::App::argument.back().index();

const auto is_non_standard_option = [](const MR::App::ParsedOption &option) {
return std::none_of(MR::App::__standard_options.begin(),
Expand Down

0 comments on commit c3eeefe

Please sign in to comment.