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:
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: