[llvm-commits] [llvm] r82322 - in /llvm/trunk: include/llvm/ADT/StringRef.h lib/Support/StringRef.cpp
Daniel Dunbar
daniel at zuster.org
Sun Sep 20 14:20:52 PDT 2009
On Sat, Sep 19, 2009 at 12:47 PM, Chris Lattner <sabre at nondot.org> wrote:
> Author: lattner
> Date: Sat Sep 19 14:47:14 2009
> New Revision: 82322
>
> URL: http://llvm.org/viewvc/llvm-project?rev=82322&view=rev
> Log:
> provide a "strtoull" operation that works on StringRef's.
Yay!
> Modified:
> llvm/trunk/include/llvm/ADT/StringRef.h
> llvm/trunk/lib/Support/StringRef.cpp
>
> Modified: llvm/trunk/include/llvm/ADT/StringRef.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/StringRef.h?rev=82322&r1=82321&r2=82322&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ADT/StringRef.h (original)
> +++ llvm/trunk/include/llvm/ADT/StringRef.h Sat Sep 19 14:47:14 2009
> @@ -224,6 +224,23 @@
> }
>
> /// @}
> + /// @name Helpful Algorithms
> + /// @{
> +
> + /// getAsInteger - Parse the current string as an integer of the specified
> + /// radix. If Radix is specified as zero, this does radix autosensing using
> + /// extended C rules: 0 is octal, 0x is hex, 0b is binary.
> + ///
> + /// If the string is invalid or if only a subset of the string is valid,
> + /// this returns true to signify the error. The string is considered
> + /// erroneous if empty.
> + ///
> + //bool getAsInteger(unsigned Radix, long long &Result) const;
> + bool getAsInteger(unsigned Radix, unsigned long long &Result) const;
> +
> + // TODO: Provide overloads for int/unsigned that check for overflow.
> +
> + /// @}
> /// @name Substring Operations
> /// @{
>
>
> Modified: llvm/trunk/lib/Support/StringRef.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/StringRef.cpp?rev=82322&r1=82321&r2=82322&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/StringRef.cpp (original)
> +++ llvm/trunk/lib/Support/StringRef.cpp Sat Sep 19 14:47:14 2009
> @@ -11,3 +11,66 @@
> using namespace llvm;
>
> const size_t StringRef::npos;
> +
> +static bool GetAsUnsignedInteger(StringRef Str, unsigned Radix,
> + unsigned long long &Result) {
> + // Autosense radix if not specified.
> + if (Radix == 0) {
> + if (Str[0] != '0') {
> + Radix = 10;
> + } else {
> + if (Str.size() < 2) {
> + Radix = 8;
> + } else {
> + if (Str[1] == 'x') {
> + Str = Str.substr(2);
> + Radix = 16;
> + } else if (Str[1] == 'b') {
> + Str = Str.substr(2);
> + Radix = 2;
> + } else {
> + Radix = 8;
> + }
> + }
> + }
> + }
I think this would be simpler as:
--
if (Radix == 0) {
if (Str.startswith("0x")) {
Str = Str.substr(2);
Radix = 16;
} else if (Str.startswith("0b")) {
Str = Str.substr(2);
Radix = 2;
} else if (Str.startswith("0"))
Radix = 8;
else
Radix = 10;
}
--
and let the optimizer do the thinking.
- Daniel
More information about the llvm-commits
mailing list