+string Architecture::best_match(const list<string> &names) const
+{
+ string best;
+ unsigned best_size = 0;
+ for(list<string>::const_iterator i=names.begin(); i!=names.end(); ++i)
+ if(match_name(*i))
+ {
+ /* TODO Do full parse and alias resolution here? Otherwise x86 and
+ x86_64 are treated as equally good, even though the latter is more
+ specific. */
+ unsigned size = 1;
+ for(string::const_iterator j=i->begin(); j!=i->end(); ++j)
+ size += (*j=='-');
+
+ if(size>best_size)
+ {
+ best = *i;
+ best_size = size;
+ }
+ }
+
+ return best;
+}
+
+void Architecture::resolve_aliases(vector<string> &parts)
+{
+ for(unsigned i=0; i<parts.size(); ++i)
+ {
+ const string &part = parts[i];
+ const char *replace = 0;
+ for(unsigned j=0; (!replace && aliases[j]); j+=2)
+ if(part==aliases[j])
+ replace = aliases[j+1];
+
+ if(replace)
+ {
+ bool has_dash = false;
+ for(const char *c=replace; (!has_dash && *c); ++c)
+ has_dash = (*c=='-');
+
+ if(has_dash)
+ {
+ vector<string> rparts = split(replace, "-");
+ parts[i] = rparts[0];
+ parts.insert(parts.begin()+i+1, rparts.begin()+1, rparts.end());
+ i += rparts.size()-1;
+ }
+ else
+ parts[i] = replace;
+ }
+ }
+}
+
+void Architecture::parse_specification(const string &spec)