/* * PDFedit - free program for PDF document manipulation. * Copyright (C) 2006, 2007 PDFedit team: Michal Hocko, * Miroslav Jahoda, * Jozef Misutka, * Martin Petricek * * Project is hosted on http://sourceforge.net/projects/pdfedit */ /** @file Utility functions to work with commandline arguments \brief Commandline arguments utility functions @author Martin Petricek */ #include "args.h" #include "qtcompat.h" #include "util.h" #include "version.h" #include #include #include #include QLIST #include #include using namespace std; using namespace util; /** Option handler map*/ typedef QMap OptionMap; /** Option handler map (with parameter) */ typedef QMap OptionMapParam; /** Option help map*/ typedef QMap OptionHelp; /** Stop processing options from commandline? */ bool stopOpt=false; /** Name of the program (argv[0]) */ QString binName; /** Option help texts */ OptionHelp optHelp; /** Option parameter names */ OptionHelp optParamName; /** Option handlers (without parameters) */ OptionMap optMap; /** Option handlers (with parameters) */ OptionMapParam optMapParam; /** Argument index currently processed */ int argIndex; /** Standard argc */ int argc; /** Standard argv */ char **argv; /** Length of longest parameter name (including name of its argument)*/ int maxParamNameLen=1; //Forward declarations that should not be visible in header file int handleOption(const QString ¶m); const QString nextParam(const QString ¶m); /** Print out application header (name and version) to stdout */ void printHeader() { cout << APP_NAME << " " << VERSION << endl; } /** Print out application header (name and version) to stderr */ void printHeaderErr() { cerr << APP_NAME << " " << VERSION << endl; } /** Standard handler to handle --help parameter Prints all registered commandline options along with their helptext to STDOUT and exits */ void handleHelpOptions(){ cout << convertFromUnicode(QObject::tr("Options: "),CON) << endl; Q_List opt=optHelp.keys(); for (Q_List::Iterator it=opt.begin();it!=opt.end();++it) { QString paramName=*it; if (optParamName.contains(paramName)) { //Add name of parameter paramName+=" ["+optParamName[paramName]+"]"; } cout << " "; cout.width(maxParamNameLen+1); //width of option name cout.flags(ios::left); cout << convertFromUnicode(paramName,CON) << convertFromUnicode(optHelp[*it],CON) << endl; } exit(0); } /** handle -- parameter (stop processing option) */ void handleStopOpt(){ stopOpt=true; } /** Register function to handle option without parameter @param param Name of option (case sensitive) @param h Function to handle this option @param help Brief one-line help about this option */ void optionHandler(const QString ¶m, optHandler h,const QString &help) { optMap[param]=h; optHelp[param]=help; int len=param.length(); //Length of parameter including its name in help if (len>maxParamNameLen) maxParamNameLen=len; } /** Register function to handle option with parameter Parameters can be accepted as: -opt[n], -opt [n] @param param Name of option (case sensitive) @param paramName Name of parameter (only shown in help) @param h Function to handle this option @param help Brief one-line help about this option */ void optionHandlerParam(const QString ¶m, const QString ¶mName, optHandlerParam h,const QString &help) { optMapParam[param]=h; optHelp[param]=help; optParamName[param]=paramName; int len=param.length()+3+paramName.length(); //Length of parameter including its name in help if (len>maxParamNameLen) maxParamNameLen=len; } /** Calls option handler on given option @param param Commandline option to check @return 0 if option is valid, but without parameters, 1 if option 'consumed' parameter after it, -1 if option is invalid */ int handleOption(const QString ¶m) { //parameterless option if (optMap.contains(param)) { assert(optMap[param]); optMap[param](); return 0; } //parameterized option, exact match, option parameter is next parameter if (optMapParam.contains(param)) { assert(optMapParam[param]); optMapParam[param](nextParam(param)); return 1; } //parameterized option, option parameter is directly appended QString paramBase; for(unsigned int i=2;i execute handler assert(optMapParam[paramBase]); optMapParam[paramBase](param.mid(i)); return 0; } } return -1; } /** Sets name of binary to show in help, etc ... (parameter should be argv[0]) @param name name of binary */ void setArgv0(const QString &name) { binName=name; } /** Get next parameter from commandline @param param name of currently processed parameter */ const QString nextParam(const QString ¶m) { argIndex++; if (argIndex