Warnings++ and further enhancements in memory usage and usability.
authorSebastian Goth <seezer@roath.org>
Tue, 15 Jul 2008 21:43:58 +0000 (23:43 +0200)
committerSebastian Goth <seezer@roath.org>
Wed, 16 Jul 2008 22:57:29 +0000 (00:57 +0200)
Empty strings are now valid arguments to shortoptions too.
--longoption="" and -l "" would be empty but set strings.

src/common/cliparser.cpp
src/common/cliparser.h

index c433f26..9fbcacf 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <QString>
 #include <QFileInfo>
 
 #include <QString>
 #include <QFileInfo>
+#include <QDebug>
 
 CliParser::CliParser(QStringList arguments)
 {
 
 CliParser::CliParser(QStringList arguments)
 {
@@ -31,16 +32,14 @@ CliParser::CliParser(QStringList arguments)
   argsRaw.removeOne("-dograb");
 }
 
   argsRaw.removeOne("-dograb");
 }
 
-void CliParser::addArgument(const CliParserArg::CliArgType type, const QString longName, const char shortName, const QString help, const QString def) {
-  CliParserArg arg;
-  if(type == CliParserArg::CliArgOption)
-    arg = CliParserArg(CliParserArg::CliArgOption, shortName, help, def);
-  else
-    arg = CliParserArg(CliParserArg::CliArgSwitch, shortName, help);
+void CliParser::addArgument(const QString &longName, const CliParserArg &arg) {
+  if(argsHash.contains(longName)) qWarning() << "Warning: Multiple definition of argument" << longName;
+  if(arg.shortName != 0 && !lnameOfShortArg(arg.shortName).isNull())
+    qWarning().nospace() << "Warning: Redefining shortName '" << arg.shortName << "' for " << longName << " previously defined for " << lnameOfShortArg(arg.shortName);
   argsHash.insert(longName, arg);
 }
 
   argsHash.insert(longName, arg);
 }
 
