xref: /AOO42X/main/autodoc/inc/cosv/commandline.hxx (revision 9bce9b0d387299c68bd81d539e1478357a103de5)
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