| // |
| // Copyright 2019 The Abseil Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| // ----------------------------------------------------------------------------- |
| // File: parse.h |
| // ----------------------------------------------------------------------------- |
| // |
| // This file defines the main parsing function for Abseil flags: |
| // `absl::ParseCommandLine()`. |
| |
| #ifndef ABSL_FLAGS_PARSE_H_ |
| #define ABSL_FLAGS_PARSE_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include "absl/base/config.h" |
| #include "absl/flags/internal/parse.h" |
| |
| namespace absl { |
| ABSL_NAMESPACE_BEGIN |
| |
| // This type represent information about an unrecognized flag in the command |
| // line. |
| struct UnrecognizedFlag { |
| enum Source { kFromArgv, kFromFlagfile }; |
| |
| explicit UnrecognizedFlag(Source s, absl::string_view f) |
| : source(s), flag_name(f) {} |
| // This field indicates where we found this flag: on the original command line |
| // or read in some flag file. |
| Source source; |
| // Name of the flag we did not recognize in --flag_name=value or --flag_name. |
| std::string flag_name; |
| }; |
| |
| inline bool operator==(const UnrecognizedFlag& lhs, |
| const UnrecognizedFlag& rhs) { |
| return lhs.source == rhs.source && lhs.flag_name == rhs.flag_name; |
| } |
| |
| namespace flags_internal { |
| |
| HelpMode ParseAbseilFlagsOnlyImpl( |
| int argc, char* argv[], std::vector<char*>& positional_args, |
| std::vector<UnrecognizedFlag>& unrecognized_flags, |
| UsageFlagsAction usage_flag_action); |
| |
| } // namespace flags_internal |
| |
| // ParseAbseilFlagsOnly() |
| // |
| // Parses a list of command-line arguments, passed in the `argc` and `argv[]` |
| // parameters, into a set of Abseil Flag values, returning any unparsed |
| // arguments in `positional_args` and `unrecognized_flags` output parameters. |
| // |
| // This function classifies all the arguments (including content of the |
| // flagfiles, if any) into one of the following groups: |
| // |
| // * arguments specified as "--flag=value" or "--flag value" that match |
| // registered or built-in Abseil Flags. These are "Abseil Flag arguments." |
| // * arguments specified as "--flag" that are unrecognized as Abseil Flags |
| // * arguments that are not specified as "--flag" are positional arguments |
| // * arguments that follow the flag-terminating delimiter (`--`) are also |
| // treated as positional arguments regardless of their syntax. |
| // |
| // All of the deduced Abseil Flag arguments are then parsed into their |
| // corresponding flag values. If any syntax errors are found in these arguments, |
| // the binary exits with code 1. |
| // |
| // This function also handles Abseil Flags built-in usage flags (e.g. --help) |
| // if any were present on the command line. |
| // |
| // All the remaining positional arguments including original program name |
| // (argv[0]) are are returned in the `positional_args` output parameter. |
| // |
| // All unrecognized flags that are not otherwise ignored are returned in the |
| // `unrecognized_flags` output parameter. Note that the special `undefok` |
| // flag allows you to specify flags which can be safely ignored; `undefok` |
| // specifies these flags as a comma-separated list. Any unrecognized flags |
| // that appear within `undefok` will therefore be ignored and not included in |
| // the `unrecognized_flag` output parameter. |
| // |
| void ParseAbseilFlagsOnly(int argc, char* argv[], |
| std::vector<char*>& positional_args, |
| std::vector<UnrecognizedFlag>& unrecognized_flags); |
| |
| // ReportUnrecognizedFlags() |
| // |
| // Reports an error to `stderr` for all non-ignored unrecognized flags in |
| // the provided `unrecognized_flags` list. |
| void ReportUnrecognizedFlags( |
| const std::vector<UnrecognizedFlag>& unrecognized_flags); |
| |
| // ParseCommandLine() |
| // |
| // First parses Abseil Flags only from the command line according to the |
| // description in `ParseAbseilFlagsOnly`. In addition this function handles |
| // unrecognized and usage flags. |
| // |
| // If any unrecognized flags are located they are reported using |
| // `ReportUnrecognizedFlags`. |
| // |
| // If any errors detected during command line parsing, this routine reports a |
| // usage message and aborts the program. |
| // |
| // If any built-in usage flags were specified on the command line (e.g. |
| // `--help`), this function reports help messages and then gracefully exits the |
| // program. |
| // |
| // This function returns all the remaining positional arguments collected by |
| // `ParseAbseilFlagsOnly`. |
| std::vector<char*> ParseCommandLine(int argc, char* argv[]); |
| |
| ABSL_NAMESPACE_END |
| } // namespace absl |
| |
| #endif // ABSL_FLAGS_PARSE_H_ |