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:
| M | src/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: