From 82cf6fa5658ccbe612b989e50dfe4e88e617b980 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Mon, 8 Feb 2010 09:53:22 +0000 Subject: [PATCH] Add a generic internal alias system to Architecture Avoid breaking packages that compare arch against win32 --- source/architecture.cpp | 75 +++++++++++++++++++++++++++-------------- source/architecture.h | 1 + 2 files changed, 50 insertions(+), 26 deletions(-) diff --git a/source/architecture.cpp b/source/architecture.cpp index 436a45a..cf888f0 100644 --- a/source/architecture.cpp +++ b/source/architecture.cpp @@ -28,21 +28,19 @@ const char *types[] = const char *cpus[] = { - "i386", "pc", 0, - "i486", "pc", 0, - "pentium", "pc", 0, - "i586", "pc", "pentium", - "pentiumpro", "pc", 0, - "i686", "pc", "pentiumpro", - "pentium2", "pc", 0, - "pentium3", "pc", 0, - "pentium4", "pc", 0, - "core2", "pc", 0, - "k6", "pc", 0, - "athlon", "pc", 0, - "athlonxp", "pc", 0, - "athlon64", "pc", 0, - "armv5", "arm", 0, + "i386", "pc", + "i486", "pc", + "pentium", "pc", + "pentiumpro", "pc", + "pentium2", "pc", + "pentium3", "pc", + "pentium4", "pc", + "core2", "pc", + "k6", "pc", + "athlon", "pc", + "athlonxp", "pc", + "athlon64", "pc", + "armv5", "arm", 0 }; @@ -54,6 +52,14 @@ const char *systems[] = 0 }; +const char *aliases[] = +{ + "i586", "pentium", + "i686", "pentiumpro", + "win32", "windows", + 0 +}; + } Architecture::Architecture(Builder &b, const string &spec): @@ -153,47 +159,64 @@ bool Architecture::match_name(const string &pattern) const vector parts = split(pattern, "-"); for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) { - if(*i!=type && *i!=cpu && *i!=system) + string part = resolve_alias(*i); + if(part!=type && part!=cpu && part!=system) return false; } return true; } +string Architecture::resolve_alias(const string &part) const +{ + for(unsigned j=0; aliases[j]; j+=2) + if(part==aliases[j]) + return aliases[j+1]; + + return part; +} + void Architecture::parse_specification(const string &spec) { vector parts = split(spec, "-"); for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) { + string part = resolve_alias(*i); + bool ok = false; + for(unsigned j=0; (!ok && types[j]); ++j) - if(*i==types[j]) + if(part==types[j]) { - if(!type.empty() && *i!=type) + if(!type.empty() && part!=type) throw InvalidParameterValue("Conflicting type specification"); - type = *i; + type = part; ok = true; } - for(unsigned j=0; (!ok && cpus[j]); j+=3) - if(*i==cpus[j]) + + for(unsigned j=0; (!ok && cpus[j]); j+=2) + if(part==cpus[j]) { if(type.empty()) type = cpus[j+1]; else if(cpus[j+1]!=type) throw InvalidParameterValue("Conflicting CPU specification"); - cpu = (cpus[j+2] ? cpus[j+2] : *i); + cpu = part; ok = true; } + for(unsigned j=0; (!ok && systems[j]); ++j) - if(*i==systems[j]) + if(part==systems[j]) { - system = *i; + system = part; ok = true; } - if(!ok && (*i=="32" || *i=="64")) + + if(!ok && (part=="32" || part=="64")) { - bits = lexical_cast(*i); + bits = lexical_cast(part); ok = true; } + if(!ok) throw InvalidParameterValue("Unrecognized part in arch specification: "+*i); } diff --git a/source/architecture.h b/source/architecture.h index a638834..ad30fe5 100644 --- a/source/architecture.h +++ b/source/architecture.h @@ -58,6 +58,7 @@ public: const BuildInfo &get_build_info() const { return build_info; } private: + std::string resolve_alias(const std::string &) const; void parse_specification(const std::string &); }; -- 2.43.0