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