redsnow 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2 -0
  3. data/ext/snowcrash/bin/snowcrash +0 -0
  4. data/ext/snowcrash/snowcrash.xcworkspace/contents.xcworkspacedata +10 -0
  5. data/ext/snowcrash/src/ActionParser.h +35 -33
  6. data/ext/snowcrash/src/AssetParser.h +17 -17
  7. data/ext/snowcrash/src/Blueprint.h +101 -66
  8. data/ext/snowcrash/src/BlueprintParser.h +219 -10
  9. data/ext/snowcrash/src/BlueprintSourcemap.h +1 -1
  10. data/ext/snowcrash/src/BlueprintUtility.h +14 -14
  11. data/ext/snowcrash/src/CBlueprint.cc +29 -10
  12. data/ext/snowcrash/src/CBlueprint.h +19 -3
  13. data/ext/snowcrash/src/CBlueprintSourcemap.cc +20 -10
  14. data/ext/snowcrash/src/CBlueprintSourcemap.h +12 -3
  15. data/ext/snowcrash/src/CodeBlockUtility.h +25 -25
  16. data/ext/snowcrash/src/HTTP.cc +3 -0
  17. data/ext/snowcrash/src/HTTP.h +9 -6
  18. data/ext/snowcrash/src/HeadersParser.h +34 -14
  19. data/ext/snowcrash/src/ParameterParser.h +21 -21
  20. data/ext/snowcrash/src/ParametersParser.h +6 -5
  21. data/ext/snowcrash/src/PayloadParser.h +174 -129
  22. data/ext/snowcrash/src/RegexMatch.h +3 -3
  23. data/ext/snowcrash/src/ResourceGroupParser.h +5 -4
  24. data/ext/snowcrash/src/ResourceParser.h +30 -26
  25. data/ext/snowcrash/src/Section.cc +6 -6
  26. data/ext/snowcrash/src/Section.h +2 -2
  27. data/ext/snowcrash/src/SectionParser.h +41 -41
  28. data/ext/snowcrash/src/SectionParserData.h +10 -10
  29. data/ext/snowcrash/src/SectionProcessor.h +70 -30
  30. data/ext/snowcrash/src/Serialize.h +3 -3
  31. data/ext/snowcrash/src/SerializeJSON.cc +124 -96
  32. data/ext/snowcrash/src/SerializeJSON.h +1 -1
  33. data/ext/snowcrash/src/SerializeYAML.cc +71 -53
  34. data/ext/snowcrash/src/SerializeYAML.h +1 -1
  35. data/ext/snowcrash/src/Signature.cc +2 -2
  36. data/ext/snowcrash/src/Signature.h +1 -1
  37. data/ext/snowcrash/src/SourceAnnotation.h +23 -23
  38. data/ext/snowcrash/src/StringUtility.h +71 -9
  39. data/ext/snowcrash/src/SymbolTable.h +17 -17
  40. data/ext/snowcrash/src/UriTemplateParser.cc +5 -5
  41. data/ext/snowcrash/src/UriTemplateParser.h +9 -9
  42. data/ext/snowcrash/src/ValuesParser.h +2 -2
  43. data/ext/snowcrash/src/Version.h +1 -1
  44. data/ext/snowcrash/src/csnowcrash.cc +10 -8
  45. data/ext/snowcrash/src/snowcrash.cc +9 -9
  46. data/ext/snowcrash/src/snowcrash.h +6 -8
  47. data/ext/snowcrash/src/snowcrash/snowcrash.cc +14 -14
  48. data/ext/snowcrash/src/win/RegexMatch.cc +7 -7
  49. data/ext/snowcrash/tools/gyp/pylib/gyp/__init__.pyc +0 -0
  50. data/ext/snowcrash/tools/gyp/pylib/gyp/common.pyc +0 -0
  51. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/__init__.pyc +0 -0
  52. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/make.pyc +0 -0
  53. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/xcode.pyc +0 -0
  54. data/ext/snowcrash/tools/gyp/pylib/gyp/input.pyc +0 -0
  55. data/ext/snowcrash/tools/gyp/pylib/gyp/xcode_emulation.pyc +0 -0
  56. data/ext/snowcrash/tools/gyp/pylib/gyp/xcodeproj_file.pyc +0 -0
  57. data/ext/snowcrash/tools/homebrew/snowcrash.rb +1 -1
  58. data/lib/redsnow/binding.rb +8 -2
  59. data/lib/redsnow/blueprint.rb +4 -3
  60. data/lib/redsnow/sourcemap.rb +6 -4
  61. data/lib/redsnow/version.rb +1 -1
  62. metadata +4 -17
