1 /* 2 ********************************************************************** 3 * Copyright (c) 2001-2004, International Business Machines 4 * Corporation and others. All Rights Reserved. 5 ********************************************************************** 6 * Date Name Description 7 * 11/19/2001 aliu Creation. 8 ********************************************************************** 9 */ 10 11 #ifndef CHARSTRING_H 12 #define CHARSTRING_H 13 14 #include "unicode/utypes.h" 15 #include "unicode/uobject.h" 16 #include "unicode/unistr.h" 17 #include "cmemory.h" 18 19 //-------------------------------------------------------------------- 20 // class CharString 21 // 22 // This is a tiny wrapper class that is used internally to make a 23 // UnicodeString look like a const char*. It can be allocated on the 24 // stack. It only creates a heap buffer if it needs to. 25 //-------------------------------------------------------------------- 26 27 U_NAMESPACE_BEGIN 28 29 class U_COMMON_API CharString : public UMemory { 30 public: 31 32 #if !UCONFIG_NO_CONVERSION 33 // Constructor 34 // @param str The unicode string to be converted to char * 35 // @param codepage The char * code page. "" for invariant conversion. 36 // NULL for default code page. 37 // inline CharString(const UnicodeString& str, const char *codepage); 38 #endif 39 40 inline CharString(const UnicodeString& str); 41 inline ~CharString(); 42 inline operator const char*() const { return ptr; } 43 44 private: 45 char buf[128]; 46 char* ptr; 47 48 CharString(const CharString &other); // forbid copying of this class 49 CharString &operator=(const CharString &other); // forbid copying of this class 50 }; 51 52 #if !UCONFIG_NO_CONVERSION 53 54 // PLEASE DON'T USE THIS FUNCTION. 55 // We don't want the static dependency on conversion or the performance hit that comes from a codepage conversion. 56 /* 57 inline CharString::CharString(const UnicodeString& str, const char *codepage) { 58 int32_t len; 59 ptr = buf; 60 len = str.extract(0, 0x7FFFFFFF, buf ,sizeof(buf)-1, codepage); 61 if (len >= (int32_t)(sizeof(buf)-1)) { 62 ptr = (char *)uprv_malloc(len+1); 63 str.extract(0, 0x7FFFFFFF, ptr, len+1, codepage); 64 } 65 }*/ 66 67 #endif 68 69 inline CharString::CharString(const UnicodeString& str) { 70 int32_t len; 71 ptr = buf; 72 len = str.extract(0, 0x7FFFFFFF, buf, (int32_t)(sizeof(buf)-1), US_INV); 73 if (len >= (int32_t)(sizeof(buf)-1)) { 74 ptr = (char *)uprv_malloc(len+1); 75 str.extract(0, 0x7FFFFFFF, ptr, len+1, US_INV); 76 } 77 } 78 79 inline CharString::~CharString() { 80 if (ptr != buf) { 81 uprv_free(ptr); 82 } 83 } 84 85 U_NAMESPACE_END 86 87 #endif 88 //eof 89