StringManager.cpp
Go to the documentation of this file.00001 #include "FACE/StringManager.h"
00002 #include "dds/DCPS/SafetyProfilePool.h"
00003 #include "dds/DCPS/Serializer.h"
00004 #include <cstring>
00005
00006 namespace FACE {
00007
00008 namespace {
00009 static Char s_empty = 0;
00010 #ifdef DDS_HAS_WCHAR
00011 static WChar s_wempty = 0;
00012 #endif
00013 }
00014
00015 Char* string_alloc(UnsignedLong len)
00016 {
00017 if (len == 0) return &s_empty;
00018 void* const raw =
00019 ACE_Allocator::instance()->malloc(len + 1);
00020 Char* const str = static_cast<Char*>(raw);
00021 if (str) str[0] = static_cast<Char>(0);
00022 return str;
00023 }
00024
00025 Char* string_dup(const Char* str)
00026 {
00027 if (!str) return 0;
00028 if (!*str) return &s_empty;
00029 const size_t len = std::strlen(str);
00030 Char* const cpy = string_alloc(static_cast<UnsignedLong>(len));
00031 if (cpy) std::strncpy(cpy, str, len + 1);
00032 return cpy;
00033 }
00034
00035 void string_free(Char* str)
00036 {
00037 if (str != &s_empty) ACE_Allocator::instance()->free(str);
00038 }
00039
00040 #ifdef DDS_HAS_WCHAR
00041 WChar* wstring_alloc(UnsignedLong len)
00042 {
00043 if (len == 0) return &s_wempty;
00044 const size_t n = (len + 1) * sizeof(WChar);
00045 void* const raw = ACE_Allocator::instance()->malloc(n);
00046 WChar* const str = static_cast<WChar*>(raw);
00047 if (str) str[0] = static_cast<WChar>(0);
00048 return str;
00049 }
00050
00051 WChar* wstring_dup(const WChar* str)
00052 {
00053 if (!str) return 0;
00054 if (!*str) return &s_wempty;
00055 const size_t len = std::wcslen(str);
00056 WChar* const cpy = wstring_alloc(static_cast<UnsignedLong>(len));
00057 if (cpy) std::wcsncpy(cpy, str, len + 1);
00058 return cpy;
00059 }
00060
00061 void wstring_free(WChar* str)
00062 {
00063 if (str != &s_wempty) ACE_Allocator::instance()->free(str);
00064 }
00065 #endif // DDS_HAS_WCHAR
00066 }
00067
00068 OPENDDS_BEGIN_VERSIONED_NAMESPACE_DECL
00069
00070 namespace OpenDDS {
00071 namespace FaceTypes {
00072
00073 bool operator>>(DCPS::Serializer& ser, StringBase<FACE::Char>& str)
00074 {
00075 ser.read_string(str.out(), FACE::string_alloc, FACE::string_free);
00076 return ser.good_bit();
00077 }
00078
00079 #ifdef DDS_HAS_WCHAR
00080 bool operator>>(DCPS::Serializer& ser, StringBase<FACE::WChar>& str)
00081 {
00082 ser.read_string(str.out(), FACE::wstring_alloc, FACE::wstring_free);
00083 return ser.good_bit();
00084 }
00085 #endif
00086
00087 }
00088 }
00089
00090 OPENDDS_END_VERSIONED_NAMESPACE_DECL