OpenDDS  Snapshot(2023/04/28-20:55)
StringManager.cpp
Go to the documentation of this file.
1 #include "FACE/StringManager.h"
3 #include "dds/DCPS/Serializer.h"
4 #include <cstring>
5 
6 namespace FACE {
7 
8 namespace {
9  static Char s_empty = 0;
10 #ifdef DDS_HAS_WCHAR
11  static WChar s_wempty = 0;
12 #endif
13 }
14 
15 Char* string_alloc(UnsignedLong len)
16 {
17  if (len == 0) return &s_empty;
18  void* const raw =
19  ACE_Allocator::instance()->malloc(len + 1);
20  Char* const str = static_cast<Char*>(raw);
21  if (str) str[0] = static_cast<Char>(0);
22  return str;
23 }
24 
25 Char* string_dup(const Char* str)
26 {
27  if (!str) return 0;
28  if (!*str) return &s_empty;
29  const size_t len = std::strlen(str);
30  Char* const cpy = string_alloc(static_cast<UnsignedLong>(len));
31  if (cpy) std::strncpy(cpy, str, len + 1);
32  return cpy;
33 }
34 
35 void string_free(Char* str)
36 {
37  if (str != &s_empty) ACE_Allocator::instance()->free(str);
38 }
39 
40 #ifdef DDS_HAS_WCHAR
41 WChar* wstring_alloc(UnsignedLong len)
42 {
43  if (len == 0) return &s_wempty;
44  const size_t n = (len + 1) * sizeof(WChar);
45  void* const raw = ACE_Allocator::instance()->malloc(n);
46  WChar* const str = static_cast<WChar*>(raw);
47  if (str) str[0] = static_cast<WChar>(0);
48  return str;
49 }
50 
51 WChar* wstring_dup(const WChar* str)
52 {
53  if (!str) return 0;
54  if (!*str) return &s_wempty;
55  const size_t len = std::wcslen(str);
56  WChar* const cpy = wstring_alloc(static_cast<UnsignedLong>(len));
57  if (cpy) std::wcsncpy(cpy, str, len + 1);
58  return cpy;
59 }
60 
61 void wstring_free(WChar* str)
62 {
63  if (str != &s_wempty) ACE_Allocator::instance()->free(str);
64 }
65 #endif // DDS_HAS_WCHAR
66 }
67 
69 
70 namespace OpenDDS {
71 namespace FaceTypes {
72 
73 bool operator>>(DCPS::Serializer& ser, StringBase<FACE::Char>& str)
74 {
76  return ser.good_bit();
77 }
78 
79 #ifdef DDS_HAS_WCHAR
80 bool operator>>(DCPS::Serializer& ser, StringBase<FACE::WChar>& str)
81 {
82  ser.read_string(str.out(), FACE::wstring_alloc, FACE::wstring_free);
83  return ser.good_bit();
84 }
85 #endif
86 
87 }
88 }
89 
ACE_WCHAR_T WChar
void wstring_free(WChar *const)
void string_free(Char *str)
virtual void free(void *ptr)=0
Char * string_alloc(UnsignedLong len)
Class to serialize and deserialize data for DDS.
Definition: Serializer.h:369
static ACE_Allocator * instance(void)
WChar * wstring_dup(const WChar *const)
WChar * wstring_alloc(ULong len)
bool operator>>(DCPS::Serializer &ser, StringBase< FACE::Char > &str)
size_t read_string(ACE_CDR::Char *&dest, StrAllocate str_alloc=0, StrFree str_free=0)
Definition: Serializer.cpp:520
Char * string_dup(const Char *str)
ACE_CDR::Char Char
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
The Internal API and Implementation of OpenDDS.
Definition: AddressCache.h:28
virtual void * malloc(size_type nbytes)=0
Definition: FaceTSS.cpp:24