|
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 |