• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
CharString(const UnicodeString & str)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 
~CharString()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