xref: /trunk/main/shell/source/tools/lngconvex/cmdline.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 
29 // MARKER(update_precomp.py): autogen include statement, do not remove
30 #include "precompiled_shell.hxx"
31 #include <stdexcept>
32 #include <osl/diagnose.h>
33 #include "cmdline.hxx"
34 
35 //---------------------------------
36 /** Simple command line abstraction
37 */
38 
39 //################################
40 // Creation
41 //################################
42 
43 
44 CommandLine::CommandLine(size_t argc, char* argv[], const std::string& ArgPrefix) :
45     m_argc(argc),
46     m_argv(argv),
47     m_argprefix(ArgPrefix)
48 {
49 }
50 
51 
52 //################################
53 // Query
54 //################################
55 
56 
57 /** Return the argument count
58 */
59 size_t CommandLine::get_arg_count() const
60 {
61     return m_argc;
62 }
63 
64 /** Return an argument by index
65     This method doesn't skip argument
66     names if any, so if the second
67     argument is an argument name the
68     function nevertheless returns it.
69 
70     @precond    0 <= Index < GetArgumentCount
71 
72     @throws std::out_of_range exception
73     if the given index is to high
74 */
75 std::string CommandLine::get_arg(size_t Index) const
76 {
77     OSL_PRECOND(Index < m_argc, "Index out of range");
78 
79     if (Index > (m_argc - 1))
80         throw std::out_of_range("Invalid index");
81 
82     return m_argv[Index];
83 }
84 
85 
86 /** Returns all argument name found in the
87     command line. An argument will be identified
88     by a specified prefix. The standard prefix
89     is '-'.
90     If the are no argument names the returned
91     container is empty.
92 */
93 StringListPtr_t CommandLine::get_arg_names() const
94 {
95     StringListPtr_t arg_cont(new StringList_t());
96 
97     for (size_t i = 0; i < m_argc; i++)
98     {
99         std::string argn = m_argv[i];
100 
101         if (is_arg_name(argn))
102             arg_cont->push_back(argn);
103     }
104 
105     return arg_cont;
106 }
107 
108 /** Returns an argument by name. If there are
109     duplicate argument names in the command line,
110     the first one wins.
111     Argument name an the argument value must be separated
112     by spaces. If the argument value starts with an
113     argument prefix use quotes else the return value is
114     an empty string because the value will be interpreted
115     as the next argument name.
116     If an argument value contains spaces use quotes.
117 
118     @precond    GetArgumentNames() -> has element ArgumentName
119 
120     @throws std::invalid_argument exception
121     if the specified argument could not be
122     found
123 */
124 std::string CommandLine::get_arg(const std::string& ArgumentName) const
125 {
126     std::string arg_value;
127     size_t i;
128     for ( i = 0; i < m_argc; i++)
129     {
130         std::string arg = m_argv[i];
131 
132         if (ArgumentName == arg && ((i+1) < m_argc) && !is_arg_name(m_argv[i+1]))
133         {
134             arg_value = m_argv[i+1];
135             break;
136         }
137     }
138 
139     if (i == m_argc)
140         throw std::invalid_argument("Invalid argument name");
141 
142     return arg_value;
143 }
144 
145 
146 //################################
147 // Command
148 //################################
149 
150 
151 /** Set the prefix used to identify arguments in
152     the command line.
153 
154     @precond    prefix is not empty
155 
156     @throws std::invalid_argument exception if
157     the prefix is empty
158 */
159 void CommandLine::set_arg_prefix(const std::string& Prefix)
160 {
161     OSL_PRECOND(Prefix.length(), "Empty argument prefix!");
162 
163     if (0 == Prefix.length())
164         throw std::invalid_argument("Empty argument prefix not allowed");
165 
166     m_argprefix = Prefix;
167 }
168 
169 
170 /** Returns whether a given argument is an argument name
171 */
172 bool CommandLine::is_arg_name(const std::string& Argument) const
173 {
174     return (0 == Argument.compare(0, m_argprefix.length(), m_argprefix));
175 }
176