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 d874bad7f655b6543839e4d05c4c6f9f16c276f9
parent 51e15a8167e2cef0a56ec93c73863efb72f9db9b
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 18 Jan 2017 15:39:49 +0100

Improve the error messages of the solstice parser

Print the context stack of the error, i.e. from where the YAML node is
parsed.

Diffstat:
Msrc/parser/solparser.c | 144+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 119 insertions(+), 25 deletions(-)

diff --git a/src/parser/solparser.c b/src/parser/solparser.c @@ -257,6 +257,15 @@ log_err va_end(vargs_list); } +static INLINE void +log_node(const struct solparser* parser, const yaml_node_t* node) +{ + fprintf(stderr, "\tby %s:%lu:%lu\n", + str_cget(&parser->stream_name), + (unsigned long)node->start_mark.line+1, + (unsigned long)node->start_mark.column+1); +} + static res_T flush_deferred_target_aliases (struct solparser* parser, @@ -300,7 +309,7 @@ flush_deferred_target_aliases ASSERT(!strncmp((char*)tgt->alias->data.scalar.value, "self.", 5)); /* Copy the anchor alias */ - len = strlen((char*)tgt->alias->data.scalar.value) + len = strlen((char*)tgt->alias->data.scalar.value) - 4/*strlen(self)*/ + 1/*NULL char*/; res = darray_char_resize(&alias, prefix_len + len); if(res != RES_OK) { @@ -308,7 +317,7 @@ flush_deferred_target_aliases "could not reserve the suffix of the targeted alias name.\n"); goto error; } - strcpy(darray_char_data_get(&alias) + prefix_len, + strcpy(darray_char_data_get(&alias) + prefix_len, (char*)tgt->alias->data.scalar.value+4); /* Retrieve the anchor */ @@ -681,8 +690,12 @@ parse_transform log_err(parser, key, "unknown transform parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; #undef SETUP_MASK } exit: @@ -744,8 +757,12 @@ parse_spectrum_data log_err(parser, key, "unknown spectrum data parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; #undef SETUP_MASK } @@ -867,8 +884,12 @@ parse_material_matte log_err(parser, key, "unknown matte parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; } if(!(mask & BIT(REFLECTIVITY))) { @@ -951,8 +972,12 @@ parse_material_mirror log_err(parser, key, "unknown mirror attribute `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; #undef SETUP_MASK } @@ -1051,7 +1076,10 @@ parse_material_descriptor res = RES_BAD_ARG; goto error; } - if(res != RES_OK) goto error; + if(res != RES_OK) { + log_node(parser, key); + goto error; + } #undef SETUP_MASK } @@ -1143,8 +1171,12 @@ parse_material SETUP_MASK(BACK, "back"); res = parse_material_descriptor(parser, doc, mtl, &mtl2->front); mtl2->back = mtl2->front; + if(res != RES_OK) goto error; /* Discard log_node */ + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; #undef SETUP_MASK } @@ -1302,15 +1334,19 @@ parse_polyclip log_err(parser, key, "unknown clipping polygon parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; #undef SETUP_MASK } #define CHECK_PARAM(Flag, Name) \ if(!(mask & BIT(Flag))) { \ log_err(parser, polyclip, \ - "the clipping polygon parameter `"Name"' is missing.\n"); \ + "the clipping polygon parameter `"Name"' is missing.\n"); \ res = RES_BAD_ARG; \ goto error; \ } (void)0 @@ -1422,8 +1458,12 @@ parse_cuboid log_err(parser, key, "unknown cuboid parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; } if(!(mask & BIT(SIZE))) { @@ -1507,8 +1547,12 @@ parse_cylinder log_err(parser, key, "unknown cylinder parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; #undef SETUP_MASK } @@ -1597,8 +1641,12 @@ parse_imported_geometry log_err(parser, key, "unknown %s parameter `%s'.\n", name, key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; } if(!(mask & BIT(PATH))) { @@ -1694,8 +1742,12 @@ parse_paraboloid log_err(parser, key, "unknown %s parameter `%s'.\n", name, key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; #undef SETUP_MASK } #define CHECK_PARAM(Flag, Name) \ @@ -1774,8 +1826,12 @@ parse_plane log_err(parser, key, "unknown plane parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; } if(!(mask & BIT(CLIP))) { log_err(parser, plane, "the plane parameter `clip' is missing.\n"); @@ -1855,8 +1911,12 @@ parse_sphere log_err(parser, key, "unknown sphere parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; #undef SETUP_MASK } @@ -1994,8 +2054,12 @@ parse_object log_err(parser, key, "unknown object parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; #undef SETUP_MASK } @@ -2245,8 +2309,12 @@ parse_anchor log_err(parser, key, "unknown anchor parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; #undef SETUP_MASK } @@ -2450,7 +2518,10 @@ parse_entity res = RES_BAD_ARG; goto error; } - if(res != RES_OK) goto error; + if(res != RES_OK) { + log_node(parser, key); + goto error; + } #undef SETUP_MASK } @@ -2621,7 +2692,10 @@ parse_target res = RES_BAD_ARG; goto error; } - if(res != RES_OK) goto error; + if(res != RES_OK) { + log_node(parser, key); + goto error; + } #undef SETUP_MASK } @@ -2702,8 +2776,12 @@ parse_pivot log_err(parser, key, "unknown pivot parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; #undef SETUP_MASK } #define CHECK_PARAM(Flag, Name) \ @@ -2776,8 +2854,12 @@ parse_buie log_err(parser, key, "unknown buie parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; } if(!(mask & BIT(CSR))) { @@ -2837,8 +2919,12 @@ parse_pillbox log_err(parser, pillbox, "unknown pillbox parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; } if(!(mask & BIT(APERTURE))) { @@ -2927,8 +3013,12 @@ parse_sun log_err(parser, key, "unknown sun parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; #undef SETUP_MASK } @@ -3013,8 +3103,12 @@ parse_item } else { log_err(parser, key, "unknown item `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; } - if(res != RES_OK) goto error; exit: return res;