mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	embedded v1.0-develop.2 of Clara, which addresses / prefixed options, which should impact non-windows platforms
See #1054
This commit is contained in:
		
							
								
								
									
										23
									
								
								include/external/clara.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								include/external/clara.hpp
									
									
									
									
										vendored
									
									
								
							| @@ -1,4 +1,4 @@ | |||||||
| // v1.0 | // v1.0-develop.2 | ||||||
| // See https://github.com/philsquared/Clara | // See https://github.com/philsquared/Clara | ||||||
|  |  | ||||||
| #ifndef CATCH_CLARA_HPP_INCLUDED | #ifndef CATCH_CLARA_HPP_INCLUDED | ||||||
| @@ -409,6 +409,14 @@ namespace detail { | |||||||
|         std::string token; |         std::string token; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  |     inline auto isOptPrefix( char c ) -> bool { | ||||||
|  |         return c == '-' | ||||||
|  | #ifdef CATCH_PLATFORM_WINDOWS | ||||||
|  |             || c == '/' | ||||||
|  | #endif | ||||||
|  |         ; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     // Abstracts iterators into args as a stream of tokens, with option arguments uniformly handled |     // Abstracts iterators into args as a stream of tokens, with option arguments uniformly handled | ||||||
|     class TokenStream { |     class TokenStream { | ||||||
|         using Iterator = std::vector<std::string>::const_iterator; |         using Iterator = std::vector<std::string>::const_iterator; | ||||||
| @@ -425,7 +433,7 @@ namespace detail { | |||||||
|  |  | ||||||
|             if( it != itEnd ) { |             if( it != itEnd ) { | ||||||
|                 auto const &next = *it; |                 auto const &next = *it; | ||||||
|                 if( next[0] == '-' || next[0] == '/' ) { |                 if( isOptPrefix( next[0] ) ) { | ||||||
|                     auto delimiterPos = next.find_first_of( " :=" ); |                     auto delimiterPos = next.find_first_of( " :=" ); | ||||||
|                     if( delimiterPos != std::string::npos ) { |                     if( delimiterPos != std::string::npos ) { | ||||||
|                         m_tokenBuffer.push_back( { TokenType::Option, next.substr( 0, delimiterPos ) } ); |                         m_tokenBuffer.push_back( { TokenType::Option, next.substr( 0, delimiterPos ) } ); | ||||||
| @@ -915,9 +923,11 @@ namespace detail { | |||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     inline auto normaliseOpt( std::string const &optName ) -> std::string { |     inline auto normaliseOpt( std::string const &optName ) -> std::string { | ||||||
|  | #ifdef CATCH_PLATFORM_WINDOWS | ||||||
|         if( optName[0] == '/' ) |         if( optName[0] == '/' ) | ||||||
|             return "-" + optName.substr( 1 ); |             return "-" + optName.substr( 1 ); | ||||||
|         else |         else | ||||||
|  | #endif | ||||||
|             return optName; |             return optName; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -958,11 +968,7 @@ namespace detail { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         auto isMatch( std::string const &optToken ) const -> bool { |         auto isMatch( std::string const &optToken ) const -> bool { | ||||||
| #ifdef CATCH_PLATFORM_WINDOWS |  | ||||||
|             auto normalisedToken = normaliseOpt( optToken ); |             auto normalisedToken = normaliseOpt( optToken ); | ||||||
| #else |  | ||||||
|             auto const &normalisedToken = optToken; |  | ||||||
| #endif |  | ||||||
|             for( auto const &name : m_optNames ) { |             for( auto const &name : m_optNames ) { | ||||||
|                 if( normaliseOpt( name ) == normalisedToken ) |                 if( normaliseOpt( name ) == normalisedToken ) | ||||||
|                     return true; |                     return true; | ||||||
| @@ -1012,8 +1018,13 @@ namespace detail { | |||||||
|             for( auto const &name : m_optNames ) { |             for( auto const &name : m_optNames ) { | ||||||
|                 if( name.empty() ) |                 if( name.empty() ) | ||||||
|                     return Result::logicError( "Option name cannot be empty" ); |                     return Result::logicError( "Option name cannot be empty" ); | ||||||
|  | #ifdef CATCH_PLATFORM_WINDOWS | ||||||
|                 if( name[0] != '-' && name[0] != '/' ) |                 if( name[0] != '-' && name[0] != '/' ) | ||||||
|                     return Result::logicError( "Option name must begin with '-' or '/'" ); |                     return Result::logicError( "Option name must begin with '-' or '/'" ); | ||||||
|  | #else | ||||||
|  |                 if( name[0] != '-' ) | ||||||
|  |                     return Result::logicError( "Option name must begin with '-'" ); | ||||||
|  | #endif | ||||||
|             } |             } | ||||||
|             return ParserRefImpl::validate(); |             return ParserRefImpl::validate(); | ||||||
|         } |         } | ||||||
|   | |||||||
							
								
								
									
										39
									
								
								third_party/clara.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								third_party/clara.hpp
									
									
									
									
										vendored
									
									
								
							| @@ -1,4 +1,4 @@ | |||||||
| // v1.0 | // v1.0-develop.2 | ||||||
| // See https://github.com/philsquared/Clara | // See https://github.com/philsquared/Clara | ||||||
|  |  | ||||||
| #ifndef CLARA_HPP_INCLUDED | #ifndef CLARA_HPP_INCLUDED | ||||||
| @@ -409,6 +409,14 @@ namespace detail { | |||||||
|         std::string token; |         std::string token; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  |     inline auto isOptPrefix( char c ) -> bool { | ||||||
|  |         return c == '-' | ||||||
|  | #ifdef CLARA_PLATFORM_WINDOWS | ||||||
|  |             || c == '/' | ||||||
|  | #endif | ||||||
|  |         ; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     // Abstracts iterators into args as a stream of tokens, with option arguments uniformly handled |     // Abstracts iterators into args as a stream of tokens, with option arguments uniformly handled | ||||||
|     class TokenStream { |     class TokenStream { | ||||||
|         using Iterator = std::vector<std::string>::const_iterator; |         using Iterator = std::vector<std::string>::const_iterator; | ||||||
| @@ -425,7 +433,7 @@ namespace detail { | |||||||
|  |  | ||||||
|             if( it != itEnd ) { |             if( it != itEnd ) { | ||||||
|                 auto const &next = *it; |                 auto const &next = *it; | ||||||
|                 if( next[0] == '-' || next[0] == '/' ) { |                 if( isOptPrefix( next[0] ) ) { | ||||||
|                     auto delimiterPos = next.find_first_of( " :=" ); |                     auto delimiterPos = next.find_first_of( " :=" ); | ||||||
|                     if( delimiterPos != std::string::npos ) { |                     if( delimiterPos != std::string::npos ) { | ||||||
|                         m_tokenBuffer.push_back( { TokenType::Option, next.substr( 0, delimiterPos ) } ); |                         m_tokenBuffer.push_back( { TokenType::Option, next.substr( 0, delimiterPos ) } ); | ||||||
| @@ -915,9 +923,11 @@ namespace detail { | |||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     inline auto normaliseOpt( std::string const &optName ) -> std::string { |     inline auto normaliseOpt( std::string const &optName ) -> std::string { | ||||||
|  | #ifdef CLARA_PLATFORM_WINDOWS | ||||||
|         if( optName[0] == '/' ) |         if( optName[0] == '/' ) | ||||||
|             return "-" + optName.substr( 1 ); |             return "-" + optName.substr( 1 ); | ||||||
|         else |         else | ||||||
|  | #endif | ||||||
|             return optName; |             return optName; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -958,11 +968,7 @@ namespace detail { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         auto isMatch( std::string const &optToken ) const -> bool { |         auto isMatch( std::string const &optToken ) const -> bool { | ||||||
| #ifdef CLARA_PLATFORM_WINDOWS |  | ||||||
|             auto normalisedToken = normaliseOpt( optToken ); |             auto normalisedToken = normaliseOpt( optToken ); | ||||||
| #else |  | ||||||
|             auto const &normalisedToken = optToken; |  | ||||||
| #endif |  | ||||||
|             for( auto const &name : m_optNames ) { |             for( auto const &name : m_optNames ) { | ||||||
|                 if( normaliseOpt( name ) == normalisedToken ) |                 if( normaliseOpt( name ) == normalisedToken ) | ||||||
|                     return true; |                     return true; | ||||||
| @@ -1012,8 +1018,13 @@ namespace detail { | |||||||
|             for( auto const &name : m_optNames ) { |             for( auto const &name : m_optNames ) { | ||||||
|                 if( name.empty() ) |                 if( name.empty() ) | ||||||
|                     return Result::logicError( "Option name cannot be empty" ); |                     return Result::logicError( "Option name cannot be empty" ); | ||||||
|  | #ifdef CLARA_PLATFORM_WINDOWS | ||||||
|                 if( name[0] != '-' && name[0] != '/' ) |                 if( name[0] != '-' && name[0] != '/' ) | ||||||
|                     return Result::logicError( "Option name must begin with '-' or '/'" ); |                     return Result::logicError( "Option name must begin with '-' or '/'" ); | ||||||
|  | #else | ||||||
|  |                 if( name[0] != '-' ) | ||||||
|  |                     return Result::logicError( "Option name must begin with '-'" ); | ||||||
|  | #endif | ||||||
|             } |             } | ||||||
|             return ParserRefImpl::validate(); |             return ParserRefImpl::validate(); | ||||||
|         } |         } | ||||||
| @@ -1142,10 +1153,15 @@ namespace detail { | |||||||
|                 size_t count = 0; |                 size_t count = 0; | ||||||
|             }; |             }; | ||||||
|             const size_t totalParsers = m_options.size() + m_args.size(); |             const size_t totalParsers = m_options.size() + m_args.size(); | ||||||
|             ParserInfo parseInfos[totalParsers]; |             assert( totalParsers < 512 ); | ||||||
|             size_t i = 0; |             // ParserInfo parseInfos[totalParsers]; // <-- this is what we really want to do | ||||||
|             for( auto const& opt : m_options ) parseInfos[i++].parser = &opt; |             ParserInfo parseInfos[512]; | ||||||
|             for( auto const& arg : m_args ) parseInfos[i++].parser = &arg; |  | ||||||
|  |             { | ||||||
|  |                 size_t i = 0; | ||||||
|  |                 for (auto const &opt : m_options) parseInfos[i++].parser = &opt; | ||||||
|  |                 for (auto const &arg : m_args) parseInfos[i++].parser = &arg; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             m_exeName.set( exeName ); |             m_exeName.set( exeName ); | ||||||
|  |  | ||||||
| @@ -1153,7 +1169,8 @@ namespace detail { | |||||||
|             while( result.value().remainingTokens() ) { |             while( result.value().remainingTokens() ) { | ||||||
|                 bool tokenParsed = false; |                 bool tokenParsed = false; | ||||||
|  |  | ||||||
|                 for( auto& parseInfo : parseInfos ) { |                 for( size_t i = 0; i < totalParsers; ++i ) { | ||||||
|  |                     auto&  parseInfo = parseInfos[i]; | ||||||
|                     if( parseInfo.parser->cardinality() == 0 || parseInfo.count < parseInfo.parser->cardinality() ) { |                     if( parseInfo.parser->cardinality() == 0 || parseInfo.count < parseInfo.parser->cardinality() ) { | ||||||
|                         result = parseInfo.parser->parse(exeName, result.value().remainingTokens()); |                         result = parseInfo.parser->parse(exeName, result.value().remainingTokens()); | ||||||
|                         if (!result) |                         if (!result) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Phil Nash
					Phil Nash