PackedVersion.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. #include "llvm/TextAPI/MachO/PackedVersion.h"
  15. #include "llvm/ADT/SmallString.h"
  16. #include "llvm/ADT/SmallVector.h"
  17. #include "llvm/ADT/StringExtras.h"
  18. #include "llvm/Support/Format.h"
  19. #include "llvm/Support/raw_ostream.h"
  20. namespace llvm {
  21. namespace MachO {
  22. bool PackedVersion::parse32(StringRef Str) {
  23. Version = 0;
  24. if (Str.empty())
  25. return false;
  26. SmallVector<StringRef, 3> Parts;
  27. SplitString(Str, Parts, ".");
  28. if (Parts.size() > 3)
  29. return false;
  30. unsigned long long Num;
  31. if (getAsUnsignedInteger(Parts[0], 10, Num))
  32. return false;
  33. if (Num > UINT16_MAX)
  34. return false;
  35. Version = Num << 16;
  36. for (unsigned i = 1, ShiftNum = 8; i < Parts.size(); ++i, ShiftNum -= 8) {
  37. if (getAsUnsignedInteger(Parts[i], 10, Num))
  38. return false;
  39. if (Num > UINT8_MAX)
  40. return false;
  41. Version |= (Num << ShiftNum);
  42. }
  43. return true;
  44. }
  45. std::pair<bool, bool> PackedVersion::parse64(StringRef Str) {
  46. bool Truncated = false;
  47. Version = 0;
  48. if (Str.empty())
  49. return std::make_pair(false, Truncated);
  50. SmallVector<StringRef, 5> Parts;
  51. SplitString(Str, Parts, ".");
  52. if (Parts.size() > 5)
  53. return std::make_pair(false, Truncated);
  54. unsigned long long Num;
  55. if (getAsUnsignedInteger(Parts[0], 10, Num))
  56. return std::make_pair(false, Truncated);
  57. if (Num > 0xFFFFFFULL)
  58. return std::make_pair(false, Truncated);
  59. if (Num > 0xFFFFULL) {
  60. Num = 0xFFFFULL;
  61. Truncated = true;
  62. }
  63. Version = Num << 16;
  64. for (unsigned i = 1, ShiftNum = 8; i < Parts.size() && i < 3;
  65. ++i, ShiftNum -= 8) {
  66. if (getAsUnsignedInteger(Parts[i], 10, Num))
  67. return std::make_pair(false, Truncated);
  68. if (Num > 0x3FFULL)
  69. return std::make_pair(false, Truncated);
  70. if (Num > 0xFFULL) {
  71. Num = 0xFFULL;
  72. Truncated = true;
  73. }
  74. Version |= (Num << ShiftNum);
  75. }
  76. if (Parts.size() > 3)
  77. Truncated = true;
  78. return std::make_pair(true, Truncated);
  79. }
  80. void PackedVersion::print(raw_ostream &OS) const {
  81. OS << format("%d", getMajor());
  82. if (getMinor() || getSubminor())
  83. OS << format(".%d", getMinor());
  84. if (getSubminor())
  85. OS << format(".%d", getSubminor());
  86. }
  87. } // end namespace MachO.
  88. } // end namespace llvm.