[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