113481Sgiacomo.travaglini@arm.com// Copyright 2005, Google Inc. 213481Sgiacomo.travaglini@arm.com// All rights reserved. 313481Sgiacomo.travaglini@arm.com// 413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without 513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are 613481Sgiacomo.travaglini@arm.com// met: 713481Sgiacomo.travaglini@arm.com// 813481Sgiacomo.travaglini@arm.com// * Redistributions of source code must retain the above copyright 913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer. 1013481Sgiacomo.travaglini@arm.com// * Redistributions in binary form must reproduce the above 1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer 1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the 1313481Sgiacomo.travaglini@arm.com// distribution. 1413481Sgiacomo.travaglini@arm.com// * Neither the name of Google Inc. nor the names of its 1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from 1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission. 1713481Sgiacomo.travaglini@arm.com// 1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2913481Sgiacomo.travaglini@arm.com// 3013481Sgiacomo.travaglini@arm.com// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) 3113481Sgiacomo.travaglini@arm.com// 3213481Sgiacomo.travaglini@arm.com// The Google C++ Testing Framework (Google Test) 3313481Sgiacomo.travaglini@arm.com// 3413481Sgiacomo.travaglini@arm.com// This header file declares the String class and functions used internally by 3513481Sgiacomo.travaglini@arm.com// Google Test. They are subject to change without notice. They should not used 3613481Sgiacomo.travaglini@arm.com// by code external to Google Test. 3713481Sgiacomo.travaglini@arm.com// 3813481Sgiacomo.travaglini@arm.com// This header file is #included by <gtest/internal/gtest-internal.h>. 3913481Sgiacomo.travaglini@arm.com// It should not be #included by other files. 4013481Sgiacomo.travaglini@arm.com 4113481Sgiacomo.travaglini@arm.com#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ 4213481Sgiacomo.travaglini@arm.com#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ 4313481Sgiacomo.travaglini@arm.com 4413481Sgiacomo.travaglini@arm.com#ifdef __BORLANDC__ 4513481Sgiacomo.travaglini@arm.com// string.h is not guaranteed to provide strcpy on C++ Builder. 4613481Sgiacomo.travaglini@arm.com# include <mem.h> 4713481Sgiacomo.travaglini@arm.com#endif 4813481Sgiacomo.travaglini@arm.com 4913481Sgiacomo.travaglini@arm.com#include <string.h> 5013481Sgiacomo.travaglini@arm.com#include <string> 5113481Sgiacomo.travaglini@arm.com 5213481Sgiacomo.travaglini@arm.com#include "gtest/internal/gtest-port.h" 5313481Sgiacomo.travaglini@arm.com 5413481Sgiacomo.travaglini@arm.comnamespace testing { 5513481Sgiacomo.travaglini@arm.comnamespace internal { 5613481Sgiacomo.travaglini@arm.com 5713481Sgiacomo.travaglini@arm.com// String - an abstract class holding static string utilities. 5813481Sgiacomo.travaglini@arm.comclass GTEST_API_ String { 5913481Sgiacomo.travaglini@arm.com public: 6013481Sgiacomo.travaglini@arm.com // Static utility methods 6113481Sgiacomo.travaglini@arm.com 6213481Sgiacomo.travaglini@arm.com // Clones a 0-terminated C string, allocating memory using new. The 6313481Sgiacomo.travaglini@arm.com // caller is responsible for deleting the return value using 6413481Sgiacomo.travaglini@arm.com // delete[]. Returns the cloned string, or NULL if the input is 6513481Sgiacomo.travaglini@arm.com // NULL. 6613481Sgiacomo.travaglini@arm.com // 6713481Sgiacomo.travaglini@arm.com // This is different from strdup() in string.h, which allocates 6813481Sgiacomo.travaglini@arm.com // memory using malloc(). 6913481Sgiacomo.travaglini@arm.com static const char* CloneCString(const char* c_str); 7013481Sgiacomo.travaglini@arm.com 7113481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS_MOBILE 7213481Sgiacomo.travaglini@arm.com // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be 7313481Sgiacomo.travaglini@arm.com // able to pass strings to Win32 APIs on CE we need to convert them 7413481Sgiacomo.travaglini@arm.com // to 'Unicode', UTF-16. 7513481Sgiacomo.travaglini@arm.com 7613481Sgiacomo.travaglini@arm.com // Creates a UTF-16 wide string from the given ANSI string, allocating 7713481Sgiacomo.travaglini@arm.com // memory using new. The caller is responsible for deleting the return 7813481Sgiacomo.travaglini@arm.com // value using delete[]. Returns the wide string, or NULL if the 7913481Sgiacomo.travaglini@arm.com // input is NULL. 8013481Sgiacomo.travaglini@arm.com // 8113481Sgiacomo.travaglini@arm.com // The wide string is created using the ANSI codepage (CP_ACP) to 8213481Sgiacomo.travaglini@arm.com // match the behaviour of the ANSI versions of Win32 calls and the 8313481Sgiacomo.travaglini@arm.com // C runtime. 8413481Sgiacomo.travaglini@arm.com static LPCWSTR AnsiToUtf16(const char* c_str); 8513481Sgiacomo.travaglini@arm.com 8613481Sgiacomo.travaglini@arm.com // Creates an ANSI string from the given wide string, allocating 8713481Sgiacomo.travaglini@arm.com // memory using new. The caller is responsible for deleting the return 8813481Sgiacomo.travaglini@arm.com // value using delete[]. Returns the ANSI string, or NULL if the 8913481Sgiacomo.travaglini@arm.com // input is NULL. 9013481Sgiacomo.travaglini@arm.com // 9113481Sgiacomo.travaglini@arm.com // The returned string is created using the ANSI codepage (CP_ACP) to 9213481Sgiacomo.travaglini@arm.com // match the behaviour of the ANSI versions of Win32 calls and the 9313481Sgiacomo.travaglini@arm.com // C runtime. 9413481Sgiacomo.travaglini@arm.com static const char* Utf16ToAnsi(LPCWSTR utf16_str); 9513481Sgiacomo.travaglini@arm.com#endif 9613481Sgiacomo.travaglini@arm.com 9713481Sgiacomo.travaglini@arm.com // Compares two C strings. Returns true iff they have the same content. 9813481Sgiacomo.travaglini@arm.com // 9913481Sgiacomo.travaglini@arm.com // Unlike strcmp(), this function can handle NULL argument(s). A 10013481Sgiacomo.travaglini@arm.com // NULL C string is considered different to any non-NULL C string, 10113481Sgiacomo.travaglini@arm.com // including the empty string. 10213481Sgiacomo.travaglini@arm.com static bool CStringEquals(const char* lhs, const char* rhs); 10313481Sgiacomo.travaglini@arm.com 10413481Sgiacomo.travaglini@arm.com // Converts a wide C string to a String using the UTF-8 encoding. 10513481Sgiacomo.travaglini@arm.com // NULL will be converted to "(null)". If an error occurred during 10613481Sgiacomo.travaglini@arm.com // the conversion, "(failed to convert from wide string)" is 10713481Sgiacomo.travaglini@arm.com // returned. 10813481Sgiacomo.travaglini@arm.com static std::string ShowWideCString(const wchar_t* wide_c_str); 10913481Sgiacomo.travaglini@arm.com 11013481Sgiacomo.travaglini@arm.com // Compares two wide C strings. Returns true iff they have the same 11113481Sgiacomo.travaglini@arm.com // content. 11213481Sgiacomo.travaglini@arm.com // 11313481Sgiacomo.travaglini@arm.com // Unlike wcscmp(), this function can handle NULL argument(s). A 11413481Sgiacomo.travaglini@arm.com // NULL C string is considered different to any non-NULL C string, 11513481Sgiacomo.travaglini@arm.com // including the empty string. 11613481Sgiacomo.travaglini@arm.com static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs); 11713481Sgiacomo.travaglini@arm.com 11813481Sgiacomo.travaglini@arm.com // Compares two C strings, ignoring case. Returns true iff they 11913481Sgiacomo.travaglini@arm.com // have the same content. 12013481Sgiacomo.travaglini@arm.com // 12113481Sgiacomo.travaglini@arm.com // Unlike strcasecmp(), this function can handle NULL argument(s). 12213481Sgiacomo.travaglini@arm.com // A NULL C string is considered different to any non-NULL C string, 12313481Sgiacomo.travaglini@arm.com // including the empty string. 12413481Sgiacomo.travaglini@arm.com static bool CaseInsensitiveCStringEquals(const char* lhs, 12513481Sgiacomo.travaglini@arm.com const char* rhs); 12613481Sgiacomo.travaglini@arm.com 12713481Sgiacomo.travaglini@arm.com // Compares two wide C strings, ignoring case. Returns true iff they 12813481Sgiacomo.travaglini@arm.com // have the same content. 12913481Sgiacomo.travaglini@arm.com // 13013481Sgiacomo.travaglini@arm.com // Unlike wcscasecmp(), this function can handle NULL argument(s). 13113481Sgiacomo.travaglini@arm.com // A NULL C string is considered different to any non-NULL wide C string, 13213481Sgiacomo.travaglini@arm.com // including the empty string. 13313481Sgiacomo.travaglini@arm.com // NB: The implementations on different platforms slightly differ. 13413481Sgiacomo.travaglini@arm.com // On windows, this method uses _wcsicmp which compares according to LC_CTYPE 13513481Sgiacomo.travaglini@arm.com // environment variable. On GNU platform this method uses wcscasecmp 13613481Sgiacomo.travaglini@arm.com // which compares according to LC_CTYPE category of the current locale. 13713481Sgiacomo.travaglini@arm.com // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the 13813481Sgiacomo.travaglini@arm.com // current locale. 13913481Sgiacomo.travaglini@arm.com static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs, 14013481Sgiacomo.travaglini@arm.com const wchar_t* rhs); 14113481Sgiacomo.travaglini@arm.com 14213481Sgiacomo.travaglini@arm.com // Returns true iff the given string ends with the given suffix, ignoring 14313481Sgiacomo.travaglini@arm.com // case. Any string is considered to end with an empty suffix. 14413481Sgiacomo.travaglini@arm.com static bool EndsWithCaseInsensitive( 14513481Sgiacomo.travaglini@arm.com const std::string& str, const std::string& suffix); 14613481Sgiacomo.travaglini@arm.com 14713481Sgiacomo.travaglini@arm.com // Formats an int value as "%02d". 14813481Sgiacomo.travaglini@arm.com static std::string FormatIntWidth2(int value); // "%02d" for width == 2 14913481Sgiacomo.travaglini@arm.com 15013481Sgiacomo.travaglini@arm.com // Formats an int value as "%X". 15113481Sgiacomo.travaglini@arm.com static std::string FormatHexInt(int value); 15213481Sgiacomo.travaglini@arm.com 15313481Sgiacomo.travaglini@arm.com // Formats a byte as "%02X". 15413481Sgiacomo.travaglini@arm.com static std::string FormatByte(unsigned char value); 15513481Sgiacomo.travaglini@arm.com 15613481Sgiacomo.travaglini@arm.com private: 15713481Sgiacomo.travaglini@arm.com String(); // Not meant to be instantiated. 15813481Sgiacomo.travaglini@arm.com}; // class String 15913481Sgiacomo.travaglini@arm.com 16013481Sgiacomo.travaglini@arm.com// Gets the content of the stringstream's buffer as an std::string. Each '\0' 16113481Sgiacomo.travaglini@arm.com// character in the buffer is replaced with "\\0". 16213481Sgiacomo.travaglini@arm.comGTEST_API_ std::string StringStreamToString(::std::stringstream* stream); 16313481Sgiacomo.travaglini@arm.com 16413481Sgiacomo.travaglini@arm.com} // namespace internal 16513481Sgiacomo.travaglini@arm.com} // namespace testing 16613481Sgiacomo.travaglini@arm.com 16713481Sgiacomo.travaglini@arm.com#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ 168