Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes option parsing on C++ libs that match EOL differently #136

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

ttuggle
Copy link

@ttuggle ttuggle commented Jul 27, 2020

The following fragment does not match between docopt.cpp and docopt:

Usage:
    myprog [options] <command> <arguments>...

Options:
  --reallylongoption <super_long_argument_description>
                This option fails to capture the argument on some
                C++ libs where $ does not match EOL.
                See https://stackoverflow.com/questions/39645660/stdregex-to-match-begin-end-of-string
                For some discussion and the inspiration to fix it by adding the \n.

@ttuggle ttuggle marked this pull request as ready for review July 27, 2020 21:45
@ttuggle
Copy link
Author

ttuggle commented Jul 27, 2020

FYI, this does include the code from #109

@ttuggle
Copy link
Author

ttuggle commented Jul 27, 2020

The pull request in #109 fixes problems parsing something like this, which does parse in Python.

usage:
    myprog [options] <file>


options:
    --fail      This arg unfortunately fails to process
                because there are two newlines preceeding
                the options section.

@@ -171,7 +171,7 @@ static std::vector<std::string> parse_section(std::string const& name, std::stri
"(?:^|\\n)" // anchored at a linebreak (or start of string)
"("
"[^\\n]*" + name + "[^\\n]*(?=\\n?)" // a line that contains the name
"(?:\\n[ \\t].*?(?=\\n|$))*" // followed by any number of lines that are indented
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the issue that it won't match just a newline (without spaces)?

@@ -532,7 +532,7 @@ namespace docopt {
options_end = option_description.begin() + static_cast<std::ptrdiff_t>(double_space);
}

static const std::regex pattern {"(-{1,2})?(.*?)([,= ]|$)"};
static const std::regex pattern {"(-{1,2})?(.*?)([,= ]|$|\n)"};
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The |$ should match a newline right?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants