nnc: fix console params parsing (#326)
authorVitaliy Cherepanov/AI Tools Lab /SRR/Engineer/삼성전자 <v.cherepanov@samsung.com>
Wed, 13 Jun 2018 12:18:13 +0000 (15:18 +0300)
committerSergey Vostokov/AI Tools Lab /SRR/Staff Engineer/삼성전자 <s.vostokov@samsung.com>
Wed, 13 Jun 2018 12:18:13 +0000 (15:18 +0300)
fix wrong single params parsing
(params like '-a', '-f')

Signed-off-by: Vitaliy Cherepanov <v.cherepanov@samsung.com>
contrib/nnc/src/module/plugin/PluginData.cpp

index f553638..bb3aaaa 100644 (file)
@@ -43,33 +43,39 @@ std::ostream &operator<<(std::ostream &os, const Data &op) {
 }
 
 // DataList class
-
-static int is_long_option(const char *argv) {
-  int res = 0;
+enum paramType {paramShort = 0, paramLong, paramData, paramError};
+static enum paramType getParamType(const char *argv) {
+  enum paramType res = paramError;
   size_t len;
 
   len = strnlen(argv, 3);
-
-  if (len <= 1) {
-    res = 0;
+  if (len <= 0) {
+    // should never happen
+    res = paramError;
+  } else if (len <= 1) {
+    res = paramData;
   } else if (len == 2) {
-    res = (argv[0] == '-' && argv[1] != '-');
+    if (argv[0] == '-' && argv[1] != '-')
+      res = paramShort;
+    else
+      res = paramData;
   } else {
-    res = (argv[0] == '-' && argv[1] == '-' && argv[2] != '-');
+    if (argv[0] == '-' && argv[1] == '-' && argv[2] != '-')
+      res = paramLong;
+    else
+      res = paramData;
   }
 
   return res;
 }
 
-static int is_single(int cur, int argc, char *argv[]) {
-  int res = 0;
+static bool nextParamIsData(int cur, int argc, char *argv[]) {
+  bool res = 0;
 
-  if (cur >= argc) {
-    res = 0;
-  } else if (cur + 1 == argc) {
-    res = is_long_option(argv[cur]);
+  if (cur >= argc - 1) {
+    res = false;
   } else {
-    res = is_long_option(argv[cur]) && is_long_option(argv[cur + 1]);
+    res = (getParamType(argv[cur + 1]) == paramData);
   }
 
   return res;
@@ -81,11 +87,23 @@ std::shared_ptr<DataList> DataList::parse(int argc, char *argv[]) noexcept(false
   std::shared_ptr<DataList> params(new DataList("params"));
 
   for (int i = 1; i < argc; i++) {
-    if (is_single(i, argc, argv)) {
-      params->createElement(argv[i] + 2);
-    } else if (is_long_option(argv[i])) {
-      params->createElement(argv[i] + 2, argv[i + 1]);
+    enum paramType type = getParamType(argv[i]);
+    const char *paramName = nullptr;
+
+    // Check param type
+    if (type == paramShort)
+      paramName = argv[i] + 1;
+    else if (type == paramLong)
+      paramName = argv[i] + 2;
+    else
+      throw DataException(std::string("bad parameter <") + argv[i] + ">");
+
+    // Get param data
+    if (nextParamIsData(i, argc, argv)) {
+      params->createElement(paramName, argv[i + 1]);
       i++;
+    } else {
+      params->createElement(paramName);
     }
   }