llvm.org GIT mirror llvm / release_25 include / llvm / ADT / StringExtras.h
release_25

Tree @release_25 (Download .tar.gz)

StringExtras.h @release_25

551ccae
9769ab2
b2109ce
 
7ed47a1
 
9769ab2
b2109ce
0095054
 
 
 
 
551ccae
 
0095054
551ccae
eaf0894
913e1b4
c5f9d8c
0095054
d5b58c2
5f62191
d0fde30
 
c9debfb
 
 
 
 
 
886645a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35c15b4
 
be4922a
c9debfb
35c15b4
 
886645a
 
3a54b3d
886645a
 
c04b691
35c15b4
 
6fb568f
 
 
0095054
 
 
 
 
2908ca7
0095054
 
 
 
6fb568f
697954c
0095054
 
6fb568f
79818a4
 
3a54b3d
6fb568f
 
3a54b3d
0095054
 
3a54b3d
0095054
2908ca7
0095054
 
3a54b3d
0095054
697954c
0095054
 
6fb568f
19b7e0e
9769ab2
8831db7
 
 
 
9769ab2
0123b7d
 
 
 
697954c
2e35bed
2908ca7
67cb2f6
 
 
2e35bed
 
ee84768
6d5e7d9
eaf0894
6d5e7d9
eaf0894
4569553
eaf0894
 
9769ab2
497b52f
64aed54
497b52f
be4922a
64aed54
 
9fc8a3e
c5ccbdb
 
 
 
 
 
 
 
8211e82
 
3a54b3d
8211e82
 
34cd4a4
8211e82
 
 
 
 
 
3a54b3d
8211e82
34cd4a4
8211e82
 
 
 
 
3a54b3d
6925f50
1fd2e6d
 
6925f50
 
fbd1589
 
6925f50
3a54b3d
fdedd53
 
3a54b3d
6925f50
3a54b3d
30f100e
6925f50
1fd2e6d
6925f50
 
 
 
 
1fd2e6d
 
6925f50
8211e82
9fc8a3e
 
 
 
 
 
 
 
 
d5b58c2
 
 
 
 
 
1e36126
 
 
 
 
 
 
 
 
d0fde30
 
0095054
//===-- llvm/ADT/StringExtras.h - Useful string functions -------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains some functions that are useful when dealing with strings.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_ADT_STRINGEXTRAS_H
#define LLVM_ADT_STRINGEXTRAS_H

#include "llvm/Support/DataTypes.h"
#include "llvm/ADT/APFloat.h"
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>

