xref: /trunk/main/autodoc/inc/cosv/commandline.hxx (revision 11c03c6d381fea19f0fea13ae5a371ba50bad241)
1*11c03c6dSDamjan Jovanovic /**************************************************************
2*11c03c6dSDamjan Jovanovic  *
3*11c03c6dSDamjan Jovanovic  * Licensed to the Apache Software Foundation (ASF) under one
4*11c03c6dSDamjan Jovanovic  * or more contributor license agreements.  See the NOTICE file
5*11c03c6dSDamjan Jovanovic  * distributed with this work for additional information
6*11c03c6dSDamjan Jovanovic  * regarding copyright ownership.  The ASF licenses this file
7*11c03c6dSDamjan Jovanovic  * to you under the Apache License, Version 2.0 (the
8*11c03c6dSDamjan Jovanovic  * "License"); you may not use this file except in compliance
9*11c03c6dSDamjan Jovanovic  * with the License.  You may obtain a copy of the License at
10*11c03c6dSDamjan Jovanovic  *
11*11c03c6dSDamjan Jovanovic  *   http://www.apache.org/licenses/LICENSE-2.0
12*11c03c6dSDamjan Jovanovic  *
13*11c03c6dSDamjan Jovanovic  * Unless required by applicable law or agreed to in writing,
14*11c03c6dSDamjan Jovanovic  * software distributed under the License is distributed on an
15*11c03c6dSDamjan Jovanovic  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*11c03c6dSDamjan Jovanovic  * KIND, either express or implied.  See the License for the
17*11c03c6dSDamjan Jovanovic  * specific language governing permissions and limitations
18*11c03c6dSDamjan Jovanovic  * under the License.
19*11c03c6dSDamjan Jovanovic  *
20*11c03c6dSDamjan Jovanovic  *************************************************************/
21*11c03c6dSDamjan Jovanovic 
22*11c03c6dSDamjan Jovanovic 
23*11c03c6dSDamjan Jovanovic 
24*11c03c6dSDamjan Jovanovic #ifndef CSV_COMMANDLINE_HXX
25*11c03c6dSDamjan Jovanovic #define CSV_COMMANDLINE_HXX
26*11c03c6dSDamjan Jovanovic 
27*11c03c6dSDamjan Jovanovic #include <cosv/string.hxx>
28*11c03c6dSDamjan Jovanovic 
29*11c03c6dSDamjan Jovanovic 
30*11c03c6dSDamjan Jovanovic 
31*11c03c6dSDamjan Jovanovic 
32*11c03c6dSDamjan Jovanovic namespace csv
33*11c03c6dSDamjan Jovanovic {
34*11c03c6dSDamjan Jovanovic 
35*11c03c6dSDamjan Jovanovic /** Does the standards in handling command line parameters.
36*11c03c6dSDamjan Jovanovic 
37*11c03c6dSDamjan Jovanovic     This class provides a default behaviour this way:
38*11c03c6dSDamjan Jovanovic 
39*11c03c6dSDamjan Jovanovic     *   Each option can have several forms
40*11c03c6dSDamjan Jovanovic 
41*11c03c6dSDamjan Jovanovic             like: "-f" and "--file"
42*11c03c6dSDamjan Jovanovic 
43*11c03c6dSDamjan Jovanovic         which are identified by having the same id.
44*11c03c6dSDamjan Jovanovic         The option id is used when calling ->do_HandleOption().
45*11c03c6dSDamjan Jovanovic 
46*11c03c6dSDamjan Jovanovic     *   For each recognized option together with its parameters
47*11c03c6dSDamjan Jovanovic         ->do_HandleOption() is called.
48*11c03c6dSDamjan Jovanovic 
49*11c03c6dSDamjan Jovanovic     *   For the first unrecognized argument ->do_HandleFreeArgument() is
50*11c03c6dSDamjan Jovanovic         called.
51*11c03c6dSDamjan Jovanovic         After the first unrecognized argument, ->do_HandleFreeArgument()
52*11c03c6dSDamjan Jovanovic         is called for all remaining arguments.
53*11c03c6dSDamjan Jovanovic 
54*11c03c6dSDamjan Jovanovic     @howtoderive
55*11c03c6dSDamjan Jovanovic     -   Overwrite ->do_HandleOption() to act on all known options.
56*11c03c6dSDamjan Jovanovic         Overwrite ->do_HandleFreeArgument() to act on additional
57*11c03c6dSDamjan Jovanovic         arguments not connected to an option.
58*11c03c6dSDamjan Jovanovic */
59*11c03c6dSDamjan Jovanovic class CommandLine
60*11c03c6dSDamjan Jovanovic {
61*11c03c6dSDamjan Jovanovic   public:
62*11c03c6dSDamjan Jovanovic   // LIFECYCLE
63*11c03c6dSDamjan Jovanovic     virtual             ~CommandLine() {}
64*11c03c6dSDamjan Jovanovic 
65*11c03c6dSDamjan Jovanovic   // OPERATIONS
66*11c03c6dSDamjan Jovanovic     bool                Interpret(
67*11c03c6dSDamjan Jovanovic                             int                 argc,
68*11c03c6dSDamjan Jovanovic                             char *              argv[] );
69*11c03c6dSDamjan Jovanovic   // INQUIRY
70*11c03c6dSDamjan Jovanovic     const StringVector &
71*11c03c6dSDamjan Jovanovic                         Arguments() const;
72*11c03c6dSDamjan Jovanovic     bool                IsOk() const;
73*11c03c6dSDamjan Jovanovic 
74*11c03c6dSDamjan Jovanovic   protected:
75*11c03c6dSDamjan Jovanovic                         CommandLine();
76*11c03c6dSDamjan Jovanovic     void                Add_Option(
77*11c03c6dSDamjan Jovanovic                             intt                i_id,
78*11c03c6dSDamjan Jovanovic                             String              i_text );
79*11c03c6dSDamjan Jovanovic     void                Set_Error();
80*11c03c6dSDamjan Jovanovic 
81*11c03c6dSDamjan Jovanovic   private:
82*11c03c6dSDamjan Jovanovic     // public for use by struct commandline.cxx-anonymous::FindOptionByText;
83*11c03c6dSDamjan Jovanovic     struct OptionDescription
84*11c03c6dSDamjan Jovanovic     {
85*11c03c6dSDamjan Jovanovic         intt                nId;
86*11c03c6dSDamjan Jovanovic         String              sText;
87*11c03c6dSDamjan Jovanovic 
88*11c03c6dSDamjan Jovanovic                             OptionDescription(
89*11c03c6dSDamjan Jovanovic                                 intt                i_id,
90*11c03c6dSDamjan Jovanovic                                 String              i_text );
91*11c03c6dSDamjan Jovanovic     }; private:
92*11c03c6dSDamjan Jovanovic 
93*11c03c6dSDamjan Jovanovic     struct FindOptionByText;
94*11c03c6dSDamjan Jovanovic 
95*11c03c6dSDamjan Jovanovic     typedef std::vector<OptionDescription>              OptionList;
96*11c03c6dSDamjan Jovanovic     typedef std::vector<StringVector::const_iterator>   StringCIteratorList;
97*11c03c6dSDamjan Jovanovic     typedef std::vector<intt>                           OptionIdList;
98*11c03c6dSDamjan Jovanovic 
99*11c03c6dSDamjan Jovanovic     // Locals
100*11c03c6dSDamjan Jovanovic     void                Get_Arguments(
101*11c03c6dSDamjan Jovanovic                             int                 argc,
102*11c03c6dSDamjan Jovanovic                             char *              argv[] );
103*11c03c6dSDamjan Jovanovic     intt                Find_Option(
104*11c03c6dSDamjan Jovanovic                             const String &      i_text ) const;
105*11c03c6dSDamjan Jovanovic     bool                Store_Argument(
106*11c03c6dSDamjan Jovanovic                             const String &      i_arg );
107*11c03c6dSDamjan Jovanovic     void                Find_OptionPoints();
108*11c03c6dSDamjan Jovanovic     void                Handle_FreeArguments(
109*11c03c6dSDamjan Jovanovic                             StringVector::const_iterator
110*11c03c6dSDamjan Jovanovic                                                 i_begin,
111*11c03c6dSDamjan Jovanovic                             StringVector::const_iterator
112*11c03c6dSDamjan Jovanovic                                                 i_end );
113*11c03c6dSDamjan Jovanovic 
114*11c03c6dSDamjan Jovanovic     // Helpers for options included via file
115*11c03c6dSDamjan Jovanovic     bool                Try2Include_Options(
116*11c03c6dSDamjan Jovanovic                             const String &      i_optionsFile );
117*11c03c6dSDamjan Jovanovic     bool                Include_Options(
118*11c03c6dSDamjan Jovanovic                             const String &      i_optionsFile );
119*11c03c6dSDamjan Jovanovic     bool                Load_Options(
120*11c03c6dSDamjan Jovanovic                             StreamStr &         o_text,
121*11c03c6dSDamjan Jovanovic                             const String &      i_optionsFile );
122*11c03c6dSDamjan Jovanovic 
123*11c03c6dSDamjan Jovanovic     /** Handles an option found in the command line.
124*11c03c6dSDamjan Jovanovic         Needs to be overwritten.
125*11c03c6dSDamjan Jovanovic 
126*11c03c6dSDamjan Jovanovic         @return
127*11c03c6dSDamjan Jovanovic         The first argument within the range
128*11c03c6dSDamjan Jovanovic         i_next_argument .. i_comandLine_end that does not belong as a
129*11c03c6dSDamjan Jovanovic         parameter to the handled option.
130*11c03c6dSDamjan Jovanovic     */
131*11c03c6dSDamjan Jovanovic     virtual StringVector::const_iterator
132*11c03c6dSDamjan Jovanovic                         do_HandleOption(
133*11c03c6dSDamjan Jovanovic                             intt                i_id,
134*11c03c6dSDamjan Jovanovic                             StringVector::const_iterator
135*11c03c6dSDamjan Jovanovic                                                 i_paramsBegin,
136*11c03c6dSDamjan Jovanovic                             StringVector::const_iterator
137*11c03c6dSDamjan Jovanovic                                                 i_paramsEnd ) = 0;
138*11c03c6dSDamjan Jovanovic     /** Handles arguments on the command line that do not belong to
139*11c03c6dSDamjan Jovanovic         an option.
140*11c03c6dSDamjan Jovanovic     */
141*11c03c6dSDamjan Jovanovic     virtual void        do_HandleFreeArgument(
142*11c03c6dSDamjan Jovanovic                             const String &      i_argument ) = 0;
143*11c03c6dSDamjan Jovanovic     // DATA
144*11c03c6dSDamjan Jovanovic     OptionList          aOptions;
145*11c03c6dSDamjan Jovanovic 
146*11c03c6dSDamjan Jovanovic     /// Used during and after ->GetArguments()
147*11c03c6dSDamjan Jovanovic     StringVector        aCommandLine;
148*11c03c6dSDamjan Jovanovic     StringCIteratorList aOptionPoints;
149*11c03c6dSDamjan Jovanovic     OptionIdList        aOptionIds;
150*11c03c6dSDamjan Jovanovic     bool                bIsOk;
151*11c03c6dSDamjan Jovanovic };
152*11c03c6dSDamjan Jovanovic 
153*11c03c6dSDamjan Jovanovic 
154*11c03c6dSDamjan Jovanovic inline const StringVector &
155*11c03c6dSDamjan Jovanovic CommandLine::Arguments() const
156*11c03c6dSDamjan Jovanovic {
157*11c03c6dSDamjan Jovanovic     return aCommandLine;
158*11c03c6dSDamjan Jovanovic }
159*11c03c6dSDamjan Jovanovic 
160*11c03c6dSDamjan Jovanovic inline bool
161*11c03c6dSDamjan Jovanovic CommandLine::IsOk() const
162*11c03c6dSDamjan Jovanovic {
163*11c03c6dSDamjan Jovanovic     return bIsOk;
164*11c03c6dSDamjan Jovanovic }
165*11c03c6dSDamjan Jovanovic 
166*11c03c6dSDamjan Jovanovic inline void
167*11c03c6dSDamjan Jovanovic CommandLine::Set_Error()
168*11c03c6dSDamjan Jovanovic {
169*11c03c6dSDamjan Jovanovic     bIsOk = false;
170*11c03c6dSDamjan Jovanovic }
171*11c03c6dSDamjan Jovanovic 
172*11c03c6dSDamjan Jovanovic 
173*11c03c6dSDamjan Jovanovic 
174*11c03c6dSDamjan Jovanovic 
175*11c03c6dSDamjan Jovanovic }   // namespace csv
176*11c03c6dSDamjan Jovanovic #endif
177