mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-18 11:24:01 +00:00
add some more overloads of StringRef::getAsInteger for
common and useful integer types. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82338 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -235,8 +235,10 @@ namespace llvm {
|
|||||||
/// this returns true to signify the error. The string is considered
|
/// this returns true to signify the error. The string is considered
|
||||||
/// erroneous if empty.
|
/// erroneous if empty.
|
||||||
///
|
///
|
||||||
//bool getAsInteger(unsigned Radix, long long &Result) const;
|
bool getAsInteger(unsigned Radix, long long &Result) const;
|
||||||
bool getAsInteger(unsigned Radix, unsigned long long &Result) const;
|
bool getAsInteger(unsigned Radix, unsigned long long &Result) const;
|
||||||
|
bool getAsInteger(unsigned Radix, int &Result) const;
|
||||||
|
bool getAsInteger(unsigned Radix, unsigned &Result) const;
|
||||||
|
|
||||||
// TODO: Provide overloads for int/unsigned that check for overflow.
|
// TODO: Provide overloads for int/unsigned that check for overflow.
|
||||||
|
|
||||||
|
@ -12,6 +12,8 @@ using namespace llvm;
|
|||||||
|
|
||||||
const size_t StringRef::npos;
|
const size_t StringRef::npos;
|
||||||
|
|
||||||
|
/// GetAsUnsignedInteger - Workhorse method that converts a integer character
|
||||||
|
/// sequence of radix up to 36 to an unsigned long long value.
|
||||||
static bool GetAsUnsignedInteger(StringRef Str, unsigned Radix,
|
static bool GetAsUnsignedInteger(StringRef Str, unsigned Radix,
|
||||||
unsigned long long &Result) {
|
unsigned long long &Result) {
|
||||||
// Autosense radix if not specified.
|
// Autosense radix if not specified.
|
||||||
@ -74,3 +76,46 @@ bool StringRef::getAsInteger(unsigned Radix, unsigned long long &Result) const {
|
|||||||
return GetAsUnsignedInteger(*this, Radix, Result);
|
return GetAsUnsignedInteger(*this, Radix, Result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool StringRef::getAsInteger(unsigned Radix, long long &Result) const {
|
||||||
|
unsigned long long ULLVal;
|
||||||
|
|
||||||
|
// Handle positive strings first.
|
||||||
|
if (empty() || front() != '-') {
|
||||||
|
if (GetAsUnsignedInteger(*this, Radix, ULLVal) ||
|
||||||
|
// Check for value so large it overflows a signed value.
|
||||||
|
(long long)ULLVal < 0)
|
||||||
|
return true;
|
||||||
|
Result = ULLVal;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the positive part of the value.
|
||||||
|
if (GetAsUnsignedInteger(substr(1), Radix, ULLVal) ||
|
||||||
|
// Reject values so large they'd overflow as negative signed, but allow
|
||||||
|
// "-0". This negates the unsigned so that the negative isn't undefined
|
||||||
|
// on signed overflow.
|
||||||
|
(long long)-ULLVal > 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
Result = -ULLVal;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StringRef::getAsInteger(unsigned Radix, int &Result) const {
|
||||||
|
long long Val;
|
||||||
|
if (getAsInteger(Radix, Val) ||
|
||||||
|
(int)Val != Val)
|
||||||
|
return true;
|
||||||
|
Result = Val;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StringRef::getAsInteger(unsigned Radix, unsigned &Result) const {
|
||||||
|
unsigned long long Val;
|
||||||
|
if (getAsInteger(Radix, Val) ||
|
||||||
|
(unsigned)Val != Val)
|
||||||
|
return true;
|
||||||
|
Result = Val;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user