namespace llvm {

/// hexdigit - Return the (uppercase) hexadecimal character for the
/// given number \arg X (which should be less than 16).
static inline char hexdigit(unsigned X) {
  return X < 10 ? '0' + X : 'A' + X - 10;
}

/// utohex_buffer - Emit the specified number into the buffer specified by
/// BufferEnd, returning a pointer to the start of the string.  This can be used
/// like this: (note that the buffer must be large enough to handle any number):
///    char Buffer[40];
///    printf("0x%s", utohex_buffer(X, Buffer+40));
///
/// This should only be used with unsigned types.
///
template<typename IntTy>
static inline char *utohex_buffer(IntTy X, char *BufferEnd) {
  char *BufPtr = BufferEnd;
  *--BufPtr = 0;      // Null terminate buffer.
  if (X == 0) {
    *--BufPtr = '0';  // Handle special case.
    return BufPtr;
  }

  while (X) {
    unsigned char Mod = static_cast<unsigned char>(X) & 15;
    *--BufPtr = hexdigit(Mod);
    X >>= 4;
  }
  return BufPtr;
}

static inline std::string utohexstr(uint64_t X) {
  char Buffer[40];
  return utohex_buffer(X, Buffer+40);
}

static inline std::string utostr_32(uint32_t X, bool isNeg = false) {
  char Buffer[20];
  char *BufPtr = Buffer+19;

  *BufPtr = 0;                  // Null terminate buffer...
  if (X == 0) *--BufPtr = '0';  // Handle special case...

  while (X) {
    *--BufPtr = '0' + char(X % 10);
    X /= 10;
  }

  if (isNeg) *--BufPtr = '-';   // Add negative sign...

  return std::string(BufPtr);
}

static inline std::string utostr(uint64_t X, bool isNeg = false) {
  if (X == uint32_t(X))
    return utostr_32(uint32_t(X), isNeg);

  char Buffer[40];
  char *BufPtr = Buffer+39;

  *BufPtr = 0;                  // Null terminate buffer...
  if (X == 0) *--BufPtr = '0';  // Handle special case...

  while (X) {
    *--BufPtr = '0' + char(X % 10);
    X /= 10;
  }

  if (isNeg) *--BufPtr = '-';   // Add negative sign...
  return std::string(BufPtr);
}


static inline std::string itostr(int64_t X) {
  if (X < 0)
    return utostr(static_cast<uint64_t>(-X), true);
  else
    return utostr(static_cast<uint64_t>(X));
}

static inline std::string itohexstr(int64_t X) {
  return utohexstr(static_cast<uint64_t>(X));
}

static inline std::string ftostr(double V) {
  char Buffer[200];
  sprintf(Buffer, "%20.6e", V);
  char *B = Buffer;
  while (*B == ' ') ++B;
  return B;
}

static inline std::string ftostr(const APFloat& V) {
  if (&V.getSemantics() == &APFloat::IEEEdouble)
    return ftostr(V.convertToDouble());
  else if (&V.getSemantics() == &APFloat::IEEEsingle)
    return ftostr((double)V.convertToFloat());
  return "<unknown format in ftostr>"; // error
}

static inline std::string LowercaseString(const std::string &S) {
  std::string result(S);
  for (unsigned i = 0; i < S.length(); ++i)
    if (isupper(result[i]))
      result[i] = char(tolower(result[i]));
  return result;
}

static inline std::string UppercaseString(const std::string &S) {
  std::string result(S);
  for (unsigned i = 0; i < S.length(); ++i)
    if (islower(result[i]))
      result[i] = char(toupper(result[i]));
  return result;
}

/// StringsEqualNoCase - Return true if the two strings are equal, ignoring
/// case.
static inline bool StringsEqualNoCase(const std::string &LHS,
                                      const std::string &RHS) {
  if (LHS.size() != RHS.size()) return false;
  for (unsigned i = 0, e = static_cast<unsigned>(LHS.size()); i != e; ++i)
    if (tolower(LHS[i]) != tolower(RHS[i])) return false;
  return true;
}

/// StringsEqualNoCase - Return true if the two strings are equal, ignoring
/// case.
static inline bool StringsEqualNoCase(const std::string &LHS,
                                      const char *RHS) {
  for (unsigned i = 0, e = static_cast<unsigned>(LHS.size()); i != e; ++i) {
    if (RHS[i] == 0) return false;  // RHS too short.
    if (tolower(LHS[i]) != tolower(RHS[i])) return false;
  }
  return RHS[LHS.size()] == 0;  // Not too long?
}

/// CStrInCStrNoCase - Portable version of strcasestr.  Locates the first
///  occurance of c-string 's2' in string 's1', ignoring case.  Returns
///  NULL if 's2' cannot be found.
static inline const char* CStrInCStrNoCase(const char *s1, const char *s2) {

  // Are either strings NULL or empty?
  if (!s1 || !s2 || s1[0] == '\0' || s2[0] == '\0')
    return 0;

  if (s1 == s2)
    return s1;

  const char *I1=s1, *I2=s2;

  while (*I1 != '\0' && *I2 != '\0' )
    if (tolower(*I1) != tolower(*I2)) { // No match.  Start over.
      ++s1; I1 = s1; I2 = s2;
    }
    else { // Character match.  Advance to the next character.
      ++I1; ++I2;
    }

  // If we exhausted all of the characters in 's2', then 's2' appears in 's1'.
  return *I2 == '\0' ? s1 : 0;
}

/// getToken - This function extracts one token from source, ignoring any
/// leading characters that appear in the Delimiters string, and ending the
/// token at any of the characters that appear in the Delimiters string.  If
/// there are no tokens in the source string, an empty string is returned.
/// The Source source string is updated in place to remove the returned string
/// and any delimiter prefix from it.
std::string getToken(std::string &Source,
                     const char *Delimiters = " \t\n\v\f\r");

/// SplitString - Split up the specified string according to the specified
/// delimiters, appending the result fragments to the output list.
void SplitString(const std::string &Source,
                 std::vector<std::string> &OutFragments,
                 const char *Delimiters = " \t\n\v\f\r");

/// UnescapeString - Modify the argument string, turning two character sequences
/// like '\\' 'n' into '\n'.  This handles: \e \a \b \f \n \r \t \v \' \\ and
/// \num (where num is a 1-3 byte octal value).
void UnescapeString(std::string &Str);

/// EscapeString - Modify the argument string, turning '\\' and anything that
/// doesn't satisfy std::isprint into an escape sequence.
void EscapeString(std::string &Str);

} // End llvm namespace

#endif