[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