Kawe Mazidjatari b3a68ed095 Add EABase, EAThread and DirtySDK to R5sdk
DirtySDK (EA's Dirty Sockets library) will be used for the LiveAPI implementation, and depends on: EABase, EAThread.
2024-04-05 18:29:03 +02:00

200 lines
5.5 KiB
C

/*H********************************************************************************/
/*!
\File zfile.c
\Description
Platform-inspecific host file operations.
\Copyright
Copyright (c) 2005 Electronic Arts Inc.
\Version 02/16/2005 (jbrookes) First Version
*/
/********************************************************************************H*/
/*** Include files ****************************************************************/
#include <stdio.h>
#include <string.h>
#include "DirtySDK/platform.h"
#include "zmem.h"
#include "zlib.h"
#include "zfile.h"
/*** Defines **********************************************************************/
/*** Type Definitions *************************************************************/
/*** Variables ********************************************************************/
/*** Private Functions ************************************************************/
/*** Public functions *************************************************************/
/*F********************************************************************************/
/*!
\Function ZFileSize
\Description
Get file size.
\Input iFileId - file id to get size of
\Output
int32_t - file size, or -1 on error
\Version 02/16/2005 (jbrookes)
*/
/********************************************************************************F*/
int64_t ZFileSize(ZFileT iFileId)
{
int64_t iEnd = ZFileSeek(iFileId, 0, ZFILE_SEEKFLAG_END);
ZFileSeek(iFileId, 0, ZFILE_SEEKFLAG_SET);
return(iEnd);
}
/*F********************************************************************************/
/*!
\Function ZFileLoad
\Description
Open a file and read it into memory.
\Input *pFilename - pointer to name of file to read
\Input *pFileSize - [out] storage for file size
\Input uOpenFlags - open flags, or zero for default (READONLY)
\Output
char * - pointer to file data, or NULL
\Version 02/16/2005 (jbrookes)
*/
/********************************************************************************F*/
char *ZFileLoad(const char *pFileName, int32_t *pFileSize, uint32_t uOpenFlags)
{
int64_t iFileSize64;
int32_t iFileSize, iResult;
char *pFileMem;
ZFileT iFileId;
// determine open flags
if (uOpenFlags == 0)
{
uOpenFlags = ZFILE_OPENFLAG_RDONLY;
}
// open the file
iFileId = ZFileOpen(pFileName, uOpenFlags);
if (iFileId == ZFILE_INVALID)
{
printf("zfile: unable to open file '%s'\n", pFileName);
return(NULL);
}
// get the file size
iFileSize64 = ZFileSize(iFileId);
if (iFileSize64 < 0)
{
printf("zfile: unable to get size of file '%s'\n", pFileName);
return(NULL);
}
iFileSize = (int32_t)iFileSize64; // this function does not support files >2GB
// allocate and clear memory for the file
pFileMem = (char *) ZMemAlloc(iFileSize+1);
if (pFileMem == NULL)
{
printf("zfile: unable to allocate %d bytes to load file '%s'\n", iFileSize+1, pFileName);
return(NULL);
}
ds_memclr(pFileMem, iFileSize+1);
// read file into memory
iResult = ZFileRead(iFileId, pFileMem, iFileSize);
if (iResult <= 0)
{
printf("zfile: unable to read file '%s'\n", pFileName);
return(NULL);
}
/* null-terminate; we do this in addition to the memset up above because
under windows the size of a text file on disk may be larger than the
file in memory */
pFileMem[iResult] = '\0';
// if size parameter is not null, set it
if (pFileSize != NULL)
{
*pFileSize = iResult;
}
// close the file
iResult = ZFileClose(iFileId);
if (iResult < 0)
{
printf("zfile: error closing file '%s'\n", pFileName);
}
// return pointer to memory
return(pFileMem);
}
/*F********************************************************************************/
/*!
\Function ZFileSave
\Description
Save data to a file. (OVERWRITE and CREATE by default)
\Input *pFilename - pointer to name of file to read
\Input *pData - pointer to data to save to a file
\Input iSize - amount of data to save to the file
\Input uOpenFlags - open flags, or zero for default (WRONLY|CREATE)
\Output
int32_t - 0 if success, error code otherwise
\Version 03/18/2005 (jfrank)
*/
/********************************************************************************F*/
int32_t ZFileSave(const char *pFileName, const char *pData, int32_t iSize, uint32_t uOpenFlags)
{
int32_t iResult;
ZFileT iFileId;
// determine what flags to use
if (uOpenFlags == 0)
{
uOpenFlags = ZFILE_OPENFLAG_WRONLY | ZFILE_OPENFLAG_CREATE;
}
// open the file
iFileId = ZFileOpen(pFileName, uOpenFlags);
if (iFileId == ZFILE_INVALID)
{
ZPrintf("zfile: unable to open file '%s' with flags 0x%X\n", pFileName, uOpenFlags);
return(ZFILE_ERROR_FILEOPEN);
}
// now write the data
iResult = ZFileWrite(iFileId, (char *)pData, iSize);
if(iResult != iSize)
{
ZPrintf("zfile: write error - size to write [%d] size written [%d]\n", iSize, iResult);
return(ZFILE_ERROR_FILEWRITE);
}
// and close the file
iResult = ZFileClose(iFileId);
if(iResult != 0)
{
ZPrintf("zfile: close error [%d=0x%X]\n", iResult, iResult);
return(ZFILE_ERROR_FILECLOSE);
}
// else successful save occurred
return(ZFILE_ERROR_NONE);
}