loader_aw

Load OBJ/MTL file formats
git clone git://git.meso-star.fr/loader_aw.git
Log | Files | Refs | README | LICENSE

commit 3645584cb0468d78aaaf8bccf7fbd5641275e950
parent 69abdcb05bd5928413c218e10fc22c0aafe8eb2c
Author: vaplv <vaplv@free.fr>
Date:   Sun, 20 Jul 2014 16:38:08 +0200

Take into account the tab separator in obj loading

Diffstat:
Msrc/aw_obj.c | 23++++++++++++++---------
Msrc/test_aw_obj.c | 8++++----
2 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/src/aw_obj.c b/src/aw_obj.c @@ -204,7 +204,7 @@ parse_face(struct aw_obj* obj, char** word_tk) /* Note that the obj indexation starts at 1 rather than 0. We thus subtract 1 * to the vertex attribute indices in order to match the C memory layout */ - while((word = strtok_r(NULL, " ", word_tk))) { + while((word = strtok_r(NULL, " \t", word_tk))) { char* id, *id_tk, *id_pos; struct vertex vert = VERTEX_NULL; @@ -265,7 +265,7 @@ parse_group(struct aw_obj* obj, char** word_tk) flush_groups(obj); - word = strtok_r(NULL, " ", word_tk); + word = strtok_r(NULL, " \t", word_tk); if(!word) { res = AW_BAD_ARGUMENT; goto error; @@ -287,7 +287,7 @@ parse_group(struct aw_obj* obj, char** word_tk) } grp->iface = darray_face_size_get(&obj->faces); grp->nfaces = 0; - } while((word = strtok_r(NULL, " ", word_tk))); + } while((word = strtok_r(NULL, " \t", word_tk))); exit: return res; @@ -308,7 +308,7 @@ parse_smooth_group(struct aw_obj* obj, char** word_tk) flush_smooth_group(obj); - word = strtok_r(NULL, " ", word_tk); + word = strtok_r(NULL, " \t", word_tk); if(!strcmp(word, "off")) { grp.is_smoothed = 0; } else if(!strcmp(word, "on")) { @@ -337,7 +337,7 @@ parse_mtllib(struct aw_obj* obj, char** word_tk) enum aw_result res = AW_OK; ASSERT(obj && word_tk); - word = strtok_r(NULL, " ", word_tk); + word = strtok_r(NULL, " \t", word_tk); if(!word) { res = AW_BAD_ARGUMENT; goto error; @@ -355,7 +355,7 @@ parse_mtllib(struct aw_obj* obj, char** word_tk) res = AW_MEMORY_ERROR; goto error; } - } while((word = strtok_r(NULL, " ", word_tk))); + } while((word = strtok_r(NULL, " \t", word_tk))); exit: return res; @@ -376,7 +376,7 @@ parse_usemtl(struct aw_obj* obj, char** word_tk) flush_usemtl(obj); - word= strtok_r(NULL, " ", word_tk); + word= strtok_r(NULL, " \t", word_tk); if(!word_tk) { res = AW_BAD_ARGUMENT; goto error; @@ -410,7 +410,7 @@ parse_obj_line(struct aw_obj* obj, char* line) enum aw_result res = AW_OK; ASSERT(obj && line); - word = strtok_r(line, " ", &word_tk); + word = strtok_r(line, " \t", &word_tk); while(word) { if(word[0] == '#') { /* Comment */ break; @@ -437,7 +437,12 @@ parse_obj_line(struct aw_obj* obj, char* line) } if(res != AW_OK) goto error; - word = strtok_r(NULL, " ", &word_tk); + if((word = strtok_r(NULL, " ", &word_tk))) { + fprintf(stderr, "%s:%lu: unexpected directive %s\n", + obj->filename, obj->iline, word); + res = AW_BAD_ARGUMENT; + goto error; + } } exit: return res; diff --git a/src/test_aw_obj.c b/src/test_aw_obj.c @@ -225,7 +225,7 @@ test_cube(struct aw_obj* obj) static const char* cube_obj = "# Cube with a different material applied to each of its faces\n" "mtllib master.mtl\n" - "v 0.0000 2.0000 2.0000\n" + "v\t0.0000 2.0000 2.0000\n" "v 0.0000 0.0000 2.0000\n" "v 2.0000 0.0000 2.0000\n" "v 2.0000 2.0000 2.0000\n" @@ -236,7 +236,7 @@ test_cube(struct aw_obj* obj) "# 8 vertices\n" "g front\n" "usemtl red\n" - "f 1 2 3 4\n" + "f 1\t\t\t 2 3 4\n" "g back\n" "usemtl blue\n" "f 8 7 6 5\n" @@ -244,8 +244,8 @@ test_cube(struct aw_obj* obj) "usemtl green\n" "f 4 3 7 8\n" "g top\n" - "usemtl gold\n" - "f 5 1 4 8\n" + "usemtl\tgold\n" + "f 5 1\t4 8\n" "g left\n" "usemtl orange\n" "f 5 6 2 1\n"