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
~CommandLine()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 &
Arguments() const1558a106958SDamjan Jovanovic CommandLine::Arguments() const
1568a106958SDamjan Jovanovic {
1578a106958SDamjan Jovanovic return aCommandLine;
1588a106958SDamjan Jovanovic }
1598a106958SDamjan Jovanovic
1608a106958SDamjan Jovanovic inline bool
IsOk() const1618a106958SDamjan Jovanovic CommandLine::IsOk() const
1628a106958SDamjan Jovanovic {
1638a106958SDamjan Jovanovic return bIsOk;
1648a106958SDamjan Jovanovic }
1658a106958SDamjan Jovanovic
1668a106958SDamjan Jovanovic inline void
Set_Error()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