1*11c03c6dSDamjan Jovanovic /************************************************************** 2*11c03c6dSDamjan Jovanovic * 3*11c03c6dSDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one 4*11c03c6dSDamjan Jovanovic * or more contributor license agreements. See the NOTICE file 5*11c03c6dSDamjan Jovanovic * distributed with this work for additional information 6*11c03c6dSDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file 7*11c03c6dSDamjan Jovanovic * to you under the Apache License, Version 2.0 (the 8*11c03c6dSDamjan Jovanovic * "License"); you may not use this file except in compliance 9*11c03c6dSDamjan Jovanovic * with the License. You may obtain a copy of the License at 10*11c03c6dSDamjan Jovanovic * 11*11c03c6dSDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0 12*11c03c6dSDamjan Jovanovic * 13*11c03c6dSDamjan Jovanovic * Unless required by applicable law or agreed to in writing, 14*11c03c6dSDamjan Jovanovic * software distributed under the License is distributed on an 15*11c03c6dSDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*11c03c6dSDamjan Jovanovic * KIND, either express or implied. See the License for the 17*11c03c6dSDamjan Jovanovic * specific language governing permissions and limitations 18*11c03c6dSDamjan Jovanovic * under the License. 19*11c03c6dSDamjan Jovanovic * 20*11c03c6dSDamjan Jovanovic *************************************************************/ 21*11c03c6dSDamjan Jovanovic 22*11c03c6dSDamjan Jovanovic 23*11c03c6dSDamjan Jovanovic 24*11c03c6dSDamjan Jovanovic #ifndef CSV_COMMANDLINE_HXX 25*11c03c6dSDamjan Jovanovic #define CSV_COMMANDLINE_HXX 26*11c03c6dSDamjan Jovanovic 27*11c03c6dSDamjan Jovanovic #include <cosv/string.hxx> 28*11c03c6dSDamjan Jovanovic 29*11c03c6dSDamjan Jovanovic 30*11c03c6dSDamjan Jovanovic 31*11c03c6dSDamjan Jovanovic 32*11c03c6dSDamjan Jovanovic namespace csv 33*11c03c6dSDamjan Jovanovic { 34*11c03c6dSDamjan Jovanovic 35*11c03c6dSDamjan Jovanovic /** Does the standards in handling command line parameters. 36*11c03c6dSDamjan Jovanovic 37*11c03c6dSDamjan Jovanovic This class provides a default behaviour this way: 38*11c03c6dSDamjan Jovanovic 39*11c03c6dSDamjan Jovanovic * Each option can have several forms 40*11c03c6dSDamjan Jovanovic 41*11c03c6dSDamjan Jovanovic like: "-f" and "--file" 42*11c03c6dSDamjan Jovanovic 43*11c03c6dSDamjan Jovanovic which are identified by having the same id. 44*11c03c6dSDamjan Jovanovic The option id is used when calling ->do_HandleOption(). 45*11c03c6dSDamjan Jovanovic 46*11c03c6dSDamjan Jovanovic * For each recognized option together with its parameters 47*11c03c6dSDamjan Jovanovic ->do_HandleOption() is called. 48*11c03c6dSDamjan Jovanovic 49*11c03c6dSDamjan Jovanovic * For the first unrecognized argument ->do_HandleFreeArgument() is 50*11c03c6dSDamjan Jovanovic called. 51*11c03c6dSDamjan Jovanovic After the first unrecognized argument, ->do_HandleFreeArgument() 52*11c03c6dSDamjan Jovanovic is called for all remaining arguments. 53*11c03c6dSDamjan Jovanovic 54*11c03c6dSDamjan Jovanovic @howtoderive 55*11c03c6dSDamjan Jovanovic - Overwrite ->do_HandleOption() to act on all known options. 56*11c03c6dSDamjan Jovanovic Overwrite ->do_HandleFreeArgument() to act on additional 57*11c03c6dSDamjan Jovanovic arguments not connected to an option. 58*11c03c6dSDamjan Jovanovic */ 59*11c03c6dSDamjan Jovanovic class CommandLine 60*11c03c6dSDamjan Jovanovic { 61*11c03c6dSDamjan Jovanovic public: 62*11c03c6dSDamjan Jovanovic // LIFECYCLE 63*11c03c6dSDamjan Jovanovic virtual ~CommandLine() {} 64*11c03c6dSDamjan Jovanovic 65*11c03c6dSDamjan Jovanovic // OPERATIONS 66*11c03c6dSDamjan Jovanovic bool Interpret( 67*11c03c6dSDamjan Jovanovic int argc, 68*11c03c6dSDamjan Jovanovic char * argv[] ); 69*11c03c6dSDamjan Jovanovic // INQUIRY 70*11c03c6dSDamjan Jovanovic const StringVector & 71*11c03c6dSDamjan Jovanovic Arguments() const; 72*11c03c6dSDamjan Jovanovic bool IsOk() const; 73*11c03c6dSDamjan Jovanovic 74*11c03c6dSDamjan Jovanovic protected: 75*11c03c6dSDamjan Jovanovic CommandLine(); 76*11c03c6dSDamjan Jovanovic void Add_Option( 77*11c03c6dSDamjan Jovanovic intt i_id, 78*11c03c6dSDamjan Jovanovic String i_text ); 79*11c03c6dSDamjan Jovanovic void Set_Error(); 80*11c03c6dSDamjan Jovanovic 81*11c03c6dSDamjan Jovanovic private: 82*11c03c6dSDamjan Jovanovic // public for use by struct commandline.cxx-anonymous::FindOptionByText; 83*11c03c6dSDamjan Jovanovic struct OptionDescription 84*11c03c6dSDamjan Jovanovic { 85*11c03c6dSDamjan Jovanovic intt nId; 86*11c03c6dSDamjan Jovanovic String sText; 87*11c03c6dSDamjan Jovanovic 88*11c03c6dSDamjan Jovanovic OptionDescription( 89*11c03c6dSDamjan Jovanovic intt i_id, 90*11c03c6dSDamjan Jovanovic String i_text ); 91*11c03c6dSDamjan Jovanovic }; private: 92*11c03c6dSDamjan Jovanovic 93*11c03c6dSDamjan Jovanovic struct FindOptionByText; 94*11c03c6dSDamjan Jovanovic 95*11c03c6dSDamjan Jovanovic typedef std::vector<OptionDescription> OptionList; 96*11c03c6dSDamjan Jovanovic typedef std::vector<StringVector::const_iterator> StringCIteratorList; 97*11c03c6dSDamjan Jovanovic typedef std::vector<intt> OptionIdList; 98*11c03c6dSDamjan Jovanovic 99*11c03c6dSDamjan Jovanovic // Locals 100*11c03c6dSDamjan Jovanovic void Get_Arguments( 101*11c03c6dSDamjan Jovanovic int argc, 102*11c03c6dSDamjan Jovanovic char * argv[] ); 103*11c03c6dSDamjan Jovanovic intt Find_Option( 104*11c03c6dSDamjan Jovanovic const String & i_text ) const; 105*11c03c6dSDamjan Jovanovic bool Store_Argument( 106*11c03c6dSDamjan Jovanovic const String & i_arg ); 107*11c03c6dSDamjan Jovanovic void Find_OptionPoints(); 108*11c03c6dSDamjan Jovanovic void Handle_FreeArguments( 109*11c03c6dSDamjan Jovanovic StringVector::const_iterator 110*11c03c6dSDamjan Jovanovic i_begin, 111*11c03c6dSDamjan Jovanovic StringVector::const_iterator 112*11c03c6dSDamjan Jovanovic i_end ); 113*11c03c6dSDamjan Jovanovic 114*11c03c6dSDamjan Jovanovic // Helpers for options included via file 115*11c03c6dSDamjan Jovanovic bool Try2Include_Options( 116*11c03c6dSDamjan Jovanovic const String & i_optionsFile ); 117*11c03c6dSDamjan Jovanovic bool Include_Options( 118*11c03c6dSDamjan Jovanovic const String & i_optionsFile ); 119*11c03c6dSDamjan Jovanovic bool Load_Options( 120*11c03c6dSDamjan Jovanovic StreamStr & o_text, 121*11c03c6dSDamjan Jovanovic const String & i_optionsFile ); 122*11c03c6dSDamjan Jovanovic 123*11c03c6dSDamjan Jovanovic /** Handles an option found in the command line. 124*11c03c6dSDamjan Jovanovic Needs to be overwritten. 125*11c03c6dSDamjan Jovanovic 126*11c03c6dSDamjan Jovanovic @return 127*11c03c6dSDamjan Jovanovic The first argument within the range 128*11c03c6dSDamjan Jovanovic i_next_argument .. i_comandLine_end that does not belong as a 129*11c03c6dSDamjan Jovanovic parameter to the handled option. 130*11c03c6dSDamjan Jovanovic */ 131*11c03c6dSDamjan Jovanovic virtual StringVector::const_iterator 132*11c03c6dSDamjan Jovanovic do_HandleOption( 133*11c03c6dSDamjan Jovanovic intt i_id, 134*11c03c6dSDamjan Jovanovic StringVector::const_iterator 135*11c03c6dSDamjan Jovanovic i_paramsBegin, 136*11c03c6dSDamjan Jovanovic StringVector::const_iterator 137*11c03c6dSDamjan Jovanovic i_paramsEnd ) = 0; 138*11c03c6dSDamjan Jovanovic /** Handles arguments on the command line that do not belong to 139*11c03c6dSDamjan Jovanovic an option. 140*11c03c6dSDamjan Jovanovic */ 141*11c03c6dSDamjan Jovanovic virtual void do_HandleFreeArgument( 142*11c03c6dSDamjan Jovanovic const String & i_argument ) = 0; 143*11c03c6dSDamjan Jovanovic // DATA 144*11c03c6dSDamjan Jovanovic OptionList aOptions; 145*11c03c6dSDamjan Jovanovic 146*11c03c6dSDamjan Jovanovic /// Used during and after ->GetArguments() 147*11c03c6dSDamjan Jovanovic StringVector aCommandLine; 148*11c03c6dSDamjan Jovanovic StringCIteratorList aOptionPoints; 149*11c03c6dSDamjan Jovanovic OptionIdList aOptionIds; 150*11c03c6dSDamjan Jovanovic bool bIsOk; 151*11c03c6dSDamjan Jovanovic }; 152*11c03c6dSDamjan Jovanovic 153*11c03c6dSDamjan Jovanovic 154*11c03c6dSDamjan Jovanovic inline const StringVector & 155*11c03c6dSDamjan Jovanovic CommandLine::Arguments() const 156*11c03c6dSDamjan Jovanovic { 157*11c03c6dSDamjan Jovanovic return aCommandLine; 158*11c03c6dSDamjan Jovanovic } 159*11c03c6dSDamjan Jovanovic 160*11c03c6dSDamjan Jovanovic inline bool 161*11c03c6dSDamjan Jovanovic CommandLine::IsOk() const 162*11c03c6dSDamjan Jovanovic { 163*11c03c6dSDamjan Jovanovic return bIsOk; 164*11c03c6dSDamjan Jovanovic } 165*11c03c6dSDamjan Jovanovic 166*11c03c6dSDamjan Jovanovic inline void 167*11c03c6dSDamjan Jovanovic CommandLine::Set_Error() 168*11c03c6dSDamjan Jovanovic { 169*11c03c6dSDamjan Jovanovic bIsOk = false; 170*11c03c6dSDamjan Jovanovic } 171*11c03c6dSDamjan Jovanovic 172*11c03c6dSDamjan Jovanovic 173*11c03c6dSDamjan Jovanovic 174*11c03c6dSDamjan Jovanovic 175*11c03c6dSDamjan Jovanovic } // namespace csv 176*11c03c6dSDamjan Jovanovic #endif 177