/usr/include/oce/NCollection_UtfString.hxx is in liboce-foundation-dev 0.17.2-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 | // Created on: 2013-01-28
// Created by: Kirill GAVRILOV
// Copyright (c) 2013-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef _NCollection_UtfString_H__
#define _NCollection_UtfString_H__
#include "NCollection_UtfIterator.hxx"
#include <Standard.hxx>
#include <cstring>
#include <cstdlib>
//! This template class represent constant UTF-* string.
//! String stored in memory continuously, always NULL-terminated
//! and can be used as standard C-string using ToCString() method.
//!
//! Notice that changing the string is not allowed
//! and any modifications should produce new string.
template<typename Type>
class NCollection_UtfString
{
public:
NCollection_UtfIterator<Type> Iterator() const
{
return NCollection_UtfIterator<Type> (myString);
}
//! @return the size of the buffer, excluding NULL-termination symbol
Standard_Integer Size() const
{
return mySize;
}
//! @return the length of the string in Unicode symbols
Standard_Integer Length() const
{
return myLength;
}
//! Retrieve Unicode symbol at specified position.
//! Warning! This is a slow access. Iterator should be used for consecutive parsing.
//! @param theCharIndex the index of the symbol, should be lesser than Length()
//! @return the Unicode symbol value
Standard_Utf32Char GetChar (const Standard_Integer theCharIndex) const;
//! Retrieve string buffer at specified position.
//! Warning! This is a slow access. Iterator should be used for consecutive parsing.
//! @param theCharIndex the index of the symbol, should be lesser than Length()
//! @return the pointer to the symbol
const Type* GetCharBuffer (const Standard_Integer theCharIndex) const;
//! Retrieve Unicode symbol at specified position.
//! Warning! This is a slow access. Iterator should be used for consecutive parsing.
Standard_Utf32Char operator[] (const Standard_Integer theCharIndex) const
{
return GetChar (theCharIndex);
}
//! Initialize empty string.
NCollection_UtfString();
//! Copy constructor.
//! @param theCopy string to copy.
NCollection_UtfString (const NCollection_UtfString& theCopy);
//! Copy constructor from NULL-terminated UTF-8 string.
//! @param theCopyUtf8 NULL-terminated UTF-8 string to copy
//! @param theLength the length limit in Unicode symbols (NOT bytes!)
NCollection_UtfString (const char* theCopyUtf8,
const Standard_Integer theLength = -1);
//! Copy constructor from NULL-terminated UTF-16 string.
//! @param theCopyUtf16 NULL-terminated UTF-16 string to copy
//! @param theLength the length limit in Unicode symbols (NOT bytes!)
NCollection_UtfString (const Standard_Utf16Char* theCopyUtf16,
const Standard_Integer theLength = -1);
//! Copy constructor from NULL-terminated UTF-32 string.
//! @param theCopyUtf32 NULL-terminated UTF-32 string to copy
//! @param theLength the length limit in Unicode symbols (NOT bytes!)
NCollection_UtfString (const Standard_Utf32Char* theCopyUtf32,
const Standard_Integer theLength = -1);
//! Copy constructor from NULL-terminated wide UTF string.
//! @param theCopyUtfWide NULL-terminated wide UTF string to copy
//! @param theLength the length limit in Unicode symbols (NOT bytes!)
NCollection_UtfString (const Standard_WideChar* theCopyUtfWide,
const Standard_Integer theLength = -1);
//! Copy from NULL-terminated Unicode string.
//! @param theStringUtf NULL-terminated Unicode string
//! @param theLength the length limit in Unicode symbols
template <typename TypeFrom>
void FromUnicode (const TypeFrom* theStringUtf,
const Standard_Integer theLength = -1);
//! Copy from NULL-terminated multibyte string in system locale.
//! You should avoid this function unless extreme necessity.
//! @param theString NULL-terminated multibyte string
//! @param theLength the length limit in Unicode symbols
void FromLocale (const char* theString,
const Standard_Integer theLength = -1);
//! Destructor.
~NCollection_UtfString();
//! Compares this string with another one.
bool IsEqual (const NCollection_UtfString& theCompare) const;
//! Returns the substring.
//! @param theStart start index (inclusive) of subString
//! @param theEnd end index (exclusive) of subString
//! @return the substring
NCollection_UtfString SubString (const Standard_Integer theStart,
const Standard_Integer theEnd) const;
//! Returns NULL-terminated Unicode string.
//! Should not be modifed or deleted!
//! @return (const Type* ) pointer to string
const Type* ToCString() const
{
return myString;
}
//! @return copy in UTF-8 format
const NCollection_UtfString<Standard_Utf8Char> ToUtf8() const;
//! @return copy in UTF-16 format
const NCollection_UtfString<Standard_Utf16Char> ToUtf16() const;
//! @return copy in UTF-32 format
const NCollection_UtfString<Standard_Utf32Char> ToUtf32() const;
//! @return copy in wide format (UTF-16 on Windows and UTF-32 on Linux)
const NCollection_UtfString<Standard_WideChar> ToUtfWide() const;
//! Converts the string into multibyte string.
//! You should avoid this function unless extreme necessity.
//! @param theBuffer output buffer
//! @param theSizeBytes buffer size in bytes
//! @return true on success
bool ToLocale (char* theBuffer,
const Standard_Integer theSizeBytes) const;
//! @return true if string is empty
bool IsEmpty() const
{
return myString[0] == Type(0);
}
//! Zero string.
void Clear();
public: //! @name assign operators
//! Copy from another string.
const NCollection_UtfString& operator= (const NCollection_UtfString& theOther);
//! Copy from UTF-8 NULL-terminated string.
const NCollection_UtfString& operator= (const char* theStringUtf8);
//! Copy from wchar_t UTF NULL-terminated string.
const NCollection_UtfString& operator= (const Standard_WideChar* theStringUtfWide);
//! Join strings.
NCollection_UtfString& operator+= (const NCollection_UtfString& theAppend);
//! Join two strings.
friend NCollection_UtfString operator+ (const NCollection_UtfString& theLeft,
const NCollection_UtfString& theRight)
{
NCollection_UtfString aSumm;
strFree (aSumm.myString);
aSumm.mySize = theLeft.mySize + theRight.mySize;
aSumm.myLength = theLeft.myLength + theRight.myLength;
aSumm.myString = strAlloc (aSumm.mySize);
// copy bytes
strCopy ((Standard_Byte* )aSumm.myString, (const Standard_Byte* )theLeft.myString, theLeft.mySize);
strCopy ((Standard_Byte* )aSumm.myString + theLeft.mySize, (const Standard_Byte* )theRight.myString, theRight.mySize);
return aSumm;
}
public: //! @name compare operators
bool operator== (const NCollection_UtfString& theCompare) const
{
return IsEqual (theCompare);
}
bool operator!= (const NCollection_UtfString& theCompare) const;
private: //! @name low-level methods
//! Compute advance for specified string.
//! @param theStringUtf pointer to the NULL-terminated Unicode string
//! @param theLengthMax length limit (to cut the string), set to -1 to compute up to NULL-termination symbol
//! @param theSizeBytes advance in bytes (out)
//! @param theLength string length (out)
template<typename TypeFrom>
static void strGetAdvance (const TypeFrom* theStringUtf,
const Standard_Integer theLengthMax,
Standard_Integer& theSizeBytes,
Standard_Integer& theLength);
//! Allocate NULL-terminated string buffer.
static Type* strAlloc (const Standard_Size theSizeBytes)
{
Type* aPtr = (Type* )Standard::Allocate (theSizeBytes + sizeof(Type));
if (aPtr != NULL)
{
// always NULL-terminate the string
aPtr[theSizeBytes / sizeof(Type)] = Type(0);
}
return aPtr;
}
//! Release string buffer and nullify the pointer.
static void strFree (Type*& thePtr)
{
Standard::Free (thePtr);
}
//! Provides bytes interface to avoid incorrect pointer arithmetics.
static void strCopy (Standard_Byte* theStrDst,
const Standard_Byte* theStrSrc,
const Standard_Integer theSizeBytes)
{
std::memcpy (theStrDst, theStrSrc, (Standard_Size )theSizeBytes);
}
//! Compare two Unicode strings per-byte.
static bool strAreEqual (const Type* theString1,
const Standard_Integer theSizeBytes1,
const Type* theString2,
const Standard_Integer theSizeBytes2)
{
return (theSizeBytes1 == theSizeBytes2)
&& (std::memcmp (theString1, theString2, (Standard_Size )theSizeBytes1) == 0);
}
private: //! @name private fields
Type* myString; //!< string buffer
Standard_Integer mySize; //!< buffer size in bytes, excluding NULL-termination symbol
Standard_Integer myLength; //!< length of the string in Unicode symbols (cached value, excluding NULL-termination symbol)
};
typedef NCollection_UtfString<Standard_Utf8Char> NCollection_Utf8String;
typedef NCollection_UtfString<Standard_Utf16Char> NCollection_Utf16String;
typedef NCollection_UtfString<Standard_Utf32Char> NCollection_Utf32String;
typedef NCollection_UtfString<Standard_WideChar> NCollection_UtfWideString;
// template implementation (inline methods)
#include "NCollection_UtfString.lxx"
#endif // _NCollection_UtfString_H__
|