+int
+Locations::next_available_name(string& result,string base)
+{
+ LocationList::iterator i;
+ string::size_type l;
+ int suffix;
+ char buf[32];
+ std::map<uint32_t,bool> taken;
+ uint32_t n;
+
+ result = base;
+ l = base.length();
+
+ if (!base.empty()) {
+
+ /* find all existing names that match "base", and store
+ the numeric part of them (if any) in the map "taken"
+ */
+
+ for (i = locations.begin(); i != locations.end(); ++i) {
+
+ const string& temp ((*i)->name());
+
+ if (!temp.find (base,0)) {
+ /* grab what comes after the "base" as if it was
+ a number, and assuming that works OK,
+ store it in "taken" so that we know it
+ has been used.
+ */
+ if ((suffix = atoi (temp.substr(l))) != 0) {
+ taken.insert (make_pair (suffix,true));
+ }
+ }
+ }
+ }
+
+ /* Now search for an un-used suffix to add to "base". This
+ will find "holes" in the numbering sequence when a location
+ was deleted.
+
+ This must start at 1, both for human-numbering reasons
+ and also because the call to atoi() above would return
+ zero if there is no recognizable numeric suffix, causing
+ "base 0" not to be inserted into the "taken" map.
+ */
+
+ n = 1;
+
+ while (n < UINT32_MAX) {
+ if (taken.find (n) == taken.end()) {
+ snprintf (buf, sizeof(buf), "%d", n);
+ result += buf;
+ return 1;
+ }
+ ++n;
+ }
+
+ return 0;
+}
+