OSDN Git Service

[CallSiteSplitting] Report edge deletion to DomTreeUpdater
[android-x86/external-llvm.git] / lib / TextAPI / MachO / PackedVersion.cpp
1 //===- llvm/TextAPI/PackedVersion.cpp - PackedVersion -----------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// \brief Implements the Mach-O packed version.
12 ///
13 //===----------------------------------------------------------------------===//
14
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"
21
22 namespace llvm {
23 namespace MachO {
24
25 bool PackedVersion::parse32(StringRef Str) {
26   Version = 0;
27
28   if (Str.empty())
29     return false;
30
31   SmallVector<StringRef, 3> Parts;
32   SplitString(Str, Parts, ".");
33
34   if (Parts.size() > 3)
35     return false;
36
37   unsigned long long Num;
38   if (getAsUnsignedInteger(Parts[0], 10, Num))
39     return false;
40
41   if (Num > UINT16_MAX)
42     return false;
43
44   Version = Num << 16;
45
46   for (unsigned i = 1, ShiftNum = 8; i < Parts.size(); ++i, ShiftNum -= 8) {
47     if (getAsUnsignedInteger(Parts[i], 10, Num))
48       return false;
49
50     if (Num > UINT8_MAX)
51       return false;
52
53     Version |= (Num << ShiftNum);
54   }
55
56   return true;
57 }
58
59 std::pair<bool, bool> PackedVersion::parse64(StringRef Str) {
60   bool Truncated = false;
61   Version = 0;
62
63   if (Str.empty())
64     return std::make_pair(false, Truncated);
65
66   SmallVector<StringRef, 5> Parts;
67   SplitString(Str, Parts, ".");
68
69   if (Parts.size() > 5)
70     return std::make_pair(false, Truncated);
71
72   unsigned long long Num;
73   if (getAsUnsignedInteger(Parts[0], 10, Num))
74     return std::make_pair(false, Truncated);
75
76   if (Num > 0xFFFFFFULL)
77     return std::make_pair(false, Truncated);
78
79   if (Num > 0xFFFFULL) {
80     Num = 0xFFFFULL;
81     Truncated = true;
82   }
83   Version = Num << 16;
84
85   for (unsigned i = 1, ShiftNum = 8; i < Parts.size() && i < 3;
86        ++i, ShiftNum -= 8) {
87     if (getAsUnsignedInteger(Parts[i], 10, Num))
88       return std::make_pair(false, Truncated);
89
90     if (Num > 0x3FFULL)
91       return std::make_pair(false, Truncated);
92
93     if (Num > 0xFFULL) {
94       Num = 0xFFULL;
95       Truncated = true;
96     }
97     Version |= (Num << ShiftNum);
98   }
99
100   if (Parts.size() > 3)
101     Truncated = true;
102
103   return std::make_pair(true, Truncated);
104 }
105
106 void PackedVersion::print(raw_ostream &OS) const {
107   OS << format("%d", getMajor());
108   if (getMinor() || getSubminor())
109     OS << format(".%d", getMinor());
110   if (getSubminor())
111     OS << format(".%d", getSubminor());
112 }
113
114 } // end namespace MachO.
115 } // end namespace llvm.