@@ -32,14 +32,15 @@ namespace snowcrash {
32
32
  const MarkdownNodes& siblings,
33
33
  SectionParserData& pd,
34
34
  SectionLayout& layout,
35
- ParseResult<Blueprint>& out) {
35
+ const ParseResultRef<Blueprint>& out) {
36
36
 
37
37
  MarkdownNodeIterator cur = node;
38
38
 
39
39
  while (cur != siblings.end() &&
40
40
  cur->type == mdp::ParagraphMarkdownNodeType) {
41
41
 
42
- ParseResult<MetadataCollection> metadata(out.report);
42
+ IntermediateParseResult<MetadataCollection> metadata(out.report);
43
+
43
44
  parseMetadata(cur, pd, metadata);
44
45
 
45
46
  // First block is paragraph and is not metadata (no API name)
@@ -57,7 +58,7 @@ namespace snowcrash {
57
58
 
58
59
  cur++;
59
60
  }
60
-
61
+
61
62
  // Ideally this parsing metadata should be handled by separate parser
62
63
  // that way the following check would be covered in SectionParser::parse()
63
64
  if (cur == siblings.end())
@@ -91,12 +92,13 @@ namespace snowcrash {
91
92
  static MarkdownNodeIterator processNestedSection(const MarkdownNodeIterator& node,
92
93
  const MarkdownNodes& siblings,
93
94
  SectionParserData& pd,
94
- ParseResult<Blueprint>& out) {
95
+ const ParseResultRef<Blueprint>& out) {
95
96
 
96
97
  if (pd.sectionContext() == ResourceGroupSectionType ||
97
98
  pd.sectionContext() == ResourceSectionType) {
98
99
 
99
- ParseResult<ResourceGroup> resourceGroup(out.report);
100
+ IntermediateParseResult<ResourceGroup> resourceGroup(out.report);
101
+
100
102
  MarkdownNodeIterator cur = ResourceGroupParser::parse(node, siblings, pd, resourceGroup);
101
103
 
102
104
  ResourceGroupIterator duplicate = findResourceGroup(out.node.resourceGroups, resourceGroup.node);
@@ -171,8 +173,10 @@ namespace snowcrash {
171
173
 
172
174
  static void finalize(const MarkdownNodeIterator& node,
173
175
  SectionParserData& pd,
174
- ParseResult<Blueprint>& out) {
175
-
176
+ const ParseResultRef<Blueprint>& out) {
177
+
178
+ checkLazyReferencing(pd, out);
179
+
176
180
  if (!out.node.name.empty())
177
181
  return;
178
182
 
@@ -183,7 +187,7 @@ namespace snowcrash {
183
187
  out.report.error = Error(ExpectedAPINameMessage,
184
188
  BusinessError,
185
189
  sourceMap);
186
-
190
+
187
191
  }
188
192
  else if (!out.node.description.empty()) {
189
193
  mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
@@ -195,7 +199,7 @@ namespace snowcrash {
195
199
 
196
200
  static bool isUnexpectedNode(const MarkdownNodeIterator& node,
197
201
  SectionType sectionType) {
198
-
202
+
199
203
  // Since Blueprint is currently top-level node any unprocessed node should be reported
200
204
  return true;
201
205
  }
@@ -203,7 +207,7 @@ namespace snowcrash {
203
207
 
204
208
  static void parseMetadata(const MarkdownNodeIterator& node,
205
209
  SectionParserData& pd,
206
- ParseResult<MetadataCollection>& out) {
210
+ const ParseResultRef<MetadataCollection>& out) {
207
211
 
208
212
  mdp::ByteBuffer content = node->text;
209
213
  TrimStringEnd(content);
@@ -278,6 +282,211 @@ namespace snowcrash {
278
282
  resourceGroups.end(),
279
283
  std::bind2nd(MatchName<ResourceGroup>(), resourceGroup));
280
284
  }
285
+
286
+ /**
287
+ * \brief Checks both blueprint and source map AST to resolve references with `Pending` state (Lazy referencing)
288
+ * \param pd Section parser state
289
+ * \param out Processed output
290
+ */
291
+ static void checkLazyReferencing(SectionParserData& pd,
292
+ const ParseResultRef<Blueprint>& out) {
293
+
294
+ Collection<SourceMap<ResourceGroup> >::iterator resourceGroupSourceMapIt;
295
+
296
+ if (pd.exportSourceMap()) {
297
+ resourceGroupSourceMapIt = out.sourceMap.resourceGroups.collection.begin();
298
+ }
299
+
300
+ for (ResourceGroups::iterator resourceGroupIt = out.node.resourceGroups.begin();
301
+ resourceGroupIt != out.node.resourceGroups.end();
302
+ ++resourceGroupIt) {
303
+
304
+ checkResourceLazyReferencing(*resourceGroupIt, resourceGroupSourceMapIt, pd, out);
305
+
306
+ if (pd.exportSourceMap()) {
307
+ resourceGroupSourceMapIt++;
308
+ }
309
+ }
310
+ }
311
+
312
+ /** Traverses Resource Collection to resolve references with `Pending` state (Lazy referencing) */
313
+ static void checkResourceLazyReferencing(ResourceGroup& resourceGroup,
314
+ Collection<SourceMap<ResourceGroup> >::iterator resourceGroupSourceMapIt,
315
+ SectionParserData& pd,
316
+ const ParseResultRef<Blueprint>& out) {
317
+
318
+ Collection<SourceMap<Resource> >::iterator resourceSourceMapIt;
319
+
320
+ if (pd.exportSourceMap()) {
321
+ resourceSourceMapIt = resourceGroupSourceMapIt->resources.collection.begin();
322
+ }
323
+
324
+ for (Resources::iterator resourceIt = resourceGroup.resources.begin();
325
+ resourceIt != resourceGroup.resources.end();
326
+ ++resourceIt) {
327
+
328
+ checkActionLazyReferencing(*resourceIt, resourceSourceMapIt, pd, out);
329
+
330
+ if (pd.exportSourceMap()) {
331
+ resourceSourceMapIt++;
332
+ }
333
+ }
334
+ }
335
+
336
+ /** Traverses Action Collection to resolve references with `Pending` state (Lazy referencing) */
337
+ static void checkActionLazyReferencing(Resource& resource,
338
+ Collection<SourceMap<Resource> >::iterator resourceSourceMapIt,
339
+ SectionParserData& pd,
340
+ const ParseResultRef<Blueprint>& out) {
341
+
342
+ Collection<SourceMap<Action> >::iterator actionSourceMapIt;
343
+
344
+ if (pd.exportSourceMap()) {
345
+ actionSourceMapIt = resourceSourceMapIt->actions.collection.begin();
346
+ }
347
+
348
+ for (Actions::iterator actionIt = resource.actions.begin();
349
+ actionIt != resource.actions.end();
350
+ ++actionIt) {
351
+
352
+ checkExampleLazyReferencing(*actionIt, actionSourceMapIt, pd, out);
353
+
354
+ if (pd.exportSourceMap()) {
355
+ actionSourceMapIt++;
356
+ }
357
+ }
358
+ }
359
+
360
+ /** Traverses Transaction Example Collection AST to resolve references with `Pending` state (Lazy referencing) */
361
+ static void checkExampleLazyReferencing(Action& action,
362
+ Collection<SourceMap<Action> >::iterator actionSourceMapIt,
363
+ SectionParserData& pd,
364
+ const ParseResultRef<Blueprint>& out) {
365
+
366
+ Collection<SourceMap<TransactionExample> >::iterator exampleSourceMapIt;
367
+
368
+ if (pd.exportSourceMap()) {
369
+ exampleSourceMapIt = actionSourceMapIt->examples.collection.begin();
370
+ }
371
+
372
+ for (TransactionExamples::iterator transactionExampleIt = action.examples.begin();
373
+ transactionExampleIt != action.examples.end();
374
+ ++transactionExampleIt) {
375
+
376
+ checkRequestLazyReferencing(*transactionExampleIt, exampleSourceMapIt, pd, out);
377
+ checkResponseLazyReferencing(*transactionExampleIt, exampleSourceMapIt, pd, out);
378
+
379
+ if (pd.exportSourceMap()) {
380
+ exampleSourceMapIt++;
381
+ }
382
+ }
383
+ }
384
+
385
+ /** Traverses Request Collection to resolve references with `Pending` state (Lazy referencing) */
386
+ static void checkRequestLazyReferencing(TransactionExample& transactionExample,
387
+ Collection<SourceMap<TransactionExample> >::iterator transactionExampleSourceMapIt,
388
+ SectionParserData& pd,
389
+ const ParseResultRef<Blueprint>& out) {
390
+
391
+ Collection<SourceMap<Request> >::iterator requestSourceMapIt;
392
+
393
+ if (pd.exportSourceMap()) {
394
+ requestSourceMapIt = transactionExampleSourceMapIt->requests.collection.begin();
395
+ }
396
+
397
+ for (Requests::iterator requestIt = transactionExample.requests.begin();
398
+ requestIt != transactionExample.requests.end();
399
+ ++requestIt) {
400
+
401
+ if (!requestIt->reference.id.empty() &&
402
+ requestIt->reference.meta.state == Reference::StatePending) {
403
+
404
+ if (pd.exportSourceMap()) {
405
+
406
+ ParseResultRef<Payload> payload(out.report, *requestIt, *requestSourceMapIt);
407
+ resolvePendingSymbols(pd, payload);
408
+ SectionProcessor<Payload>::checkRequest(requestIt->reference.meta.node, pd, payload);
409
+ }
410
+ else {
411
+
412
+ SourceMap<Payload> tempSourceMap;
413
+ ParseResultRef<Payload> payload(out.report, *requestIt, tempSourceMap);
414
+ resolvePendingSymbols(pd, payload);
415
+ SectionProcessor<Payload>::checkRequest(requestIt->reference.meta.node, pd, payload);
416
+ }
417
+ }
418
+
419
+ if (pd.exportSourceMap()) {
420
+ requestSourceMapIt++;
421
+ }
422
+ }
423
+ }
424
+
425
+ /** Traverses Response Collection to resolve references with `Pending` state (Lazy referencing) */
426
+ static void checkResponseLazyReferencing(TransactionExample& transactionExample,
427
+ Collection<SourceMap<TransactionExample> >::iterator transactionExampleSourceMapIt,
428
+ SectionParserData& pd,
429
+ const ParseResultRef<Blueprint>& out) {
430
+
431
+ Collection<SourceMap<Response> >::iterator responseSourceMapIt;
432
+
433
+ if (pd.exportSourceMap()) {
434
+ responseSourceMapIt = transactionExampleSourceMapIt->responses.collection.begin();
435
+ }
436
+
437
+ for (Responses::iterator responseIt = transactionExample.responses.begin();
438
+ responseIt != transactionExample.responses.end();
439
+ ++responseIt) {
440
+
441
+ if (!responseIt->reference.id.empty() &&
442
+ responseIt->reference.meta.state == Reference::StatePending) {
443
+
444
+ if (pd.exportSourceMap()) {
445
+
446
+ ParseResultRef<Payload> payload(out.report, *responseIt, *responseSourceMapIt);
447
+ resolvePendingSymbols(pd, payload);
448
+ SectionProcessor<Payload>::checkResponse(responseIt->reference.meta.node, pd, payload);
449
+ }
450
+ else {
451
+
452
+ SourceMap<Payload> tempSourceMap;
453
+ ParseResultRef<Payload> payload(out.report, *responseIt, tempSourceMap);
454
+ resolvePendingSymbols(pd, payload);
455
+ SectionProcessor<Payload>::checkResponse(responseIt->reference.meta.node, pd, payload);
456
+ }
457
+ }
458
+
459
+ if (pd.exportSourceMap()) {
460
+ responseSourceMapIt++;
461
+ }
462
+ }
463
+ }
464
+
465
+ /**
466
+ * \brief Resolve pending references
467
+ * \param pd Section parser state
468
+ * \param out Processed output
469
+ */
470
+ static void resolvePendingSymbols(SectionParserData& pd,
471
+ const ParseResultRef<Payload>& out) {
472
+
473
+ if (pd.symbolTable.resourceModels.find(out.node.reference.id) == pd.symbolTable.resourceModels.end()) {
474
+
475
+ // ERR: Undefined symbol
476
+ std::stringstream ss;
477
+ ss << "Undefined symbol " << out.node.reference.id;
478
+
479
+ mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(out.node.reference.meta.node->sourceMap, pd.sourceData);
480
+ out.report.error = Error(ss.str(), SymbolError, sourceMap);
481
+
482
+ out.node.reference.meta.state = Reference::StateUnresolved;
483
+ }
484
+ else {
485
+
486
+ out.node.reference.meta.state = Reference::StateResolved;
487
+ SectionProcessor<Payload>::assingReferredPayload(pd, out);
488
+ }
489
+ }
281
490
  };
282
491
 
283
492
  /** Blueprint Parser */
@@ -97,7 +97,7 @@ namespace snowcrash {
97
97
  SourceMap<Asset> schema;
98
98
 
99
99
  /** Source Map of Symbol */
100
- SourceMap<SymbolName> symbol;
100
+ SourceMap<Reference> reference;
101
101
  };
102
102
 
103
103
  /** Source Map of Collection of Requests */
@@ -15,29 +15,29 @@
15
15
  #include "HTTP.h"
16
16
 
17
17
  namespace snowcrash {
18
-
18
+
19
19
  /**
20
20
  * \brief Pair firsts matching predicate.
21
21
  *
22
22
  * Two pairs are a match if their %first matches.
23
23
  */
24
- template <class T>
24
+ template <class T, class Predicate = std::equal_to<typename T::first_type> >
25
25
  struct MatchFirsts : std::binary_function<T, T, bool> {
26
26
  bool operator()(const T& left, const T& right) const {
27
- return left.first == right.first;
27
+ return Predicate()(left.first, right.first);
28
28
  }
29
29
  };
30
-
30
+
31
31
  /**
32
32
  * \brief Matches a pair's first against a value.
33
33
  */
34
- template <class T, class R>
34
+ template <class T, class R = typename T::first_type, class Predicate = std::equal_to<R> >
35
35
  struct MatchFirstWith : std::binary_function<T, R, bool> {
36
36
  bool operator()(const T& left, const R& right) const {
37
- return left.first == right;
37
+ return Predicate()(left.first, right);
38
38
  }
39
39
  };
40
-
40
+
41
41
  /** A name matching predicate. */
42
42
  template <class T>
43
43
  struct MatchName : std::binary_function<T, T, bool> {
@@ -45,7 +45,7 @@ namespace snowcrash {
45
45
  return first.name == second.name;
46
46
  }
47
47
  };
48
-
48
+
49
49
  /**
50
50
  * \brief Payload matching predicate.
51
51
  *
@@ -53,11 +53,11 @@ namespace snowcrash {
53
53
  */
54
54
  struct MatchPayload : std::binary_function<Payload, Payload, bool> {
55
55
  bool operator()(const first_argument_type& left, const second_argument_type& right) const {
56
-
56
+
57
57
 
58
58
  if (left.name != right.name)
59
59
  return false;
60
-
60
+
61
61
  // Resolve left content type
62
62
  Collection<Header>::const_iterator header;
63
63
 
@@ -70,7 +70,7 @@ namespace snowcrash {
70
70
 
71
71
  if (header != left.headers.end())
72
72
  leftContentType = header->second;
73
-
73
+
74
74
  // Resolve right content type
75
75
  header = std::find_if(right.headers.begin(),
76
76
  right.headers.end(),
@@ -81,18 +81,18 @@ namespace snowcrash {
81
81
 
82
82
  if (header != right.headers.end())
83
83
  rightContentType = header->second;
84
-
84
+
85
85
  return leftContentType == rightContentType;
86
86
  }
87
87
  };
88
-
88
+
89
89
  /** URI matching predicate. */
90
90
  struct MatchResource : std::binary_function<Resource, Resource, bool> {
91
91
  bool operator()(const first_argument_type& first, const second_argument_type& second) const {
92
92
  return first.uriTemplate == second.uriTemplate;
93
93
  }
94
94
  };
95
-
95
+
96
96
  /** Action matching predicate. */
97
97
  template <class T>
98
98
  struct MatchAction : std::binary_function<T, T, bool> {
@@ -252,16 +252,6 @@ SC_API const char* sc_payload_name(const sc_payload_t* handle)
252
252
  return p->name.c_str();
253
253
  }
254
254
 
255
- /** TODO: Need to change this to use the "Reference" data structure */
256
- SC_API const char* sc_payload_symbol(const sc_payload_t* handle)
257
- {
258
- const snowcrash::Payload* p = AS_CTYPE(snowcrash::Payload, handle);
259
- if (!p)
260
- return "";
261
-
262
- return p->symbol.c_str();
263
- }
264
-
265
255
  SC_API const char* sc_payload_description(const sc_payload_t* handle)
266
256
  {
267
257
  const snowcrash::Payload* p = AS_CTYPE(snowcrash::Payload, handle);
@@ -291,6 +281,35 @@ SC_API const char* sc_payload_schema(const sc_payload_t* handle)
291
281
 
292
282
  /*----------------------------------------------------------------------*/
293
283
 
284
+ SC_API const sc_reference_t* sc_reference_handle_payload(const sc_payload_t* handle)
285
+ {
286
+ const snowcrash::Payload* p = AS_CTYPE(snowcrash::Payload, handle);
287
+ if(!p)
288
+ return NULL;
289
+
290
+ return AS_CTYPE(sc_reference_t, &p->reference);
291
+ }
292
+
293
+ SC_API const char* sc_reference_id(const sc_reference_t* handle)
294
+ {
295
+ const snowcrash::Reference* p = AS_CTYPE(snowcrash::Reference, handle);
296
+ if (!p)
297
+ return "";
298
+
299
+ return p->id.c_str();
300
+ }
301
+
302
+ SC_API sc_reference_type_t sc_reference_type(const sc_reference_t* handle)
303
+ {
304
+ const snowcrash::Reference* p = AS_CTYPE(snowcrash::Reference, handle);
305
+ if (!p)
306
+ return (sc_reference_type_t)0;
307
+
308
+ return (sc_reference_type_t)p->type;
309
+ }
310
+
311
+ /*----------------------------------------------------------------------*/
312
+
294
313
  SC_API const sc_parameter_collection_t* sc_parameter_collection_handle_payload(const sc_payload_t* handle)
295
314
  {
296
315
  const snowcrash::Payload* p = AS_CTYPE(snowcrash::Payload, handle);
@@ -34,6 +34,10 @@ extern "C" {
34
34
  SC_REQUIRED_PARAMETER_USE
35
35
  } sc_parameter_use;
36
36
 
37
+ typedef enum sc_reference_type_t {
38
+ SC_TYPE_SYMBOL_REFERENCE
39
+ } sc_reference_type_t;
40
+
37
41
  /** Class Blueprint wrapper */
38
42
  struct sc_blueprint_s;
39
43
  typedef struct sc_blueprint_s sc_blueprint_t;
@@ -70,6 +74,10 @@ extern "C" {
70
74
  struct sc_payload_collection_s;
71
75
  typedef struct sc_payload_collection_s sc_payload_collection_t;
72
76
 
77
+ /** Class Reference wrapper */
78
+ struct sc_reference_s;
79
+ typedef struct sc_reference_s sc_reference_t;
80
+
73
81
  /** Class Payload wrapper */
74
82
  struct sc_payload_s;
75
83
  typedef struct sc_payload_s sc_payload_t;
@@ -210,9 +218,6 @@ extern "C" {
210
218
  /** \returns Payload name */
211
219
  SC_API const char* sc_payload_name(const sc_payload_t* handle);
212
220
 
213
- /** \returns Payload symbol name */
214
- SC_API const char* sc_payload_symbol(const sc_payload_t* handle);
215
-
216
221
  /** \returns Payload description */
217
222
  SC_API const char* sc_payload_description(const sc_payload_t* handle);
218
223
 
@@ -224,6 +229,17 @@ extern "C" {
224
229
 
225
230
  /*----------------------------------------------------------------------*/
226
231
 
232
+ /** \returns Reference handle from payload */
233
+ SC_API const sc_reference_t* sc_reference_handle_payload(const sc_payload_t* handle);
234
+
235
+ /** \returns Reference identifier */
236
+ SC_API const char* sc_reference_id(const sc_reference_t* handle);
237
+
238
+ /** \returns Reference identifier */
239
+ SC_API sc_reference_type_t sc_reference_type(const sc_reference_t* handle);
240
+
241
+ /*----------------------------------------------------------------------*/
242
+
227
243
  /** \returns Parameter Collection handle from Payload */
228
244
  SC_API const sc_parameter_collection_t* sc_parameter_collection_handle_payload(const sc_payload_t* handle);
229
245