/* ********************************************************************** * Copyright (c) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description * 11/19/2001 aliu Creation. ********************************************************************** */ #include "unicode/utypes.h" #include "unicode/uobject.h" #include "unicode/unistr.h" #include "cmemory.h" //-------------------------------------------------------------------- // class CharString // // This is a tiny wrapper class that is used internally to make a // UnicodeString look like a const char*. It can be allocated on the // stack. It only creates a heap buffer if it needs to. //-------------------------------------------------------------------- U_NAMESPACE_BEGIN class U_COMMON_API CharString : public UMemory { public: #if !UCONFIG_NO_CONVERSION // Constructor // @param str The unicode string to be converted to char * // @param codepage The char * code page. "" for invariant conversion. // NULL for default code page. inline CharString(const UnicodeString& str, const char *codepage); #endif inline CharString(const UnicodeString& str); inline ~CharString(); inline operator const char*() const { return ptr; } private: char buf[128]; char* ptr; CharString(const CharString &other); // forbid copying of this class CharString &operator=(const CharString &other); // forbid copying of this class }; #if !UCONFIG_NO_CONVERSION inline CharString::CharString(const UnicodeString& str, const char *codepage) { int32_t len; ptr = buf; len = str.extract(0, 0x7FFFFFFF, buf ,sizeof(buf)-1, codepage); if (len >= (int32_t)(sizeof(buf)-1)) { ptr = (char *)uprv_malloc(len+1); str.extract(0, 0x7FFFFFFF, ptr, len+1, codepage); } } #endif inline CharString::CharString(const UnicodeString& str) { int32_t len; ptr = buf; len = str.extract(0, 0x7FFFFFFF, buf, (int32_t)(sizeof(buf)-1), US_INV); if (len >= (int32_t)(sizeof(buf)-1)) { ptr = (char *)uprv_malloc(len+1); str.extract(0, 0x7FFFFFFF, ptr, len+1, US_INV); } } inline CharString::~CharString() { if (ptr != buf) { uprv_free(ptr); } } U_NAMESPACE_END //eof