From 42be0046aabd350901d9bc97e13de857ced43b48 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 28 Jul 2002 21:03:27 +0000 Subject: [PATCH] Natural language #defines and build system support. --- archivers/dir.c | 2 +- archivers/grp.c | 2 +- archivers/zip.c | 57 +++++------- configure.in | 29 +++++- physfs.c | 2 +- physfs_internal.h | 143 ++++++++++++++++++++++------- platform/macclassic.c | 92 +++++++++---------- platform/os2.c | 208 ++++++++++-------------------------------- platform/win32.c | 8 +- 9 files changed, 262 insertions(+), 281 deletions(-) diff --git a/archivers/dir.c b/archivers/dir.c index be98bd8b..8304d547 100644 --- a/archivers/dir.c +++ b/archivers/dir.c @@ -49,7 +49,7 @@ static void DIR_dirClose(DirHandle *h); const PHYSFS_ArchiveInfo __PHYSFS_ArchiveInfo_DIR = { "", - "non-archive directory I/O", + DIR_ARCHIVE_DESCRIPTION, "Ryan C. Gordon ", "http://icculus.org/physfs/", }; diff --git a/archivers/grp.c b/archivers/grp.c index 4bb0dd8a..4746c085 100644 --- a/archivers/grp.c +++ b/archivers/grp.c @@ -93,7 +93,7 @@ static FileHandle *GRP_openRead(DirHandle *h, const char *name); const PHYSFS_ArchiveInfo __PHYSFS_ArchiveInfo_GRP = { "GRP", - "Build engine Groupfile format", + GRP_ARCHIVE_DESCRIPTION, "Ryan C. Gordon ", "http://icculus.org/physfs/", }; diff --git a/archivers/zip.c b/archivers/zip.c index 212bc9dd..c84630ed 100644 --- a/archivers/zip.c +++ b/archivers/zip.c @@ -147,7 +147,7 @@ static int zip_resolve(void *in, ZIPinfo *info, ZIPentry *entry); const PHYSFS_ArchiveInfo __PHYSFS_ArchiveInfo_ZIP = { "ZIP", - "PkZip/WinZip/Info-Zip compatible", + ZIP_ARCHIVE_DESCRIPTION, "Ryan C. Gordon ", "http://icculus.org/physfs/", }; @@ -183,46 +183,33 @@ const DirFunctions __PHYSFS_DirFunctions_ZIP = }; -/* - * Wrap all zlib calls in this, so the physfs error state is set appropriately. - */ -static int zlib_err(int rc) +static const char *zlib_error_string(int rc) { - const char *err = NULL; - switch (rc) { - case Z_OK: - case Z_STREAM_END: - break; /* not errors. */ - - case Z_ERRNO: - err = strerror(errno); - break; - - case Z_NEED_DICT: - err = "zlib: need dictionary"; - break; - case Z_DATA_ERROR: - err = "zlib: need dictionary"; - break; - case Z_MEM_ERROR: - err = "zlib: memory error"; - break; - case Z_BUF_ERROR: - err = "zlib: buffer error"; - break; - case Z_VERSION_ERROR: - err = "zlib: version error"; - break; - default: - err = "unknown zlib error"; - break; + case Z_OK: return(NULL); /* not an error. */ + case Z_STREAM_END: return(NULL); /* not an error. */ + case Z_ERRNO: return(strerror(errno)); + case Z_NEED_DICT: return(ERR_ZLIB_NEED_DICT); + case Z_DATA_ERROR: return(ERR_ZLIB_DATA_ERROR); + case Z_MEM_ERROR: return(ERR_ZLIB_MEMORY_ERROR); + case Z_BUF_ERROR: return(ERR_ZLIB_BUFFER_ERROR); + case Z_VERSION_ERROR: return(ERR_ZLIB_VERSION_ERROR); + default: return(ERR_ZLIB_UNKNOWN_ERROR); } /* switch */ - if (err != NULL) - __PHYSFS_setError(err); + return(NULL); +} /* zlib_error_string */ + +/* + * Wrap all zlib calls in this, so the physfs error state is set appropriately. + */ +static int zlib_err(int rc) +{ + const char *str = zlib_error_string(rc); + if (str != NULL) + __PHYSFS_setError(str); return(rc); } /* zlib_err */ diff --git a/configure.in b/configure.in index 9b281efc..187a14a7 100644 --- a/configure.in +++ b/configure.in @@ -229,9 +229,36 @@ if test x$enable_cdrom = xyes; then fi fi +dnl determine language. +physfslang=english +AC_ARG_ENABLE(language, +[ --enable-language=lang English, currently. [default=english]], + physfslang=`echo $enable_language |tr A-Z a-z`) + +AC_MSG_CHECKING([if language choice is supported]) +physfs_valid_lang=no +if test x$physfslang = xenglish; then + physfs_valid_lang=yes + AC_DEFINE([PHYSFS_LANG], PHYSFS_LANG_ENGLISH, [define desired natural language]) +fi + +dnl Add other language checks here... + +AC_MSG_RESULT([$physfs_valid_lang]) +if test x$physfs_valid_lang = xno; then + AC_MSG_WARN([***]) + AC_MSG_WARN([*** You've asked for "$physfslang" language support...]) + AC_MSG_WARN([*** ...but we don't support that.]) + AC_MSG_WARN([*** You could choose another language,]) + AC_MSG_WARN([*** but is this what you REALLY wanted?]) + AC_MSG_WARN([*** Please see the LANG section of physfs_internal.h]) + AC_MSG_WARN([*** for info on writing a translation.]) + AC_MSG_WARN([***]) + AC_MSG_ERROR([*** unsupported language. stop.]) +fi + have_non_posix_threads=no -dnl AC_CHECK_HEADER(be/kernel/OS.h, this_is_beos=yes) AC_MSG_CHECKING([if this is BeOS]) if test x$build_os = xbeos; then this_is_beos=yes diff --git a/physfs.c b/physfs.c index cf56a535..52329d31 100644 --- a/physfs.c +++ b/physfs.c @@ -824,7 +824,7 @@ int PHYSFS_setSaneConfig(const char *organization, const char *appName, /* Root out archives, and add them to search path... */ if (archiveExt != NULL) { - char **rc = PHYSFS_enumerateFiles(""); + char **rc = PHYSFS_enumerateFiles("/"); char **i; size_t extlen = strlen(archiveExt); char *ext; diff --git a/physfs_internal.h b/physfs_internal.h index 02d090d3..85ddc22a 100644 --- a/physfs_internal.h +++ b/physfs_internal.h @@ -20,6 +20,117 @@ extern "C" { #endif + +/* The LANG section. */ +/* please send questions/translations to Ryan: icculus@clutteredmind.org. */ + +#if (!defined PHYSFS_LANG) +# define PHYSFS_LANG PHYSFS_LANG_ENGLISH +#endif + +#define PHYSFS_LANG_ENGLISH 1 /* English text by Ryan C. Gordon */ + + +#if (PHYSFS_LANG == PHYSFS_LANG_ENGLISH) + #define DIR_ARCHIVE_DESCRIPTION "Non-archive, direct filesystem I/O" + #define GRP_ARCHIVE_DESCRIPTION "Build engine Groupfile format" + #define ZIP_ARCHIVE_DESCRIPTION "PkZip/WinZip/Info-Zip compatible" + + #define ERR_IS_INITIALIZED "Already initialized" + #define ERR_NOT_INITIALIZED "Not initialized" + #define ERR_INVALID_ARGUMENT "Invalid argument" + #define ERR_FILES_STILL_OPEN "Files still open" + #define ERR_NO_DIR_CREATE "Failed to create directories" + #define ERR_OUT_OF_MEMORY "Out of memory" + #define ERR_NOT_IN_SEARCH_PATH "No such entry in search path" + #define ERR_NOT_SUPPORTED "Operation not supported" + #define ERR_UNSUPPORTED_ARCHIVE "Archive type unsupported" + #define ERR_NOT_A_HANDLE "Not a file handle" + #define ERR_INSECURE_FNAME "Insecure filename" + #define ERR_SYMLINK_DISALLOWED "Symbolic links are disabled" + #define ERR_NO_WRITE_DIR "Write directory is not set" + #define ERR_NO_SUCH_FILE "File not found" + #define ERR_NO_SUCH_PATH "Path not found" + #define ERR_NO_SUCH_VOLUME "Volume not found" + #define ERR_PAST_EOF "Past end of file" + #define ERR_ARC_IS_READ_ONLY "Archive is read-only" + #define ERR_IO_ERROR "I/O error" + #define ERR_CANT_SET_WRITE_DIR "Can't set write directory" + #define ERR_SYMLINK_LOOP "Infinite symbolic link loop" + #define ERR_COMPRESSION "(De)compression error" + #define ERR_NOT_IMPLEMENTED "Not implemented" + #define ERR_OS_ERROR "Operating system reported error" + #define ERR_FILE_EXISTS "File already exists" + #define ERR_NOT_A_FILE "Not a file" + #define ERR_NOT_A_DIR "Not a directory" + #define ERR_NOT_AN_ARCHIVE "Not an archive" + #define ERR_CORRUPTED "Corrupted archive" + #define ERR_SEEK_OUT_OF_RANGE "Seek out of range" + #define ERR_BAD_FILENAME "Bad filename" + #define ERR_PHYSFS_BAD_OS_CALL "(BUG) PhysicsFS made a bad system call" + #define ERR_ARGV0_IS_NULL "argv0 is NULL" + #define ERR_ZLIB_NEED_DICT "zlib: need dictionary" + #define ERR_ZLIB_DATA_ERROR "zlib: data error" + #define ERR_ZLIB_MEMORY_ERROR "zlib: memory error" + #define ERR_ZLIB_BUFFER_ERROR "zlib: buffer error" + #define ERR_ZLIB_VERSION_ERROR "zlib: version error" + #define ERR_ZLIB_UNKNOWN_ERROR "zlib: unknown error" + #define ERR_SEARCHPATH_TRUNC "Search path was truncated" + #define ERR_GETMODFN_TRUNC "GetModuleFileName() was truncated" + #define ERR_GETMODFN_NO_DIR "GetModuleFileName() had no dir" + #define ERR_DISK_FULL "Disk is full" + #define ERR_DIRECTORY_FULL "Directory full" + #define ERR_MACOS_GENERIC "MacOS reported error (%d)" + #define ERR_OS2_GENERIC "OS/2 reported error (%d)" + #define ERR_VOL_LOCKED_HW "Volume is locked through hardware" + #define ERR_VOL_LOCKED_SW "Volume is locked through software" + #define ERR_FILE_LOCKED "File is locked" + #define ERR_FILE_OR_DIR_BUSY "File/directory is busy" + #define ERR_FILE_ALREADY_OPEN_W "File already open for writing" + #define ERR_FILE_ALREADY_OPEN_R "File already open for reading" + #define ERR_INVALID_REFNUM "Invalid reference number" + #define ERR_GETTING_FILE_POS "Error getting file position" + #define ERR_VOLUME_OFFLINE "Volume is offline" + #define ERR_PERMISSION_DENIED "Permission denied" + #define ERR_VOL_ALREADY_ONLINE "Volume already online" + #define ERR_NO_SUCH_DRIVE "No such drive" + #define ERR_NOT_MAC_DISK "Not a Macintosh disk" + #define ERR_VOL_EXTERNAL_FS "Volume belongs to an external filesystem" + #define ERR_PROBLEM_RENAME "Problem during rename" + #define ERR_BAD_MASTER_BLOCK "Bad master directory block" + #define ERR_CANT_MOVE_FORBIDDEN "Attempt to move forbidden" + #define ERR_WRONG_VOL_TYPE "Wrong volume type" + #define ERR_SERVER_VOL_LOST "Server volume has been disconnected" + #define ERR_FILE_ID_NOT_FOUND "File ID not found" + #define ERR_FILE_ID_EXISTS "File ID already exists" + #define ERR_SERVER_NO_RESPOND "Server not responding" + #define ERR_USER_AUTH_FAILED "User authentication failed" + #define ERR_PWORD_EXPIRED "Password has expired on server" + #define ERR_ACCESS_DENIED "Access denied" + #define ERR_NOT_A_DOS_DISK "Not a DOS disk" + #define ERR_SHARING_VIOLATION "Sharing violation" + #define ERR_CANNOT_MAKE "Cannot make" + #define ERR_DEV_IN_USE "Device already in use" + #define ERR_OPEN_FAILED "Open failed" + #define ERR_PIPE_BUSY "Pipe is busy" + #define ERR_SHARING_BUF_EXCEEDED "Sharing buffer exceeded" + #define ERR_TOO_MANY_HANDLES "Too many open handles" + #define ERR_SEEK_ERROR "Seek error" + #define ERR_DEL_CWD "Trying to delete current working directory" + #define ERR_WRITE_PROTECT_ERROR "Write protect error" + #define ERR_WRITE_FAULT "Write fault" + #define ERR_LOCK_VIOLATION "Lock violation" + #define ERR_GEN_FAILURE "General failure" + #define ERR_UNCERTAIN_MEDIA "Uncertain media" + #define ERR_PROT_VIOLATION "Protection violation" + #define ERR_BROKEN_PIPE "Broken pipe" +#else + #error Please define PHYSFS_LANG. +#endif + +/* end LANG section. */ + + struct __PHYSFS_DIRHANDLE__; struct __PHYSFS_FILEFUNCTIONS__; @@ -252,38 +363,6 @@ typedef struct __PHYSFS_DIRFUNCTIONS__ } DirFunctions; -/* error messages... */ -#define ERR_IS_INITIALIZED "Already initialized" -#define ERR_NOT_INITIALIZED "Not initialized" -#define ERR_INVALID_ARGUMENT "Invalid argument" -#define ERR_FILES_STILL_OPEN "Files still open" -#define ERR_NO_DIR_CREATE "Failed to create directories" -#define ERR_OUT_OF_MEMORY "Out of memory" -#define ERR_NOT_IN_SEARCH_PATH "No such entry in search path" -#define ERR_NOT_SUPPORTED "Operation not supported" -#define ERR_UNSUPPORTED_ARCHIVE "Archive type unsupported" -#define ERR_NOT_A_HANDLE "Not a file handle" -#define ERR_INSECURE_FNAME "Insecure filename" -#define ERR_SYMLINK_DISALLOWED "Symbolic links are disabled" -#define ERR_NO_WRITE_DIR "Write directory is not set" -#define ERR_NO_SUCH_FILE "No such file" -#define ERR_PAST_EOF "Past end of file" -#define ERR_ARC_IS_READ_ONLY "Archive is read-only" -#define ERR_IO_ERROR "I/O error" -#define ERR_CANT_SET_WRITE_DIR "Can't set write directory" -#define ERR_SYMLINK_LOOP "Infinite symbolic link loop" -#define ERR_COMPRESSION "(De)compression error" -#define ERR_NOT_IMPLEMENTED "Not implemented" -#define ERR_OS_ERROR "Operating system reported error" -#define ERR_FILE_EXISTS "File already exists" -#define ERR_NOT_A_DIR "Not a directory" -#define ERR_FILE_NOT_FOUND "File not found" -#define ERR_NOT_AN_ARCHIVE "Not an archive" -#define ERR_CORRUPTED "Corrupted archive" -#define ERR_SEEK_OUT_OF_RANGE "Seek out of range" -#define ERR_BAD_FILENAME "Bad filename" - - /* * Call this to set the message returned by PHYSFS_getLastError(). * Please only use the ERR_* constants above, or add new constants to the diff --git a/platform/macclassic.c b/platform/macclassic.c index 5eecacdc..fa6585d9 100644 --- a/platform/macclassic.c +++ b/platform/macclassic.c @@ -61,56 +61,56 @@ const char *__PHYSFS_platformDirSeparator = ":"; -static const char *get_os_error_string(OSErr err) +static const char *get_macos_error_string(OSErr err) { if (err == noErr) return(NULL); switch (err) { - case fnfErr: return("File not found"); - case notOpenErr: return("Volume not found"); - case dirFulErr: return("Directory full"); - case dskFulErr: return("Disk full"); - case nsvErr: return("Volume not found"); + case fnfErr: return(ERR_NO_SUCH_FILE); + case notOpenErr: return(ERR_NO_SUCH_VOLUME); + case dirFulErr: return(ERR_DIRECTORY_FULL); + case dskFulErr: return(ERR_DISK_FULL); + case nsvErr: return(ERR_NO_SUCH_VOLUME); case ioErr: return(ERR_IO_ERROR); case bdNamErr: return(ERR_BAD_FILENAME); case fnOpnErr: return(ERR_NOT_A_HANDLE); case eofErr: return(ERR_PAST_EOF); case posErr: return(ERR_SEEK_OUT_OF_RANGE); - case tmfoErr: return("Too many files open"); - case wPrErr: return("Volume is locked through hardware"); - case fLckdErr: return("File is locked"); - case vLckdErr: return("Volume is locked through software"); - case fBsyErr: return("File/directory is busy"); - case dupFNErr: return(FILE_ALREADY_EXISTS); - case opWrErr: return("File already open for writing"); - case rfNumErr: return("Invalid reference number"); - case gfpErr: return("Error getting file position"); - case volOffLinErr: return("Volume is offline"); - case permErr: return("Permission denied"); - case volOnLinErr: return("Volume already online"); - case nsDrvErr: return("No such drive"); - case noMacDskErr: return("Not a Macintosh disk"); - case extFSErr: return("Volume belongs to an external file system"); - case fsRnErr: return("Problem during rename"); - case badMDBErr: return("Bad master directory block"); - case wrPermErr: return("Write permission denied"); + case tmfoErr: return(ERR_TOO_MANY_HANDLES); + case wPrErr: return(ERR_VOL_LOCKED_HW); + case fLckdErr: return(ERR_FILE_LOCKED); + case vLckdErr: return(ERR_VOL_LOCKED_SW); + case fBsyErr: return(ERR_FILE_OR_DIR_BUSY); + case dupFNErr: return(ERR_FILE_ALREADY_EXISTS); + case opWrErr: return(ERR_FILE_ALREADY_OPEN_W); + case rfNumErr: return(ERR_INVALID_REFNUM); + case gfpErr: return(ERR_GETTING_FILE_POS); + case volOffLinErr: return(ERR_VOLUME_OFFLINE); + case permErr: return(ERR_PERMISSION_DENIED); + case volOnLinErr: return(ERR_VOL_ALREADY_ONLINE); + case nsDrvErr: return(ERR_NO_SUCH_DRIVE); + case noMacDskErr: return(ERR_NOT_MAC_DISK); + case extFSErr: return(ERR_VOL_EXTERNAL_FS); + case fsRnErr: return(ERR_PROBLEM_RENAME); + case badMDBErr: return(ERR_BAD_MASTER_BLOCK); + case wrPermErr: return(ERR_PERMISSION_DENIED); case memFullErr: return(ERR_OUT_OF_MEMORY); - case dirNFErr: return("Directory not found or incomplete pathname"); - case tmwdoErr: return("Too many working directories open"); - case badMovErr: return("Attempt to move forbidden"); - case wrgVolTypErr: return("Wrong volume type"); - case volGoneErr: return("Server volume has been disconnected"); + case dirNFErr: return(ERR_NO_SUCH_PATH); + case tmwdoErr: return(ERR_TOO_MANY_HANDLES); + case badMovErr: return(ERR_CANT_MOVE_FORBIDDEN); + case wrgVolTypErr: return(ERR_WRONG_VOL_TYPE); + case volGoneErr: return(ERR_SERVER_VOL_LOST); case errFSNameTooLong: return(ERR_BAD_FILENAME); - case errFSNotAFolder: return("Not a folder"); - case errFSNotAFile: return("Not a file"); - case fidNotFound: return("File ID not found"); - case fidExists: return("File ID already exists"); - case afpAccessDenied: return("Access denied"); - case afpNoServer: return("Server not responding"); - case afpUserNotAuth: return("User authentication failed"); - case afpPwdExpiredErr: return("Password has expired on server"); + case errFSNotAFolder: return(ERR_NOT_A_DIR); + case errFSNotAFile: return(ERR_NOT_A_FILE); + case fidNotFound: return(ERR_FILE_ID_NOT_FOUND); + case fidExists: return(ERR_FILE_ID_EXISTS); + case afpAccessDenied: return(ERR_ACCESS_DENIED); + case afpNoServer: return(ERR_SERVER_NO_RESPOND); + case afpUserNotAuth: return(ERR_USER_AUTH_FAILED); + case afpPwdExpiredErr: return(ERR_PWORD_EXPIRED); case paramErr: case errFSBadFSRef: @@ -121,29 +121,29 @@ static const char *get_os_error_string(OSErr err) case errFSBadItemCount case errFSBadSearchParams case afpDenyConflict - return("(BUG) PhysicsFS gave wrong params to the OS."); + return(ERR_PHYSFS_BAD_OS_CALL); - default: return(ERR_OS_ERROR); + default: return(ERR_MACOS_GENERIC); } /* switch */ return(NULL); -} /* get_os_error_string */ +} /* get_macos_error_string */ -static OSErr oserr(OSErr err) +static OSErr oserr(OSErr retval) { char buf[128]; - const char *errstr = get_os_error_string(err); - if (err == ERR_OS_ERROR) + const char *errstr = get_macos_error_string(retval); + if (errstr == ERR_MACOS_GENERIC) { - snprintf(buf, "MacOS reported error (%d)", (int) err); + snprintf(buf, ERR_MACOS_GENERIC, (int) retval); errstr = buf; } /* if */ if (errstr != NULL) - __PHYSFS_SetError(errstr); + __PHYSFS_setError(errstr); - return(err); + return(retval); } /* oserr */ diff --git a/platform/os2.c b/platform/os2.c index fae6beb9..cb10226d 100644 --- a/platform/os2.c +++ b/platform/os2.c @@ -36,116 +36,40 @@ const char *__PHYSFS_platformDirSeparator = "\\"; -static APIRET os2err(APIRET retval) +static const char *get_os2_error_string(APIRET rc) { - const char *err = NULL; - - /* - * The ones that say "OS/2 reported" are more for PhysicsFS developer - * debugging. We give more generic messages for ones that are likely to - * fall through to an application. - */ - switch (retval) + switch (rc) { - case NO_ERROR: /* Don't set the PhysicsFS error message for these... */ - case ERROR_INTERRUPT: - case ERROR_TIMEOUT: - break; - - case ERROR_NOT_ENOUGH_MEMORY: - err = ERR_OUT_OF_MEMORY; - break; - - case ERROR_FILE_NOT_FOUND: - err = "File not found"; - break; - - case ERROR_PATH_NOT_FOUND: - err = "Path not found"; - break; - - case ERROR_ACCESS_DENIED: - err = "Access denied"; - break; - - case ERROR_NOT_DOS_DISK: - err = "Not a DOS disk"; - break; - - case ERROR_SHARING_VIOLATION: - err = "Sharing violation"; - break; - - case ERROR_CANNOT_MAKE: - err = "Cannot make"; - break; - - case ERROR_DEVICE_IN_USE: - err = "Device already in use"; - break; - - case ERROR_OPEN_FAILED: - err = "Open failed"; - break; - - case ERROR_DISK_FULL: - err = "Disk is full"; - break; - - case ERROR_PIPE_BUSY: - err = "Pipe busy"; - break; - - case ERROR_SHARING_BUFFER_EXCEEDED: - err = "Sharing buffer exceeded"; - break; - - case ERROR_FILENAME_EXCED_RANGE: - case ERROR_META_EXPANSION_TOO_LONG: - err = "Filename too big"; - break; - - case ERROR_TOO_MANY_HANDLES: - case ERROR_TOO_MANY_OPEN_FILES: - case ERROR_NO_MORE_SEARCH_HANDLES: - err = "Too many open handles"; - break; - - case ERROR_SEEK_ON_DEVICE: - err = "Seek error"; /* Is that what this error means? */ - break; - - case ERROR_NEGATIVE_SEEK: - err = "Seek past start of file"; - break; - - case ERROR_CURRENT_DIRECTORY: - err = "Trying to delete current working directory"; - break; - - case ERROR_WRITE_PROTECT: - err = "Write protect error"; - break; - - case ERROR_WRITE_FAULT: - err = "Write fault"; - break; - - case ERROR_LOCK_VIOLATION: - err = "Lock violation"; - break; - - case ERROR_GEN_FAILURE: - err = "General failure"; - break; - - case ERROR_UNCERTAIN_MEDIA: - err = "Uncertain media"; - break; - - case ERROR_PROTECTION_VIOLATION: - err = "Protection violation"; - break; + case NO_ERROR: return(NULL); /* not an error. */ + case ERROR_INTERRUPT: return(NULL); /* not an error. */ + case ERROR_TIMEOUT: return(NULL); /* not an error. */ + case ERROR_NOT_ENOUGH_MEMORY: return(ERR_OUT_OF_MEMORY); + case ERROR_FILE_NOT_FOUND: return(ERR_NO_SUCH_FILE); + case ERROR_PATH_NOT_FOUND: return(ERR_NO_SUCH_PATH); + case ERROR_ACCESS_DENIED: return(ERR_ACCESS_DENIED); + case ERROR_NOT_DOS_DISK: return(ERR_NOT_A_DOS_DISK); + case ERROR_SHARING_VIOLATION: return(ERR_SHARING_VIOLATION); + case ERROR_CANNOT_MAKE: return(ERR_CANNOT_MAKE); + case ERROR_DEVICE_IN_USE: return(ERR_DEV_IN_USE); + case ERROR_OPEN_FAILED: return(ERR_OPEN_FAILED); + case ERROR_DISK_FULL: return(ERR_DISK_FULL); + case ERROR_PIPE_BUSY: return(ERR_PIPE_BUSY); + case ERROR_SHARING_BUFFER_EXCEEDED: return(ERR_SHARING_BUF_EXCEEDED); + case ERROR_FILENAME_EXCED_RANGE: return(ERR_BAD_FILENAME); + case ERROR_META_EXPANSION_TOO_LONG: return(ERR_BAD_FILENAME); + case ERROR_TOO_MANY_HANDLES: return(ERR_TOO_MANY_HANDLES); + case ERROR_TOO_MANY_OPEN_FILES: return(ERR_TOO_MANY_HANDLES); + case ERROR_NO_MORE_SEARCH_HANDLES: return(ERR_TOO_MANY_HANDLES); + case ERROR_SEEK_ON_DEVICE: return(ERR_SEEK_ERROR); + case ERROR_NEGATIVE_SEEK: return(ERR_SEEK_OUT_OF_RANGE); + case ERROR_DEL_CURRENT_DIRECTORY: return(ERR_DEL_CWD); + case ERROR_WRITE_PROTECT: return(ERR_WRITE_PROTECT_ERROR); + case ERROR_WRITE_FAULT: return(ERR_WRITE_FAULT); + case ERROR_LOCK_VIOLATION: return(ERR_LOCK_VIOLATION); + case ERROR_GEN_FAILURE: return(ERR_GENERAL_FAILURE); + case ERROR_UNCERTAIN_MEDIA: return(ERR_UNCERTAIN_MEDIA); + case ERROR_PROTECTION_VIOLATION: return(ERR_PROT_VIOLATION); + case ERROR_BROKEN_PIPE: return(ERR_BROKEN_PIPE); case ERROR_INVALID_PARAMETER: case ERROR_INVALID_NAME: @@ -159,66 +83,30 @@ static APIRET os2err(APIRET retval) case ERROR_BAD_LENGTH: case ERROR_BAD_DRIVER_LEVEL: case ERROR_DIRECT_ACCESS_HANDLE: - err = "OS/2 reported an invalid parameter to an API function"; - break; - - case ERROR_NO_VOLUME_LABEL: - err = "OS/2 reported no volume label"; - break; - - case ERROR_NO_MORE_FILES: - err = "OS/2 reported no more files"; - break; - - case ERROR_MONITORS_NOT_SUPPORTED: - err = "OS/2 reported monitors not supported"; - break; - - case ERROR_BROKEN_PIPE: - err = "OS/2 reported a broken pipe"; - break; - - case ERROR_MORE_DATA: - err = "OS/2 reported \"more data\" (?)"; - break; - - case ERROR_EAS_DIDNT_FIT: - err = "OS/2 reported Extended Attributes didn't fit"; - break; - - case ERROR_INVALID_EA_NAME: - err = "OS/2 reported an invalid Extended Attribute name"; - break; - - case ERROR_EA_LIST_INCONSISTENT: - err = "OS/2 reported an inconsistent Extended Attribute list"; - break; - - case ERROR_SEM_OWNER_DIED: - err = "OS/2 reported that semaphore owner died"; - break; + case ERROR_NOT_OWNER: + return(ERR_PHYSFS_BAD_OS_CALL); - case ERROR_TOO_MANY_SEM_REQUESTS: - err = "OS/2 reported too many semaphore requests"; - break; + default: return(ERR_OS2_GENERIC); + } /* switch */ - case ERROR_SEM_BUSY: - err = "OS/2 reported a blocked semaphore"; - break; + return(NULL); +} /* get_os2_error_string */ - case ERROR_NOT_OWNER: - err = "OS/2 reported that we used a resource we don't own."; - break; - default: - err = "OS/2 reported back with unrecognized error code"; - break; - } /* switch */ +static APIRET os2err(APIRET retval) +{ + char buf[128]; + const char *err = get_os2_error_string(retval); + if (err == ERR_OS2_GENERIC) + { + snprintf(buf, ERR_OS2_GENERIC, (int) retval); + err = buf; + } /* if */ if (err != NULL) __PHYSFS_setError(err); - return(retval); + return(err); } /* os2err */ diff --git a/platform/win32.c b/platform/win32.c index da31d126..a3236b93 100644 --- a/platform/win32.c +++ b/platform/win32.c @@ -125,12 +125,12 @@ static char *getExePath(const char *argv0) /* make sure the string was not truncated. */ if (__PHYSFS_platformStricmp(&retval[buflen - 4], ".exe") != 0) - __PHYSFS_setError("WIN32: GetModuleFileName() got truncated."); + __PHYSFS_setError(ERR_GOTMODFN_TRUNC); else { ptr = strrchr(retval, '\\'); if (ptr == NULL) - __PHYSFS_setError("WIN32: GetModuleFileName() had no dir."); + __PHYSFS_setError(ERR_GETMODFN_NO_DIR); else { *(ptr + 1) = '\0'; /* chop off filename. */ @@ -144,14 +144,14 @@ static char *getExePath(const char *argv0) if (!success) { if (argv0 == NULL) - __PHYSFS_setError("WIN32: argv0 is NULL."); + __PHYSFS_setError(ERR_ARGV0_IS_NULL); else { buflen = SearchPath(NULL, argv0, NULL, MAX_PATH+1, retval, &ptr); if (buflen == 0) __PHYSFS_setError(win32strerror()); else if (buflen > MAX_PATH) - __PHYSFS_setError("Win32: SearchPath() got truncated."); + __PHYSFS_setError(ERR_SEARCHPATH_TRUNC); else success = 1; } /* else */