/* This file is part of the KDE project
Copyright (C) 1999 Waldo Bastian
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License version 2 as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#ifndef _KCMDLINEARGS_H_
#define _KCMDLINEARGS_H_
#include
#include
#include
#include
typedef QValueList QCStringList;
/**
* @short Structure that holds command line options.
*/
struct KCmdLineOptions
{
const char *name;
const char *description;
const char *def; // Default
};
#define KCmdLineLastOption { 0, 0, 0 }
class KCmdLineArgsList;
class KApplication;
class KUniqueApplication;
class KCmdLineParsedOptions;
class KCmdLineParsedArgs;
class KAboutData;
class KCmdLineArgsPrivate;
/**
* Simple access to the command-line arguments.
*
* It takes into account Qt-specific options, KDE-specific options
* and application specific options.
*
* This class is used in main() via the static method
* @ref init().
*
* A typical KDE application should look like this:
*
*
* int main(int argc, char *argv[])
* {
* // Initialize command line args
* KCmdLineArgs::init(argc, argv, appName, description, version);
*
* // Tell which options are supported
* KCmdLineArgs::addCmdLineOptions( options );
*
* // Add options from other components
* KUniqueApplication::addCmdLineOptions();
*
* ....
*
* // Create application object without passing 'argc' and 'argv' again.
* KUniqueApplication app;
*
* ....
*
* // Handle our own options/argments
* // A KApplication will usually do this in main but this is not
* // necassery.
* // A KUniqueApplication might want to handle it in newInstance().
*
* KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
*
* // A binary option (on / off)
* if (args->isSet("some-option"))
* ....
*
* // An option which takes an additional argument
* QCString anotherOptionArg = args->getOption("another-option");
*
* // Arguments (e.g. files to open)
* for(int i = 0; i < args->count(); i++) // Counting start at 0!
* {
* // don't forget to convert to Unicode!
* openFile( QFile::decodeName( args->arg(i)));
* // Or more convenient:
* // openURL( args->url(i));
*
* }
*
* args->clear(); // Free up some memory.
* ....
* }
*
*
* options are defined as follow
*
*
* static KCmdLineOptions options[] =
* {
* { "a", I18N_NOOP("A short binary option."), 0 },
* { "b ", I18N_NOOP("A short option which takes an argument."), 0 },
* { "c ", I18N_NOOP("As above but with a default value."), "9600" },
* { "option1", I18N_NOOP("A long binary option, off by default."), 0 },
* { "nooption2", I18N_NOOP("A long binary option, on by default."), 0 },
* { "option3 ", I18N_NOOP("A long option which takes an argument."), 0 },
* { "option3 ", I18N_NOOP("As above with 9600 as default."), "9600" },
* { "d", 0, 0 },
* { "option4", I18N_NOOP("A long option which has a short option as alias."), 0 },
* { "e", 0, 0 },
* { "nooption5", I18N_NOOP("Another long option with an alias."), 0 },
* { "f", 0, 0 },
* { "option6 ", I18N_NOOP("'--option6 speed' is same a '-f speed'"), 0 },
* { "!option7 ", I18N_NOOP("All options following this one will be treated as arguments", 0 },
* { "+file", I18N_NOOP("A required argument 'file'.), 0 },
* { "+[arg1]", I18N_NOOP("An optional argument 'arg1'."), 0 },
* { "!+command", I18N_NOOP("A required argument 'command', that can contain multiple words, even starting with '-'.), 0 },
* { 0, 0, 0 } // End of options.
* };
*
*
* The I18N_NOOP macro is used to indicate that these strings should be
* marked for translation. The actual translation is done by KCmdLineArgs.
* You can't use i18n() here because we are setting up a static data
* structure and can't do translations at compile time.
*
* Note that a program should define the options before any arguments.
*
* When a long option has a short option as alias. A program should
* only check for the long option.
*
* With the above options a command line could look like:
*
*
* Long binary options can be in the form 'option' and 'nooption'.
* A command line may contain the same binary option multiple times,
* the last option determines the outcome:
*
* myapp --nooption4 --option4 --nooption4
*
* is the same as:
*
* myapp --nooption4
*
*
* Normally if an option value is provided multiple times only the last
* value is used:
*
* myapp -c 1200 -c 2400 -c 4800
*
* is usually the same as:
*
* myapp -c 4800
*
*
* However, an application can choose to use all values specified as well.
* E.g. to specify a number of directories to use:
*
* When an application does this it should mention this in the description
* of the option. @ref getOptionList()
*
* @short A class for command-line argument handling.
* @author Waldo Bastian
* @version 0.0.4
*/
class KCmdLineArgs
{
friend class KApplication;
friend class KUniqueApplication;
friend class QList;
public:
// Static functions:
/**
* Initialize class.
*
* This function should be called as the very first thing in
* your application.
* @param argc As passed to @p main(...).
* @param argv As passed to @p main(...).
* @param appname The untranslated name of your application. This should
* match with @p argv[0].
* @param description A short description of what your application is about.
* @param version A version.
* @param noKApp Don't add commandline options for @ref QApplication/@ref KApplication
*/
static void init(int _argc, char **_argv,
const char *_appname, const char *_description,
const char *_version, bool noKApp = false);
/**
* Initialize class.
*
* This function should be called as the very first thing in
* your application.
* @param argc As passed to @p main(...).
* @param argv As passed to @p main(...).
* @param about A KAboutData object describing your program.
* @param noKApp Don't add commandline options for @ref QApplication / @ref KApplication
*/
static void init(int _argc, char **_argv,
const KAboutData *about, bool noKApp = false);
/**
* Initialize Class
*
* This function should be called as the very first thing in
* your application.
* This method is exactly the same as calling
* @ref init(0,0, const KAboutData *about, true)
* This method will rarely be used
*
*/
static void init(const KAboutData *about);
/**
* Add options to your application.
*
* You must make sure that all possible options have been added before
* any class uses the command line arguments.
*
* @param options A list of options thath your code supplies.
* @param id A name with which these options can be identified.
* @param afterId The options are inserted after this set of options.
*
* The list of options should look like this:
*
* static KCmdLineOptions options[] =
* {
* { "option1 ", I18N_NOOP("Description 1"), "default" },
* { "o", 0, 0 },
* { "option2", I18N_NOOP("Description 2"), 0 },
* { "nooption3", I18N_NOOP("Description 3"), 0 },
* { 0, 0, 0}
* }
*
* @li "option1" is an option that requires an additional argument
* @li "option2" is an option that can be turned on. The default is off.
* @li "option3" is an option that can be turned off. The default is on.
* @li "o" does not have a description. It is an alias for the option
* that follows. In this case "option2".
* @li "+file" specifies an argument. The '+' is removed. If your program
* doesn't specify that it can use arguments your program will abort
* when an argument is passed to it.
*
* In BNF:
* cmd = myapp [options] file
* options = (option)*
* option = --option1 |
* (-o | --option2 | --nooption2) |
* ( --option3 | --nooption3 )
*
* Instead of "--option3" one may also use "-option3"
*
* Usage examples:
*
* @li "myapp --option1 test"
* @li "myapp" (same as "myapp --option1 default")
* @li "myapp --option2"
* @li "myapp --nooption2" (same as "myapp")
* @li "myapp -o" (same as "myapp --option2")
* @li "myapp --nooption3"
* @li "myapp --option3 (same as "myapp")
* @li "myapp --option2 --nooption2" (same as "myapp")
* @li "myapp /tmp/file"
*/
static void addCmdLineOptions( const KCmdLineOptions *options,
const char *name=0, const char *id = 0,
const char *afterId=0);
/**
* Access parsed arguments.
*
* This function returns all command line arguments that your code
* handles. If unknown command-line arguments are encountered the program
* is aborted and usage information is shown.
*
* @param id The name of the options you are interested in.
*/
static KCmdLineArgs *parsedArgs(const char *id=0);
/**
* Get the CWD (Current Working Directory) associated with the
* current command line arguments.
*
* Typically this is needed in KUniqueApplication::newInstance()
* since the CWD of the process may be different from the CWD
* where the user started a second instance.
**/
static QString cwd();
/**
* Get the appname according to argv[0]
**/
static const char *appName();
/**
* Print the usage help to stdout and exit.
*
* @param complete If true, print all available options.
**/
static void usage(const char *id = 0);
/**
* Print an error to stderr and the usage help to stdout and exit.
*
**/
static void usage(const QString &error);
/**
* Enable i18n to be able to print a translated error message.
*
* N.B.: This function leaks memory, therefore you are expected to exit
* afterwards (e.g., by calling @ref usage()).
**/
static void enable_i18n();
// Member functions:
/**
* Read out a string option.
*
* @param option The name of the option without '-'.
*
* @return The value of the option. If the option was not
* present on the command line the default is returned.
* If the option was present more than the value of the
* last occurence is used.
*/
QCString getOption(const char *option);
/**
* Read out all occurences of a string option.
*
* @param option The name of the option without '-'.
*
* @return A list of all option values. If no option was present
* on the command line, an empty list is returned.
*/
QCStringList getOptionList(const char *option);
/**
* Read out a boolean option or check for the presence of string option.
*
* @param option The name of the option without '-' or '-no'.
*
* @return The value of the option. If the option was not
* present on the command line the default is returned.
* If the option is listed as 'no
Generated by: dfaure on kde.faure.org on Thu Jan 17 22:15:01 2002, using kdoc 2.0a53.