1 /*
2 *
3 * Copyright (C) 2008-2012, OFFIS e.V. and ICSMED AG, Oldenburg, Germany
4 * Copyright (C) 2013-2017, J. Riesmeier, Oldenburg, Germany
5 * All rights reserved. See COPYRIGHT file for details.
6 *
7 * Source file for class DRTSetupDeviceSequence
8 *
9 * Generated automatically from DICOM PS 3.3-2017e
10 * File created on 2017-12-05 09:30:54
11 *
12 */
13
14
15 #include "dcmtk/config/osconfig.h" // make sure OS specific configuration is included first
16
17 #include "dcmtk/dcmrt/seq/drtsds.h"
18
19
20 // --- item class ---
21
Item(const OFBool emptyDefaultItem)22 DRTSetupDeviceSequence::Item::Item(const OFBool emptyDefaultItem)
23 : EmptyDefaultItem(emptyDefaultItem),
24 AccessoryCode(DCM_AccessoryCode),
25 SetupDeviceDescription(DCM_SetupDeviceDescription),
26 SetupDeviceLabel(DCM_SetupDeviceLabel),
27 SetupDeviceParameter(DCM_SetupDeviceParameter),
28 SetupDeviceType(DCM_SetupDeviceType),
29 SetupReferenceDescription(DCM_SetupReferenceDescription)
30 {
31 }
32
33
Item(const Item & copy)34 DRTSetupDeviceSequence::Item::Item(const Item ©)
35 : EmptyDefaultItem(copy.EmptyDefaultItem),
36 AccessoryCode(copy.AccessoryCode),
37 SetupDeviceDescription(copy.SetupDeviceDescription),
38 SetupDeviceLabel(copy.SetupDeviceLabel),
39 SetupDeviceParameter(copy.SetupDeviceParameter),
40 SetupDeviceType(copy.SetupDeviceType),
41 SetupReferenceDescription(copy.SetupReferenceDescription)
42 {
43 }
44
45
~Item()46 DRTSetupDeviceSequence::Item::~Item()
47 {
48 }
49
50
operator =(const Item & copy)51 DRTSetupDeviceSequence::Item &DRTSetupDeviceSequence::Item::operator=(const Item ©)
52 {
53 if (this != ©)
54 {
55 EmptyDefaultItem = copy.EmptyDefaultItem;
56 AccessoryCode = copy.AccessoryCode;
57 SetupDeviceDescription = copy.SetupDeviceDescription;
58 SetupDeviceLabel = copy.SetupDeviceLabel;
59 SetupDeviceParameter = copy.SetupDeviceParameter;
60 SetupDeviceType = copy.SetupDeviceType;
61 SetupReferenceDescription = copy.SetupReferenceDescription;
62 }
63 return *this;
64 }
65
66
clear()67 void DRTSetupDeviceSequence::Item::clear()
68 {
69 if (!EmptyDefaultItem)
70 {
71 /* clear all DICOM attributes */
72 SetupDeviceType.clear();
73 SetupDeviceLabel.clear();
74 SetupDeviceDescription.clear();
75 SetupDeviceParameter.clear();
76 SetupReferenceDescription.clear();
77 AccessoryCode.clear();
78 }
79 }
80
81
isEmpty()82 OFBool DRTSetupDeviceSequence::Item::isEmpty()
83 {
84 return SetupDeviceType.isEmpty() &&
85 SetupDeviceLabel.isEmpty() &&
86 SetupDeviceDescription.isEmpty() &&
87 SetupDeviceParameter.isEmpty() &&
88 SetupReferenceDescription.isEmpty() &&
89 AccessoryCode.isEmpty();
90 }
91
92
isValid() const93 OFBool DRTSetupDeviceSequence::Item::isValid() const
94 {
95 return !EmptyDefaultItem;
96 }
97
98
read(DcmItem & item)99 OFCondition DRTSetupDeviceSequence::Item::read(DcmItem &item)
100 {
101 OFCondition result = EC_IllegalCall;
102 if (!EmptyDefaultItem)
103 {
104 /* re-initialize object */
105 clear();
106 getAndCheckElementFromDataset(item, SetupDeviceType, "1", "1", "SetupDeviceSequence");
107 getAndCheckElementFromDataset(item, SetupDeviceLabel, "1", "2", "SetupDeviceSequence");
108 getAndCheckElementFromDataset(item, SetupDeviceDescription, "1", "3", "SetupDeviceSequence");
109 getAndCheckElementFromDataset(item, SetupDeviceParameter, "1", "2", "SetupDeviceSequence");
110 getAndCheckElementFromDataset(item, SetupReferenceDescription, "1", "3", "SetupDeviceSequence");
111 getAndCheckElementFromDataset(item, AccessoryCode, "1", "3", "SetupDeviceSequence");
112 result = EC_Normal;
113 }
114 return result;
115 }
116
117
write(DcmItem & item)118 OFCondition DRTSetupDeviceSequence::Item::write(DcmItem &item)
119 {
120 OFCondition result = EC_IllegalCall;
121 if (!EmptyDefaultItem)
122 {
123 result = EC_Normal;
124 addElementToDataset(result, item, new DcmCodeString(SetupDeviceType), "1", "1", "SetupDeviceSequence");
125 addElementToDataset(result, item, new DcmShortString(SetupDeviceLabel), "1", "2", "SetupDeviceSequence");
126 addElementToDataset(result, item, new DcmShortText(SetupDeviceDescription), "1", "3", "SetupDeviceSequence");
127 addElementToDataset(result, item, new DcmDecimalString(SetupDeviceParameter), "1", "2", "SetupDeviceSequence");
128 addElementToDataset(result, item, new DcmShortText(SetupReferenceDescription), "1", "3", "SetupDeviceSequence");
129 addElementToDataset(result, item, new DcmLongString(AccessoryCode), "1", "3", "SetupDeviceSequence");
130 }
131 return result;
132 }
133
134
getAccessoryCode(OFString & value,const signed long pos) const135 OFCondition DRTSetupDeviceSequence::Item::getAccessoryCode(OFString &value, const signed long pos) const
136 {
137 if (EmptyDefaultItem)
138 return EC_IllegalCall;
139 else
140 return getStringValueFromElement(AccessoryCode, value, pos);
141 }
142
143
getSetupDeviceDescription(OFString & value,const signed long pos) const144 OFCondition DRTSetupDeviceSequence::Item::getSetupDeviceDescription(OFString &value, const signed long pos) const
145 {
146 if (EmptyDefaultItem)
147 return EC_IllegalCall;
148 else
149 return getStringValueFromElement(SetupDeviceDescription, value, pos);
150 }
151
152
getSetupDeviceLabel(OFString & value,const signed long pos) const153 OFCondition DRTSetupDeviceSequence::Item::getSetupDeviceLabel(OFString &value, const signed long pos) const
154 {
155 if (EmptyDefaultItem)
156 return EC_IllegalCall;
157 else
158 return getStringValueFromElement(SetupDeviceLabel, value, pos);
159 }
160
161
getSetupDeviceParameter(OFString & value,const signed long pos) const162 OFCondition DRTSetupDeviceSequence::Item::getSetupDeviceParameter(OFString &value, const signed long pos) const
163 {
164 if (EmptyDefaultItem)
165 return EC_IllegalCall;
166 else
167 return getStringValueFromElement(SetupDeviceParameter, value, pos);
168 }
169
170
getSetupDeviceParameter(Float64 & value,const unsigned long pos) const171 OFCondition DRTSetupDeviceSequence::Item::getSetupDeviceParameter(Float64 &value, const unsigned long pos) const
172 {
173 if (EmptyDefaultItem)
174 return EC_IllegalCall;
175 else
176 return OFconst_cast(DcmDecimalString &, SetupDeviceParameter).getFloat64(value, pos);
177 }
178
179
getSetupDeviceType(OFString & value,const signed long pos) const180 OFCondition DRTSetupDeviceSequence::Item::getSetupDeviceType(OFString &value, const signed long pos) const
181 {
182 if (EmptyDefaultItem)
183 return EC_IllegalCall;
184 else
185 return getStringValueFromElement(SetupDeviceType, value, pos);
186 }
187
188
getSetupReferenceDescription(OFString & value,const signed long pos) const189 OFCondition DRTSetupDeviceSequence::Item::getSetupReferenceDescription(OFString &value, const signed long pos) const
190 {
191 if (EmptyDefaultItem)
192 return EC_IllegalCall;
193 else
194 return getStringValueFromElement(SetupReferenceDescription, value, pos);
195 }
196
197
setAccessoryCode(const OFString & value,const OFBool check)198 OFCondition DRTSetupDeviceSequence::Item::setAccessoryCode(const OFString &value, const OFBool check)
199 {
200 OFCondition result = EC_IllegalCall;
201 if (!EmptyDefaultItem)
202 {
203 result = (check) ? DcmLongString::checkStringValue(value, "1") : EC_Normal;
204 if (result.good())
205 result = AccessoryCode.putOFStringArray(value);
206 }
207 return result;
208 }
209
210
setSetupDeviceDescription(const OFString & value,const OFBool check)211 OFCondition DRTSetupDeviceSequence::Item::setSetupDeviceDescription(const OFString &value, const OFBool check)
212 {
213 OFCondition result = EC_IllegalCall;
214 if (!EmptyDefaultItem)
215 {
216 result = (check) ? DcmShortText::checkStringValue(value) : EC_Normal;
217 if (result.good())
218 result = SetupDeviceDescription.putOFStringArray(value);
219 }
220 return result;
221 }
222
223
setSetupDeviceLabel(const OFString & value,const OFBool check)224 OFCondition DRTSetupDeviceSequence::Item::setSetupDeviceLabel(const OFString &value, const OFBool check)
225 {
226 OFCondition result = EC_IllegalCall;
227 if (!EmptyDefaultItem)
228 {
229 result = (check) ? DcmShortString::checkStringValue(value, "1") : EC_Normal;
230 if (result.good())
231 result = SetupDeviceLabel.putOFStringArray(value);
232 }
233 return result;
234 }
235
236
setSetupDeviceParameter(const OFString & value,const OFBool check)237 OFCondition DRTSetupDeviceSequence::Item::setSetupDeviceParameter(const OFString &value, const OFBool check)
238 {
239 OFCondition result = EC_IllegalCall;
240 if (!EmptyDefaultItem)
241 {
242 result = (check) ? DcmDecimalString::checkStringValue(value, "1") : EC_Normal;
243 if (result.good())
244 result = SetupDeviceParameter.putOFStringArray(value);
245 }
246 return result;
247 }
248
249
setSetupDeviceType(const OFString & value,const OFBool check)250 OFCondition DRTSetupDeviceSequence::Item::setSetupDeviceType(const OFString &value, const OFBool check)
251 {
252 OFCondition result = EC_IllegalCall;
253 if (!EmptyDefaultItem)
254 {
255 result = (check) ? DcmCodeString::checkStringValue(value, "1") : EC_Normal;
256 if (result.good())
257 result = SetupDeviceType.putOFStringArray(value);
258 }
259 return result;
260 }
261
262
setSetupReferenceDescription(const OFString & value,const OFBool check)263 OFCondition DRTSetupDeviceSequence::Item::setSetupReferenceDescription(const OFString &value, const OFBool check)
264 {
265 OFCondition result = EC_IllegalCall;
266 if (!EmptyDefaultItem)
267 {
268 result = (check) ? DcmShortText::checkStringValue(value) : EC_Normal;
269 if (result.good())
270 result = SetupReferenceDescription.putOFStringArray(value);
271 }
272 return result;
273 }
274
275
276 // --- sequence class ---
277
DRTSetupDeviceSequence(const OFBool emptyDefaultSequence)278 DRTSetupDeviceSequence::DRTSetupDeviceSequence(const OFBool emptyDefaultSequence)
279 : EmptyDefaultSequence(emptyDefaultSequence),
280 SequenceOfItems(),
281 CurrentItem(),
282 EmptyItem(OFTrue /*emptyDefaultItem*/)
283 {
284 CurrentItem = SequenceOfItems.end();
285 }
286
287
DRTSetupDeviceSequence(const DRTSetupDeviceSequence & copy)288 DRTSetupDeviceSequence::DRTSetupDeviceSequence(const DRTSetupDeviceSequence ©)
289 : EmptyDefaultSequence(copy.EmptyDefaultSequence),
290 SequenceOfItems(),
291 CurrentItem(),
292 EmptyItem(OFTrue /*emptyDefaultItem*/)
293 {
294 /* create a copy of the internal sequence of items */
295 Item *item = NULL;
296 OFListConstIterator(Item *) current = copy.SequenceOfItems.begin();
297 const OFListConstIterator(Item *) last = copy.SequenceOfItems.end();
298 while (current != last)
299 {
300 item = new Item(**current);
301 if (item != NULL)
302 {
303 SequenceOfItems.push_back(item);
304 } else {
305 /* memory exhausted, there is nothing we can do about it */
306 break;
307 }
308 ++current;
309 }
310 CurrentItem = SequenceOfItems.begin();
311 }
312
313
operator =(const DRTSetupDeviceSequence & copy)314 DRTSetupDeviceSequence &DRTSetupDeviceSequence::operator=(const DRTSetupDeviceSequence ©)
315 {
316 if (this != ©)
317 {
318 clear();
319 EmptyDefaultSequence = copy.EmptyDefaultSequence;
320 /* create a copy of the internal sequence of items */
321 Item *item = NULL;
322 OFListConstIterator(Item *) current = copy.SequenceOfItems.begin();
323 const OFListConstIterator(Item *) last = copy.SequenceOfItems.end();
324 while (current != last)
325 {
326 item = new Item(**current);
327 if (item != NULL)
328 {
329 SequenceOfItems.push_back(item);
330 } else {
331 /* memory exhausted, there is nothing we can do about it */
332 break;
333 }
334 ++current;
335 }
336 CurrentItem = SequenceOfItems.begin();
337 }
338 return *this;
339 }
340
341
~DRTSetupDeviceSequence()342 DRTSetupDeviceSequence::~DRTSetupDeviceSequence()
343 {
344 clear();
345 }
346
347
clear()348 void DRTSetupDeviceSequence::clear()
349 {
350 if (!EmptyDefaultSequence)
351 {
352 CurrentItem = SequenceOfItems.begin();
353 const OFListConstIterator(Item *) last = SequenceOfItems.end();
354 /* delete all items and free memory */
355 while (CurrentItem != last)
356 {
357 delete (*CurrentItem);
358 CurrentItem = SequenceOfItems.erase(CurrentItem);
359 }
360 /* make sure that the list is empty */
361 SequenceOfItems.clear();
362 CurrentItem = SequenceOfItems.end();
363 }
364 }
365
366
isEmpty()367 OFBool DRTSetupDeviceSequence::isEmpty()
368 {
369 return SequenceOfItems.empty();
370 }
371
372
isValid() const373 OFBool DRTSetupDeviceSequence::isValid() const
374 {
375 return !EmptyDefaultSequence;
376 }
377
378
getNumberOfItems() const379 size_t DRTSetupDeviceSequence::getNumberOfItems() const
380 {
381 return SequenceOfItems.size();
382 }
383
384
gotoFirstItem()385 OFCondition DRTSetupDeviceSequence::gotoFirstItem()
386 {
387 OFCondition result = EC_IllegalCall;
388 if (!SequenceOfItems.empty())
389 {
390 CurrentItem = SequenceOfItems.begin();
391 result = EC_Normal;
392 }
393 return result;
394 }
395
396
gotoNextItem()397 OFCondition DRTSetupDeviceSequence::gotoNextItem()
398 {
399 OFCondition result = EC_IllegalCall;
400 if (CurrentItem != SequenceOfItems.end())
401 {
402 ++CurrentItem;
403 result = EC_Normal;
404 }
405 return result;
406 }
407
408
gotoItem(const size_t num,OFListIterator (Item *)& iterator)409 OFCondition DRTSetupDeviceSequence::gotoItem(const size_t num, OFListIterator(Item *) &iterator)
410 {
411 OFCondition result = EC_IllegalCall;
412 if (!SequenceOfItems.empty())
413 {
414 size_t idx = num + 1;
415 iterator = SequenceOfItems.begin();
416 const OFListConstIterator(Item *) last = SequenceOfItems.end();
417 while ((--idx > 0) && (iterator != last))
418 ++iterator;
419 /* specified list item found? */
420 if ((idx == 0) && (iterator != last))
421 result = EC_Normal;
422 else
423 result = EC_IllegalParameter;
424 }
425 return result;
426 }
427
428
gotoItem(const size_t num,OFListConstIterator (Item *)& iterator) const429 OFCondition DRTSetupDeviceSequence::gotoItem(const size_t num, OFListConstIterator(Item *) &iterator) const
430 {
431 OFCondition result = EC_IllegalCall;
432 if (!SequenceOfItems.empty())
433 {
434 size_t idx = num + 1;
435 iterator = SequenceOfItems.begin();
436 const OFListConstIterator(Item *) last = SequenceOfItems.end();
437 while ((--idx > 0) && (iterator != last))
438 ++iterator;
439 /* specified list item found? */
440 if ((idx == 0) && (iterator != last))
441 result = EC_Normal;
442 else
443 result = EC_IllegalParameter;
444 }
445 return result;
446 }
447
448
gotoItem(const size_t num)449 OFCondition DRTSetupDeviceSequence::gotoItem(const size_t num)
450 {
451 return gotoItem(num, CurrentItem);
452 }
453
454
getCurrentItem(Item * & item) const455 OFCondition DRTSetupDeviceSequence::getCurrentItem(Item *&item) const
456 {
457 OFCondition result = EC_IllegalCall;
458 if (CurrentItem != SequenceOfItems.end())
459 {
460 item = *CurrentItem;
461 result = EC_Normal;
462 }
463 return result;
464 }
465
466
getCurrentItem()467 DRTSetupDeviceSequence::Item &DRTSetupDeviceSequence::getCurrentItem()
468 {
469 if (CurrentItem != SequenceOfItems.end())
470 return **CurrentItem;
471 else
472 return EmptyItem;
473 }
474
475
getCurrentItem() const476 const DRTSetupDeviceSequence::Item &DRTSetupDeviceSequence::getCurrentItem() const
477 {
478 if (CurrentItem != SequenceOfItems.end())
479 return **CurrentItem;
480 else
481 return EmptyItem;
482 }
483
484
getItem(const size_t num,Item * & item)485 OFCondition DRTSetupDeviceSequence::getItem(const size_t num, Item *&item)
486 {
487 OFListIterator(Item *) iterator;
488 OFCondition result = gotoItem(num, iterator);
489 if (result.good())
490 item = *iterator;
491 return result;
492 }
493
494
getItem(const size_t num)495 DRTSetupDeviceSequence::Item &DRTSetupDeviceSequence::getItem(const size_t num)
496 {
497 OFListIterator(Item *) iterator;
498 if (gotoItem(num, iterator).good())
499 return **iterator;
500 else
501 return EmptyItem;
502 }
503
504
getItem(const size_t num) const505 const DRTSetupDeviceSequence::Item &DRTSetupDeviceSequence::getItem(const size_t num) const
506 {
507 OFListConstIterator(Item *) iterator;
508 if (gotoItem(num, iterator).good())
509 return **iterator;
510 else
511 return EmptyItem;
512 }
513
514
operator [](const size_t num)515 DRTSetupDeviceSequence::Item &DRTSetupDeviceSequence::operator[](const size_t num)
516 {
517 return getItem(num);
518 }
519
520
operator [](const size_t num) const521 const DRTSetupDeviceSequence::Item &DRTSetupDeviceSequence::operator[](const size_t num) const
522 {
523 return getItem(num);
524 }
525
526
addItem(Item * & item)527 OFCondition DRTSetupDeviceSequence::addItem(Item *&item)
528 {
529 OFCondition result = EC_IllegalCall;
530 if (!EmptyDefaultSequence)
531 {
532 item = new Item();
533 if (item != NULL)
534 {
535 SequenceOfItems.push_back(item);
536 result = EC_Normal;
537 } else
538 result = EC_MemoryExhausted;
539 }
540 return result;
541 }
542
543
insertItem(const size_t pos,Item * & item)544 OFCondition DRTSetupDeviceSequence::insertItem(const size_t pos, Item *&item)
545 {
546 OFCondition result = EC_IllegalCall;
547 if (!EmptyDefaultSequence)
548 {
549 OFListIterator(Item *) iterator;
550 result = gotoItem(pos, iterator);
551 if (result.good())
552 {
553 item = new Item();
554 if (item != NULL)
555 {
556 SequenceOfItems.insert(iterator, 1, item);
557 result = EC_Normal;
558 } else
559 result = EC_MemoryExhausted;
560 } else
561 result = addItem(item);
562 }
563 return result;
564 }
565
566
removeItem(const size_t pos)567 OFCondition DRTSetupDeviceSequence::removeItem(const size_t pos)
568 {
569 OFCondition result = EC_IllegalCall;
570 if (!EmptyDefaultSequence)
571 {
572 OFListIterator(Item *) iterator;
573 if (gotoItem(pos, iterator).good())
574 {
575 delete *iterator;
576 iterator = SequenceOfItems.erase(iterator);
577 result = EC_Normal;
578 } else
579 result = EC_IllegalParameter;
580 }
581 return result;
582 }
583
584
read(DcmItem & dataset,const OFString & card,const OFString & type,const char * moduleName)585 OFCondition DRTSetupDeviceSequence::read(DcmItem &dataset,
586 const OFString &card,
587 const OFString &type,
588 const char *moduleName)
589 {
590 OFCondition result = EC_IllegalCall;
591 if (!EmptyDefaultSequence)
592 {
593 /* re-initialize object */
594 clear();
595 /* retrieve sequence element from dataset */
596 DcmSequenceOfItems *sequence;
597 result = dataset.findAndGetSequence(DCM_SetupDeviceSequence, sequence);
598 if (sequence != NULL)
599 {
600 if (checkElementValue(*sequence, card, type, result, moduleName))
601 {
602 DcmStack stack;
603 OFBool first = OFTrue;
604 /* iterate over all sequence items */
605 while (result.good() && sequence->nextObject(stack, first /*intoSub*/).good())
606 {
607 DcmItem *ditem = OFstatic_cast(DcmItem *, stack.top());
608 if (ditem != NULL)
609 {
610 Item *item = new Item();
611 if (item != NULL)
612 {
613 result = item->read(*ditem);
614 if (result.good())
615 {
616 /* append new item to the end of the list */
617 SequenceOfItems.push_back(item);
618 first = OFFalse;
619 }
620 } else
621 result = EC_MemoryExhausted;
622 } else
623 result = EC_CorruptedData;
624 }
625 }
626 } else {
627 DcmSequenceOfItems element(DCM_SetupDeviceSequence);
628 checkElementValue(element, card, type, result, moduleName);
629 }
630 }
631 return result;
632 }
633
634
write(DcmItem & dataset,const OFString & card,const OFString & type,const char * moduleName)635 OFCondition DRTSetupDeviceSequence::write(DcmItem &dataset,
636 const OFString &card,
637 const OFString &type,
638 const char *moduleName)
639 {
640 OFCondition result = EC_IllegalCall;
641 if (!EmptyDefaultSequence)
642 {
643 result = EC_MemoryExhausted;
644 DcmSequenceOfItems *sequence = new DcmSequenceOfItems(DCM_SetupDeviceSequence);
645 if (sequence != NULL)
646 {
647 result = EC_Normal;
648 /* an empty optional sequence is not written */
649 if ((type == "2") || !SequenceOfItems.empty())
650 {
651 OFListIterator(Item *) iterator = SequenceOfItems.begin();
652 const OFListConstIterator(Item *) last = SequenceOfItems.end();
653 /* iterate over all sequence items */
654 while (result.good() && (iterator != last))
655 {
656 DcmItem *item = new DcmItem();
657 if (item != NULL)
658 {
659 /* append new item to the end of the sequence */
660 result = sequence->append(item);
661 if (result.good())
662 {
663 result = (*iterator)->write(*item);
664 ++iterator;
665 } else
666 delete item;
667 } else
668 result = EC_MemoryExhausted;
669 }
670 if (result.good())
671 {
672 /* insert sequence element into the dataset */
673 result = dataset.insert(sequence, OFTrue /*replaceOld*/);
674 }
675 if (DCM_dcmrtLogger.isEnabledFor(OFLogger::WARN_LOG_LEVEL))
676 checkElementValue(*sequence, card, type, result, moduleName);
677 if (result.good())
678 {
679 /* forget reference to sequence object (avoid deletion below) */
680 sequence = NULL;
681 }
682 }
683 else if (type == "1")
684 {
685 /* empty type 1 sequence not allowed */
686 result = RT_EC_InvalidValue;
687 if (DCM_dcmrtLogger.isEnabledFor(OFLogger::WARN_LOG_LEVEL))
688 checkElementValue(*sequence, card, type, result, moduleName);
689 }
690 /* delete sequence (if not inserted into the dataset) */
691 delete sequence;
692 }
693 }
694 return result;
695 }
696
697
698 // end of source file
699