/*=========================================================================

	FILEIO.CPP

	Author:  Tim Swann @ CLIMAX
	Created:
	Project:
	Purpose:

	Copyright (c) 1998 Climax Development Ltd

===========================================================================*/

/*----------------------------------------------------------------------
	Includes
	-------- */

#include "AsciiExp.h"
#include "ExpFileIO.h"


/*	Std Lib
	------- */

/*	Glib
	---- */

/*	Local
	----- */

/*	Graphics
	-------- */

/*----------------------------------------------------------------------
	Tyepdefs && Defines
	------------------- */

/*----------------------------------------------------------------------
	Structure defintions
	-------------------- */

/*----------------------------------------------------------------------
	Positional Vars
	--------------- */

/*----------------------------------------------------------------------
	Function Prototypes
	------------------- */

/*----------------------------------------------------------------------
	Vars
	---- */

/*----------------------------------------------------------------------
	Data
	---- */


/*----------------------------------------------------------------------
	Function:	
	Purpose:
	Params:
	Returns:
  ---------------------------------------------------------------------- */

void FIO_Stripfileinfo(char * Name, char * fname, char * ext, char * dir, char * drive)
{
	char tdrive[_MAX_DRIVE];
	char tdir[_MAX_DIR];
	char tfname[_MAX_FNAME];
	char text[_MAX_EXT];


	_splitpath(Name, tdrive, tdir, tfname, text);

	if (fname)
		strcpy(fname, tfname);

	if (ext)
		strcpy(ext, text);

	if (dir)
		strcpy(dir, tdir);

	if (drive)
		strcpy(drive, tdrive);

}


/*----------------------------------------------------------------------
	Function:	
	Purpose:
	Params:
	Returns:
  ---------------------------------------------------------------------- */

bool FIO_FileExists(const char * Name)
{
	int hFile;

	/* Open input file */
	hFile = _open(Name, _O_RDONLY | _O_BINARY);

	if(hFile != -1)
	{
		_close(hFile);							// file close
		return(TRUE);
	}
	else
	{
		return(FALSE);
	}
}


/*----------------------------------------------------------------------
	Function:	
	Purpose:
	Params:
	Returns:
  ---------------------------------------------------------------------- */

void * FIO_Read(char const * Name, int Offset)
{
	int		hFile;
	long	filelen;
	void *	pAddr;
	long	pos;


	/* Open input file */
	hFile = _open(Name, _O_RDONLY | _O_BINARY);

	if(hFile != -1)
	{
		filelen = FIO_FileLen(Name);		// length of file
		pAddr = malloc(filelen);			// allocate mainmemory

		pos = _lseek( hFile, Offset, SEEK_SET );
		if( pos == -1 )	assert(!"File seek");
		filelen -= pos;

		_read(hFile, pAddr, filelen);		// read in file
		_close(hFile);						// file close
	}
	else
	{
		assert(0);
	}
	return pAddr;
}


/*----------------------------------------------------------------------
	Function:	
	Purpose:
	Params:
	Returns:
  ---------------------------------------------------------------------- */

bool FIO_ReadAtAddr(char const * Name, unsigned char * Dest, int Len, int Offset)
{
	int		hFile;
	long	filelen;
	long	pos;


	/* Open input file */
	hFile = _open(Name, _O_RDONLY | _O_BINARY);

	if(hFile != -1)
	{
		filelen = FIO_FileLen(Name);			// length of file

		if (Len && (Len < filelen))	filelen = Len;

		pos = _lseek( hFile, Offset, SEEK_SET );
		if( pos == -1 )	assert(!"File seek");

		_read(hFile, Dest, filelen);			// read in file
		_close(hFile);							// file close
	}
	else
	{
		assert(0);
	}
	return TRUE;
}


/*----------------------------------------------------------------------
	Function:	
	Purpose:
	Params:
	Returns:
  ---------------------------------------------------------------------- */

int FIO_FileLen(const char * Name)
{
	int hFile;
	int filelen = 0;


	/* Open input file */
	hFile = _open(Name, _O_RDONLY | _O_BINARY);

	if(hFile != -1)
	{
		filelen = _filelength(hFile);			// length of file
		_close(hFile);							// file close
	}
	return filelen;
}


/*----------------------------------------------------------------------
	Function:	
	Purpose:
	Params:
	Returns:
  ---------------------------------------------------------------------- */

bool FIO_Save(const char * Name,unsigned char * Addr,int Len)
{
	HANDLE			hFile;
	UINT			fResult;
	DWORD			nWrited;


	/* Open output file */
	hFile = CreateFile(	Name,						/* output filename */
						GENERIC_WRITE,				/* mode = write */
						0,							/* share mode = not share */
						NULL,						/* security attribute = cancel */
						CREATE_ALWAYS,				/* create file always */
						FILE_ATTRIBUTE_NORMAL,		/* file attribute = normal */
						NULL						/* template file = non */
						);
	if(hFile)
	{
		fResult = WriteFile(hFile,			/* IN  : file handle */
							Addr,			/* IN  : pointer to write data */
							(DWORD)Len,		/* IN  : number of data in bytes */
							&nWrited,		/* OUT : number of data just writed */
							NULL			/* IN  : pointer to OVERLAPPED structure */
						  	);
		CloseHandle(hFile);							/* close file */

		if(fResult == FALSE)
			assert(!("SaveFile: ERROR Can not write file %s",Name));
	}
	else
	{
		return FALSE;
	}
	return TRUE;
}

  
  /*===========================================================================
 end */