rngrd

Describe a surface and its physical properties
git clone git://git.meso-star.fr/rngrd.git
Log | Files | Refs | README | LICENSE

commit 86c79f446dae8b2fee6ca5de99d0c625be33be2c
parent eeeee1fdba9c7282a5e056efe67c5a9747a6d4c4
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Fri, 15 Jul 2022 10:34:23 +0200

Add material filename expansion

Diffstat:
Msrc/rngrd_setup_properties.c | 35+++++++++++++++++++++++++----------
1 file changed, 25 insertions(+), 10 deletions(-)

diff --git a/src/rngrd_setup_properties.c b/src/rngrd_setup_properties.c @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#define _POSIX_C_SOURCE 200112L /* strtok_r */ +#define _POSIX_C_SOURCE 200112L /* strtok_r and wordexp */ #include "rngrd.h" #include "rngrd_c.h" @@ -30,6 +30,7 @@ #include <rsys/text_reader.h> #include <string.h> +#include <wordexp.h> /******************************************************************************* * Helper functions @@ -43,15 +44,15 @@ check_sbuf_desc ASSERT(ground && desc && args); if(desc->size != ground->ntriangles) { - log_err(ground, + log_err(ground, "%s: no sufficient surface properties regarding the mesh %s.\n", args->props_filename, args->smsh_filename); return RES_BAD_ARG; } - if(desc->szitem != 16 - || desc->alitem != 16 - || desc->pitch != 16) { + if(desc->szitem != 8 + || desc->alitem != 8 + || desc->pitch != 8) { log_err(ground, "%s: unexpected layout of properties\n", args->props_filename); return RES_BAD_ARG; @@ -63,11 +64,14 @@ check_sbuf_desc static res_T parse_mtl(struct rngrd* ground, struct txtrdr* txtrdr, struct mrumtl** out_mtl) { + wordexp_t wexp; char* tk = NULL; char* tk_ctx = NULL; struct mrumtl_create_args args = MRUMTL_CREATE_ARGS_DEFAULT; struct mrumtl* mtl = NULL; + int wexp_is_allocated = 1; res_T res = RES_OK; + int err = 0; ASSERT(ground && txtrdr && out_mtl); res = txtrdr_read_line(txtrdr); @@ -91,9 +95,19 @@ parse_mtl(struct rngrd* ground, struct txtrdr* txtrdr, struct mrumtl** out_mtl) goto error; } - tk = strtok_r(txtrdr_get_line(txtrdr), " \t", &tk_ctx); + tk = strtok_r(txtrdr_get_line(txtrdr), "", &tk_ctx); ASSERT(tk); + err = wordexp(tk, &wexp, 0/*flags*/); + if(err) { + log_err(ground, "%s:%lu: unable to expand material filename\n", + txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr)); + res = RES_BAD_ARG; + goto error; + } + wexp_is_allocated = 1; + ASSERT(wexp.we_wordc != 0); + args.verbose = ground->verbose; res = mrumtl_create(&args, &mtl); if(res != RES_OK) { @@ -102,16 +116,17 @@ parse_mtl(struct rngrd* ground, struct txtrdr* txtrdr, struct mrumtl** out_mtl) goto error; } - res = mrumtl_load(mtl, tk); + res = mrumtl_load(mtl, wexp.we_wordv[0]); if(res != RES_OK) goto error; - tk = strtok_r(NULL, " \t", &tk_ctx); - if(tk) { + if(wexp.we_wordc > 1) { log_warn(ground, "%s:%lu: unexpected text `%s'\n", - txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr), tk); + txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr), + wexp.we_wordv[1]); } exit: + if(wexp_is_allocated) wordfree(&wexp); *out_mtl = mtl; return res; error: