xref: /trunk/main/autodoc/inc/cosv/commandline.hxx (revision 914d351e5f5b84e4342a86d6ab8d4aca7308b9bd)
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