[llvm-commits] [llvm] r82322 - in /llvm/trunk: include/llvm/ADT/StringRef.h lib/Support/StringRef.cpp

Misha Brukman brukman at gmail.com
Sun Sep 20 17:15:20 PDT 2009


Hi, Chris --

I think this new code is missing a test or two. ;-)

Misha

On Sat, Sep 19, 2009 at 3: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.
>
> 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;
> +        }
> +      }
> +    }
> +  }
> +
> +  // Empty strings (after the radix autosense) are invalid.
> +  if (Str.empty()) return true;
> +
> +  // Parse all the bytes of the string given this radix.  Watch for
> overflow.
> +  Result = 0;
> +  while (!Str.empty()) {
> +    unsigned CharVal;
> +    if (Str[0] >= '0' && Str[0] <= '9')
> +      CharVal = Str[0]-'0';
> +    else if (Str[0] >= 'a' && Str[0] <= 'z')
> +      CharVal = Str[0]-'a'+10;
> +    else if (Str[0] >= 'A' && Str[0] <= 'Z')
> +      CharVal = Str[0]-'A'+10;
> +    else
> +      return true;
> +
> +    // If the parsed value is larger than the integer radix, the string is
> +    // invalid.
> +    if (CharVal >= Radix)
> +      return true;
> +
> +    // Add in this character.
> +    unsigned long long PrevResult = Result;
> +    Result = Result*Radix+CharVal;
> +
> +    // Check for overflow.
> +    if (Result < PrevResult)
> +      return true;
> +
> +    Str = Str.substr(1);
> +  }
> +
> +  return false;
> +}
> +
> +bool StringRef::getAsInteger(unsigned Radix, unsigned long long &Result)
> const {
> +  return GetAsUnsignedInteger(*this, Radix, Result);
> +}
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20090920/7d192f0e/attachment.html>


More information about the llvm-commits mailing list