OpenDDS  Snapshot(2023/04/07-19:43)
Public Member Functions | Public Attributes | List of all members
OpenDDS::XTypes::MemberPathParser Class Reference

#include <Utils.h>

Collaboration diagram for OpenDDS::XTypes::MemberPathParser:
Collaboration graph
[legend]

Public Member Functions

 MemberPathParser (const char *path)
 
 MemberPathParser (const DCPS::String &path)
 
bool consume (size_t by)
 
bool get_next_subpath ()
 
bool get_index (CORBA::UInt32 &index)
 

Public Attributes

size_t pos
 
size_t left
 
const char * path
 
bool error
 
bool in_subscript
 
DCPS::String subpath
 

Detailed Description

Iterate over parts of a member name path that can be the name of a field inside a function or an array element nested multiple levels inside a type.

Examples: "member_a" "member_b[2]" "member_b[2].x" "[2]" (If the DynamicData is indexed or keyed)

Definition at line 43 of file XTypes/Utils.h.

Constructor & Destructor Documentation

◆ MemberPathParser() [1/2]

OpenDDS::XTypes::MemberPathParser::MemberPathParser ( const char *  path)
inline

Definition at line 52 of file XTypes/Utils.h.

References strlen().

53  : pos(0)
54  , left(path ? std::strlen(path) : 0)
55  , path(left > 0 ? path : 0)
56  , error(false)
57  , in_subscript(false)
58  {
59  }

◆ MemberPathParser() [2/2]

OpenDDS::XTypes::MemberPathParser::MemberPathParser ( const DCPS::String path)
inline

Definition at line 61 of file XTypes/Utils.h.

62  : pos(0)
63  , left(path.size())
64  , path(left > 0 ? path.c_str() : 0)
65  , error(false)
66  , in_subscript(false)
67  {
68  }

Member Function Documentation

◆ consume()

bool OpenDDS::XTypes::MemberPathParser::consume ( size_t  by)

Definition at line 113 of file XTypes/Utils.cpp.

References ACE_ERROR, error, left, LM_WARNING, OpenDDS::DCPS::log_level, path, pos, and OpenDDS::DCPS::LogLevel::Warning.

Referenced by get_next_subpath().

114 {
115  if (by > left) {
116  if (log_level >= LogLevel::Warning) {
117  ACE_ERROR((LM_WARNING, "(%P|%t) Warning: MemberPathParser::consume: "
118  "at pos %B with %B left trying to increment by %B\n", pos, left, by));
119  }
120  error = true;
121  return false;
122  }
123  pos += by;
124  left -= by;
125  path += by;
126  return true;
127 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_ERROR(X)

◆ get_index()

bool OpenDDS::XTypes::MemberPathParser::get_index ( CORBA::UInt32 index)

Definition at line 213 of file XTypes/Utils.cpp.

References ACE_ERROR, OpenDDS::DCPS::convertToInteger(), in_subscript, LM_NOTICE, OpenDDS::DCPS::log_level, OpenDDS::DCPS::LogLevel::Notice, and subpath.

214 {
215  if (!in_subscript || subpath.empty() ||
216  subpath.find_first_not_of("0123456789") != DCPS::String::npos) {
217  if (log_level >= LogLevel::Notice) {
218  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: MemberPathParser::get_index: "
219  "\"%C\" is not a valid subscript index\n", subpath.c_str()));
220 
221  }
222  return false;
223  }
224  return DCPS::convertToInteger(subpath, index);
225 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_ERROR(X)
bool convertToInteger(const String &s, T &value)

◆ get_next_subpath()

bool OpenDDS::XTypes::MemberPathParser::get_next_subpath ( )

Put the next member name or subscript value in subpath and which kind in in_subscript. Returns false when the end of the path is reached or there was an error in which case error is set to true.

Definition at line 129 of file XTypes/Utils.cpp.

References ACE_ERROR, consume(), error, in_subscript, left, LM_NOTICE, OpenDDS::DCPS::log_level, OpenDDS::DCPS::LogLevel::Notice, path, pos, and subpath.

Referenced by OpenDDS::XTypes::MemberPath::resolve_string_path().

130 {
131  if (!path) {
132  if (log_level >= LogLevel::Notice) {
133  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: MemberPathParser::get_next_subpath: "
134  "empty or null path\n"));
135  }
136  error = true;
137  return false;
138  }
139 
140  // See if we're in a nested member or subscript and move past the '.' or '[' if we are.
141  in_subscript = left > 0 ? path[0] == '[' : false;
142  const bool nested_member = left > 0 ? path[0] == '.' : false;
143  if (nested_member && pos == 0) {
144  if (log_level >= LogLevel::Notice) {
145  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: MemberPathParser::get_next_subpath: "
146  "at pos 0 found unexpected '.'\n"));
147  }
148  error = true;
149  return false;
150  }
151  if (nested_member || in_subscript) {
152  consume(1);
153  }
154 
155  size_t i = 0; // Char count to consume
156  size_t got = 0; // Char count to use for the result
157  char c = '\0';
158  bool scan = true;
159  for (; i < left && scan; ++i) {
160  c = path[i];
161  switch (c) {
162  case '.':
163  case '[':
164  if (in_subscript) {
165  if (log_level >= LogLevel::Notice) {
166  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: MemberPathParser::get_next_subpath: "
167  "at pos %B unexpected '%c' in a subscript\n", pos + i, c));
168  }
169  error = true;
170  return false;
171  }
172  --i; // Don't consume, leave for next iteration
173  // fallthrough
174  case ']':
175  scan = false;
176  break;
177 
178  default:
179  ++got;
180  }
181  }
182 
183  if (in_subscript && c != ']') {
184  if (log_level >= LogLevel::Notice) {
185  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: MemberPathParser::get_next_subpath: "
186  "at pos %B expected to find a ']' to end subscript\n", pos + i));
187  }
188  error = true;
189  return false;
190  }
191 
192  if (got == 0) {
193  if (in_subscript || nested_member) {
194  if (log_level >= LogLevel::Notice) {
195  const char* const expected = in_subscript ? "index or key" : "member name";
196  if (c) {
197  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: MemberPathParser::get_next_subpath: "
198  "at pos %B expected to find %C before '%c'\n", pos + i, expected, c));
199  } else {
200  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: MemberPathParser::get_next_subpath: "
201  "at pos %B expected to find %C before the end of the path\n", pos + i, expected));
202  }
203  }
204  error = true;
205  }
206  return false;
207  }
208 
209  subpath.assign(path, got);
210  return consume(i);
211 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_ERROR(X)

Member Data Documentation

◆ error

bool OpenDDS::XTypes::MemberPathParser::error

Definition at line 48 of file XTypes/Utils.h.

Referenced by consume(), and get_next_subpath().

◆ in_subscript

bool OpenDDS::XTypes::MemberPathParser::in_subscript

◆ left

size_t OpenDDS::XTypes::MemberPathParser::left

Definition at line 46 of file XTypes/Utils.h.

Referenced by consume(), and get_next_subpath().

◆ path

const char* OpenDDS::XTypes::MemberPathParser::path

◆ pos

size_t OpenDDS::XTypes::MemberPathParser::pos

Definition at line 45 of file XTypes/Utils.h.

Referenced by consume(), and get_next_subpath().

◆ subpath

DCPS::String OpenDDS::XTypes::MemberPathParser::subpath

The documentation for this class was generated from the following files: