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 2bf47b15ecea79ecc7fc155d19d19b1fee6fc348
parent 99b9f559df6a1960d919434e1d7d40a05012725b
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  8 Mar 2017 16:37:34 +0100

Fix the parsing of the rendering options

A null image definition did not produce an error. Furthermore, if the
parsing of a rendering option failed but that there is subsequent
valid rendering options, no error was reported.

Diffstat:
Msrc/solstice_args.c | 11+++++++----
Msrc/test_solstice_args.c | 37+++++++++++++++++++++++++++++++++++++
2 files changed, 44 insertions(+), 4 deletions(-)

diff --git a/src/solstice_args.c b/src/solstice_args.c @@ -182,6 +182,7 @@ parse_image_definition tk = strtok_r(buf, "x", &ctx); res = cstr_to_ulong(tk, width); + if(res == RES_OK && !*width) res = RES_BAD_ARG; if(res != RES_OK) { fprintf(stderr, "Invalid image width `%s'\n", tk); return res; @@ -189,6 +190,7 @@ parse_image_definition tk = strtok_r(NULL, "", &ctx); res = cstr_to_ulong(tk, height); + if(res == RES_OK && !*height) res = RES_BAD_ARG; if(res != RES_OK) { fprintf(stderr, "Invalid image height `%s'\n", tk); return res; @@ -225,13 +227,13 @@ parse_rendering_option(const char* str, struct solstice_args* args) goto error; } - if(!strcmp(key, "fov")) { + if(!strcmp(key, "fov")) { /* Camera horizontal field of view in degrees */ res = parse_fov(val, &args->camera.fov_x); if(res != RES_OK) goto error; - } else if(!strcmp(key, "img")) { + } else if(!strcmp(key, "img")) { /* Image definition */ res = parse_image_definition(val, &args->img.width, &args->img.height); if(res != RES_OK) goto error; - } else if(!strcmp(key, "pos")) { + } else if(!strcmp(key, "pos")) { /* Camera position */ res = cstr_to_list_double(val, ',', args->camera.pos, &len, 3); if(res == RES_OK && len != 3) res = RES_BAD_ARG; if(res != RES_OK ) { @@ -247,7 +249,7 @@ parse_rendering_option(const char* str, struct solstice_args* args) goto error; } args->camera.auto_look_at = 0; /* Disable auto look at */ - } else if(!strcmp(key, "up")) { + } else if(!strcmp(key, "up")) { /* Camera up vector */ res = cstr_to_list_double(val, ',', args->camera.up, &len, 3); if(res == RES_OK && len != 3) res = RES_BAD_ARG; if(res != RES_OK) { @@ -294,6 +296,7 @@ parse_rendering_options(const char* str, struct solstice_args* args) tk = strtok_r(buf, ":", &ctx); do { res = parse_rendering_option(tk, args); + if(res != RES_OK) goto error; tk = strtok_r(NULL, ":", &ctx); } while(tk); diff --git a/src/test_solstice_args.c b/src/test_solstice_args.c @@ -90,6 +90,7 @@ test_rendering(void) CHECK(args.camera.fov_x, SOLSTICE_ARGS_DEFAULT.camera.fov_x); CHECK(args.img.width, 1280); CHECK(args.img.height, 720); + CHECK(args.img.spp, SOLSTICE_ARGS_DEFAULT.img.spp); CHECK(args.quiet, 0); CHECK(args.output_filename, NULL); solstice_args_release(&args); @@ -104,6 +105,7 @@ test_rendering(void) CHECK(d3_eq(args.camera.up, SOLSTICE_ARGS_DEFAULT.camera.up), 1); CHECK(args.img.width, 640); CHECK(args.img.height, 480); + CHECK(args.img.spp, SOLSTICE_ARGS_DEFAULT.img.spp); CHECK(args.quiet, 1); CHECK(eq_eps(args.camera.fov_x, 70, 1.e-6), 1); CHECK(args.output_filename, NULL); @@ -118,12 +120,25 @@ test_rendering(void) CHECK(d3_eq(args.camera.up, d3(tmp, 0, 0, 1)), 1); CHECK(args.img.width, SOLSTICE_ARGS_DEFAULT.img.width); CHECK(args.img.height, SOLSTICE_ARGS_DEFAULT.img.height); + CHECK(args.img.spp, SOLSTICE_ARGS_DEFAULT.img.spp); CHECK(args.rendering, 1); CHECK(args.quiet, 0); CHECK(args.output_filename, NULL); solstice_args_release(&args); cmd_delete(cmd); + cmd = cmd_create(0, "test", "-r", "up=0,0,1:spp=4", NULL); + CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK); + CHECK(args.nrealisations, SOLSTICE_ARGS_DEFAULT.nrealisations); + CHECK(d3_eq(args.camera.up, d3(tmp, 0, 0, 1)), 1); + CHECK(args.img.width, SOLSTICE_ARGS_DEFAULT.img.width); + CHECK(args.img.height, SOLSTICE_ARGS_DEFAULT.img.height); + CHECK(args.rendering, 1); + CHECK(args.output_filename, NULL); + CHECK(args.img.spp, 4); + solstice_args_release(&args); + cmd_delete(cmd); + cmd = cmd_create(0, "test", "-r", "up=0,10,0", "-o", "my_output", NULL); CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK); CHECK(d3_eq(args.camera.up, d3(tmp, 0, 10, 0)), 1); @@ -133,6 +148,12 @@ test_rendering(void) solstice_args_release(&args); cmd_delete(cmd); + cmd = cmd_create(0, "test", "-r", "spp=16", NULL); + CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK); + CHECK(args.img.spp, 16); + solstice_args_release(&args); + cmd_delete(cmd); + cmd = cmd_create(0, "test", "-r", "up=0,1", NULL); CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); cmd_delete(cmd); @@ -151,6 +172,10 @@ test_rendering(void) solstice_args_release(&args); cmd_delete(cmd); + cmd = cmd_create(0, "test", "-r", "spp=0", NULL); + CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); + cmd_delete(cmd); + cmd = cmd_create(0, "test", "-r", "img=32X32", NULL); CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); cmd_delete(cmd); @@ -159,6 +184,18 @@ test_rendering(void) CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); cmd_delete(cmd); + cmd = cmd_create(0, "test", "-r", "img=0x64", NULL); + CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); + cmd_delete(cmd); + + cmd = cmd_create(0, "test", "-r", "img=64x0", NULL); + CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); + cmd_delete(cmd); + + cmd = cmd_create(0, "test", "-r", "img=32x32@12:up=0,0,1", NULL); + CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); + cmd_delete(cmd); + cmd = cmd_create(0, "test", "-r", "tgt=1,1,1:img=32x32:12", NULL); CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); cmd_delete(cmd);