diff --git a/src/resource/model.c b/src/resource/model.c index 4b76504c..de44dc5f 100644 --- a/src/resource/model.c +++ b/src/resource/model.c @@ -100,7 +100,12 @@ static void free_obj(ObjFileData *data) { } static void parse_obj(const char *filename, ObjFileData *data) { - FILE *fp = fopen(filename, "rb"); + SDL_RWops *rw = SDL_RWFromFile(filename, "r"); + + if(!rw) { + warnx("%s(): SDL_RWFromFile() failed: %s", __func__, SDL_GetError()); + return; + } char line[256]; Vector buf; @@ -109,7 +114,7 @@ static void parse_obj(const char *filename, ObjFileData *data) { memset(data, 0, sizeof(ObjFileData)); - while(fgets(line, sizeof(line), fp)) { + while(SDL_RWgets(rw, line, sizeof(line))) { linen++; char *first; @@ -192,7 +197,7 @@ static void parse_obj(const char *filename, ObjFileData *data) { } } - fclose(fp); + SDL_RWclose(rw); } Model* get_model(const char *name) { diff --git a/src/util.c b/src/util.c index 4043bef9..955bf09b 100644 --- a/src/util.c +++ b/src/util.c @@ -370,6 +370,22 @@ void png_init_rwops(png_structp png, SDL_RWops *rwops) { png_set_read_fn(png, rwops, png_rwops_read_data); } +char* SDL_RWgets(SDL_RWops *rwops, char *buf, size_t bufsize) { + char c, *ptr = buf, *end = buf + bufsize - 1; + assert(end > ptr); + + while((c = SDL_ReadU8(rwops)) && ptr <= end) { + if((*ptr++ = c) == '\n') + break; + } + + if(ptr == buf) + return NULL; + + *ptr = 0; + return buf; +} + // // misc utils // diff --git a/src/util.h b/src/util.h index 70ce532b..684d6652 100644 --- a/src/util.h +++ b/src/util.h @@ -99,6 +99,8 @@ Hashtable* parse_keyvalue_stream(SDL_RWops *strm, size_t tablesize); Hashtable* parse_keyvalue_file(const char *filename, size_t tablesize); void png_init_rwops(png_structp png, SDL_RWops *rwops); +char* SDL_RWgets(SDL_RWops *rwops, char *buf, size_t bufsize); + // // misc utils //