File:  [RetroPC.NET] / xmil / nds / win32s / dosio.cpp
Revision 1.1: download - view: text, annotated - select for diffs
Tue Mar 24 22:52:53 2009 JST (16 years, 7 months ago) by yui
Branches: MAIN
CVS tags: HEAD
add nds-win32 simulation project

#include	"compiler.h"
#include	"dosio.h"


static TCHAR s_szCurPath[MAX_PATH];
static LPTSTR s_lpszFile = s_szCurPath;

// ----

void dosio_init() { }
void dosio_term() { }

											// ファイル操作
FILEH __stdcall file_open(LPCTSTR lpcszPath)
{
	FILEH fhRet = CreateFile(lpcszPath, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (fhRet == INVALID_HANDLE_VALUE)
	{
		fhRet = CreateFile(lpcszPath, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	}
	if (fhRet == INVALID_HANDLE_VALUE)
	{
		return FILEH_INVALID;
	}
	return fhRet;
}

FILEH __stdcall file_open_rb(LPCTSTR lpcszPath)
{
	FILEH fhRet = CreateFile(lpcszPath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (fhRet == INVALID_HANDLE_VALUE)
	{
		return FILEH_INVALID;
	}
	return fhRet;
}

FILEH __stdcall file_create(LPCTSTR lpcszPath)
{
	FILEH fhRet = CreateFile(lpcszPath, GENERIC_READ | GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	if (fhRet == INVALID_HANDLE_VALUE)
	{
		return FILEH_INVALID;
	}
	return fhRet;
}

long __stdcall file_seek(FILEH handle, long lPointer, int nMethod)
{
	return SetFilePointer(handle, lPointer, 0, nMethod);
}

UINT __stdcall file_read(FILEH handle, LPVOID lpvData, UINT uLength)
{
	DWORD dwReadSize;
	if (!ReadFile(handle, lpvData, uLength, &dwReadSize, NULL))
	{
		return 0;
	}
	return dwReadSize;
}

UINT __stdcall file_write(FILEH handle, LPCVOID lpcvData, UINT uLength)
{
	if (uLength)
	{
		DWORD dwWriteSize;
		if (WriteFile(handle, lpcvData, uLength, &dwWriteSize, NULL))
		{
			return dwWriteSize;
		}
	}
	else
	{
		SetEndOfFile(handle);
	}
	return 0;
}

BRESULT __stdcall file_close(FILEH handle)
{
	CloseHandle(handle);
	return 0;
}

UINT __stdcall file_getsize(FILEH handle)
{
	return GetFileSize(handle, NULL);
}

static BRESULT cnvdatetime(LPFILETIME lpFt, PDOSDATE pDosDate, PDOSTIME pDosTime)
{
	FILETIME localtime;
	if (FileTimeToLocalFileTime(lpFt, &localtime) == 0)
	{
		return FAILURE;
	}

	SYSTEMTIME systime;
	if (FileTimeToSystemTime(&localtime, &systime) == 0)
	{
		return FAILURE;
	}

	if (pDosDate)
	{
		pDosDate->year = (UINT16)systime.wYear;
		pDosDate->month = (UINT8)systime.wMonth;
		pDosDate->day = (UINT8)systime.wDay;
	}
	if (pDosTime)
	{
		pDosTime->hour = (UINT8)systime.wHour;
		pDosTime->minute = (UINT8)systime.wMinute;
		pDosTime->second = (UINT8)systime.wSecond;
	}
	return SUCCESS;
}

BRESULT __stdcall file_getdatetime(FILEH handle, PDOSDATE pDosDate, PDOSTIME pDosTime)
{
	FILETIME lastwrite;
	if ((GetFileTime(handle, NULL, NULL, &lastwrite) == 0) ||
		(cnvdatetime(&lastwrite, pDosDate, pDosTime) != SUCCESS))
	{
		return FAILURE;
	}
	return SUCCESS;
}

BRESULT __stdcall file_delete(LPCTSTR lpcszPath)
{
	return (DeleteFile(lpcszPath) ? SUCCESS : FAILURE);
}

SINT16 __stdcall file_attr(LPCTSTR lpcszPath)
{
	return static_cast<SINT16>(GetFileAttributes(lpcszPath));
}

BRESULT __stdcall file_dircreate(LPCTSTR lpcszPath)
{
	return (CreateDirectory(lpcszPath, NULL) ? SUCCESS : FAILURE);
}


											// カレントファイル操作
void __stdcall file_setcd(LPCTSTR lpcszExePath)
{
	file_cpyname(s_szCurPath, lpcszExePath, NELEMENTS(s_szCurPath));
	s_lpszFile = file_getname(s_szCurPath);
	*s_lpszFile = '\0';
}

OEMCHAR * __stdcall file_getcd(LPCTSTR lpcszPath)
{
	*s_lpszFile = '\0';
	file_catname(s_szCurPath, lpcszPath, NELEMENTS(s_szCurPath));
	return s_szCurPath;
}

FILEH __stdcall file_open_c(LPCTSTR lpcszPath)
{
	*s_lpszFile = '\0';
	file_catname(s_szCurPath, lpcszPath, NELEMENTS(s_szCurPath));
	return file_open(s_szCurPath);
}

FILEH __stdcall file_open_rb_c(LPCTSTR lpcszPath)
{
	*s_lpszFile = '\0';
	file_catname(s_szCurPath, lpcszPath, NELEMENTS(s_szCurPath));
	return file_open_rb(s_szCurPath);
}

FILEH __stdcall file_create_c(LPCTSTR lpcszPath)
{
	*s_lpszFile = '\0';
	file_catname(s_szCurPath, lpcszPath, NELEMENTS(s_szCurPath));
	return file_create(s_szCurPath);
}

BRESULT __stdcall file_delete_c(LPCTSTR lpcszPath)
{
	*s_lpszFile = '\0';
	file_catname(s_szCurPath, lpcszPath, NELEMENTS(s_szCurPath));
	return file_delete(s_szCurPath);
}

SINT16 __stdcall file_attr_c(LPCTSTR lpcszPath)
{
	*s_lpszFile = '\0';
	file_catname(s_szCurPath, lpcszPath, NELEMENTS(s_szCurPath));
	return file_attr(s_szCurPath);
}


LPTSTR __stdcall file_getname(LPCTSTR lpcszPath)
{
	LPCTSTR lpcszRet = lpcszPath;
	int nSize;
	while((nSize = milstr_charsize(lpcszPath)) != 0)
	{
		if (nSize == 1)
		{
			if ((*lpcszPath == '\\') || (*lpcszPath == '/') || (*lpcszPath == ':'))
			{
				lpcszRet = lpcszPath + 1;
			}
		}
		lpcszPath += nSize;
	}
	return const_cast<LPTSTR>(lpcszRet);
}

void __stdcall file_cutname(LPTSTR lpszPath)
{
	LPTSTR p = file_getname(lpszPath);
	p[0] = '\0';
}

LPTSTR __stdcall file_getext(LPCTSTR lpcszPath)
{
	LPCTSTR p = file_getname(lpcszPath);
	LPCTSTR q = 0;
	while(*p != '\0')
	{
		if (*p == '.')
		{
			q = p + 1;
		}
		p++;
	}
	if (!q)
	{
		q = p;
	}
	return const_cast<LPTSTR>(q);
}

void __stdcall file_cutext(LPTSTR lpszPath)
{
	LPTSTR p = file_getname(lpszPath);
	LPTSTR q = 0;
	while(*p != '\0')
	{
		if (*p == '.')
		{
			q = p;
		}
		p++;
	}
	if (q)
	{
		*q = '\0';
	}
}

void __stdcall file_cutseparator(LPTSTR lpszPath)
{
	int nPos = lstrlen(lpszPath) - 1;
	if ((nPos > 0) &&								// 2文字以上でー
		(lpszPath[nPos] == '\\') &&					// ケツが \ でー
		(!milstr_kanji2nd(lpszPath, nPos)) &&		// 漢字の2バイト目ぢゃなくてー
		((nPos != 1) || (lpszPath[0] != '\\')) &&	// '\\' ではなくてー
		((nPos != 2) || (lpszPath[1] != ':')))		// '?:\' ではなかったら
	{
		lpszPath[nPos] = '\0';
	}
}

void __stdcall file_setseparator(LPTSTR lpszPath, int nMaxLen)
{
	const int nPos = lstrlen(lpszPath) - 1;
	if ((nPos < 0) ||
		((nPos == 1) && (lpszPath[1] == ':')) ||
		((lpszPath[nPos] == '\\') && (!milstr_kanji2nd(lpszPath, nPos))) ||
		((nPos + 2) >= nMaxLen))
	{
		return;
	}
	lpszPath[nPos + 1] = '\\';
	lpszPath[nPos + 2] = '\0';
}


RetroPC.NET-CVS <cvs@retropc.net>