[nolimips] 217: Make extraction of option's value more conventional.

Index: ChangeLog from Benoit Perrot <benoit@lrde.epita.fr> Make extraction of option's value more conventional. * src/task/task_register.cc: Split argv[] on `=' for long options' values only. Split argv[] in place for short options' value. Use the next argv[] when no value is provided. Index: src/task/task_register.cc --- src/task/task_register.cc (revision 216) +++ src/task/task_register.cc (working copy) @@ -151,50 +151,91 @@ if ((1 < arg.size ()) && (arg[0] == '-')) { - std::string value; + std::string *value = 0; + + // Identify option + TaskRegister::const_task_iterator it(tasks_.end()); + if (arg[1] == '-') // Long option + { + // Split on `=' for value unsigned eq = arg.find('='); if (eq < arg.size()) { - value = std::string(arg, eq +1); + // +1: do not include `=' in value + value = new std::string(arg, eq + 1); arg.resize(eq); } - // Identify option - TaskRegister::const_task_iterator it(tasks_.end()); - if (arg[1] == '-') // Long option + // Search for long option it = find_task(arg); - else // Short option - for (unsigned l = 1; l < arg.size(); ++l) + } + else // Short option(s) + { + for (unsigned l = 1; l < arg.size() && !value; ++l) { std::string short_option("-"); short_option += arg[l]; + // Search for short option it = find_task(short_option); - if (it != tasks_.end() && (l < arg.size() -1)) + + // Let last task fall through the remaining of the + // routine + if (l + 1 < arg.size()) + if (it != tasks_.end()) + { + if (it->second->needs_value()) + // Split here for value + value = new std::string(arg, l + 1); + else + // Enable task enable_task(*(it->second)); } + } + } - // Consider value + // Enable (long or last short) task and set value if needed if (it != tasks_.end()) { const Task *task = it->second; - if (!task->needs_value() && !value.empty()) + + if (task->needs_value()) + { + if (!value) + { + ++i; + if (i < argc) + value = new std::string(argv[i]); + } + + if (!value) std::cerr << program_name << ": option `" << task->long_opt() - << "' does not take a value" << std::endl; - else if (task->needs_value() && value.empty()) + << "' takes a value" << std::endl; + else + { + task->set_value(*value); + enable_task(*task); + } + } + else + { + if (value) std::cerr << program_name << ": option `" << task->long_opt() - << "' takes a value" << std::endl; - else if (value.empty() || task->set_value(value)) + << "' does not take a value" << std::endl; + else enable_task(*task); } - else if (!value.empty()) + } + else if (value) std::cerr << program_name - << ": `"<< value << "': unexpected value" << std::endl; + << ": `"<< *value << "': unexpected value" << std::endl; + + delete value; } else res = argv[i];
participants (1)
-
Noe