commit 788b495441c9a0e439fec76670fef0f0b988cde6
parent b95ba6d5b0762af025fe4bfe5992c9d901ef63ce
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Tue, 14 Mar 2017 15:57:01 +0100
Add the "per_primitive" data to the receiver file format
Diffstat:
6 files changed, 67 insertions(+), 3 deletions(-)
diff --git a/doc/receiver b/doc/receiver
@@ -12,6 +12,7 @@
<receiver> ::=
name: <entity-identifier>
side: <BACK|FRONT|FRONT_AND_BACK>
+[ per_primitive: INTEGER ] # in [0, 1]
<entity-identifier>
STRING[.STRING ... ]
diff --git a/src/receivers/srcvl.c b/src/receivers/srcvl.c
@@ -15,6 +15,7 @@
#include "srcvl.h"
+#include <rsys/cstr.h>
#include <rsys/dynamic_array.h>
#include <rsys/mem_allocator.h>
#include <rsys/ref_count.h>
@@ -27,6 +28,7 @@
struct receiver {
struct str name;
enum srcvl_side side;
+ int per_primitive;
};
static INLINE void
@@ -35,6 +37,7 @@ receiver_init(struct mem_allocator* allocator, struct receiver* receiver)
ASSERT(receiver);
str_init(allocator, &receiver->name);
receiver->side = SRCVL_FRONT_AND_BACK;
+ receiver->per_primitive = 0;
}
static INLINE void
@@ -49,15 +52,16 @@ receiver_copy(struct receiver* dst, const struct receiver* src)
{
ASSERT(dst && src);
dst->side = src->side;
+ dst->per_primitive = src->per_primitive;
return str_copy(&dst->name, &src->name);
}
-
static INLINE res_T
receiver_copy_and_release(struct receiver* dst, struct receiver* src)
{
ASSERT(dst && src);
dst->side = src->side;
+ dst->per_primitive = src->per_primitive;
return str_copy_and_release(&dst->name, &src->name);
}
@@ -164,12 +168,39 @@ error:
}
static res_T
+parse_integer(struct srcvl* srcvl, yaml_node_t* integer, int* dst)
+{
+ res_T res = RES_OK;
+ ASSERT(integer && dst);
+
+ if(integer->type != YAML_SCALAR_NODE
+ || !strlen((char*)integer->data.scalar.value)) {
+ log_err(srcvl, integer, "expect an integer.\n");
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+ res = cstr_to_int((char*)integer->data.scalar.value, dst);
+ if(res != RES_OK) {
+ log_err(srcvl, integer, "invalid integer `%s'.\n",
+ integer->data.scalar.value);
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+exit:
+ return res;
+error:
+ goto exit;
+}
+
+static res_T
parse_receiver
(struct srcvl* srcvl,
yaml_document_t* doc,
const yaml_node_t* receiver)
{
- enum { NAME, SIDE };
+ enum { NAME, PER_PRIMITIVE, SIDE };
struct receiver* solreceiver = NULL;
size_t isolreceiver;
intptr_t i, n;
@@ -218,6 +249,9 @@ parse_receiver
} else if(!strcmp((char*)key->data.scalar.value, "side")) {
SETUP_MASK(SIDE, "side");
res = parse_side(srcvl, val, &solreceiver->side);
+ } else if(!strcmp((char*)key->data.scalar.value, "per_primitive")) {
+ SETUP_MASK(PER_PRIMITIVE, "per_primitive");
+ res = parse_integer(srcvl, val, &solreceiver->per_primitive);
} else {
log_err(srcvl, key, "unknown receiver parameter `%s'.\n",
key->data.scalar.value);
@@ -427,5 +461,6 @@ srcvl_get
r = darray_receiver_cdata_get(&srcvl->receivers) + i;
receiver->name = str_cget(&r->name);
receiver->side = r->side;
+ receiver->per_primitive = r->per_primitive;
}
diff --git a/src/receivers/srcvl.h b/src/receivers/srcvl.h
@@ -27,6 +27,7 @@ enum srcvl_side {
struct srcvl_receiver {
const char* name;
enum srcvl_side side;
+ int per_primitive; /* Define if per primitive receiver is enabled */
};
struct mem_allocator;
diff --git a/src/receivers/test_srcvl2.c b/src/receivers/test_srcvl2.c
@@ -39,31 +39,48 @@ main(int argc, char** argv)
fprintf(stream, "- { name: entity3, side: BACK }\n");
fprintf(stream, "- name: entity4\n");
fprintf(stream, " side: FRONT_AND_BACK\n");
+ fprintf(stream, "- { name: entity5, side: BACK, per_primitive: 1 }\n");
+ fprintf(stream, "- { name: entity6, per_primitive: 0, side: FRONT }\n");
rewind(stream);
CHECK(srcvl_setup_stream(srcvl, NULL, stream), RES_OK);
CHECK(srcvl_load(srcvl), RES_OK);
- CHECK(srcvl_count(srcvl), 5);
+ CHECK(srcvl_count(srcvl), 7);
srcvl_get(srcvl, 0, &receiver);
CHECK(strcmp(receiver.name, "entity0"), 0);
CHECK(receiver.side, SRCVL_FRONT_AND_BACK);
+ CHECK(receiver.per_primitive, 0);
srcvl_get(srcvl, 1, &receiver);
CHECK(strcmp(receiver.name, "entity1"), 0);
CHECK(receiver.side, SRCVL_FRONT_AND_BACK);
+ CHECK(receiver.per_primitive, 0);
srcvl_get(srcvl, 2, &receiver);
CHECK(strcmp(receiver.name, "entity2"), 0);
CHECK(receiver.side, SRCVL_FRONT);
+ CHECK(receiver.per_primitive, 0);
srcvl_get(srcvl, 3, &receiver);
CHECK(strcmp(receiver.name, "entity3"), 0);
CHECK(receiver.side, SRCVL_BACK);
+ CHECK(receiver.per_primitive, 0);
srcvl_get(srcvl, 4, &receiver);
CHECK(strcmp(receiver.name, "entity4"), 0);
CHECK(receiver.side, SRCVL_FRONT_AND_BACK);
+ CHECK(receiver.per_primitive, 0);
+
+ srcvl_get(srcvl, 5, &receiver);
+ CHECK(strcmp(receiver.name, "entity5"), 0);
+ CHECK(receiver.side, SRCVL_BACK);
+ CHECK(receiver.per_primitive, 1);
+
+ srcvl_get(srcvl, 6, &receiver);
+ CHECK(strcmp(receiver.name, "entity6"), 0);
+ CHECK(receiver.side, SRCVL_FRONT);
+ CHECK(receiver.per_primitive, 0);
CHECK(srcvl_load(srcvl), RES_BAD_OP);
diff --git a/src/receivers/yaml/test_ko.yaml b/src/receivers/yaml/test_ko.yaml
@@ -18,3 +18,11 @@
---
- name: test
-
+---
+- name: test
+ per_primitive: hop
+---
+- name: test
+ per_primitive:
+---
+- per_primitive: 1
diff --git a/src/receivers/yaml/test_ok.yaml b/src/receivers/yaml/test_ok.yaml
@@ -13,4 +13,6 @@
{name: test},
{side: FRONT_AND_BACK, name: "Hello world"},
{name: Hello world, side: BACK}
+ {name: hop, per_primitive: 1}
+ {per_primitive: 0, name: test}
]