}
// 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;
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);
}
}