Home | History | Annotate | Download | only in common
      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