+std::string
+TDictionary::complete(const std::string prefix, std::list<std::string>& complete_list) const
+{
+ bool no_match = true;
+ std::string new_prefix = "";
+ for (Dictionary::const_iterator i = entries.begin(); i != entries.end(); i++)
+ {
+ if ((*i).first.find(prefix) == 0)
+ {
+ complete_list.push_front((*i).first);
+ if (no_match)
+ {
+ // it's the first match
+ no_match = false;
+ new_prefix = (*i).first;
+ }
+ else
+ {
+ // in this case, new_prefix has been set yet.
+ std::string s1 = (*i).first.substr(prefix.length()); // s1 is the high part of the matching string
+ std::string s2 = new_prefix.substr(prefix.length()); // s2 is the high part of new_prefix
+#if 0
+ long j = 0; // it's the number of common characters
+ while (s1[j] == s2[j]) j++;
+#endif
+ std::string::const_iterator i1 = s1.begin();
+ std::string::const_iterator i2 = s2.begin();
+ while (i1 != s1.end() && i2 != s2.end() && *i1 == *i2) i1++, i2++;
+ new_prefix = prefix + s1.substr(0, i1 - s1.begin());
+ //new_prefix = (j) ? prefix + s1.substr(0, i1 - s1.begin()) : prefix;
+ }
+ }
+ }
+
+ return new_prefix;
+}
+