schiff

Estimate the radiative properties of soft particless
git clone git://git.meso-star.com/schiff.git
Log | Files | Refs | README | LICENSE

commit 75cb616b0a705844cbb55e3be5c64dcc77eb6763
parent c5c174672604ec776595ac4cccd8ba4e628675c2
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  9 Mar 2016 08:34:27 +0100

Parse the YAML cylinder distribution

Do not parse the cylinder attribute distribution yet.

Diffstat:
Msrc/schiff_args.c | 121+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 113 insertions(+), 8 deletions(-)

diff --git a/src/schiff_args.c b/src/schiff_args.c @@ -36,6 +36,7 @@ #include <rsys/str.h> #include <rsys/stretchy_array.h> +#include <stdarg.h> #include <yaml.h> #ifdef COMPILER_CL @@ -521,13 +522,78 @@ error: goto exit; } +static INLINE void +log_yaml_node_error + (const char* filename, + const yaml_node_t* node, + const char* fmt, + ...) +{ + va_list vargs_list; + ASSERT(node && fmt); + + fprintf(stderr, "%s:%lu:%lu: ", + filename, + (unsigned long)node->start_mark.line+1, + (unsigned long)node->start_mark.column+1); + va_start(vargs_list, fmt); + vfprintf(stderr, fmt, vargs_list); + va_end(vargs_list); +} + +static res_T +parse_yaml_cylinder + (const char* filename, + yaml_document_t* doc, + const yaml_node_t* cylinder) +{ + size_t iattr, nattrs; + res_T res = RES_OK; + ASSERT(doc && cylinder); + + if(cylinder->type != YAML_MAPPING_NODE) { + log_yaml_node_error(filename, cylinder, + "expecting a YAML mapping of cylinder attributes.\n"); + res = RES_BAD_ARG; + goto error; + } + + nattrs = (size_t) + (cylinder->data.mapping.pairs.top - cylinder->data.mapping.pairs.start); + + FOR_EACH(iattr, 0, nattrs) { + yaml_node_t* attr; + + attr = yaml_document_get_node + (doc, cylinder->data.mapping.pairs.start[iattr].key); + ASSERT(attr->type == YAML_SCALAR_NODE); + + if(!strcmp((char*)attr->data.scalar.value, "proba")) { + } else if(!strcmp((char*)attr->data.scalar.value, "radius")) { + } else if(!strcmp((char*)attr->data.scalar.value, "height")) { + } else if(!strcmp((char*)attr->data.scalar.value, "aspect_ratio")) { + } else { + log_yaml_node_error(filename, attr, "unkown cylinder attribute `%s'.\n", + attr->data.scalar.value); + res = RES_BAD_ARG; + goto error; + } + } + +exit: + return res; +error: + goto exit; +} + static res_T parse_yaml(const char* filename) { yaml_parser_t parser; - yaml_document_t document; - yaml_node_t* node; - size_t nvals; + yaml_document_t doc; + yaml_node_t* root; + size_t ndistribs; + size_t idistrib; FILE* file = NULL; res_T res = RES_OK; ASSERT(filename); @@ -547,22 +613,61 @@ parse_yaml(const char* filename) yaml_parser_set_input_file(&parser, file); - if(!yaml_parser_load(&parser, &document)) { - fprintf(stderr, "Error in parsing the YAML file `%s'.\n", filename); + if(!yaml_parser_load(&parser, &doc)) { + fprintf(stderr, "%s:%lu:%lu: %s.\n", + filename, + (unsigned long)parser.problem_mark.line+1, + (unsigned long)parser.problem_mark.column+1, + parser.problem); res = RES_IO_ERR; goto error; } - node = yaml_document_get_root_node(&document); - if(node->type != YAML_SEQUENCE_NODE) { + root = yaml_document_get_root_node(&doc); + if(root->type != YAML_SEQUENCE_NODE) { fprintf(stderr, "Expecting YAML sequence.\n"); res = RES_BAD_ARG; goto error; } + ndistribs = (size_t) + (root->data.sequence.items.top - root->data.sequence.items.start); + FOR_EACH(idistrib, 0, ndistribs) { + yaml_node_t* distrib, *name, *data; + + distrib = yaml_document_get_node + (&doc, root->data.sequence.items.start[idistrib]); + if(distrib->data.mapping.pairs.top-distrib->data.mapping.pairs.start > 1) { + log_yaml_node_error(filename, distrib, "expecting only one mapping pair\n"); + res = RES_BAD_ARG; + goto error; + } + if(distrib->type != YAML_MAPPING_NODE) { + log_yaml_node_error(filename, distrib, "expecting a YAML mapping.\n"); + res = RES_BAD_ARG; + goto error; + } + + name = yaml_document_get_node(&doc, distrib->data.mapping.pairs.start[0].key); + data = yaml_document_get_node(&doc, distrib->data.mapping.pairs.start[0].value); + ASSERT(name->type == YAML_SCALAR_NODE); + + if(!strcmp((const char*)name->data.scalar.value, "cylinder")) { + res = parse_yaml_cylinder(filename, &doc, data); + /* TODO parse cylinder */ + } else if(!strcmp((const char*)name->data.scalar.value, "sphere")) { + /* TODO parse sphere */ + } else { + log_yaml_node_error(filename, name, "unknown distribution type `%s'.\n", + name->data.scalar.value); + res = RES_BAD_ARG; + goto error; + } + } + exit: yaml_parser_delete(&parser); - yaml_document_delete(&document); + yaml_document_delete(&doc); if(file) fclose(file); return res; error: