string_utils-inl.h
来自「SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多K」· C头文件 代码 · 共 136 行
H
136 行
// Copyright (c) 2006, Google Inc.// All rights reserved.//// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are// met://// * Redistributions of source code must retain the above copyright// notice, this list of conditions and the following disclaimer.// * Redistributions in binary form must reproduce the above// copyright notice, this list of conditions and the following disclaimer// in the documentation and/or other materials provided with the// distribution.// * Neither the name of Google Inc. nor the names of its// contributors may be used to endorse or promote products derived from// this software without specific prior written permission.//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.// string_utils-inl.h: Safer string manipulation on Windows, supporting// pre-MSVC8 environments.#ifndef COMMON_WINDOWS_STRING_UTILS_INL_H__#define COMMON_WINDOWS_STRING_UTILS_INL_H__#include <stdarg.h>#include <wchar.h>#include <string>// The "ll" printf format size specifier corresponding to |long long| was// intrudced in MSVC8. Earlier versions did not provide this size specifier,// but "I64" can be used to print 64-bit types. Don't use "I64" where "ll"// is available, in the event of oddball systems where |long long| is not// 64 bits wide.#if _MSC_VER >= 1400 // MSVC 2005/8#define WIN_STRING_FORMAT_LL "ll"#else // MSC_VER >= 1400#define WIN_STRING_FORMAT_LL "I64"#endif // MSC_VER >= 1400// A nonconforming version of swprintf, without the length argument, was// included with the CRT prior to MSVC8. Although a conforming version was// also available via an overload, it is not reliably chosen. _snwprintf// behaves as a standards-confirming swprintf should, so force the use of// _snwprintf when using older CRTs.#if _MSC_VER < 1400 // MSVC 2005/8#define swprintf _snwprintf#endif // MSC_VER < 1400namespace google_breakpad {using std::string;using std::wstring;class WindowsStringUtils { public: // Roughly equivalent to MSVC8's wcscpy_s, except pre-MSVC8, this does // not fail if source is longer than destination_size. The destination // buffer is always 0-terminated. static void safe_wcscpy(wchar_t *destination, size_t destination_size, const wchar_t *source); // Roughly equivalent to MSVC8's wcsncpy_s, except that _TRUNCATE cannot // be passed directly, and pre-MSVC8, this will not fail if source or count // are longer than destination_size. The destination buffer is always // 0-terminated. static void safe_wcsncpy(wchar_t *destination, size_t destination_size, const wchar_t *source, size_t count); // Performs multi-byte to wide character conversion on C++ strings, using // mbstowcs_s (MSVC8) or mbstowcs (pre-MSVC8). Returns false on failure, // without setting wcs. static bool safe_mbstowcs(const string &mbs, wstring *wcs); // Returns the base name of a file, e.g. strips off the path. static wstring GetBaseName(const wstring &filename); private: // Disallow instantiation and other object-based operations. WindowsStringUtils(); WindowsStringUtils(const WindowsStringUtils&); ~WindowsStringUtils(); void operator=(const WindowsStringUtils&);};// staticinline void WindowsStringUtils::safe_wcscpy(wchar_t *destination, size_t destination_size, const wchar_t *source) {#if _MSC_VER >= 1400 // MSVC 2005/8 wcscpy_s(destination, destination_size, source);#else // _MSC_VER >= 1400 // Pre-MSVC 2005/8 doesn't have wcscpy_s. Simulate it with wcsncpy. // wcsncpy doesn't 0-terminate the destination buffer if the source string // is longer than size. Ensure that the destination is 0-terminated. wcsncpy(destination, source, destination_size); if (destination && destination_size) destination[destination_size - 1] = 0;#endif // _MSC_VER >= 1400}// staticinline void WindowsStringUtils::safe_wcsncpy(wchar_t *destination, size_t destination_size, const wchar_t *source, size_t count) {#if _MSC_VER >= 1400 // MSVC 2005/8 wcsncpy_s(destination, destination_size, source, count);#else // _MSC_VER >= 1400 // Pre-MSVC 2005/8 doesn't have wcsncpy_s. Simulate it with wcsncpy. // wcsncpy doesn't 0-terminate the destination buffer if the source string // is longer than size. Ensure that the destination is 0-terminated. if (destination_size < count) count = destination_size; wcsncpy(destination, source, count); if (destination && count) destination[count - 1] = 0;#endif // _MSC_VER >= 1400}} // namespace google_breakpad#endif // COMMON_WINDOWS_STRING_UTILS_INL_H__
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?