18a106958SDamjan Jovanovic /************************************************************** 28a106958SDamjan Jovanovic * 38a106958SDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one 48a106958SDamjan Jovanovic * or more contributor license agreements. See the NOTICE file 58a106958SDamjan Jovanovic * distributed with this work for additional information 68a106958SDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file 78a106958SDamjan Jovanovic * to you under the Apache License, Version 2.0 (the 88a106958SDamjan Jovanovic * "License"); you may not use this file except in compliance 98a106958SDamjan Jovanovic * with the License. You may obtain a copy of the License at 108a106958SDamjan Jovanovic * 118a106958SDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0 128a106958SDamjan Jovanovic * 138a106958SDamjan Jovanovic * Unless required by applicable law or agreed to in writing, 148a106958SDamjan Jovanovic * software distributed under the License is distributed on an 158a106958SDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 168a106958SDamjan Jovanovic * KIND, either express or implied. See the License for the 178a106958SDamjan Jovanovic * specific language governing permissions and limitations 188a106958SDamjan Jovanovic * under the License. 198a106958SDamjan Jovanovic * 208a106958SDamjan Jovanovic *************************************************************/ 218a106958SDamjan Jovanovic 228a106958SDamjan Jovanovic 238a106958SDamjan Jovanovic 248a106958SDamjan Jovanovic #ifndef CSV_COMMANDLINE_HXX 258a106958SDamjan Jovanovic #define CSV_COMMANDLINE_HXX 268a106958SDamjan Jovanovic 278a106958SDamjan Jovanovic #include <cosv/string.hxx> 288a106958SDamjan Jovanovic 298a106958SDamjan Jovanovic 308a106958SDamjan Jovanovic 318a106958SDamjan Jovanovic 328a106958SDamjan Jovanovic namespace csv 338a106958SDamjan Jovanovic { 348a106958SDamjan Jovanovic 358a106958SDamjan Jovanovic /** Does the standards in handling command line parameters. 368a106958SDamjan Jovanovic 378a106958SDamjan Jovanovic This class provides a default behaviour this way: 388a106958SDamjan Jovanovic 398a106958SDamjan Jovanovic * Each option can have several forms 408a106958SDamjan Jovanovic 418a106958SDamjan Jovanovic like: "-f" and "--file" 428a106958SDamjan Jovanovic 438a106958SDamjan Jovanovic which are identified by having the same id. 448a106958SDamjan Jovanovic The option id is used when calling ->do_HandleOption(). 458a106958SDamjan Jovanovic 468a106958SDamjan Jovanovic * For each recognized option together with its parameters 478a106958SDamjan Jovanovic ->do_HandleOption() is called. 488a106958SDamjan Jovanovic 498a106958SDamjan Jovanovic * For the first unrecognized argument ->do_HandleFreeArgument() is 508a106958SDamjan Jovanovic called. 518a106958SDamjan Jovanovic After the first unrecognized argument, ->do_HandleFreeArgument() 528a106958SDamjan Jovanovic is called for all remaining arguments. 538a106958SDamjan Jovanovic 548a106958SDamjan Jovanovic @howtoderive 558a106958SDamjan Jovanovic - Overwrite ->do_HandleOption() to act on all known options. 568a106958SDamjan Jovanovic Overwrite ->do_HandleFreeArgument() to act on additional 578a106958SDamjan Jovanovic arguments not connected to an option. 588a106958SDamjan Jovanovic */ 598a106958SDamjan Jovanovic class CommandLine 608a106958SDamjan Jovanovic { 618a106958SDamjan Jovanovic public: 628a106958SDamjan Jovanovic // LIFECYCLE 638a106958SDamjan Jovanovic virtual ~CommandLine() {} 648a106958SDamjan Jovanovic 658a106958SDamjan Jovanovic // OPERATIONS 668a106958SDamjan Jovanovic bool Interpret( 678a106958SDamjan Jovanovic int argc, 688a106958SDamjan Jovanovic char * argv[] ); 698a106958SDamjan Jovanovic // INQUIRY 708a106958SDamjan Jovanovic const StringVector & 718a106958SDamjan Jovanovic Arguments() const; 728a106958SDamjan Jovanovic bool IsOk() const; 738a106958SDamjan Jovanovic 748a106958SDamjan Jovanovic protected: 758a106958SDamjan Jovanovic CommandLine(); 768a106958SDamjan Jovanovic void Add_Option( 778a106958SDamjan Jovanovic intt i_id, 788a106958SDamjan Jovanovic String i_text ); 798a106958SDamjan Jovanovic void Set_Error(); 808a106958SDamjan Jovanovic 818a106958SDamjan Jovanovic private: 828a106958SDamjan Jovanovic // public for use by struct commandline.cxx-anonymous::FindOptionByText; 838a106958SDamjan Jovanovic struct OptionDescription 848a106958SDamjan Jovanovic { 858a106958SDamjan Jovanovic intt nId; 868a106958SDamjan Jovanovic String sText; 878a106958SDamjan Jovanovic 888a106958SDamjan Jovanovic OptionDescription( 898a106958SDamjan Jovanovic intt i_id, 908a106958SDamjan Jovanovic String i_text ); 918a106958SDamjan Jovanovic }; private: 928a106958SDamjan Jovanovic 938a106958SDamjan Jovanovic struct FindOptionByText; 948a106958SDamjan Jovanovic 958a106958SDamjan Jovanovic typedef std::vector<OptionDescription> OptionList; 968a106958SDamjan Jovanovic typedef std::vector<StringVector::const_iterator> StringCIteratorList; 978a106958SDamjan Jovanovic typedef std::vector<intt> OptionIdList; 988a106958SDamjan Jovanovic 998a106958SDamjan Jovanovic // Locals 1008a106958SDamjan Jovanovic void Get_Arguments( 1018a106958SDamjan Jovanovic int argc, 1028a106958SDamjan Jovanovic char * argv[] ); 1038a106958SDamjan Jovanovic intt Find_Option( 1048a106958SDamjan Jovanovic const String & i_text ) const; 1058a106958SDamjan Jovanovic bool Store_Argument( 1068a106958SDamjan Jovanovic const String & i_arg ); 1078a106958SDamjan Jovanovic void Find_OptionPoints(); 1088a106958SDamjan Jovanovic void Handle_FreeArguments( 1098a106958SDamjan Jovanovic StringVector::const_iterator 1108a106958SDamjan Jovanovic i_begin, 1118a106958SDamjan Jovanovic StringVector::const_iterator 1128a106958SDamjan Jovanovic i_end ); 1138a106958SDamjan Jovanovic 1148a106958SDamjan Jovanovic // Helpers for options included via file 1158a106958SDamjan Jovanovic bool Try2Include_Options( 1168a106958SDamjan Jovanovic const String & i_optionsFile ); 1178a106958SDamjan Jovanovic bool Include_Options( 1188a106958SDamjan Jovanovic const String & i_optionsFile ); 1198a106958SDamjan Jovanovic bool Load_Options( 1208a106958SDamjan Jovanovic StreamStr & o_text, 1218a106958SDamjan Jovanovic const String & i_optionsFile ); 1228a106958SDamjan Jovanovic 1238a106958SDamjan Jovanovic /** Handles an option found in the command line. 1248a106958SDamjan Jovanovic Needs to be overwritten. 1258a106958SDamjan Jovanovic 1268a106958SDamjan Jovanovic @return 1278a106958SDamjan Jovanovic The first argument within the range 128*611f99e7SJohn Bampton i_next_argument .. i_commandLine_end that does not belong as a 1298a106958SDamjan Jovanovic parameter to the handled option. 1308a106958SDamjan Jovanovic */ 1318a106958SDamjan Jovanovic virtual StringVector::const_iterator 1328a106958SDamjan Jovanovic do_HandleOption( 1338a106958SDamjan Jovanovic intt i_id, 1348a106958SDamjan Jovanovic StringVector::const_iterator 1358a106958SDamjan Jovanovic i_paramsBegin, 1368a106958SDamjan Jovanovic StringVector::const_iterator 1378a106958SDamjan Jovanovic i_paramsEnd ) = 0; 1388a106958SDamjan Jovanovic /** Handles arguments on the command line that do not belong to 1398a106958SDamjan Jovanovic an option. 1408a106958SDamjan Jovanovic */ 1418a106958SDamjan Jovanovic virtual void do_HandleFreeArgument( 1428a106958SDamjan Jovanovic const String & i_argument ) = 0; 1438a106958SDamjan Jovanovic // DATA 1448a106958SDamjan Jovanovic OptionList aOptions; 1458a106958SDamjan Jovanovic 1468a106958SDamjan Jovanovic /// Used during and after ->GetArguments() 1478a106958SDamjan Jovanovic StringVector aCommandLine; 1488a106958SDamjan Jovanovic StringCIteratorList aOptionPoints; 1498a106958SDamjan Jovanovic OptionIdList aOptionIds; 1508a106958SDamjan Jovanovic bool bIsOk; 1518a106958SDamjan Jovanovic }; 1528a106958SDamjan Jovanovic 1538a106958SDamjan Jovanovic 1548a106958SDamjan Jovanovic inline const StringVector & 1558a106958SDamjan Jovanovic CommandLine::Arguments() const 1568a106958SDamjan Jovanovic { 1578a106958SDamjan Jovanovic return aCommandLine; 1588a106958SDamjan Jovanovic } 1598a106958SDamjan Jovanovic 1608a106958SDamjan Jovanovic inline bool 1618a106958SDamjan Jovanovic CommandLine::IsOk() const 1628a106958SDamjan Jovanovic { 1638a106958SDamjan Jovanovic return bIsOk; 1648a106958SDamjan Jovanovic } 1658a106958SDamjan Jovanovic 1668a106958SDamjan Jovanovic inline void 1678a106958SDamjan Jovanovic CommandLine::Set_Error() 1688a106958SDamjan Jovanovic { 1698a106958SDamjan Jovanovic bIsOk = false; 1708a106958SDamjan Jovanovic } 1718a106958SDamjan Jovanovic 1728a106958SDamjan Jovanovic 1738a106958SDamjan Jovanovic 1748a106958SDamjan Jovanovic 1758a106958SDamjan Jovanovic } // namespace csv 1768a106958SDamjan Jovanovic #endif 177