1 //===- llvm/TextAPI/PackedVersion.cpp - PackedVersion -----------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 /// \brief Implements the Mach-O packed version.
13 //===----------------------------------------------------------------------===//
15 #include "llvm/TextAPI/MachO/PackedVersion.h"
16 #include "llvm/ADT/SmallString.h"
17 #include "llvm/ADT/SmallVector.h"
18 #include "llvm/ADT/StringExtras.h"
19 #include "llvm/Support/Format.h"
20 #include "llvm/Support/raw_ostream.h"
25 bool PackedVersion::parse32(StringRef Str) {
31 SmallVector<StringRef, 3> Parts;
32 SplitString(Str, Parts, ".");
37 unsigned long long Num;
38 if (getAsUnsignedInteger(Parts[0], 10, Num))
46 for (unsigned i = 1, ShiftNum = 8; i < Parts.size(); ++i, ShiftNum -= 8) {
47 if (getAsUnsignedInteger(Parts[i], 10, Num))
53 Version |= (Num << ShiftNum);
59 std::pair<bool, bool> PackedVersion::parse64(StringRef Str) {
60 bool Truncated = false;
64 return std::make_pair(false, Truncated);
66 SmallVector<StringRef, 5> Parts;
67 SplitString(Str, Parts, ".");
70 return std::make_pair(false, Truncated);
72 unsigned long long Num;
73 if (getAsUnsignedInteger(Parts[0], 10, Num))
74 return std::make_pair(false, Truncated);
76 if (Num > 0xFFFFFFULL)
77 return std::make_pair(false, Truncated);
79 if (Num > 0xFFFFULL) {
85 for (unsigned i = 1, ShiftNum = 8; i < Parts.size() && i < 3;
87 if (getAsUnsignedInteger(Parts[i], 10, Num))
88 return std::make_pair(false, Truncated);
91 return std::make_pair(false, Truncated);
97 Version |= (Num << ShiftNum);
100 if (Parts.size() > 3)
103 return std::make_pair(true, Truncated);
106 void PackedVersion::print(raw_ostream &OS) const {
107 OS << format("%d", getMajor());
108 if (getMinor() || getSubminor())
109 OS << format(".%d", getMinor());
111 OS << format(".%d", getSubminor());
114 } // end namespace MachO.
115 } // end namespace llvm.