Path: blob/main/contrib/llvm-project/llvm/lib/TextAPI/PackedVersion.cpp
35262 views
//===- PackedVersion.cpp --------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// Implements the Mach-O packed version.9//10//===----------------------------------------------------------------------===//1112#include "llvm/TextAPI/PackedVersion.h"13#include "llvm/ADT/SmallVector.h"14#include "llvm/ADT/StringExtras.h"15#include "llvm/Support/Format.h"16#include "llvm/Support/raw_ostream.h"1718namespace llvm {19namespace MachO {2021bool PackedVersion::parse32(StringRef Str) {22Version = 0;2324if (Str.empty())25return false;2627SmallVector<StringRef, 3> Parts;28SplitString(Str, Parts, ".");2930if (Parts.size() > 3 || Parts.empty())31return false;3233unsigned long long Num;34if (getAsUnsignedInteger(Parts[0], 10, Num))35return false;3637if (Num > UINT16_MAX)38return false;3940Version = Num << 16;4142for (unsigned i = 1, ShiftNum = 8; i < Parts.size(); ++i, ShiftNum -= 8) {43if (getAsUnsignedInteger(Parts[i], 10, Num))44return false;4546if (Num > UINT8_MAX)47return false;4849Version |= (Num << ShiftNum);50}5152return true;53}5455std::pair<bool, bool> PackedVersion::parse64(StringRef Str) {56bool Truncated = false;57Version = 0;5859if (Str.empty())60return std::make_pair(false, Truncated);6162SmallVector<StringRef, 5> Parts;63SplitString(Str, Parts, ".");6465if (Parts.size() > 5 || Parts.empty())66return std::make_pair(false, Truncated);6768unsigned long long Num;69if (getAsUnsignedInteger(Parts[0], 10, Num))70return std::make_pair(false, Truncated);7172if (Num > 0xFFFFFFULL)73return std::make_pair(false, Truncated);7475if (Num > 0xFFFFULL) {76Num = 0xFFFFULL;77Truncated = true;78}79Version = Num << 16;8081for (unsigned i = 1, ShiftNum = 8; i < Parts.size() && i < 3;82++i, ShiftNum -= 8) {83if (getAsUnsignedInteger(Parts[i], 10, Num))84return std::make_pair(false, Truncated);8586if (Num > 0x3FFULL)87return std::make_pair(false, Truncated);8889if (Num > 0xFFULL) {90Num = 0xFFULL;91Truncated = true;92}93Version |= (Num << ShiftNum);94}9596if (Parts.size() > 3)97Truncated = true;9899return std::make_pair(true, Truncated);100}101102PackedVersion::operator std::string() const {103SmallString<32> Str;104raw_svector_ostream OS(Str);105print(OS);106return std::string(Str);107}108109void PackedVersion::print(raw_ostream &OS) const {110OS << format("%d", getMajor());111if (getMinor() || getSubminor())112OS << format(".%d", getMinor());113if (getSubminor())114OS << format(".%d", getSubminor());115}116117} // end namespace MachO.118} // end namespace llvm.119120121