aboutsummaryrefslogtreecommitdiffstats
path: root/tools/lldb-mi/MIUtilString.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lldb-mi/MIUtilString.cpp')
-rw-r--r--tools/lldb-mi/MIUtilString.cpp915
1 files changed, 0 insertions, 915 deletions
diff --git a/tools/lldb-mi/MIUtilString.cpp b/tools/lldb-mi/MIUtilString.cpp
deleted file mode 100644
index 986de963450e..000000000000
--- a/tools/lldb-mi/MIUtilString.cpp
+++ /dev/null
@@ -1,915 +0,0 @@
-//===-- MIUtilString.cpp ----------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-// Third party headers
-#include "llvm/Support/Compiler.h"
-#include <cstdlib>
-#include <inttypes.h>
-#include <limits.h>
-#include <memory>
-#include <sstream>
-#include <stdarg.h>
-#include <string.h>
-
-// In-house headers:
-#include "MIUtilString.h"
-
-//++
-// Details: CMIUtilString constructor.
-// Type: Method.
-// Args: None.
-// Return: None.
-// Throws: None.
-//--
-CMIUtilString::CMIUtilString() : std::string() {}
-
-//++
-// Details: CMIUtilString constructor.
-// Type: Method.
-// Args: vpData - Pointer to UTF8 text data.
-// Return: None.
-// Throws: None.
-//--
-CMIUtilString::CMIUtilString(const char *vpData)
- : std::string(WithNullAsEmpty(vpData)) {}
-
-//++
-// Details: CMIUtilString constructor.
-// Type: Method.
-// Args: vpStr - Text data.
-// Return: None.
-// Throws: None.
-//--
-CMIUtilString::CMIUtilString(const std::string &vrStr) : std::string(vrStr) {}
-
-//++
-// Details: CMIUtilString assignment operator.
-// Type: Method.
-// Args: vpRhs - Pointer to UTF8 text data.
-// Return: CMIUtilString & - *this string.
-// Throws: None.
-//--
-CMIUtilString &CMIUtilString::operator=(const char *vpRhs) {
- assign(WithNullAsEmpty(vpRhs));
- return *this;
-}
-
-//++
-// Details: CMIUtilString assignment operator.
-// Type: Method.
-// Args: vrRhs - The other string to copy from.
-// Return: CMIUtilString & - *this string.
-// Throws: None.
-//--
-CMIUtilString &CMIUtilString::operator=(const std::string &vrRhs) {
- assign(vrRhs);
- return *this;
-}
-
-//++
-// Details: CMIUtilString destructor.
-// Type: Method.
-// Args: None.
-// Return: None.
-// Throws: None.
-//--
-CMIUtilString::~CMIUtilString() {}
-
-//++
-// Details: Perform a snprintf format style on a string data. A new string
-// object is
-// created and returned.
-// Type: Static method.
-// Args: vrFormat - (R) Format string data instruction.
-// vArgs - (R) Var list args of any type.
-// Return: CMIUtilString - Number of splits found in the string data.
-// Throws: None.
-//--
-CMIUtilString CMIUtilString::FormatPriv(const CMIUtilString &vrFormat,
- va_list vArgs) {
- CMIUtilString strResult;
- MIint nFinal = 0;
- MIint n = vrFormat.size();
-
- // IOR: mysterious crash in this function on some windows builds not able to
- // duplicate but found article which may be related. Crash occurs in
- // vsnprintf() or va_copy().
- // Duplicate vArgs va_list argument pointer to ensure that it can be safely
- // used in a new frame.
- // http://julipedia.meroh.net/2011/09/using-vacopy-to-safely-pass-ap.html
- va_list argsDup;
- va_copy(argsDup, vArgs);
-
- // Create a copy va_list to reset when we spin
- va_list argsCpy;
- va_copy(argsCpy, argsDup);
-
- if (n == 0)
- return strResult;
-
- n = n << 4; // Reserve 16 times as much the length of the vrFormat
-
- std::unique_ptr<char[]> pFormatted;
- while (1) {
- pFormatted.reset(new char[n + 1]); // +1 for safety margin
- ::strncpy(&pFormatted[0], vrFormat.c_str(), n);
-
- // We need to restore the variable argument list pointer to the start again
- // before running vsnprintf() more then once
- va_copy(argsDup, argsCpy);
-
- nFinal = ::vsnprintf(&pFormatted[0], n, vrFormat.c_str(), argsDup);
- if ((nFinal < 0) || (nFinal >= n))
- n += abs(nFinal - n + 1);
- else
- break;
- }
-
- va_end(argsCpy);
- va_end(argsDup);
-
- strResult = pFormatted.get();
-
- return strResult;
-}
-
-//++
-// Details: Perform a snprintf format style on a string data. A new string
-// object is
-// created and returned.
-// Type: Static method.
-// Args: vFormat - (R) Format string data instruction.
-// ... - (R) Var list args of any type.
-// Return: CMIUtilString - Number of splits found in the string data.
-// Throws: None.
-//--
-CMIUtilString CMIUtilString::Format(const char *vFormating, ...) {
- va_list args;
- va_start(args, vFormating);
- CMIUtilString strResult =
- CMIUtilString::FormatPriv(WithNullAsEmpty(vFormating), args);
- va_end(args);
-
- return strResult;
-}
-
-//++
-// Details: Perform a snprintf format style on a string data. A new string
-// object is
-// created and returned.
-// Type: Static method.
-// Args: vrFormat - (R) Format string data instruction.
-// vArgs - (R) Var list args of any type.
-// Return: CMIUtilString - Number of splits found in the string data.
-// Throws: None.
-//--
-CMIUtilString CMIUtilString::FormatValist(const CMIUtilString &vrFormating,
- va_list vArgs) {
- return CMIUtilString::FormatPriv(vrFormating, vArgs);
-}
-
-//++
-// Details: Splits string into array of strings using delimiter. If multiple
-// delimiter
-// are found in sequence then they are not added to the list of splits.
-// Type: Method.
-// Args: vData - (R) String data to be split up.
-// vDelimiter - (R) Delimiter char or text.
-// vwVecSplits - (W) Container of splits found in string data.
-// Return: size_t - Number of splits found in the string data.
-// Throws: None.
-//--
-size_t CMIUtilString::Split(const CMIUtilString &vDelimiter,
- VecString_t &vwVecSplits) const {
- vwVecSplits.clear();
-
- if (this->empty() || vDelimiter.empty())
- return 0;
-
- const size_t nLen(length());
- size_t nOffset(0);
- do {
- // Find first occurrence which doesn't match to the delimiter
- const size_t nSectionPos(FindFirstNot(vDelimiter, nOffset));
- if (nSectionPos == std::string::npos)
- break;
-
- // Find next occurrence of the delimiter after section
- size_t nNextDelimiterPos(FindFirst(vDelimiter, nSectionPos));
- if (nNextDelimiterPos == std::string::npos)
- nNextDelimiterPos = nLen;
-
- // Extract string between delimiters
- const size_t nSectionLen(nNextDelimiterPos - nSectionPos);
- const std::string strSection(substr(nSectionPos, nSectionLen));
- vwVecSplits.push_back(strSection);
-
- // Next
- nOffset = nNextDelimiterPos + 1;
- } while (nOffset < nLen);
-
- return vwVecSplits.size();
-}
-
-//++
-// Details: Splits string into array of strings using delimiter. However the
-// string is
-// also considered for text surrounded by quotes. Text with quotes
-// including the
-// delimiter is treated as a whole. If multiple delimiter are found in
-// sequence
-// then they are not added to the list of splits. Quotes that are
-// embedded in
-// the string as string formatted quotes are ignored (proceeded by a
-// '\\') i.e.
-// "\"MI GDB local C++.cpp\":88".
-// Type: Method.
-// Args: vData - (R) String data to be split up.
-// vDelimiter - (R) Delimiter char or text.
-// vwVecSplits - (W) Container of splits found in string data.
-// Return: size_t - Number of splits found in the string data.
-// Throws: None.
-//--
-size_t CMIUtilString::SplitConsiderQuotes(const CMIUtilString &vDelimiter,
- VecString_t &vwVecSplits) const {
- vwVecSplits.clear();
-
- if (this->empty() || vDelimiter.empty())
- return 0;
-
- const size_t nLen(length());
- size_t nOffset(0);
- do {
- // Find first occurrence which doesn't match to the delimiter
- const size_t nSectionPos(FindFirstNot(vDelimiter, nOffset));
- if (nSectionPos == std::string::npos)
- break;
-
- // Find next occurrence of the delimiter after (quoted) section
- const bool bSkipQuotedText(true);
- bool bUnmatchedQuote(false);
- size_t nNextDelimiterPos(
- FindFirst(vDelimiter, bSkipQuotedText, bUnmatchedQuote, nSectionPos));
- if (bUnmatchedQuote) {
- vwVecSplits.clear();
- return 0;
- }
- if (nNextDelimiterPos == std::string::npos)
- nNextDelimiterPos = nLen;
-
- // Extract string between delimiters
- const size_t nSectionLen(nNextDelimiterPos - nSectionPos);
- const std::string strSection(substr(nSectionPos, nSectionLen));
- vwVecSplits.push_back(strSection);
-
- // Next
- nOffset = nNextDelimiterPos + 1;
- } while (nOffset < nLen);
-
- return vwVecSplits.size();
-}
-
-//++
-// Details: Split string into lines using \n and return an array of strings.
-// Type: Method.
-// Args: vwVecSplits - (W) Container of splits found in string data.
-// Return: size_t - Number of splits found in the string data.
-// Throws: None.
-//--
-size_t CMIUtilString::SplitLines(VecString_t &vwVecSplits) const {
- return Split("\n", vwVecSplits);
-}
-
-//++
-// Details: Remove '\n' from the end of string if found. It does not alter
-// *this string.
-// Type: Method.
-// Args: None.
-// Return: CMIUtilString - New version of the string.
-// Throws: None.
-//--
-CMIUtilString CMIUtilString::StripCREndOfLine() const {
- const size_t nPos = rfind('\n');
- if (nPos == std::string::npos)
- return *this;
-
- const CMIUtilString strNew(substr(0, nPos));
-
- return strNew;
-}
-
-//++
-// Details: Remove all '\n' from the string and replace with a space. It does
-// not alter
-// *this string.
-// Type: Method.
-// Args: None.
-// Return: CMIUtilString - New version of the string.
-// Throws: None.
-//--
-CMIUtilString CMIUtilString::StripCRAll() const {
- return FindAndReplace("\n", " ");
-}
-
-//++
-// Details: Find and replace all matches of a sub string with another string. It
-// does not
-// alter *this string.
-// Type: Method.
-// Args: vFind - (R) The string to look for.
-// vReplaceWith - (R) The string to replace the vFind match.
-// Return: CMIUtilString - New version of the string.
-// Throws: None.
-//--
-CMIUtilString
-CMIUtilString::FindAndReplace(const CMIUtilString &vFind,
- const CMIUtilString &vReplaceWith) const {
- if (vFind.empty() || this->empty())
- return *this;
-
- size_t nPos = find(vFind);
- if (nPos == std::string::npos)
- return *this;
-
- CMIUtilString strNew(*this);
- while (nPos != std::string::npos) {
- strNew.replace(nPos, vFind.length(), vReplaceWith);
- nPos += vReplaceWith.length();
- nPos = strNew.find(vFind, nPos);
- }
-
- return strNew;
-}
-
-//++
-// Details: Check if *this string is a decimal number.
-// Type: Method.
-// Args: None.
-// Return: bool - True = yes number, false not a number.
-// Throws: None.
-//--
-bool CMIUtilString::IsNumber() const {
- if (empty())
- return false;
-
- if ((at(0) == '-') && (length() == 1))
- return false;
-
- const size_t nPos = find_first_not_of("-.0123456789");
- return nPos == std::string::npos;
-}
-
-//++
-// Details: Check if *this string is a hexadecimal number.
-// Type: Method.
-// Args: None.
-// Return: bool - True = yes number, false not a number.
-// Throws: None.
-//--
-bool CMIUtilString::IsHexadecimalNumber() const {
- // Compare '0x..' prefix
- if ((strncmp(c_str(), "0x", 2) != 0) && (strncmp(c_str(), "0X", 2) != 0))
- return false;
-
- // Skip '0x..' prefix
- const size_t nPos = find_first_not_of("01234567890ABCDEFabcedf", 2);
- return nPos == std::string::npos;
-}
-
-//++
-// Details: Extract the number from the string. The number can be either a
-// hexadecimal or
-// natural number. It cannot contain other non-numeric characters.
-// Type: Method.
-// Args: vwrNumber - (W) Number extracted from the string.
-// Return: bool - True = yes number, false not a number.
-// Throws: None.
-//--
-bool CMIUtilString::ExtractNumber(MIint64 &vwrNumber) const {
- vwrNumber = 0;
-
- if (!IsNumber()) {
- return ExtractNumberFromHexadecimal(vwrNumber);
- }
-
- std::stringstream ss(const_cast<CMIUtilString &>(*this));
- ss >> vwrNumber;
-
- return true;
-}
-
-//++
-// Details: Extract the number from the hexadecimal string..
-// Type: Method.
-// Args: vwrNumber - (W) Number extracted from the string.
-// Return: bool - True = yes number, false not a number.
-// Throws: None.
-//--
-bool CMIUtilString::ExtractNumberFromHexadecimal(MIint64 &vwrNumber) const {
- vwrNumber = 0;
-
- const size_t nPos = find_first_not_of("xX01234567890ABCDEFabcedf");
- if (nPos != std::string::npos)
- return false;
-
- errno = 0;
- const MIuint64 nNum = ::strtoull(this->c_str(), nullptr, 16);
- if (errno == ERANGE)
- return false;
-
- vwrNumber = static_cast<MIint64>(nNum);
-
- return true;
-}
-
-//++
-// Details: Determine if the text is all valid alpha numeric characters. Letters
-// can be
-// either upper or lower case.
-// Type: Static method.
-// Args: vpText - (R) The text data to examine.
-// Return: bool - True = yes all alpha, false = one or more chars is non alpha.
-// Throws: None.
-//--
-bool CMIUtilString::IsAllValidAlphaAndNumeric(const char *vpText) {
- const size_t len = ::strlen(WithNullAsEmpty(vpText));
- if (len == 0)
- return false;
-
- for (size_t i = 0; i < len; i++, vpText++) {
- const char c = *vpText;
- if (::isalnum((int)c) == 0)
- return false;
- }
-
- return true;
-}
-
-//++
-// Details: Check if two strings share equal contents.
-// Type: Method.
-// Args: vrLhs - (R) String A.
-// vrRhs - (R) String B.
-// Return: bool - True = yes equal, false - different.
-// Throws: None.
-//--
-bool CMIUtilString::Compare(const CMIUtilString &vrLhs,
- const CMIUtilString &vrRhs) {
- // Check the sizes match
- if (vrLhs.size() != vrRhs.size())
- return false;
-
- return (::strncmp(vrLhs.c_str(), vrRhs.c_str(), vrLhs.size()) == 0);
-}
-
-//++
-// Details: Remove from either end of *this string the following: " \t\n\v\f\r".
-// Type: Method.
-// Args: None.
-// Return: CMIUtilString - Trimmed string.
-// Throws: None.
-//--
-CMIUtilString CMIUtilString::Trim() const {
- CMIUtilString strNew(*this);
- const char *pWhiteSpace = " \t\n\v\f\r";
- const size_t nPos = find_last_not_of(pWhiteSpace);
- if (nPos != std::string::npos) {
- strNew = substr(0, nPos + 1);
- }
- const size_t nPos2 = strNew.find_first_not_of(pWhiteSpace);
- if (nPos2 != std::string::npos) {
- strNew = strNew.substr(nPos2);
- }
-
- return strNew;
-}
-
-//++
-// Details: Remove from either end of *this string the specified character.
-// Type: Method.
-// Args: None.
-// Return: CMIUtilString - Trimmed string.
-// Throws: None.
-//--
-CMIUtilString CMIUtilString::Trim(const char vChar) const {
- CMIUtilString strNew(*this);
- const size_t nLen = strNew.length();
- if (nLen > 1) {
- if ((strNew[0] == vChar) && (strNew[nLen - 1] == vChar))
- strNew = strNew.substr(1, nLen - 2);
- }
-
- return strNew;
-}
-
-//++
-// Details: Do a printf equivalent for printing a number in binary i.e. "b%llB".
-// Type: Static method.
-// Args: vnDecimal - (R) The number to represent in binary.
-// Return: CMIUtilString - Binary number in text.
-// Throws: None.
-//--
-CMIUtilString CMIUtilString::FormatBinary(const MIuint64 vnDecimal) {
- CMIUtilString strBinaryNumber;
-
- const MIuint nConstBits = 64;
- MIuint nRem[nConstBits + 1];
- MIint i = 0;
- MIuint nLen = 0;
- MIuint64 nNum = vnDecimal;
- while ((nNum > 0) && (nLen < nConstBits)) {
- nRem[i++] = nNum % 2;
- nNum = nNum >> 1;
- nLen++;
- }
- char pN[nConstBits + 1];
- MIuint j = 0;
- for (i = nLen; i > 0; --i, j++) {
- pN[j] = '0' + nRem[i - 1];
- }
- pN[j] = 0; // String NUL termination
-
- strBinaryNumber = CMIUtilString::Format("0b%s", &pN[0]);
-
- return strBinaryNumber;
-}
-
-//++
-// Details: Remove from a string doubled up characters so only one set left.
-// Characters
-// are only removed if the previous character is already a same
-// character.
-// Type: Method.
-// Args: vChar - (R) The character to search for and remove adjacent
-// duplicates.
-// Return: CMIUtilString - New version of the string.
-// Throws: None.
-//--
-CMIUtilString CMIUtilString::RemoveRepeatedCharacters(const char vChar) {
- return RemoveRepeatedCharacters(0, vChar);
-}
-
-//++
-// Details: Recursively remove from a string doubled up characters so only one
-// set left.
-// Characters are only removed if the previous character is already a
-// same
-// character.
-// Type: Method.
-// Args: vChar - (R) The character to search for and remove adjacent
-// duplicates.
-// vnPos - Character position in the string.
-// Return: CMIUtilString - New version of the string.
-// Throws: None.
-//--
-CMIUtilString CMIUtilString::RemoveRepeatedCharacters(size_t vnPos,
- const char vChar) {
- const char cQuote = '"';
-
- // Look for first quote of two
- const size_t nPos = find(cQuote, vnPos);
- if (nPos == std::string::npos)
- return *this;
-
- const size_t nPosNext = nPos + 1;
- if (nPosNext > length())
- return *this;
-
- if (at(nPosNext) == cQuote) {
- *this = substr(0, nPos) + substr(nPosNext, length());
- RemoveRepeatedCharacters(nPosNext, vChar);
- }
-
- return *this;
-}
-
-//++
-// Details: Is the text in *this string surrounded by quotes.
-// Type: Method.
-// Args: None.
-// Return: bool - True = Yes string is quoted, false = no quoted.
-// Throws: None.
-//--
-bool CMIUtilString::IsQuoted() const {
- const char cQuote = '"';
-
- if (at(0) != cQuote)
- return false;
-
- const size_t nLen = length();
- return !((nLen > 0) && (at(nLen - 1) != cQuote));
-}
-
-//++
-// Details: Find first occurrence in *this string which matches the pattern.
-// Type: Method.
-// Args: vrPattern - (R) The pattern to search for.
-// vnPos - The starting position at which to start searching.
-// (Dflt = 0)
-// Return: size_t - The position of the first substring that match.
-// Throws: None.
-//--
-size_t CMIUtilString::FindFirst(const CMIUtilString &vrPattern,
- size_t vnPos /* = 0 */) const {
- return find(vrPattern, vnPos);
-}
-
-//++
-// Details: Find first occurrence in *this string which matches the pattern and
-// isn't surrounded by quotes.
-// Type: Method.
-// Args: vrPattern - (R) The pattern to search for.
-// vbSkipQuotedText - (R) True = don't look at quoted text,
-// false = otherwise.
-// vrwbNotFoundClosedQuote - (W) True = parsing error: unmatched
-// quote, false = otherwise.
-// vnPos - Position of the first character in the
-// string to be considered in the search. (Dflt = 0)
-// Return: size_t - The position of the first substring that matches and isn't
-// quoted.
-// Throws: None.
-//--
-size_t CMIUtilString::FindFirst(const CMIUtilString &vrPattern,
- const bool vbSkipQuotedText,
- bool &vrwbNotFoundClosedQuote,
- size_t vnPos /* = 0 */) const {
- vrwbNotFoundClosedQuote = false;
-
- if (!vbSkipQuotedText)
- return FindFirst(vrPattern, vnPos);
-
- const size_t nLen(length());
-
- size_t nPos = vnPos;
- do {
- const size_t nQuotePos(FindFirstQuote(nPos));
- const size_t nPatternPos(FindFirst(vrPattern, nPos));
- if (nQuotePos == std::string::npos)
- return nPatternPos;
-
- const size_t nQuoteClosedPos = FindFirstQuote(nQuotePos + 1);
- if (nQuoteClosedPos == std::string::npos) {
- vrwbNotFoundClosedQuote = true;
- return std::string::npos;
- }
-
- if ((nPatternPos == std::string::npos) || (nPatternPos < nQuotePos))
- return nPatternPos;
-
- nPos = nQuoteClosedPos + 1;
- } while (nPos < nLen);
-
- return std::string::npos;
-}
-
-//++
-// Details: Find first occurrence in *this string which doesn't match the
-// pattern.
-// Type: Method.
-// Args: vrPattern - (R) The pattern to search for.
-// vnPos - Position of the first character in the string to be
-// considered in the search. (Dflt = 0)
-// Return: size_t - The position of the first character that doesn't match.
-// Throws: None.
-//--
-size_t CMIUtilString::FindFirstNot(const CMIUtilString &vrPattern,
- size_t vnPos /* = 0 */) const {
- const size_t nLen(length());
- const size_t nPatternLen(vrPattern.length());
-
- size_t nPatternPos(vnPos);
- do {
- const bool bMatchPattern(compare(nPatternPos, nPatternLen, vrPattern) == 0);
- if (!bMatchPattern)
- return nPatternPos;
- nPatternPos += nPatternLen;
- } while (nPatternPos < nLen);
-
- return std::string::npos;
-}
-
-//++
-// Details: Find first occurrence of not escaped quotation mark in *this string.
-// Type: Method.
-// Args: vnPos - Position of the first character in the string to be
-// considered in the search.
-// Return: size_t - The position of the quotation mark.
-// Throws: None.
-//--
-size_t CMIUtilString::FindFirstQuote(size_t vnPos) const {
- const char cBckSlash('\\');
- const char cQuote('"');
- const size_t nLen(length());
-
- size_t nPos = vnPos;
- do {
- const size_t nBckSlashPos(find(cBckSlash, nPos));
- const size_t nQuotePos(find(cQuote, nPos));
- if ((nBckSlashPos == std::string::npos) || (nQuotePos == std::string::npos))
- return nQuotePos;
-
- if (nQuotePos < nBckSlashPos)
- return nQuotePos;
-
- // Skip 2 characters: First is '\', second is that which is escaped by '\'
- nPos = nBckSlashPos + 2;
- } while (nPos < nLen);
-
- return std::string::npos;
-}
-
-//++
-// Details: Get escaped string from *this string.
-// Type: Method.
-// Args: None.
-// Return: CMIUtilString - The escaped version of the initial string.
-// Throws: None.
-//--
-CMIUtilString CMIUtilString::Escape(bool vbEscapeQuotes /* = false */) const {
- const size_t nLen(length());
- CMIUtilString strNew;
- strNew.reserve(nLen);
- for (size_t nIndex(0); nIndex < nLen; ++nIndex) {
- const char cUnescapedChar((*this)[nIndex]);
- if (cUnescapedChar == '"' && vbEscapeQuotes)
- strNew.append("\\\"");
- else
- strNew.append(ConvertToPrintableASCII((char)cUnescapedChar));
- }
- return strNew;
-}
-
-//++
-// Details: Get string with backslashes in front of double quote '"' and
-// backslash '\\'
-// characters.
-// Type: Method.
-// Args: None.
-// Return: CMIUtilString - The wrapped version of the initial string.
-// Throws: None.
-//--
-CMIUtilString CMIUtilString::AddSlashes() const {
- const char cBckSlash('\\');
- const size_t nLen(length());
- CMIUtilString strNew;
- strNew.reserve(nLen);
-
- size_t nOffset(0);
- while (nOffset < nLen) {
- const size_t nUnescapedCharPos(find_first_of("\"\\", nOffset));
- const bool bUnescapedCharNotFound(nUnescapedCharPos == std::string::npos);
- if (bUnescapedCharNotFound) {
- const size_t nAppendAll(std::string::npos);
- strNew.append(*this, nOffset, nAppendAll);
- break;
- }
- const size_t nAppendLen(nUnescapedCharPos - nOffset);
- strNew.append(*this, nOffset, nAppendLen);
- strNew.push_back(cBckSlash);
- const char cUnescapedChar((*this)[nUnescapedCharPos]);
- strNew.push_back(cUnescapedChar);
- nOffset = nUnescapedCharPos + 1;
- }
-
- return strNew;
-}
-
-//++
-// Details: Remove backslashes added by CMIUtilString::AddSlashes.
-// Type: Method.
-// Args: None.
-// Return: CMIUtilString - The initial version of wrapped string.
-// Throws: None.
-//--
-CMIUtilString CMIUtilString::StripSlashes() const {
- const char cBckSlash('\\');
- const size_t nLen(length());
- CMIUtilString strNew;
- strNew.reserve(nLen);
-
- size_t nOffset(0);
- while (nOffset < nLen) {
- const size_t nBckSlashPos(find(cBckSlash, nOffset));
- const bool bBckSlashNotFound(nBckSlashPos == std::string::npos);
- if (bBckSlashNotFound) {
- const size_t nAppendAll(std::string::npos);
- strNew.append(*this, nOffset, nAppendAll);
- break;
- }
- const size_t nAppendLen(nBckSlashPos - nOffset);
- strNew.append(*this, nOffset, nAppendLen);
- const bool bBckSlashIsLast(nBckSlashPos == nLen);
- if (bBckSlashIsLast) {
- strNew.push_back(cBckSlash);
- break;
- }
- const char cEscapedChar((*this)[nBckSlashPos + 1]);
- const size_t nEscapedCharPos(std::string("\"\\").find(cEscapedChar));
- const bool bEscapedCharNotFound(nEscapedCharPos == std::string::npos);
- if (bEscapedCharNotFound)
- strNew.push_back(cBckSlash);
- strNew.push_back(cEscapedChar);
- nOffset = nBckSlashPos + 2;
- }
-
- return strNew;
-}
-
-CMIUtilString CMIUtilString::ConvertToPrintableASCII(const char vChar,
- bool bEscapeQuotes) {
- switch (vChar) {
- case '\a':
- return "\\a";
- case '\b':
- return "\\b";
- case '\t':
- return "\\t";
- case '\n':
- return "\\n";
- case '\v':
- return "\\v";
- case '\f':
- return "\\f";
- case '\r':
- return "\\r";
- case '\033':
- return "\\e";
- case '\\':
- return "\\\\";
- case '"':
- if (bEscapeQuotes)
- return "\\\"";
- LLVM_FALLTHROUGH;
- default:
- if (::isprint(vChar))
- return Format("%c", vChar);
- else
- return Format("\\x%02" PRIx8, vChar);
- }
-}
-
-CMIUtilString
-CMIUtilString::ConvertCharValueToPrintableASCII(char vChar,
- bool bEscapeQuotes) {
- switch (vChar) {
- case '\a':
- return "\\a";
- case '\b':
- return "\\b";
- case '\t':
- return "\\t";
- case '\n':
- return "\\n";
- case '\v':
- return "\\v";
- case '\f':
- return "\\f";
- case '\r':
- return "\\r";
- case '\033':
- return "\\e";
- case '\\':
- return "\\\\";
- case '"':
- if (bEscapeQuotes)
- return "\\\"";
- LLVM_FALLTHROUGH;
- default:
- if (::isprint(vChar))
- return Format("%c", vChar);
- else
- return CMIUtilString();
- }
-}
-
-CMIUtilString CMIUtilString::ConvertToPrintableASCII(const char16_t vChar16,
- bool bEscapeQuotes) {
- if (vChar16 == (char16_t)(char)vChar16) {
- // Convert char16_t to char (if possible)
- CMIUtilString str =
- ConvertCharValueToPrintableASCII((char)vChar16, bEscapeQuotes);
- if (str.length() > 0)
- return str;
- }
- return Format("\\u%02" PRIx8 "%02" PRIx8, (vChar16 >> 8) & 0xff,
- vChar16 & 0xff);
-}
-
-CMIUtilString CMIUtilString::ConvertToPrintableASCII(const char32_t vChar32,
- bool bEscapeQuotes) {
- if (vChar32 == (char32_t)(char)vChar32) {
- // Convert char32_t to char (if possible)
- CMIUtilString str =
- ConvertCharValueToPrintableASCII((char)vChar32, bEscapeQuotes);
- if (str.length() > 0)
- return str;
- }
- return Format("\\U%02" PRIx8 "%02" PRIx8 "%02" PRIx8 "%02" PRIx8,
- (vChar32 >> 24) & 0xff, (vChar32 >> 16) & 0xff,
- (vChar32 >> 8) & 0xff, vChar32 & 0xff);
-}