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 43b6c966b4958356a6f9b3748b9d97add5863383
parent 937417b55b1bbee68d7e20f31c41600da3e611b0
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  9 Nov 2016 09:55:29 +0100

Parse the "sphere" shape

Diffstat:
Msrc/solstice_facility.c | 70+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 69 insertions(+), 1 deletion(-)

diff --git a/src/solstice_facility.c b/src/solstice_facility.c @@ -993,6 +993,73 @@ error: goto exit; } +static res_T +parse_sphere + (const char* filename, yaml_document_t* doc, const yaml_node_t* sphere) +{ + enum { RADIUS, SLICES }; + double radius; + long nslices; + intptr_t i, n; + int mask = 0; /* Register the parsed attributes */ + res_T res = RES_OK; + ASSERT(doc && sphere); + + if(sphere->type != YAML_MAPPING_NODE) { + log_err(filename, sphere, "expect a mapping of sphere parameters.\n"); + res = RES_BAD_ARG; + goto error; + } + + n = sphere->data.mapping.pairs.top - sphere->data.mapping.pairs.start; + FOR_EACH(i, 0, n) { + yaml_node_t* key; + yaml_node_t* val; + + key = yaml_document_get_node(doc, sphere->data.mapping.pairs.start[i].key); + val = yaml_document_get_node(doc, sphere->data.mapping.pairs.start[i].value); + if(key->type != YAML_SCALAR_NODE) { + log_err(filename, key, "expect sphere parameters.\n"); + res = RES_BAD_ARG; + goto error; + } + #define SETUP_MASK(Flag, Name) { \ + if(mask & BIT(Flag)) { \ + log_err(filename, key, \ + "the sphere parameter `"Name"' is already defined.\n"); \ + res = RES_BAD_ARG; \ + goto error; \ + } \ + mask |= BIT(Flag); \ + } (void)0 + if(!strcmp((char*)key->data.scalar.value, "radius")) { + SETUP_MASK(RADIUS, "radius"); + res = parse_real(filename, val, 0, DBL_MAX, &radius); + } else if(!strcmp((char*)key->data.scalar.value, "slices")) { + SETUP_MASK(SLICES, "slices"); + res = parse_integer(filename, val, 4, 4096, &nslices); + } else { + log_err(filename, key, "unknown sphere parameter `%s'.\n", + key->data.scalar.value); + res = RES_BAD_ARG; + } + if(res != RES_OK) goto error; + #undef SETUP_MASK + } + + if(!(mask & BIT(RADIUS))) { + log_err(filename, sphere, "the sphere radius is missing.\n"); + res = RES_BAD_ARG; + goto error; + } + /* TODO register the sphere */ + +exit: + return res; +error: + goto exit; +} + /******************************************************************************* * Object ******************************************************************************/ @@ -1060,7 +1127,8 @@ parse_object SETUP_MASK(SHAPE, "shape"); res = parse_plane(filename, doc, val); } else if(!strcmp((char*)key->data.scalar.value, "sphere")) { - SETUP_MASK(SHAPE, "shape"); /* TODO parse the shape */ + SETUP_MASK(SHAPE, "shape"); + res = parse_sphere(filename, doc, val); } else if(!strcmp((char*)key->data.scalar.value, "stl")) { SETUP_MASK(SHAPE, "shape"); /* TODO parse the shape */ } else if(!strcmp((char*)key->data.scalar.value, "transform")) {