150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Copyright (C) 2009-2010, International Business Machines 2b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Corporation and others. All Rights Reserved. 3b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// 4b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Copyright 2004 and onwards Google Inc. 5b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// 6b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Author: wilsonh@google.com (Wilson Hsieh) 7b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// 8b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 9b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/utypes.h" 10b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/stringpiece.h" 11b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "cstring.h" 1250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "cmemory.h" 13b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 14b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_NAMESPACE_BEGIN 15b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 16b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruStringPiece::StringPiece(const char* str) 17b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru : ptr_(str), length_((str == NULL) ? 0 : static_cast<int32_t>(uprv_strlen(str))) { } 18b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 19b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruStringPiece::StringPiece(const StringPiece& x, int32_t pos) { 20b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (pos < 0) { 21b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru pos = 0; 22b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else if (pos > x.length_) { 23b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru pos = x.length_; 24b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 25b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ptr_ = x.ptr_ + pos; 26b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru length_ = x.length_ - pos; 27b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 28b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 29b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruStringPiece::StringPiece(const StringPiece& x, int32_t pos, int32_t len) { 30b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (pos < 0) { 31b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru pos = 0; 32b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else if (pos > x.length_) { 33b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru pos = x.length_; 34b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 35b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (len < 0) { 36b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru len = 0; 37b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else if (len > x.length_ - pos) { 38b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru len = x.length_ - pos; 39b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 40b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ptr_ = x.ptr_ + pos; 41b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru length_ = len; 42b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 43b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 4450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid StringPiece::set(const char* str) { 4550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ptr_ = str; 4650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (str != NULL) 4750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length_ = static_cast<int32_t>(uprv_strlen(str)); 4850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho else 4950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length_ = 0; 5050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 5150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 5250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_EXPORT UBool U_EXPORT2 5350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehooperator==(const StringPiece& x, const StringPiece& y) { 5450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t len = x.size(); 5550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (len != y.size()) { 5650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return false; 5750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 5827f654740f2a26ad62a5c155af9199af9e69b889claireho if (len == 0) { 5927f654740f2a26ad62a5c155af9199af9e69b889claireho return true; 6027f654740f2a26ad62a5c155af9199af9e69b889claireho } 6150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char* p = x.data(); 6250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char* p2 = y.data(); 6350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // Test last byte in case strings share large common prefix 6427f654740f2a26ad62a5c155af9199af9e69b889claireho --len; 6527f654740f2a26ad62a5c155af9199af9e69b889claireho if (p[len] != p2[len]) return false; 6650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // At this point we can, but don't have to, ignore the last byte. 6727f654740f2a26ad62a5c155af9199af9e69b889claireho return uprv_memcmp(p, p2, len) == 0; 6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 6950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 71b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* Microsft Visual Studios <= 8.0 complains about redefinition of this 72b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * static const class variable. However, the C++ standard states that this 73b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * definition is correct. Perhaps there is a bug in the Microsoft compiler. 74b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * This is not an issue on any other compilers (that we know of) including 75b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Visual Studios 9.0. 76b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Cygwin with MSVC 9.0 also complains here about redefinition. 77b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 7827f654740f2a26ad62a5c155af9199af9e69b889claireho#if (!defined(_MSC_VER) || (_MSC_VER > 1500)) && !defined(CYGWINMSVC) 79b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruconst int32_t StringPiece::npos; 80b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#endif 81b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 82b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_NAMESPACE_END 83