diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index 4935acc66da8..cdcb97691f11 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -235,6 +235,17 @@ public: const std::string &ArchName) const; /// @} + + /// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and + /// return the grouped values as integers. Numbers which are not + /// provided are set to 0. + /// + /// \return True if the entire string was parsed (9.2), or all + /// groups were parsed (10.3.5extrastuff). HadExtra is true if all + /// groups were parsed but extra characters remain at the end. + static bool GetReleaseVersion(const char *Str, unsigned &Major, + unsigned &Minor, unsigned &Micro, + bool &HadExtra); }; } // end namespace driver diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index dc303ad0498c..1562fde14cab 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1029,3 +1029,42 @@ bool Driver::ShouldUseClangCompiler(const Compilation &C, const JobAction &JA, return true; } + +/// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and +/// return the grouped values as integers. Numbers which are not +/// provided are set to 0. +/// +/// \return True if the entire string was parsed (9.2), or all groups +/// were parsed (10.3.5extrastuff). +bool Driver::GetReleaseVersion(const char *Str, unsigned &Major, + unsigned &Minor, unsigned &Micro, + bool &HadExtra) { + HadExtra = false; + + Major = Minor = Micro = 0; + if (*Str == '\0') + return true; + + char *End; + Major = (unsigned) strtol(Str, &End, 10); + if (*Str != '\0' && *End == '\0') + return true; + if (*End != '.') + return false; + + Str = End+1; + Minor = (unsigned) strtol(Str, &End, 10); + if (*Str != '\0' && *End == '\0') + return true; + if (*End != '.') + return false; + + Str = End+1; + Micro = (unsigned) strtol(Str, &End, 10); + if (*Str != '\0' && *End == '\0') + return true; + if (Str == End) + return false; + HadExtra = true; + return true; +} diff --git a/clang/lib/Driver/HostInfo.cpp b/clang/lib/Driver/HostInfo.cpp index 8f762095b614..c02267fbdc8c 100644 --- a/clang/lib/Driver/HostInfo.cpp +++ b/clang/lib/Driver/HostInfo.cpp @@ -72,37 +72,6 @@ public: const char *ArchName) const; }; -/// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and -/// return the grouped values as integers. Numbers which are not -/// provided are set to 0. -/// -/// \return True if the entire string was parsed (9.2), or all groups -/// were parsed (10.3.5extrastuff). -static bool GetReleaseVersion(const char *Str, unsigned &Major, - unsigned &Minor, unsigned &Micro) { - Major = Minor = Micro = 0; - if (*Str == '\0') - return true; - - char *End; - Major = (unsigned) strtol(Str, &End, 10); - if (*Str != '\0' && *End == '\0') - return true; - if (*End != '.') - return false; - - Str = End+1; - Minor = (unsigned) strtol(Str, &End, 10); - if (*Str != '\0' && *End == '\0') - return true; - if (*End != '.') - return false; - - Str = End+1; - Micro = (unsigned) strtol(Str, &End, 10); - return true; -} - DarwinHostInfo::DarwinHostInfo(const Driver &D, const char *_Arch, const char *_Platform, const char *_OS) : HostInfo(D, _Arch, _Platform, _OS) { @@ -114,8 +83,9 @@ DarwinHostInfo::DarwinHostInfo(const Driver &D, const char *_Arch, assert(memcmp(&getOSName()[0], "darwin", 6) == 0 && "Unknown Darwin platform."); const char *Release = &getOSName()[6]; - if (!GetReleaseVersion(Release, DarwinVersion[0], DarwinVersion[1], - DarwinVersion[2])) { + bool HadExtra; + if (!Driver::GetReleaseVersion(Release, DarwinVersion[0], DarwinVersion[1], + DarwinVersion[2], HadExtra)) { D.Diag(clang::diag::err_drv_invalid_darwin_version) << Release; }