diff --git a/src/CLI.cpp b/src/CLI.cpp index 1c5e71ccc..61bae23d2 100644 --- a/src/CLI.cpp +++ b/src/CLI.cpp @@ -33,6 +33,12 @@ extern Context context; +// Overridden by rc.abbreviation.minimum. +static int minimumMatchLength = 3; + +// Alias expansion limit. Any more indicates some kind of error. +static int safetyValveDefault = 10; + //////////////////////////////////////////////////////////////////////////////// CLI::CLI () : _program ("") @@ -128,6 +134,43 @@ bool CLI::exactMatch ( return false; } +//////////////////////////////////////////////////////////////////////////////// +// Search for 'value' in _entities category, return canonicalized value. +bool CLI::canonicalize ( + std::string& canonicalized, + const std::string& category, + const std::string& value) const +{ + // Find the category. + std::pair ::const_iterator, std::multimap ::const_iterator> c; + c = _entities.equal_range (category); + + // Extract a list of entities for category. + std::vector options; + std::multimap ::const_iterator e; + for (e = c.first; e != c.second; ++e) + { + // Shortcut: if an exact match is found, success. + if (value == e->second) + { + canonicalized = value; + return true; + } + + options.push_back (e->second); + } + + // Match against the options, throw away results. + std::vector matches; + if (autoComplete (value, options, matches, minimumMatchLength) == 1) + { + canonicalized = matches[0]; + return true; + } + + return false; +} + //////////////////////////////////////////////////////////////////////////////// void CLI::dump (const std::string& label) const {