From b209774f7b912b159b7172586b1bc45ba0e3084b Mon Sep 17 00:00:00 2001 From: Linus Probert Date: Thu, 22 Feb 2018 13:02:40 +0100 Subject: [PATCH] Optional physfs compile, removed deprectaions. --- CMakeLists.txt | 26 ++++- src/io_util.c | 8 +- src/main.c | 2 +- src/physfsrwops.c | 256 ++++++++++++++++++++++++---------------------- 4 files changed, 159 insertions(+), 133 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 63cabbc..23fc78e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,14 +5,13 @@ SET(CMAKE_COLOR_MAKEFILE ON) project(breakhack C) include(FindLua) +include(FindPhysFS) include(cmake/FindSDL2.cmake) include(cmake/FindSDL2_image.cmake) include(cmake/FindSDL2_ttf.cmake) include(cmake/FindSDL2_mixer.cmake) include(cmake/FindCCache.cmake) -add_subdirectory(physfs-3.0.1) - if (NOT WIN32) include(FindX11) include(cmake/FindCheck.cmake) @@ -23,8 +22,18 @@ configure_file( "${PROJECT_BINARY_DIR}/config.h" ) +if (NOT PHYSFS_FOUND) + add_subdirectory(physfs-3.0.1) + include_directories( + physfs-3.0.1 + ) +else (NOT PHYSFS_FOUND) + include_directories( + ${PHYSFS_INCLUDE_DIR} + ) +endif (NOT PHYSFS_FOUND) + include_directories( - physfs-3.0.1/src ${PROJECT_BINARY_DIR} ${LUA_INCLUDE_DIR} ${SDL2_INCLUDE_DIR} @@ -87,7 +96,6 @@ add_executable(breakhack ) target_link_libraries(breakhack - physfs ${LUA_LIBRARY} ${SDL2_LIBRARY} ${SDL2_IMAGE_LIBRARY} @@ -95,6 +103,16 @@ target_link_libraries(breakhack ${SDL2_MIXER_LIBRARY} ) +if (NOT PHYSFS_FOUND) + target_link_libraries(breakhack + physfs + ) +else (NOT PHYSFS_FOUND) + target_link_libraries(breakhack + ${PHYSFS_LIBRARY} + ) +endif (NOT PHYSFS_FOUND) + if (NOT WIN32) target_link_libraries(breakhack ${X11_LIBRARIES} diff --git a/src/io_util.c b/src/io_util.c index 4da3b34..f8bb780 100644 --- a/src/io_util.c +++ b/src/io_util.c @@ -6,8 +6,10 @@ SDL_RWops * io_load_rwops(const char *path) { - if (!PHYSFS_exists(path)) - fatal("Unable to open file %s: %s", path, PHYSFS_getLastError()); + if (!PHYSFS_exists(path)) { + PHYSFS_ErrorCode code = PHYSFS_getLastErrorCode(); + fatal("Unable to open file %s: (%d) %s", path, code, PHYSFS_getErrorByCode(code)); + } return PHYSFSRWOPS_openRead(path); -} \ No newline at end of file +} diff --git a/src/main.c b/src/main.c index 60c5567..70617db 100644 --- a/src/main.c +++ b/src/main.c @@ -613,7 +613,7 @@ int main(int argc, char *argv[]) UNUSED(argc); PHYSFS_init(argv[0]); - PHYSFS_addToSearchPath("assets", 0); + PHYSFS_mount("assets", NULL, 0); if (!init()) return 1; diff --git a/src/physfsrwops.c b/src/physfsrwops.c index 8e5857c..5b8ec84 100644 --- a/src/physfsrwops.c +++ b/src/physfsrwops.c @@ -37,11 +37,17 @@ #define RW_SEEK_END SEEK_END #endif +static const char *getLastPhysfsError(void) +{ + const PHYSFS_ErrorCode err = PHYSFS_getLastErrorCode(); + return (err) ? PHYSFS_getErrorByCode(err) : NULL; +} + #if TARGET_SDL2 static Sint64 SDLCALL physfsrwops_size(struct SDL_RWops *rw) { - PHYSFS_File *handle = (PHYSFS_File *) rw->hidden.unknown.data1; - return (Sint64) PHYSFS_fileLength(handle); + PHYSFS_File *handle = (PHYSFS_File *) rw->hidden.unknown.data1; + return (Sint64) PHYSFS_fileLength(handle); } /* physfsrwops_size */ #endif @@ -52,192 +58,192 @@ static Sint64 SDLCALL physfsrwops_seek(struct SDL_RWops *rw, Sint64 offset, int static int physfsrwops_seek(SDL_RWops *rw, int offset, int whence) #endif { - PHYSFS_File *handle = (PHYSFS_File *) rw->hidden.unknown.data1; - PHYSFS_sint64 pos = 0; + PHYSFS_File *handle = (PHYSFS_File *) rw->hidden.unknown.data1; + PHYSFS_sint64 pos = 0; - if (whence == RW_SEEK_SET) - pos = (PHYSFS_sint64) offset; + if (whence == RW_SEEK_SET) + pos = (PHYSFS_sint64) offset; - else if (whence == RW_SEEK_CUR) - { - const PHYSFS_sint64 current = PHYSFS_tell(handle); - if (current == -1) - { - SDL_SetError("Can't find position in file: %s", - PHYSFS_getLastError()); - return -1; - } /* if */ + else if (whence == RW_SEEK_CUR) + { + const PHYSFS_sint64 current = PHYSFS_tell(handle); + if (current == -1) + { - if (offset == 0) /* this is a "tell" call. We're done. */ - { - #if TARGET_SDL2 - return (Sint64) current; - #else - return (int) current; - #endif - } /* if */ + SDL_SetError("Can't find position in file: %s", + getLastPhysfsError()); + return -1; + } /* if */ - pos = current + ((PHYSFS_sint64) offset); - } /* else if */ + if (offset == 0) /* this is a "tell" call. We're done. */ + { +#if TARGET_SDL2 + return (Sint64) current; +#else + return (int) current; +#endif + } /* if */ - else if (whence == RW_SEEK_END) - { - const PHYSFS_sint64 len = PHYSFS_fileLength(handle); - if (len == -1) - { - SDL_SetError("Can't find end of file: %s", PHYSFS_getLastError()); - return -1; - } /* if */ + pos = current + ((PHYSFS_sint64) offset); + } /* else if */ - pos = len + ((PHYSFS_sint64) offset); - } /* else if */ + else if (whence == RW_SEEK_END) + { + const PHYSFS_sint64 len = PHYSFS_fileLength(handle); + if (len == -1) + { + SDL_SetError("Can't find end of file: %s", getLastPhysfsError()); + return -1; + } /* if */ - else - { - SDL_SetError("Invalid 'whence' parameter."); - return -1; - } /* else */ + pos = len + ((PHYSFS_sint64) offset); + } /* else if */ - if ( pos < 0 ) - { - SDL_SetError("Attempt to seek past start of file."); - return -1; - } /* if */ - - if (!PHYSFS_seek(handle, (PHYSFS_uint64) pos)) - { - SDL_SetError("PhysicsFS error: %s", PHYSFS_getLastError()); - return -1; - } /* if */ + else + { + SDL_SetError("Invalid 'whence' parameter."); + return -1; + } /* else */ - #if TARGET_SDL2 - return (Sint64) pos; - #else - return (int) pos; - #endif + if ( pos < 0 ) + { + SDL_SetError("Attempt to seek past start of file."); + return -1; + } /* if */ + + if (!PHYSFS_seek(handle, (PHYSFS_uint64) pos)) + { + SDL_SetError("PhysicsFS error: %s", getLastPhysfsError()); + return -1; + } /* if */ + +#if TARGET_SDL2 + return (Sint64) pos; +#else + return (int) pos; +#endif } /* physfsrwops_seek */ #if TARGET_SDL2 static size_t SDLCALL physfsrwops_read(struct SDL_RWops *rw, void *ptr, - size_t size, size_t maxnum) + size_t size, size_t maxnum) #else static int physfsrwops_read(SDL_RWops *rw, void *ptr, int size, int maxnum) #endif { - PHYSFS_File *handle = (PHYSFS_File *) rw->hidden.unknown.data1; - const PHYSFS_uint64 readlen = (PHYSFS_uint64) (maxnum * size); - const PHYSFS_sint64 rc = PHYSFS_readBytes(handle, ptr, readlen); - if (rc != ((PHYSFS_sint64) readlen)) - { - if (!PHYSFS_eof(handle)) /* not EOF? Must be an error. */ - { - SDL_SetError("PhysicsFS error: %s", PHYSFS_getLastError()); + PHYSFS_File *handle = (PHYSFS_File *) rw->hidden.unknown.data1; + const PHYSFS_uint64 readlen = (PHYSFS_uint64) (maxnum * size); + const PHYSFS_sint64 rc = PHYSFS_readBytes(handle, ptr, readlen); + if (rc != ((PHYSFS_sint64) readlen)) + { + if (!PHYSFS_eof(handle)) /* not EOF? Must be an error. */ + { + SDL_SetError("PhysicsFS error: %s", getLastPhysfsError()); - #if TARGET_SDL2 - return 0; - #else - return -1; - #endif - } /* if */ - } /* if */ +#if TARGET_SDL2 + return 0; +#else + return -1; +#endif + } /* if */ + } /* if */ - #if TARGET_SDL2 - return (size_t) rc / size; - #else - return (int) rc / size; - #endif +#if TARGET_SDL2 + return (size_t) rc / size; +#else + return (int) rc / size; +#endif } /* physfsrwops_read */ #if TARGET_SDL2 static size_t SDLCALL physfsrwops_write(struct SDL_RWops *rw, const void *ptr, - size_t size, size_t num) + size_t size, size_t num) #else static int physfsrwops_write(SDL_RWops *rw, const void *ptr, int size, int num) #endif { - PHYSFS_File *handle = (PHYSFS_File *) rw->hidden.unknown.data1; - const PHYSFS_uint64 writelen = (PHYSFS_uint64) (num * size); - const PHYSFS_sint64 rc = PHYSFS_writeBytes(handle, ptr, writelen); - if (rc != ((PHYSFS_sint64) writelen)) - SDL_SetError("PhysicsFS error: %s", PHYSFS_getLastError()); + PHYSFS_File *handle = (PHYSFS_File *) rw->hidden.unknown.data1; + const PHYSFS_uint64 writelen = (PHYSFS_uint64) (num * size); + const PHYSFS_sint64 rc = PHYSFS_writeBytes(handle, ptr, writelen); + if (rc != ((PHYSFS_sint64) writelen)) + SDL_SetError("PhysicsFS error: %s", getLastPhysfsError()); - #if TARGET_SDL2 - return (size_t) rc; - #else - return (int) rc; - #endif +#if TARGET_SDL2 + return (size_t) rc; +#else + return (int) rc; +#endif } /* physfsrwops_write */ - static int physfsrwops_close(SDL_RWops *rw) { - PHYSFS_File *handle = (PHYSFS_File *) rw->hidden.unknown.data1; - if (!PHYSFS_close(handle)) - { - SDL_SetError("PhysicsFS error: %s", PHYSFS_getLastError()); - return -1; - } /* if */ + PHYSFS_File *handle = (PHYSFS_File *) rw->hidden.unknown.data1; + if (!PHYSFS_close(handle)) + { + SDL_SetError("PhysicsFS error: %s", getLastPhysfsError()); + return -1; + } /* if */ - SDL_FreeRW(rw); - return 0; + SDL_FreeRW(rw); + return 0; } /* physfsrwops_close */ static SDL_RWops *create_rwops(PHYSFS_File *handle) { - SDL_RWops *retval = NULL; + SDL_RWops *retval = NULL; - if (handle == NULL) - SDL_SetError("PhysicsFS error: %s", PHYSFS_getLastError()); - else - { - retval = SDL_AllocRW(); - if (retval != NULL) - { - #if TARGET_SDL2 - retval->size = physfsrwops_size; - #endif - retval->seek = physfsrwops_seek; - retval->read = physfsrwops_read; - retval->write = physfsrwops_write; - retval->close = physfsrwops_close; - retval->hidden.unknown.data1 = handle; - } /* if */ - } /* else */ + if (handle == NULL) + SDL_SetError("PhysicsFS error: %s", getLastPhysfsError()); + else + { + retval = SDL_AllocRW(); + if (retval != NULL) + { +#if TARGET_SDL2 + retval->size = physfsrwops_size; +#endif + retval->seek = physfsrwops_seek; + retval->read = physfsrwops_read; + retval->write = physfsrwops_write; + retval->close = physfsrwops_close; + retval->hidden.unknown.data1 = handle; + } /* if */ + } /* else */ - return retval; + return retval; } /* create_rwops */ SDL_RWops *PHYSFSRWOPS_makeRWops(PHYSFS_File *handle) { - SDL_RWops *retval = NULL; - if (handle == NULL) - SDL_SetError("NULL pointer passed to PHYSFSRWOPS_makeRWops()."); - else - retval = create_rwops(handle); + SDL_RWops *retval = NULL; + if (handle == NULL) + SDL_SetError("NULL pointer passed to PHYSFSRWOPS_makeRWops()."); + else + retval = create_rwops(handle); - return retval; + return retval; } /* PHYSFSRWOPS_makeRWops */ SDL_RWops *PHYSFSRWOPS_openRead(const char *fname) { - return create_rwops(PHYSFS_openRead(fname)); + return create_rwops(PHYSFS_openRead(fname)); } /* PHYSFSRWOPS_openRead */ SDL_RWops *PHYSFSRWOPS_openWrite(const char *fname) { - return create_rwops(PHYSFS_openWrite(fname)); + return create_rwops(PHYSFS_openWrite(fname)); } /* PHYSFSRWOPS_openWrite */ SDL_RWops *PHYSFSRWOPS_openAppend(const char *fname) { - return create_rwops(PHYSFS_openAppend(fname)); + return create_rwops(PHYSFS_openAppend(fname)); } /* PHYSFSRWOPS_openAppend */