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 c31023846f474371db61d8da6f05df0098a059eb
parent f3c072679a0ee4d81971937352dbe8fccfa6b656
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue,  8 Nov 2016 11:08:10 +0100

Refactor the matte and material descriptor parsing

Diffstat:
Msrc/solstice_facility.c | 111++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
1 file changed, 68 insertions(+), 43 deletions(-)

diff --git a/src/solstice_facility.c b/src/solstice_facility.c @@ -288,10 +288,10 @@ static res_T parse_material_matte (const char* filename, yaml_document_t* doc, const yaml_node_t* matte) { - yaml_node_t* key; - yaml_node_t* val; + enum { REFLECTIVITY }; double reflectivity; - intptr_t n; + intptr_t i, n; + int mask = 0; /* Register the parsed attributes */ res_T res = RES_OK; ASSERT(doc && matte); @@ -302,31 +302,40 @@ parse_material_matte } n = matte->data.mapping.pairs.top - matte->data.mapping.pairs.start; - if(n != 1) { - log_err(filename, matte, - "expect only one matte material attribute while %li are submitted.\n", n); - res = RES_BAD_ARG; - goto error; - } + FOR_EACH(i, 0, n) { + yaml_node_t* key; + yaml_node_t* val; - key = yaml_document_get_node(doc, matte->data.mapping.pairs.start[0].key); - val = yaml_document_get_node(doc, matte->data.mapping.pairs.start[0].value); - if(key->type != YAML_SCALAR_NODE) { - log_err(filename, key, "expect a matte material attribute.\n"); - res = RES_BAD_ARG; - goto error; + key = yaml_document_get_node(doc, matte->data.mapping.pairs.start[0].key); + val = yaml_document_get_node(doc, matte->data.mapping.pairs.start[0].value); + if(key->type != YAML_SCALAR_NODE) { + log_err(filename, key, "expect a matte material attribute.\n"); + res = RES_BAD_ARG; + goto error; + } + + if(!strcmp((char*)key->data.scalar.value, "reflectivity")) { + if(mask & BIT(REFLECTIVITY)) { + log_err(filename, key, "the matte reflectivity is already defined.\n"); + res = RES_BAD_ARG; + goto error; + } + mask |= BIT(REFLECTIVITY); + res = parse_real(filename, val, 0, 1, &reflectivity); + } else { + log_err(filename, key, "unknown matte attribute `%s'.\n", + key->data.scalar.value); + res = RES_BAD_ARG; + } + if(res != RES_OK) goto error; } - if(strcmp((char*)key->data.scalar.value, "reflectivity")) { - log_err(filename, key, "unknown matte attribute `%s'.\n", - key->data.scalar.value); + if(!(mask & BIT(REFLECTIVITY))) { + log_err(filename, matte, "the matte reflectivity is missing.\n"); res = RES_BAD_ARG; goto error; } - res = parse_real(filename, val, 0, 1, &reflectivity); - if(res != RES_OK) goto error; - /* TODO create the Solstice material */ exit: @@ -412,9 +421,9 @@ static res_T parse_material_descriptor (const char* filename, yaml_document_t* doc, const yaml_node_t* desc) { - yaml_node_t* key; - yaml_node_t* val; - intptr_t n; + enum { DESCRIPTOR }; + intptr_t i, n; + int mask = 0; /* Register the parsed attributes */ res_T res = RES_OK; ASSERT(doc && desc); @@ -428,31 +437,47 @@ parse_material_descriptor } n = desc->data.mapping.pairs.top - desc->data.mapping.pairs.start; - if(n != 1) { - log_err(filename, desc, "expect only one material descriptor.\n", n); - res = RES_BAD_ARG; - goto error; - } + FOR_EACH(i, 0, n) { + yaml_node_t* key; + yaml_node_t* val; - key = yaml_document_get_node(doc, desc->data.mapping.pairs.start[0].key); - val = yaml_document_get_node(doc, desc->data.mapping.pairs.start[0].value); - if(key->type != YAML_SCALAR_NODE) { - log_err(filename, key, "expect a material name.\n"); - res = RES_BAD_ARG; - goto error; + key = yaml_document_get_node(doc, desc->data.mapping.pairs.start[i].key); + val = yaml_document_get_node(doc, desc->data.mapping.pairs.start[i].value); + if(key->type != YAML_SCALAR_NODE) { + log_err(filename, key, "expect a material name.\n"); + res = RES_BAD_ARG; + goto error; + } + + #define SETUP_MASK(Flag, Name) { \ + if(mask & BIT(Flag)) { \ + log_err(filename, key, "the material "Name" is already defined.\n"); \ + res = RES_BAD_ARG; \ + goto error; \ + } \ + mask |= BIT(Flag); \ + } (void)0 + if(!strcmp((char*)key->data.scalar.value, "matte")) { + SETUP_MASK(DESCRIPTOR, "descriptor"); + res = parse_material_matte(filename, doc, val); + } else if(!strcmp((char*)key->data.scalar.value, "mirror")) { + SETUP_MASK(DESCRIPTOR, "descriptor"); + res = parse_material_mirror(filename, doc, val); + } else { + log_err(filename, key, "unknown material descriptor `%s'.\n", + key->data.scalar.value); + res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) goto error; + #undef SETUP_MASK } - if(!strcmp((char*)key->data.scalar.value, "matte")) { - res = parse_material_matte(filename, doc, val); - } else if(!strcmp((char*)key->data.scalar.value, "mirror")) { - res = parse_material_mirror(filename, doc, val); - } else { - log_err(filename, key, "unknown material descriptor `%s'.\n", - key->data.scalar.value); + if(!(mask & BIT(DESCRIPTOR))) { + log_err(filename, desc, "the material descriptor is missing.\n"); res = RES_BAD_ARG; goto error; } - if(res != RES_OK) goto error; exit: return res;