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
~CommandLine()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 &
Arguments() const15511c03c6dSDamjan Jovanovic CommandLine::Arguments() const
15611c03c6dSDamjan Jovanovic {
15711c03c6dSDamjan Jovanovic return aCommandLine;
15811c03c6dSDamjan Jovanovic }
15911c03c6dSDamjan Jovanovic
16011c03c6dSDamjan Jovanovic inline bool
IsOk() const16111c03c6dSDamjan Jovanovic CommandLine::IsOk() const
16211c03c6dSDamjan Jovanovic {
16311c03c6dSDamjan Jovanovic return bIsOk;
16411c03c6dSDamjan Jovanovic }
16511c03c6dSDamjan Jovanovic
16611c03c6dSDamjan Jovanovic inline void
Set_Error()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