-bool CliParser::addLongArg(const CliParserArg::CliArgType type, const QString name, const QString value) {
+bool CliParser::addLongArg(const CliParserArg::CliArgType type, const QString &name, const QString &value) {
   if(argsHash.contains(name)){
     if(type == CliParserArg::CliArgOption && argsHash.value(name).type == type) {
       argsHash[name].value = value;
   if(argsHash.contains(name)){
     if(type == CliParserArg::CliArgOption && argsHash.value(name).type == type) {
       argsHash[name].value = value;
@@ -54,16 +53,23 @@ bool CliParser::addLongArg(const CliParserArg::CliArgType type, const QString na
   return false;
 }
 
   return false;
 }
 
-bool CliParser::addShortArg(const CliParserArg::CliArgType type, const char shortName, const QString value) {
+bool CliParser::addShortArg(const CliParserArg::CliArgType type, const char shortName, const QString &value) {
   QString longName = lnameOfShortArg(shortName);
   if(!longName.isNull()) {
     if(type == CliParserArg::CliArgOption && argsHash.value(longName).type == type) {
       argsHash[longName].value = value;
       return true;
     }
   QString longName = lnameOfShortArg(shortName);
   if(!longName.isNull()) {
     if(type == CliParserArg::CliArgOption && argsHash.value(longName).type == type) {
       argsHash[longName].value = value;
       return true;
     }
-    else if (type == CliParserArg::CliArgSwitch && argsHash.value(longName).type == type) {
-      argsHash[longName].boolValue = true;
-      return true;
+    else if (type == CliParserArg::CliArgSwitch) {
+      if(argsHash.value(longName).type == type) {
+        argsHash[longName].boolValue = true;
+        return true;
+      }
+      // arg is an option but detected as a switch -> argument is missing
+      else {
+        qWarning().nospace() << "Warning: '" << shortName << "' is an option which needs an argument";
+        return false;
+      }
     }
   }
   return false;
     }
   }
   return false;
@@ -106,6 +112,11 @@ bool CliParser::parse() {
       // if next arg is is no option/switch it's an argument to a shortoption
       else {
         // option
       // if next arg is is no option/switch it's an argument to a shortoption
       else {
         // option
+        // short options are not freely mixable with other shortargs
+        if(currentArg->mid(1).toAscii().size() > 1) {
+          qWarning() << "Warning: Shortoptions may not be combined with other shortoptions or switches";
+          return false;
+        }
         QString value;
         bool skipNext = false;
         if(nextArg != argsRaw.constEnd()) {
         QString value;
         bool skipNext = false;
         if(nextArg != argsRaw.constEnd()) {
@@ -128,7 +139,7 @@ bool CliParser::parse() {
 }
 
 void CliParser::usage() {
 }
 
 void CliParser::usage() {
-  qWarning("Usage: %s [arguments]",QFileInfo(argsRaw.at(0)).completeBaseName().toLatin1().constData());
+  qWarning() << "Usage:" << QFileInfo(argsRaw.at(0)).completeBaseName() << "[arguments]";
   
   // get size of longName field
   QStringList keys = argsHash.keys();
   
   // get size of longName field
   QStringList keys = argsHash.keys();
@@ -176,7 +187,7 @@ QString CliParser::value(const QString &longName) {
       return argsHash.value(longName).def;
   }
   else {
       return argsHash.value(longName).def;
   }
   else {
-    qWarning("Warning: Requested value of not defined argument '%s' or argument is a switch",longName.toLatin1().constData());
+    qWarning() << "Warning: Requested value of not defined argument" << longName << "or argument is a switch";
     return QString();
   }
 }
     return QString();
   }
 }
@@ -187,7 +198,7 @@ bool CliParser::isSet(const QString &longName) {
     else return argsHash.value(longName).boolValue;
   }
   else {
     else return argsHash.value(longName).boolValue;
   }
   else {
-    qWarning("Warning: Requested isSet of not defined argument '%s'",longName.toLatin1().constData());
+    qWarning() << "Warning: Requested isSet of not defined argument" << longName;
     return false;
   }
 }
     return false;
   }
 }
index 3b0af91..1750843 100644 (file)
@@ -33,11 +33,11 @@ public:
   bool parse();
   QString value(const QString &longName);
   bool isSet(const QString &longName);
   bool parse();
   QString value(const QString &longName);
   bool isSet(const QString &longName);
-  inline void addSwitch(const QString longName, const char shortName = 0, const QString help = QString()) {
-    addArgument(CliParserArg::CliArgSwitch, longName, shortName, help);
+  inline void addSwitch(const QString &longName, const char shortName = 0, const QString &help = QString()) {
+    addArgument(longName, CliParserArg(CliParserArg::CliArgSwitch, shortName, help));
   }
   }
-  inline void addOption(const QString longName, const char shortName = 0, const QString help = QString(), const QString def = QString()) {
-    addArgument(CliParserArg::CliArgOption, longName, shortName, help, def);
+  inline void addOption(const QString &longName, const char shortName = 0, const QString &help = QString(), const QString &def = QString()) {
+    addArgument(longName, CliParserArg(CliParserArg::CliArgOption, shortName, help, def));
   }
   void usage();
 
   }
   void usage();
 
@@ -64,9 +64,9 @@ private:
     bool boolValue;
   };
   
     bool boolValue;
   };
   
-  void addArgument(const CliParserArg::CliArgType type, const QString longName, const char shortName = 0, const QString help = QString(), const QString def = QString());
-  bool addLongArg(const CliParserArg::CliArgType type, const QString name, const QString value = QString());
-  bool addShortArg(const CliParserArg::CliArgType type, const char shortName, const QString value = QString());
+  void addArgument(const QString &longName, const CliParserArg &arg);
+  bool addLongArg(const CliParserArg::CliArgType type, const QString &name, const QString &value = QString());
+  bool addShortArg(const CliParserArg::CliArgType type, const char shortName, const QString &value = QString());
   QString lnameOfShortArg(const char arg);
   QStringList argsRaw;
   QHash<QString, CliParserArg> argsHash;
   QString lnameOfShortArg(const char arg);
   QStringList argsRaw;
   QHash<QString, CliParserArg> argsHash;