}
}
-bool Architecture::match_name(const string &pattern) const
+bool Architecture::match_name(const string &pattern, unsigned *quality) const
{
bool negate = (pattern[0]=='!');
vector<string> parts = split(pattern.substr(negate), "-");
if((p=="32" && bits==32) || (p=="64" && bits==64))
;
else if(p!=type && p!=cpu && p!=fpu && p!=system && p!=toolchain)
+ {
+ if(quality)
+ *quality = 0;
return negate;
+ }
}
+
+ if(quality)
+ *quality = parts.size();
return !negate;
}
string Architecture::best_match(const vector<string> &names) const
{
string best;
- unsigned best_size = 0;
+ unsigned best_quality = 0;
for(const string &n: names)
- if(match_name(n))
- {
- /* 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(char c: n)
- size += (c=='-');
-
- if(size>best_size)
+ {
+ unsigned quality;
+ if(match_name(n, &quality))
+ if(quality>best_quality)
{
best = n;
- best_size = size;
+ best_quality = quality;
}
- }
+ }
return best;
}
const std::string &get_cpu() const { return cpu; }
const std::string &get_fpu() const { return fpu; }
const std::string &get_toolchain() const { return toolchain; }
- bool match_name(const std::string &) const;
+ bool match_name(const std::string &, unsigned * = 0) const;
std::string best_match(const std::vector<std::string> &) const;
bool is_native() const { return native; }
bool is_cross() const { return !cross_prefix.empty(); }