Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
265 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,172 @@ | ||
/* | ||
* This code provides a glue layer between PhysicsFS and Simple Directmedia | ||
* Layer's (SDL) RWops i/o abstraction. | ||
* | ||
* License: this code is public domain. I make no warranty that it is useful, | ||
* correct, harmless, or environmentally safe. | ||
* | ||
* This particular file may be used however you like, including copying it | ||
* verbatim into a closed-source project, exploiting it commercially, and | ||
* removing any trace of my name from the source (although I hope you won't | ||
* do that). I welcome enhancements and corrections to this file, but I do | ||
* not require you to send me patches if you make changes. | ||
* | ||
* Unless otherwise stated, the rest of PhysicsFS falls under the GNU Lesser | ||
* General Public License: http://www.gnu.org/licenses/lgpl.txt | ||
* | ||
* SDL falls under the LGPL, too. You can get SDL at http://www.libsdl.org/ | ||
* | ||
* This file was written by Ryan C. Gordon. (icculus@clutteredmind.org). | ||
*/ | ||
|
||
#include <stdio.h> /* used for SEEK_SET, SEEK_CUR, SEEK_END ... */ | ||
#include "physfsrwops.h" | ||
|
||
static int physfsrwops_seek(SDL_RWops *rw, int offset, int whence) | ||
{ | ||
PHYSFS_file *handle = (PHYSFS_file *) rw->hidden.unknown.data1; | ||
int pos = 0; | ||
|
||
if (whence == SEEK_SET) | ||
{ | ||
pos = offset; | ||
} /* if */ | ||
|
||
else if (whence == SEEK_CUR) | ||
{ | ||
int current = PHYSFS_tell(handle); | ||
if (current == -1) | ||
{ | ||
SDL_SetError("Can't find position in file: %s", | ||
PHYSFS_getLastError()); | ||
return(-1); | ||
} /* if */ | ||
|
||
if (offset == 0) /* this is a "tell" call. We're done. */ | ||
return(offset); | ||
|
||
pos = current + offset; | ||
} /* else if */ | ||
|
||
else if (whence == SEEK_END) | ||
{ | ||
int len = PHYSFS_fileLength(handle); | ||
if (len == -1) | ||
{ | ||
SDL_SetError("Can't find end of file: %s", PHYSFS_getLastError()); | ||
return(-1); | ||
} /* if */ | ||
|
||
pos = len + offset; | ||
} /* else if */ | ||
|
||
else | ||
{ | ||
SDL_SetError("Invalid 'whence' parameter."); | ||
return(-1); | ||
} /* else */ | ||
|
||
if (!PHYSFS_seek(handle, pos)) | ||
{ | ||
SDL_SetError("PhysicsFS error: %s", PHYSFS_getLastError()); | ||
return(-1); | ||
} /* if */ | ||
|
||
return(pos); | ||
} /* physfsrwops_seek */ | ||
|
||
|
||
static int physfsrwops_read(SDL_RWops *rw, void *ptr, int size, int maxnum) | ||
{ | ||
PHYSFS_file *handle = (PHYSFS_file *) rw->hidden.unknown.data1; | ||
int rc = PHYSFS_read(handle, ptr, size, maxnum); | ||
if (rc != maxnum) | ||
{ | ||
if (!PHYSFS_eof(handle)) /* not EOF? Must be an error. */ | ||
SDL_SetError("PhysicsFS error: %s", PHYSFS_getLastError()); | ||
} /* if */ | ||
|
||
return(rc); | ||
} /* physfsrwops_read */ | ||
|
||
|
||
static int physfsrwops_write(SDL_RWops *rw, const void *ptr, int size, int num) | ||
{ | ||
PHYSFS_file *handle = (PHYSFS_file *) rw->hidden.unknown.data1; | ||
int rc = PHYSFS_write(handle, ptr, size, num); | ||
if (rc != num) | ||
SDL_SetError("PhysicsFS error: %s", PHYSFS_getLastError()); | ||
|
||
return(rc); | ||
} /* 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 */ | ||
|
||
SDL_FreeRW(rw); | ||
return(0); | ||
} /* physfsrwops_close */ | ||
|
||
|
||
static SDL_RWops *create_rwops(PHYSFS_file *handle) | ||
{ | ||
SDL_RWops *retval = NULL; | ||
|
||
if (handle == NULL) | ||
SDL_SetError("PhysicsFS error: %s", PHYSFS_getLastError()); | ||
else | ||
{ | ||
retval = SDL_AllocRW(); | ||
if (retval != NULL) | ||
{ | ||
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); | ||
} /* 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); | ||
|
||
return(retval); | ||
} /* PHYSFSRWOPS_makeRWops */ | ||
|
||
|
||
SDL_RWops *PHYSFSRWOPS_openRead(const char *fname) | ||
{ | ||
return(create_rwops(PHYSFS_openRead(fname))); | ||
} /* PHYSFSRWOPS_openRead */ | ||
|
||
|
||
SDL_RWops *PHYSFSRWOPS_openWrite(const char *fname) | ||
{ | ||
return(create_rwops(PHYSFS_openWrite(fname))); | ||
} /* PHYSFSRWOPS_openWrite */ | ||
|
||
|
||
SDL_RWops *PHYSFSRWOPS_openAppend(const char *fname) | ||
{ | ||
return(create_rwops(PHYSFS_openAppend(fname))); | ||
} /* PHYSFSRWOPS_openAppend */ | ||
|
||
|
||
/* end of physfsrwops.c ... */ | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
/* | ||
* This code provides a glue layer between PhysicsFS and Simple Directmedia | ||
* Layer's (SDL) RWops i/o abstraction. | ||
* | ||
* License: this code is public domain. I make no warranty that it is useful, | ||
* correct, harmless, or environmentally safe. | ||
* | ||
* This particular file may be used however you like, including copying it | ||
* verbatim into a closed-source project, exploiting it commercially, and | ||
* removing any trace of my name from the source (although I hope you won't | ||
* do that). I welcome enhancements and corrections to this file, but I do | ||
* not require you to send me patches if you make changes. | ||
* | ||
* Unless otherwise stated, the rest of PhysicsFS falls under the GNU Lesser | ||
* General Public License: http://www.gnu.org/licenses/lgpl.txt | ||
* | ||
* SDL falls under the LGPL, too. You can get SDL at http://www.libsdl.org/ | ||
* | ||
* This file was written by Ryan C. Gordon. (icculus@clutteredmind.org). | ||
*/ | ||
|
||
#ifndef _INCLUDE_PHYSFSRWOPS_H_ | ||
#define _INCLUDE_PHYSFSRWOPS_H_ | ||
|
||
#include "physfs.h" | ||
#include "SDL.h" | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
#if (defined _MSC_VER) | ||
#define __EXPORT__ __declspec(dllexport) | ||
#else | ||
#define __EXPORT__ | ||
#endif | ||
|
||
/** | ||
* Open a platform-independent filename for reading, and make it accessible | ||
* via an SDL_RWops structure. The file will be closed in PhysicsFS when the | ||
* RWops is closed. PhysicsFS should be configured to your liking before | ||
* opening files through this method. | ||
* | ||
* @param filename File to open in platform-independent notation. | ||
* @return A valid SDL_RWops structure on success, NULL on error. Specifics | ||
* of the error can be gleaned from PHYSFS_getLastError(). | ||
*/ | ||
__EXPORT__ SDL_RWops *PHYSFSRWOPS_openRead(const char *fname); | ||
|
||
/** | ||
* Open a platform-independent filename for writing, and make it accessible | ||
* via an SDL_RWops structure. The file will be closed in PhysicsFS when the | ||
* RWops is closed. PhysicsFS should be configured to your liking before | ||
* opening files through this method. | ||
* | ||
* @param filename File to open in platform-independent notation. | ||
* @return A valid SDL_RWops structure on success, NULL on error. Specifics | ||
* of the error can be gleaned from PHYSFS_getLastError(). | ||
*/ | ||
__EXPORT__ SDL_RWops *PHYSFSRWOPS_openWrite(const char *fname); | ||
|
||
/** | ||
* Open a platform-independent filename for appending, and make it accessible | ||
* via an SDL_RWops structure. The file will be closed in PhysicsFS when the | ||
* RWops is closed. PhysicsFS should be configured to your liking before | ||
* opening files through this method. | ||
* | ||
* @param filename File to open in platform-independent notation. | ||
* @return A valid SDL_RWops structure on success, NULL on error. Specifics | ||
* of the error can be gleaned from PHYSFS_getLastError(). | ||
*/ | ||
__EXPORT__ SDL_RWops *PHYSFSRWOPS_openAppend(const char *fname); | ||
|
||
/** | ||
* Make a SDL_RWops from an existing PhysicsFS file handle. You should | ||
* dispose of any references to the handle after successful creation of | ||
* the RWops. The actual PhysicsFS handle will be destroyed when the | ||
* RWops is closed. | ||
* | ||
* @param handle a valid PhysicsFS file handle. | ||
* @return A valid SDL_RWops structure on success, NULL on error. Specifics | ||
* of the error can be gleaned from PHYSFS_getLastError(). | ||
*/ | ||
__EXPORT__ SDL_RWops *PHYSFSRWOPS_makeRWops(PHYSFS_file *handle); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* include-once blocker */ | ||
|
||
/* end of physfsrwops.h ... */ | ||
|