FARGOS/VISTA Object Management Environment Core  ..
FARGOS/VISTA Object Management Environment Core Table of Contents
OMEoutputOnStream.h
Go to the documentation of this file.
1 #ifndef _OME_OUTPUT_ON_STREAM_H_
2 #define _OME_OUTPUT_ON_STREAM_H_ "$Id: OMEoutputOnStream.h 312 2020-03-21 21:25:35Z geoff $"
4 
13 #include <utils/base/text2int.h>
14 
15 
16 template <typename STREAMTYPE>
17 inline STREAMTYPE &OMEarrayStorage::outputOnStream(STREAMTYPE &outputStream, int_fast16_t indent, uint8_t includeTypePrefix) const
18 {
20  includeTypePrefix &= ~OME_DISABLE_QUOTE_OUTPUT;
21  }
22  if (includeTypePrefix & OME_OUTPUT_NEWLINE) {
23  for (int_fast16_t count = 0; count < indent; ++count) {
24  outputStream << " ";
25  }
26  outputStream << "{\n";
27  } else {
28  outputStream << "{ ";
29  }
30  int_fast16_t newIndent = indent < 0 ? -indent : indent;
31  newIndent += 1;
32  for (SparseArrayType_t::const_iterator i = sparseArray.begin();
33  i != sparseArray.end(); ++i) {
34  for (int_fast16_t count = 0; count < newIndent; ++count) {
35  outputStream << " ";
36  }
37  outputStream << "[" << i->first << "] = ";
38  i->second->outputOnStream(outputStream, -(newIndent + 1), includeTypePrefix);
39  }
40  newIndent -= 1;
41  if (sparseArray.empty() == false) { // something was output
42  for (int_fast16_t count = 0; count < newIndent; ++count) {
43  outputStream << " ";
44  }
45  }
46  if (includeTypePrefix & OME_OUTPUT_NEWLINE) {
47  outputStream << "}\n";
48  } else {
49  outputStream << "}";
50  }
51  return (outputStream);
52 }
53 
54 template <typename STREAMTYPE>
55 STREAMTYPE &OMEassocKeyPair::outputOnStream(STREAMTYPE &outputStream, int_fast16_t indent, uint8_t includeTypePrefix) const
56 {
57  outputStream << "[\"" << *key << "\"] = ";
58  value->outputOnStream(outputStream, indent, includeTypePrefix);
59  return (outputStream);
60 }
61 
62 template <typename STREAMTYPE>
63 inline STREAMTYPE &OMEassocStorage::outputOnStream(STREAMTYPE &outputStream, int_fast16_t indent, uint8_t includeTypePrefix) const
64 {
66  includeTypePrefix &= ~OME_DISABLE_QUOTE_OUTPUT;
67  }
68  if (includeTypePrefix & OME_OUTPUT_NEWLINE) {
69  for (int_fast16_t count = 0; count < indent; ++count) {
70  outputStream << " ";
71  }
72  outputStream << "{\n";
73  } else {
74  outputStream << "{ ";
75  }
76  int_fast16_t newIndent = (indent < 0) ? -indent : indent;
77  newIndent += 1;
78  AssocArrayType_t::const_iterator i = assocArray.begin();
79  while (i != assocArray.end()) {
80  for (int_fast16_t count = 0; count < newIndent; ++count) {
81  outputStream << " ";
82  }
83  i->second->outputOnStream(outputStream, -newIndent - 1, includeTypePrefix);
84 // outputStream << "\n";
85  ++i; // get next element
86  }
87  newIndent -= 1;
88  for (int_fast16_t count = 0; count < newIndent; ++count) {
89  outputStream << " ";
90  }
91  if (includeTypePrefix & OME_OUTPUT_NEWLINE) {
92  outputStream << "}\n";
93  } else {
94  outputStream << "}";
95  }
96  return (outputStream);
97 }
98 
99 template <typename STREAMTYPE> inline STREAMTYPE &OMEnlmStorage::outputOnStream(STREAMTYPE &outputStream, int_fast16_t indent,
100  uint8_t includeTypePrefix, const OMEstring *lang) const
101 {
102  const char *fieldModifier;
103  int fieldModifierLen;
104  enum { NORMAL,
105  SAW_ESCAPE,
106  SAW_FIELD,
107  SAW_FIELD_MODIFIER,
108  SAW_FIELD_NUM
109  } state;
110  int sum = 0; // initialization not needed, but quiets compiler warnings
111 
112  if (includeTypePrefix & OME_OUTPUT_NEWLINE) {
113  for (int_fast16_t count = 0; count < indent; ++count) {
114  outputStream << " ";
115  }
116  }
117  if (messageData == nullptr) { // we have no data!
118  outputStream << "[NLM NULL]";
119  return (outputStream);
120  }
121  const OMEstring &messProto = getMessageText(lang);
122  if (messageArguments.isEmpty()) { // no arguments...
123  // fast path, just copy data as-is...
124  outputStream << messProto;
125  return (outputStream);
126  }
127  // TO DO: create new string using messProto prototype
128  const char *cp = static_cast<const char *>(messProto);
129  const char *lastChar = cp + messProto.length();
130  for (state = NORMAL; cp != lastChar; cp++) {
131  switch (state) {
132  case NORMAL:
133  if (*cp == '\\') {
134  state = SAW_ESCAPE;
135  }
136  else if (*cp == '$') {
137  state = SAW_FIELD;
138  }
139  else {
140  outputStream << *cp;
141  }
142  break;
143  case SAW_ESCAPE:
144  state = NORMAL;
145  switch (*cp) {
146  case 't':
147  outputStream << '\t';
148  break;
149  case 'n':
150  outputStream << '\n';
151  break;
152  case 'r':
153  outputStream << '\r';
154  break;
155  default: // output as-is
156  outputStream << *cp;
157  break;
158  }
159  break;
160  case SAW_FIELD:
161  if ((*cp >= '0') && (*cp <= '9')) {
162  sum = *cp - '0';
163  state = SAW_FIELD_NUM;
164  fieldModifier = 0;
165  fieldModifierLen = 0;
166  }
167  else if (*cp == '%') {
168  state = SAW_FIELD_MODIFIER;
169  fieldModifier = cp; // save start...
170  }
171  else {
172  outputStream << '$' << *cp; // $$
173  state = NORMAL;
174  }
175  break;
176  case SAW_FIELD_MODIFIER:
177  if ((*cp >= '0') && (*cp <= '9')) { // end of modifier
178  fieldModifierLen = cp - fieldModifier;
179  sum = *cp - '0';
180  state = SAW_FIELD_NUM;
181  }
182  break;
183  case SAW_FIELD_NUM:
184  if ((*cp >= '0') && (*cp <= '9')) { // end of modifier
185  sum *= 10;
186  sum = *cp - '0';
187  }
188  else { // end of field...
189  const OMEarray &args = messageArguments;
190  // const OMEarray &info = argumentInfo;
191 
192  --sum; // $1 ==> argv[0]
193  const OMEtype &data = args[sum];
194  const OMEtype &anno = argumentInfo[sum];
195 
196  OMEnlm::outputFormattedData(outputStream,
197  data, anno, fieldModifier,
198  fieldModifierLen);
199  state = NORMAL;
200  cp -= 1; // reprocess the last char
201  }
202  break;
203  default:
204  std::cerr << "NLM format: ILLEGAL state\n";
205  break;
206  } // end switch
207  } // end for-loop
208  if (state == SAW_FIELD_NUM) { // handle last field
209  const OMEarray &args = messageArguments;
210  // const OMEarray &info = argumentInfo;
211 
212  --sum; // $1 ==> argv[0]
213  const OMEtype &data = args[sum];
214  const OMEtype &anno = argumentInfo[sum];
215 
216  OMEnlm::outputFormattedData(outputStream,
217  data, anno, fieldModifier,
218  fieldModifierLen);
219  }
220  return (outputStream);
221 }
222 
223 template <typename STREAMTYPE> inline STREAMTYPE &OMEnlm::outputFormattedData(STREAMTYPE &outputStream,
224  const class OMEbaseType &data,
225  const class OMEbaseType &annotation,
226  const char *fieldModifier, int modifierLen)
227 {
228  // TO DO: actually pay attention to modifiers, annotations
229  data.outputOnStream(outputStream, 0, OME_DISABLE_QUOTE_OUTPUT);
230  return (outputStream);
231 }
232 
233 #if 0
234 template <typename STREAMTYPE> inline STREAMTYPE &OMEoidStorageInternal::outputOnStream(STREAMTYPE &o,
235  int_fast16_t indent, bool fullInfo) const
236 {
237  o << "OID INTERNAL REFEFENCES NOT SUPPORTED IN EXTERNAL LIBRARIES\n";
238  o.flush();
239  return (o);
240 }
241 #endif
242 
243 template <typename STREAMTYPE> inline STREAMTYPE &OMEoidStorageExternal::outputOnStream(STREAMTYPE &outputStream,
244  int_fast16_t indent, bool fullInfo) const
245 {
246  outputStream << oidData;
247  if (fullInfo) {
248  outputStream << "EXT ACL=" << acl << "\n";
249  }
250  return (outputStream);
251 }
252 
253 template <typename STREAMTYPE> inline STREAMTYPE &OMEoidStorage::outputOnStream(STREAMTYPE &outputStream,
254  int_fast16_t indent, bool fullInfo) const
255 {
256  switch (referenceType) {
257  case OMErefType::internal: {
258  const OMEoidStorageInternal *intPtr = dynamic_cast<const OMEoidStorageInternal *>(storageRef);
259  intPtr->outputOnStream(outputStream, indent, fullInfo);
260  }
261  break;
262  case OMErefType::external: {
263  const OMEoidStorageExternal *extPtr = dynamic_cast<const OMEoidStorageExternal *>(storageRef);
264  extPtr->outputOnStream(outputStream, indent, fullInfo);
265  }
266  break;
267  default:
268  break;
269  }
270  return (outputStream);
271 }
272 
273 template <typename STREAMTYPE> inline STREAMTYPE &OMEsetStorage::outputOnStream(STREAMTYPE &outputStream, int_fast16_t indent, uint8_t includeTypePrefix) const
274 {
276  includeTypePrefix &= ~OME_DISABLE_QUOTE_OUTPUT;
277  }
278 
279  if (includeTypePrefix & OME_OUTPUT_NEWLINE) {
280  for (int_fast16_t count = 0; count < indent; ++count) {
281  outputStream << " ";
282  }
283  outputStream << "{\n";
284  } else {
285  outputStream << "{ ";
286  }
287 
288  int_fast16_t newIndent = (indent < 0) ? -indent : indent;
289  bool notFirst = false;
290  for (_STD deque<OMEbaseTypeP>::const_iterator i = dataSet.begin();
291  i != dataSet.end(); ++i) {
292  if (notFirst == false) {
293  notFirst = true;
294  if ((includeTypePrefix & OME_OUTPUT_NEWLINE) == 0) {
295  outputStream << ", ";
296  }
297  }
298  (*i)->outputOnStream(outputStream, newIndent + 1, includeTypePrefix);
299  }
300  if (includeTypePrefix & OME_OUTPUT_NEWLINE) {
301  for (int_fast16_t count = 0; count < newIndent; ++count) {
302  outputStream << " ";
303  }
304  outputStream << "}\n";
305  } else {
306  outputStream << "}";
307  }
308  return (outputStream);
309 }
310 
311 template <typename STREAMTYPE> inline STREAMTYPE &OMEbaseType::outputOnStream(STREAMTYPE &outputStream, int_fast16_t indent,
312  uint8_t includeTypePrefix) const
313 {
314  uint32_t workBfr[6];
315 
316  if (includeTypePrefix & OME_OUTPUT_NEWLINE) {
317  for (int_fast16_t i = 0; i < indent; ++i) {
318  outputStream << " ";
319  }
320  }
321  int_fast16_t negIndent = (indent < 0) ? indent : -indent;
322 
323  if (includeTypePrefix & OUTPUT_TYPENAME) {
324  outputStream << typeName() << " ";
325  }
326  switch (type) {
327  case OME_NIL:
328  if ((includeTypePrefix & OUTPUT_TYPENAME) == 0) {
329  outputStream << "nil";
330  }
331  if (includeTypePrefix & OUTPUT_NEWLINE) {
332  outputStream << "\n";
333  }
334  break;
335  case OME_INT32:
336  outputStream << int_to_ascii(workBfr, sizeof(workBfr), value.i);
337  if (includeTypePrefix & OUTPUT_NEWLINE) {
338  outputStream << "\n";
339  }
340  break;
341  case OME_UINT32:
342  case OME_UINT16:
343  case OME_UINT8:
344  outputStream << uint_to_ascii(workBfr, sizeof(workBfr), value.ui);
345  if (includeTypePrefix & OUTPUT_NEWLINE) {
346  outputStream << "\n";
347  }
348  break;
349  case OME_FLOAT:
350  // outputStream.setf(0, std::ios::floatfield);
351  outputStream << float_to_ascii((char *) workBfr, sizeof(workBfr), value.f);
352  if (includeTypePrefix & OUTPUT_NEWLINE) {
353  outputStream << "\n";
354  }
355  break;
356  case OME_DOUBLE:
357  // outputStream.setf(0, std::ios::floatfield);
358  outputStream << float_to_ascii((char *) workBfr, sizeof(workBfr), OME_EXT_TYPE(df));
359  if (includeTypePrefix & OUTPUT_NEWLINE) {
360  outputStream << "\n";
361  }
362  break;
363  case OME_INT64:
364  outputStream << int_to_ascii(workBfr, sizeof(workBfr), OME_EXT_TYPE(i64));
365  if (includeTypePrefix & OUTPUT_NEWLINE) {
366  outputStream << "\n";
367  }
368  break;
369  case OME_UINT64:
370  outputStream << uint_to_ascii(workBfr, sizeof(workBfr), OME_EXT_TYPE(ui64));
371  if (includeTypePrefix & OUTPUT_NEWLINE) {
372  outputStream << "\n";
373  }
374  break;
375  case OME_OID:
376  value.oid->outputOnStream(outputStream, 0);
377  if (includeTypePrefix & OUTPUT_NEWLINE) {
378  outputStream << "\n";
379  }
380  break;
381  case OME_STRING:
382  value.s->outputOnStream(outputStream, 0, includeTypePrefix);
383  if (includeTypePrefix & OUTPUT_NEWLINE) {
384  outputStream << "\n";
385  }
386  break;
387  case OME_ARRAY:
388  value.array->outputOnStream(outputStream, negIndent, includeTypePrefix);
389  break;
390  case OME_ASSOC:
391  value.assoc->outputOnStream(outputStream, negIndent, includeTypePrefix);
392  break;
393  case OME_SET:
394  value.set->outputOnStream(outputStream, negIndent, includeTypePrefix);
395  break;
396  case OME_POINTER:
397  if (includeTypePrefix & OUTPUT_TYPENAME) {
398  outputStream << "-> ";
399  }
400  value.pointer->outputOnStream(outputStream, negIndent, includeTypePrefix);
401  break;
402  case OME_NLM:
403  if ((includeTypePrefix & DISABLE_QUOTE_OUTPUT) == 0) {
404  outputStream << "\"";
405  }
406  value.nlm->outputOnStream(outputStream, 0, includeTypePrefix);
407  if ((includeTypePrefix & DISABLE_QUOTE_OUTPUT) == 0) {
408  outputStream << "\"";
409  }
410  if (includeTypePrefix & OUTPUT_NEWLINE) {
411  outputStream << "\n";
412  }
413  break;
414  case OME_FIXED:
415  value.fixed->outputOnStream(outputStream, 0);
416  if (includeTypePrefix & OUTPUT_NEWLINE) {
417  outputStream << "\n";
418  }
419  break;
420  default:
421  outputStream << "UnsupportedType(" << type << ")";
422  if (includeTypePrefix & OUTPUT_NEWLINE) {
423  outputStream << "\n";
424  }
425  break;
426  }
427  return (outputStream);
428 }
429 
430 template <typename STREAMTYPE> inline STREAMTYPE &operator<<(STREAMTYPE &outputStream, const OMEbaseType &data)
431 {
432  uint8_t mode;
433  switch (data.type) {
434  case OME_ARRAY:
435  case OME_ASSOC:
436  case OME_SET:
438  break;
439  default:
441  break;
442  }
443 
444  data.outputOnStream(outputStream, 0, mode);
445  return (outputStream);
446 }
447 
450 #endif
451 /* vim: set expandtab shiftwidth=4 tabstop=4: */
OME_EXT_TYPE
#define OME_EXT_TYPE(member)
Definition: OMEbaseType.h:19
OME_NLM
@ OME_NLM
Definition: OMEmanifests.h:90
OME_FLOAT
@ OME_FLOAT
Definition: OMEmanifests.h:82
OME_DISABLE_QUOTE_OUTPUT
@ OME_DISABLE_QUOTE_OUTPUT
Definition: OMEmanifests.h:110
OMEoidStorage::storageRef
class OMEoidStorageBase * storageRef
Definition: OMEoid.h:128
OME_POINTER
@ OME_POINTER
Definition: OMEmanifests.h:92
OME_UINT16
@ OME_UINT16
Definition: OMEmanifests.h:98
OMEassocStorage::outputOnStream
STREAMTYPE & outputOnStream(STREAMTYPE &outputOnStream, int_fast16_t indent=0, uint8_t includeTypePrefix=OME_DEFAULT_COMPLEX_OUTPUT_MODE) const
Definition: OMEoutputOnStream.h:63
OMEnlmStorage::outputOnStream
STREAMTYPE & outputOnStream(STREAMTYPE &outputStream, int_fast16_t indent=0, uint8_t includeTypePrefix=OME_DEFAULT_COMPLEX_OUTPUT_MODE, const OMEstring *lang=nullptr) const
Definition: OMEoutputOnStream.h:99
OMEstring
Implements text and binary string storage.
Definition: OMEstring.h:305
OMEoidStorageExternal::oidData
OMEoidID oidData
Definition: OMEoid.h:421
OMEreferenceToData< OMEnlmStorage >::data
OMEnlmStorage * data
Definition: OMErefCount.h:82
OMEtype
Fundamental ANY type for FARGOS/VISTA Object Management Environment.
Definition: OMEbaseType.h:250
OME_DOUBLE
@ OME_DOUBLE
Definition: OMEmanifests.h:83
OMEnlmStorage::messageData
class OMEnlmData * messageData
Definition: OMEnlm.h:28
OME_UINT32
@ OME_UINT32
Definition: OMEmanifests.h:96
OMEoidStorageInternal::outputOnStream
STREAMTYPE & outputOnStream(STREAMTYPE &outputStream, int_fast16_t indent=0, bool fullInfo=false) const
Definition: OMEoidIntStub2.cpp:10
OMEassocKeyPair::key
class OMEstring * key
Definition: OMEassoc.h:27
OMEassocKeyPair::outputOnStream
STREAMTYPE & outputOnStream(STREAMTYPE &outputOnStream, int_fast16_t indent=0, uint8_t includeTypePrefix=OME_DEFAULT_COMPLEX_OUTPUT_MODE) const
Definition: OMEoutputOnStream.h:55
OME_STRING
@ OME_STRING
Definition: OMEmanifests.h:85
OME_OUTPUT_NEWLINE
@ OME_OUTPUT_NEWLINE
Definition: OMEmanifests.h:111
OMEoidStorageBase::acl
OMEassoc acl
Definition: OMEoid.h:50
OME_NIL
@ OME_NIL
Definition: OMEmanifests.h:78
OMEnlm::outputFormattedData
static STREAMTYPE & outputFormattedData(STREAMTYPE &o, const class OMEtype &data, const class OMEtype &annotation, const char *fieldModifier, int modifierLen)
Definition: OMEoutputOnStream.h:223
OME_OID
@ OME_OID
Definition: OMEmanifests.h:84
OMEsetStorage::outputOnStream
STREAMTYPE & outputOnStream(STREAMTYPE &outputStream, int_fast16_t indent=0, uint8_t includeTypePrefix=OME_DEFAULT_COMPLEX_OUTPUT_MODE) const
Definition: OMEoutputOnStream.h:273
text2int.h
Extreme-performance text/number conversion routines.
operator<<
STREAMTYPE & operator<<(STREAMTYPE &outputStream, const OMEtype &data)
Definition: OMEoutputOnStream.h:430
OME_UINT64
@ OME_UINT64
Definition: OMEmanifests.h:97
OMEoidStorageInternal
Interface to an internal OME object.
Definition: OMEoid.h:324
float_to_ascii
char * float_to_ascii(char *resultBfr, uint_fast8_t bfrLen, double value, uint_fast8_t *retStrLen, int_fast8_t outputPrecision, bool roundValue)
Format a double-precision value with indicated decimal places.
Definition: text2int.cpp:2808
OMEassocKeyPair::value
class OMEtype * value
Definition: OMEassoc.h:28
int_to_ascii
char * int_to_ascii(uint32_t resultBfr[], uint_fast8_t bfrLen, int64_t value, uint_fast8_t *retStrLen)
Identical to uint_to_ascii(), except that negative values are accepted.
Definition: text2int.cpp:2699
OMEoidStorage::outputOnStream
STREAMTYPE & outputOnStream(STREAMTYPE &outputStream, int_fast16_t indent=0, bool fullInfo=false) const
Definition: OMEoutputOnStream.h:253
OMEstring::length
size_t length() const
Definition: OMEstring.h:401
OMEnlmStorage::argumentInfo
OMEarray argumentInfo
Definition: OMEnlm.h:30
OME_FORCE_QUOTES_IN_CONTAINER_OUTPUT
@ OME_FORCE_QUOTES_IN_CONTAINER_OUTPUT
Definition: OMEmanifests.h:112
OMEnlmStorage::messageArguments
OMEarray messageArguments
Definition: OMEnlm.h:29
OMEassocStorage::assocArray
AssocArrayType_t assocArray
Definition: OMEassoc.h:63
OME_SET
@ OME_SET
Definition: OMEmanifests.h:89
OMEarray::isEmpty
bool isEmpty() const OME_ALWAYS_INLINE
Definition: OMEarray.h:252
OMEsetStorage::dataSet
_STD deque< OMEbaseTypeP > dataSet
Definition: OMEset.h:26
OMEtype::outputOnStream
STREAMTYPE & outputOnStream(STREAMTYPE &outputOnStream, int_fast16_t indent=0, uint8_t includeTypePrefix=OUTPUT_TYPENAME) const
Definition: OMEoutputOnStream.h:311
OME_UINT8
@ OME_UINT8
Definition: OMEmanifests.h:99
OMEoidStorageExternal::outputOnStream
STREAMTYPE & outputOnStream(STREAMTYPE &outputStream, int_fast16_t indent=0, bool fullInfo=false) const
Definition: OMEoutputOnStream.h:243
OME_FIXED
@ OME_FIXED
Definition: OMEmanifests.h:91
_STD
#define _STD
Definition: OMEmanifests.h:146
OMEarray
Implements sparse array of OMEtype elements.
Definition: OMEarray.h:75
OMEarrayStorage::outputOnStream
STREAMTYPE & outputOnStream(STREAMTYPE &outputStream, int_fast16_t indent=0, uint8_t includeTypePrefix=OME_DEFAULT_COMPLEX_OUTPUT_MODE) const
Definition: OMEoutputOnStream.h:17
OME_DEFAULT_COMPLEX_OUTPUT_MODE
@ OME_DEFAULT_COMPLEX_OUTPUT_MODE
Definition: OMEmanifests.h:116
OMEoidStorageExternal
Interface to an external OME object.
Definition: OMEoid.h:415
uint_to_ascii
char * uint_to_ascii(uint32_t resultBfr[], uint_fast8_t bfrLen, uint64_t value, uint_fast8_t *retStrLen)
Quickly convert a binary integer into ASCII decimal text.
Definition: text2int.cpp:2628
OME_ARRAY
@ OME_ARRAY
Definition: OMEmanifests.h:86
OME_ASSOC
@ OME_ASSOC
Definition: OMEmanifests.h:87
OMEoidStorage::referenceType
OMErefType referenceType
Definition: OMEoid.h:134
OME_DEFAULT_OUTPUT_MODE
@ OME_DEFAULT_OUTPUT_MODE
Definition: OMEmanifests.h:115
OMEnlmStorage::getMessageText
const OMEstring & getMessageText(const OMEstring *lang=nullptr) const
Definition: OMEnlm.cpp:41
OMEarrayStorage::sparseArray
SparseArrayType_t sparseArray
Definition: OMEarray.h:32
OME_INT32
@ OME_INT32
Definition: OMEmanifests.h:79
OME_INT64
@ OME_INT64
Definition: OMEmanifests.h:81
Generated: Fri Jul 31 2020 18:19:15
Support Information