111c03c6dSDamjan Jovanovic /************************************************************** 211c03c6dSDamjan Jovanovic * 311c03c6dSDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one 411c03c6dSDamjan Jovanovic * or more contributor license agreements. See the NOTICE file 511c03c6dSDamjan Jovanovic * distributed with this work for additional information 611c03c6dSDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file 711c03c6dSDamjan Jovanovic * to you under the Apache License, Version 2.0 (the 811c03c6dSDamjan Jovanovic * "License"); you may not use this file except in compliance 911c03c6dSDamjan Jovanovic * with the License. You may obtain a copy of the License at 1011c03c6dSDamjan Jovanovic * 1111c03c6dSDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0 1211c03c6dSDamjan Jovanovic * 1311c03c6dSDamjan Jovanovic * Unless required by applicable law or agreed to in writing, 1411c03c6dSDamjan Jovanovic * software distributed under the License is distributed on an 1511c03c6dSDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 1611c03c6dSDamjan Jovanovic * KIND, either express or implied. See the License for the 1711c03c6dSDamjan Jovanovic * specific language governing permissions and limitations 1811c03c6dSDamjan Jovanovic * under the License. 1911c03c6dSDamjan Jovanovic * 2011c03c6dSDamjan Jovanovic *************************************************************/ 2111c03c6dSDamjan Jovanovic 2211c03c6dSDamjan Jovanovic 2311c03c6dSDamjan Jovanovic 2411c03c6dSDamjan Jovanovic #ifndef CSV_COMMANDLINE_HXX 2511c03c6dSDamjan Jovanovic #define CSV_COMMANDLINE_HXX 2611c03c6dSDamjan Jovanovic 2711c03c6dSDamjan Jovanovic #include <cosv/string.hxx> 2811c03c6dSDamjan Jovanovic 2911c03c6dSDamjan Jovanovic 3011c03c6dSDamjan Jovanovic 3111c03c6dSDamjan Jovanovic 3211c03c6dSDamjan Jovanovic namespace csv 3311c03c6dSDamjan Jovanovic { 3411c03c6dSDamjan Jovanovic 3511c03c6dSDamjan Jovanovic /** Does the standards in handling command line parameters. 3611c03c6dSDamjan Jovanovic 3711c03c6dSDamjan Jovanovic This class provides a default behaviour this way: 3811c03c6dSDamjan Jovanovic 3911c03c6dSDamjan Jovanovic * Each option can have several forms 4011c03c6dSDamjan Jovanovic 4111c03c6dSDamjan Jovanovic like: "-f" and "--file" 4211c03c6dSDamjan Jovanovic 4311c03c6dSDamjan Jovanovic which are identified by having the same id. 4411c03c6dSDamjan Jovanovic The option id is used when calling ->do_HandleOption(). 4511c03c6dSDamjan Jovanovic 4611c03c6dSDamjan Jovanovic * For each recognized option together with its parameters 4711c03c6dSDamjan Jovanovic ->do_HandleOption() is called. 4811c03c6dSDamjan Jovanovic 4911c03c6dSDamjan Jovanovic * For the first unrecognized argument ->do_HandleFreeArgument() is 5011c03c6dSDamjan Jovanovic called. 5111c03c6dSDamjan Jovanovic After the first unrecognized argument, ->do_HandleFreeArgument() 5211c03c6dSDamjan Jovanovic is called for all remaining arguments. 5311c03c6dSDamjan Jovanovic 5411c03c6dSDamjan Jovanovic @howtoderive 5511c03c6dSDamjan Jovanovic - Overwrite ->do_HandleOption() to act on all known options. 5611c03c6dSDamjan Jovanovic Overwrite ->do_HandleFreeArgument() to act on additional 5711c03c6dSDamjan Jovanovic arguments not connected to an option. 5811c03c6dSDamjan Jovanovic */ 5911c03c6dSDamjan Jovanovic class CommandLine 6011c03c6dSDamjan Jovanovic { 6111c03c6dSDamjan Jovanovic public: 6211c03c6dSDamjan Jovanovic // LIFECYCLE 6311c03c6dSDamjan Jovanovic virtual ~CommandLine() {} 6411c03c6dSDamjan Jovanovic 6511c03c6dSDamjan Jovanovic // OPERATIONS 6611c03c6dSDamjan Jovanovic bool Interpret( 6711c03c6dSDamjan Jovanovic int argc, 6811c03c6dSDamjan Jovanovic char * argv[] ); 6911c03c6dSDamjan Jovanovic // INQUIRY 7011c03c6dSDamjan Jovanovic const StringVector & 7111c03c6dSDamjan Jovanovic Arguments() const; 7211c03c6dSDamjan Jovanovic bool IsOk() const; 7311c03c6dSDamjan Jovanovic 7411c03c6dSDamjan Jovanovic protected: 7511c03c6dSDamjan Jovanovic CommandLine(); 7611c03c6dSDamjan Jovanovic void Add_Option( 7711c03c6dSDamjan Jovanovic intt i_id, 7811c03c6dSDamjan Jovanovic String i_text ); 7911c03c6dSDamjan Jovanovic void Set_Error(); 8011c03c6dSDamjan Jovanovic 8111c03c6dSDamjan Jovanovic private: 8211c03c6dSDamjan Jovanovic // public for use by struct commandline.cxx-anonymous::FindOptionByText; 8311c03c6dSDamjan Jovanovic struct OptionDescription 8411c03c6dSDamjan Jovanovic { 8511c03c6dSDamjan Jovanovic intt nId; 8611c03c6dSDamjan Jovanovic String sText; 8711c03c6dSDamjan Jovanovic 8811c03c6dSDamjan Jovanovic OptionDescription( 8911c03c6dSDamjan Jovanovic intt i_id, 9011c03c6dSDamjan Jovanovic String i_text ); 9111c03c6dSDamjan Jovanovic }; private: 9211c03c6dSDamjan Jovanovic 9311c03c6dSDamjan Jovanovic struct FindOptionByText; 9411c03c6dSDamjan Jovanovic 9511c03c6dSDamjan Jovanovic typedef std::vector<OptionDescription> OptionList; 9611c03c6dSDamjan Jovanovic typedef std::vector<StringVector::const_iterator> StringCIteratorList; 9711c03c6dSDamjan Jovanovic typedef std::vector<intt> OptionIdList; 9811c03c6dSDamjan Jovanovic 9911c03c6dSDamjan Jovanovic // Locals 10011c03c6dSDamjan Jovanovic void Get_Arguments( 10111c03c6dSDamjan Jovanovic int argc, 10211c03c6dSDamjan Jovanovic char * argv[] ); 10311c03c6dSDamjan Jovanovic intt Find_Option( 10411c03c6dSDamjan Jovanovic const String & i_text ) const; 10511c03c6dSDamjan Jovanovic bool Store_Argument( 10611c03c6dSDamjan Jovanovic const String & i_arg ); 10711c03c6dSDamjan Jovanovic void Find_OptionPoints(); 10811c03c6dSDamjan Jovanovic void Handle_FreeArguments( 10911c03c6dSDamjan Jovanovic StringVector::const_iterator 11011c03c6dSDamjan Jovanovic i_begin, 11111c03c6dSDamjan Jovanovic StringVector::const_iterator 11211c03c6dSDamjan Jovanovic i_end ); 11311c03c6dSDamjan Jovanovic 11411c03c6dSDamjan Jovanovic // Helpers for options included via file 11511c03c6dSDamjan Jovanovic bool Try2Include_Options( 11611c03c6dSDamjan Jovanovic const String & i_optionsFile ); 11711c03c6dSDamjan Jovanovic bool Include_Options( 11811c03c6dSDamjan Jovanovic const String & i_optionsFile ); 11911c03c6dSDamjan Jovanovic bool Load_Options( 12011c03c6dSDamjan Jovanovic StreamStr & o_text, 12111c03c6dSDamjan Jovanovic const String & i_optionsFile ); 12211c03c6dSDamjan Jovanovic 12311c03c6dSDamjan Jovanovic /** Handles an option found in the command line. 12411c03c6dSDamjan Jovanovic Needs to be overwritten. 12511c03c6dSDamjan Jovanovic 12611c03c6dSDamjan Jovanovic @return 12711c03c6dSDamjan Jovanovic The first argument within the range 128*49333635SJohn Bampton i_next_argument .. i_commandLine_end that does not belong as a 12911c03c6dSDamjan Jovanovic parameter to the handled option. 13011c03c6dSDamjan Jovanovic */ 13111c03c6dSDamjan Jovanovic virtual StringVector::const_iterator 13211c03c6dSDamjan Jovanovic do_HandleOption( 13311c03c6dSDamjan Jovanovic intt i_id, 13411c03c6dSDamjan Jovanovic StringVector::const_iterator 13511c03c6dSDamjan Jovanovic i_paramsBegin, 13611c03c6dSDamjan Jovanovic StringVector::const_iterator 13711c03c6dSDamjan Jovanovic i_paramsEnd ) = 0; 13811c03c6dSDamjan Jovanovic /** Handles arguments on the command line that do not belong to 13911c03c6dSDamjan Jovanovic an option. 14011c03c6dSDamjan Jovanovic */ 14111c03c6dSDamjan Jovanovic virtual void do_HandleFreeArgument( 14211c03c6dSDamjan Jovanovic const String & i_argument ) = 0; 14311c03c6dSDamjan Jovanovic // DATA 14411c03c6dSDamjan Jovanovic OptionList aOptions; 14511c03c6dSDamjan Jovanovic 14611c03c6dSDamjan Jovanovic /// Used during and after ->GetArguments() 14711c03c6dSDamjan Jovanovic StringVector aCommandLine; 14811c03c6dSDamjan Jovanovic StringCIteratorList aOptionPoints; 14911c03c6dSDamjan Jovanovic OptionIdList aOptionIds; 15011c03c6dSDamjan Jovanovic bool bIsOk; 15111c03c6dSDamjan Jovanovic }; 15211c03c6dSDamjan Jovanovic 15311c03c6dSDamjan Jovanovic 15411c03c6dSDamjan Jovanovic inline const StringVector & 15511c03c6dSDamjan Jovanovic CommandLine::Arguments() const 15611c03c6dSDamjan Jovanovic { 15711c03c6dSDamjan Jovanovic return aCommandLine; 15811c03c6dSDamjan Jovanovic } 15911c03c6dSDamjan Jovanovic 16011c03c6dSDamjan Jovanovic inline bool 16111c03c6dSDamjan Jovanovic CommandLine::IsOk() const 16211c03c6dSDamjan Jovanovic { 16311c03c6dSDamjan Jovanovic return bIsOk; 16411c03c6dSDamjan Jovanovic } 16511c03c6dSDamjan Jovanovic 16611c03c6dSDamjan Jovanovic inline void 16711c03c6dSDamjan Jovanovic CommandLine::Set_Error() 16811c03c6dSDamjan Jovanovic { 16911c03c6dSDamjan Jovanovic bIsOk = false; 17011c03c6dSDamjan Jovanovic } 17111c03c6dSDamjan Jovanovic 17211c03c6dSDamjan Jovanovic 17311c03c6dSDamjan Jovanovic 17411c03c6dSDamjan Jovanovic 17511c03c6dSDamjan Jovanovic } // namespace csv 17611c03c6dSDamjan Jovanovic #endif 177