/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 * * http://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. * *************************************************************/ #ifndef CSV_COMMANDLINE_HXX #define CSV_COMMANDLINE_HXX #include namespace csv { /** Does the standards in handling command line parameters. This class provides a default behaviour this way: * Each option can have several forms like: "-f" and "--file" which are identified by having the same id. The option id is used when calling ->do_HandleOption(). * For each recognized option together with its parameters ->do_HandleOption() is called. * For the first unrecognized argument ->do_HandleFreeArgument() is called. After the first unrecognized argument, ->do_HandleFreeArgument() is called for all remaining arguments. @howtoderive - Overwrite ->do_HandleOption() to act on all known options. Overwrite ->do_HandleFreeArgument() to act on additional arguments not connected to an option. */ class CommandLine { public: // LIFECYCLE virtual ~CommandLine() {} // OPERATIONS bool Interpret( int argc, char * argv[] ); // INQUIRY const StringVector & Arguments() const; bool IsOk() const; protected: CommandLine(); void Add_Option( intt i_id, String i_text ); void Set_Error(); private: // public for use by struct commandline.cxx-anonymous::FindOptionByText; struct OptionDescription { intt nId; String sText; OptionDescription( intt i_id, String i_text ); }; private: struct FindOptionByText; typedef std::vector OptionList; typedef std::vector StringCIteratorList; typedef std::vector OptionIdList; // Locals void Get_Arguments( int argc, char * argv[] ); intt Find_Option( const String & i_text ) const; bool Store_Argument( const String & i_arg ); void Find_OptionPoints(); void Handle_FreeArguments( StringVector::const_iterator i_begin, StringVector::const_iterator i_end ); // Helpers for options included via file bool Try2Include_Options( const String & i_optionsFile ); bool Include_Options( const String & i_optionsFile ); bool Load_Options( StreamStr & o_text, const String & i_optionsFile ); /** Handles an option found in the command line. Needs to be overwritten. @return The first argument within the range i_next_argument .. i_comandLine_end that does not belong as a parameter to the handled option. */ virtual StringVector::const_iterator do_HandleOption( intt i_id, StringVector::const_iterator i_paramsBegin, StringVector::const_iterator i_paramsEnd ) = 0; /** Handles arguments on the command line that do not belong to an option. */ virtual void do_HandleFreeArgument( const String & i_argument ) = 0; // DATA OptionList aOptions; /// Used during and after ->GetArguments() StringVector aCommandLine; StringCIteratorList aOptionPoints; OptionIdList aOptionIds; bool bIsOk; }; inline const StringVector & CommandLine::Arguments() const { return aCommandLine; } inline bool CommandLine::IsOk() const { return bIsOk; } inline void CommandLine::Set_Error() { bIsOk = false; } } // namespace csv #endif