Add control of hex casing in APInt::toString
authorThomas Preud'homme <thomas.preudhomme@arm.com>
Thu, 18 May 2023 09:10:21 +0000 (09:10 +0000)
committerThomas Preud'homme <thomas.preudhomme@arm.com>
Fri, 19 May 2023 13:20:47 +0000 (14:20 +0100)
This will be used in implementing arbitrary precision support to
FileCheck's numeric variables and expressions.

Reviewed By: foad, RKSimon

Differential Revision: https://reviews.llvm.org/D150879

llvm/include/llvm/ADT/APInt.h
llvm/lib/Support/APInt.cpp
llvm/unittests/ADT/APIntTest.cpp

index 0357165..f6f2e19 100644 (file)
@@ -1635,9 +1635,10 @@ public:
   void print(raw_ostream &OS, bool isSigned) const;
 
   /// Converts an APInt to a string and append it to Str.  Str is commonly a
-  /// SmallString.
+  /// SmallString. If Radix > 10, UpperCase determine the case of letter
+  /// digits.
   void toString(SmallVectorImpl<char> &Str, unsigned Radix, bool Signed,
-                bool formatAsCLiteral = false) const;
+                bool formatAsCLiteral = false, bool UpperCase = true) const;
 
   /// Considers the APInt to be unsigned and converts it into a string in the
   /// radix given. The radix can be 2, 8, 10 16, or 36.
index e10057d..7724c65 100644 (file)
@@ -2136,8 +2136,8 @@ void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
     this->negate();
 }
 
-void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
-                     bool Signed, bool formatAsCLiteral) const {
+void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix, bool Signed,
+                     bool formatAsCLiteral, bool UpperCase) const {
   assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
           Radix == 36) &&
          "Radix should be 2, 8, 10, 16, or 36!");
@@ -2173,7 +2173,9 @@ void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
     return;
   }
 
-  static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+  static const char BothDigits[] = "0123456789abcdefghijklmnopqrstuvwxyz"
+                                   "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+  const char *Digits = BothDigits + (UpperCase ? 36 : 0);
 
   if (isSingleWord()) {
     char Buffer[65];
index d8d7bfa..b8cf48c 100644 (file)
@@ -1388,6 +1388,9 @@ TEST(APIntTest, toString) {
   APInt(8, 255, isSigned).toString(S, 10, isSigned, true);
   EXPECT_EQ(std::string(S), "255");
   S.clear();
+  APInt(8, 255, isSigned).toString(S, 16, isSigned, true, /*UpperCase=*/false);
+  EXPECT_EQ(std::string(S), "0xff");
+  S.clear();
   APInt(8, 255, isSigned).toString(S, 16, isSigned, true);
   EXPECT_EQ(std::string(S), "0xFF");
   S.clear();