From: Vitaliy Cherepanov/AI Tools Lab /SRR/Engineer/삼성전자 Date: Wed, 13 Jun 2018 12:18:13 +0000 (+0300) Subject: nnc: fix console params parsing (#326) X-Git-Tag: nncc_backup~2603 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=76c1b8773387a397448c1ea1507e6e4a39ffff4b;p=platform%2Fcore%2Fml%2Fnnfw.git nnc: fix console params parsing (#326) fix wrong single params parsing (params like '-a', '-f') Signed-off-by: Vitaliy Cherepanov --- diff --git a/contrib/nnc/src/module/plugin/PluginData.cpp b/contrib/nnc/src/module/plugin/PluginData.cpp index f553638..bb3aaaa 100644 --- a/contrib/nnc/src/module/plugin/PluginData.cpp +++ b/contrib/nnc/src/module/plugin/PluginData.cpp @@ -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::parse(int argc, char *argv[]) noexcept(false std::shared_ptr 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); } }