solstice

Compute collected power and efficiencies of a solar plant
git clone git://git.meso-star.com/solstice.git
Log | Files | Refs | README | LICENSE

commit 595461f4295b03eef74c432d20c2247d329e692f
parent 93f9fe83549f61faeecf060ecb2ce894d8abf3e2
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon,  7 Nov 2016 16:41:34 +0100

Parse the "instance" item

Diffstat:
Msrc/solstice_facility.c | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 90 insertions(+), 9 deletions(-)

diff --git a/src/solstice_facility.c b/src/solstice_facility.c @@ -22,6 +22,18 @@ #include <string.h> #include <yaml.h> +static res_T +parse_node + (const char* filename, + yaml_document_t* doc, + const yaml_node_t* children); + +static res_T +parse_object + (const char* filename, + yaml_document_t* doc, + const yaml_node_t* object); + /******************************************************************************* * Helper functions ******************************************************************************/ @@ -186,6 +198,80 @@ error: } /******************************************************************************* + * Instance + ******************************************************************************/ +static res_T +parse_instance + (const char* filename, yaml_document_t* doc, const yaml_node_t* inst) +{ + enum { GEOMETRY, TRANSFORM }; + double position[3] = {0, 0, 0}; + double rotation[3] = {0, 0, 0}; + intptr_t i, n; + int mask = 0; + res_T res = RES_OK; + ASSERT(doc && inst); + + if(inst->type != YAML_MAPPING_NODE) { + log_err(filename, inst, "expect an instance definition.\n"); + res = RES_BAD_ARG; + goto error; + } + + n = inst->data.mapping.pairs.top - inst->data.mapping.pairs.start; + FOR_EACH(i, 0, n) { + yaml_node_t* key; + yaml_node_t* val; + + key = yaml_document_get_node(doc, inst->data.mapping.pairs.start[i].key); + val = yaml_document_get_node(doc, inst->data.mapping.pairs.start[i].value); + if(key->type != YAML_SCALAR_NODE) { + log_err(filename, key, "expect instance parameters.\n"); + res = RES_BAD_ARG; + goto error; + } + #define SETUP_MASK(Flag, Name) { \ + if(mask & BIT(Flag)) { \ + log_err(filename, key, "the instance "Name" is already defined.\n"); \ + res = RES_BAD_ARG; \ + goto error; \ + } \ + mask |= BIT(Flag); \ + } (void)0 + if(!strcmp((char*)key->data.scalar.value, "node")) { + SETUP_MASK(GEOMETRY, "geometry"); + res = parse_node(filename, doc, val); + } else if(!strcmp((char*)key->data.scalar.value, "object")) { + SETUP_MASK(GEOMETRY, "geometry"); + res = parse_object(filename, doc, val); + } else if(!strcmp((char*)key->data.scalar.value, "transform")) { + SETUP_MASK(TRANSFORM, "transform"); + res = parse_transform(filename, doc, val, position, rotation); + } else { + log_err(filename, key, "unknown instance parameter `%s'.\n", + key->data.scalar.value); + res = RES_BAD_ARG; + } + if(res != RES_OK) goto error; + #undef SETUP_MASK + } + + #define CHECK_PARAM(Flag, Name) \ + if(!(mask & BIT(Flag))) { \ + log_err(filename, inst, "the instance "Name" is missing.\n"); \ + res = RES_BAD_ARG; \ + goto error; \ + } (void)0 + CHECK_PARAM(GEOMETRY, "geometry"); + #undef CHECK_PARAM + +exit: + return res; +error: + goto exit; +} + +/******************************************************************************* * Material ******************************************************************************/ static res_T @@ -426,7 +512,7 @@ error: /******************************************************************************* * Object ******************************************************************************/ -static res_T +res_T parse_object (const char* filename, yaml_document_t* doc, const yaml_node_t* object) { @@ -517,12 +603,6 @@ error: * Node ******************************************************************************/ static res_T -parse_node - (const char* filename, - yaml_document_t* doc, - const yaml_node_t* children); - -static res_T parse_children (const char* filename, yaml_document_t* doc, const yaml_node_t* children) { @@ -894,7 +974,9 @@ parse_item goto error; } - if(!strcmp((char*)key->data.scalar.value, "material")) { + if(!strcmp((char*)key->data.scalar.value, "instance")) { + res = parse_instance(filename, doc, val); + } else if(!strcmp((char*)key->data.scalar.value, "material")) { res = parse_material(filename, doc, val); } else if(!strcmp((char*)key->data.scalar.value, "node")) { res = parse_node(filename, doc, val); @@ -902,7 +984,6 @@ parse_item res = parse_object(filename, doc, val); } else if(!strcmp((char*)key->data.scalar.value, "pivot")) { res = parse_pivot(filename, doc, val); - } else if(!strcmp((char*)key->data.scalar.value, "spawn")) { /* TODO */ } else if(!strcmp((char*)key->data.scalar.value, "sun")) { res = parse_sun(filename, doc, val); } else {