enhanced fio.c for DOS
This commit is contained in:
		| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: fio.c 451 2011-05-03 14:00:38Z hyunghwan.chung $ | ||||
|  * $Id: fio.c 452 2011-05-04 15:11:23Z hyunghwan.chung $ | ||||
|  * | ||||
|     Copyright 2006-2011 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -30,6 +30,9 @@ | ||||
| #	define INCL_DOSFILEMGR | ||||
| #	define INCL_DOSERRORS | ||||
| #	include <os2.h> | ||||
| #elif defined(__DOS__) | ||||
| #	include <io.h> | ||||
| #	include <fcntl.h> | ||||
| #else | ||||
| #	include "syscall.h" | ||||
| #	include <sys/types.h> | ||||
| @ -90,7 +93,7 @@ qse_fio_t* qse_fio_init ( | ||||
| 	QSE_MEMSET (fio, 0, QSE_SIZEOF(*fio)); | ||||
| 	fio->mmgr = mmgr; | ||||
|  | ||||
| 	/* store the flags for later use though only OS/2 needs  | ||||
| 	/* store the flags for later use though only OS/2 needs | ||||
| 	 * this at this moment */ | ||||
| 	fio->flags = flags; | ||||
|  | ||||
| @ -252,9 +255,57 @@ qse_fio_t* qse_fio_init ( | ||||
|  | ||||
| 		if (ret != NO_ERROR) return QSE_NULL; | ||||
| 	} | ||||
|  | ||||
| #elif defined(__DOS__) | ||||
| 	/* UNSUPPORTED */ | ||||
| 	return QSE_NULL; | ||||
|  | ||||
| 	if (flags & QSE_FIO_HANDLE) | ||||
| 	{ | ||||
| 		handle = *(qse_fio_hnd_t*)path; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		int oflags = 0; | ||||
| 		int permission = 0; | ||||
|  | ||||
| 	#ifdef QSE_CHAR_IS_MCHAR | ||||
| 		const qse_mchar_t* path_mb = path; | ||||
| 	#else | ||||
| 		qse_mchar_t path_mb[_MAX_PATH]; | ||||
| 		if (qse_wcstombs_strict (path, | ||||
| 			path_mb, QSE_COUNTOF(path_mb)) == -1) return QSE_NULL; | ||||
| 	#endif | ||||
|  | ||||
| 		if (flags & QSE_FIO_APPEND) | ||||
| 		{ | ||||
| 			if ((flags & QSE_FIO_READ)) oflags |= O_RDWR; | ||||
| 			else oflags |= O_WRONLY; | ||||
| 			oflags |= O_APPEND; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			if ((flags & QSE_FIO_READ) && | ||||
| 			    (flags & QSE_FIO_WRITE)) oflags |= O_RDWR; | ||||
| 			else if (flags & QSE_FIO_READ) oflags |= O_RDONLY; | ||||
| 			else if (flags & QSE_FIO_WRITE) oflags |= O_WRONLY; | ||||
| 		} | ||||
|  | ||||
| 		if (flags & QSE_FIO_CREATE) oflags |= O_CREAT; | ||||
| 		if (flags & QSE_FIO_TRUNCATE) oflags |= O_TRUNC; | ||||
| 		if (flags & QSE_FIO_EXCLUSIVE) oflags |= O_EXCL; | ||||
|  | ||||
| 		oflags |= O_BINARY | O_NOINHERIT; | ||||
| 		 | ||||
| 		if (mode & QSE_FIO_RUSR) permission |= S_IREAD; | ||||
| 		if (mode & QSE_FIO_WUSR) permission |= S_IWRITE; | ||||
|  | ||||
| 		handle = open ( | ||||
| 			path_mb, | ||||
| 			oflags, | ||||
| 			permission | ||||
| 		); | ||||
| 		if (handle <= -1) return QSE_NULL; | ||||
| 	} | ||||
|  | ||||
| #else | ||||
|  | ||||
| 	if (flags & QSE_FIO_HANDLE) | ||||
| @ -332,8 +383,7 @@ qse_fio_t* qse_fio_init ( | ||||
| 		#elif defined(__OS2__) | ||||
| 			DosClose (handle); | ||||
| 		#elif defined(__DOS__) | ||||
| 			/* UNSUPPORTED */ | ||||
| 			; | ||||
| 			close (handle); | ||||
| 		#else | ||||
| 			QSE_CLOSE (handle);      | ||||
| 		#endif | ||||
| @ -356,8 +406,7 @@ void qse_fio_fini (qse_fio_t* fio) | ||||
| #elif defined(__OS2__) | ||||
| 	DosClose (fio->handle); | ||||
| #elif defined(__DOS__) | ||||
| 	/* UNSUPPORTED */ | ||||
| 	;  | ||||
| 	close (fio->handle); | ||||
| #else | ||||
| 	QSE_CLOSE (fio->handle); | ||||
| #endif | ||||
| @ -427,10 +476,14 @@ qse_fio_off_t qse_fio_seek ( | ||||
|  | ||||
| 	return ((qse_fio_off_t)pos.ulHi << 32) | pos.ulLo; | ||||
| #elif defined(__DOS__) | ||||
| 	static int seek_map[] = | ||||
| 	{ | ||||
| 		SEEK_SET,                     | ||||
| 		SEEK_CUR, | ||||
| 		SEEK_END | ||||
| 	}; | ||||
|  | ||||
| 	/* UNSUPPORTED */ | ||||
| 	return -1; | ||||
|  | ||||
| 	return lseek (fio->handle, offset, seek_map[origin]); | ||||
| #else | ||||
| 	static int seek_map[] = | ||||
| 	{ | ||||
| @ -484,8 +537,8 @@ int qse_fio_truncate (qse_fio_t* fio, qse_fio_off_t size) | ||||
| 	return (ret == NO_ERROR)? 0: -1; | ||||
|  | ||||
| #elif defined(__DOS__) | ||||
| 	/* UNSUPPORTED */ | ||||
| 	return -1; | ||||
|  | ||||
| 	return chsize (fio->handle, size); | ||||
|  | ||||
| #else | ||||
| 	return QSE_FTRUNCATE (fio->handle, size); | ||||
| @ -495,19 +548,26 @@ int qse_fio_truncate (qse_fio_t* fio, qse_fio_off_t size) | ||||
| static qse_ssize_t fio_read (qse_fio_t* fio, void* buf, qse_size_t size) | ||||
| { | ||||
| #if defined(_WIN32) | ||||
|  | ||||
| 	DWORD count; | ||||
| 	if (size > QSE_TYPE_MAX(DWORD)) size = QSE_TYPE_MAX(DWORD); | ||||
| 	if (ReadFile(fio->handle, buf, (DWORD)size, &count, QSE_NULL) == FALSE) return -1; | ||||
| 	if (ReadFile (fio->handle,  | ||||
| 		buf, (DWORD)size, &count, QSE_NULL) == FALSE) return -1; | ||||
| 	return (qse_ssize_t)count; | ||||
|  | ||||
| #elif defined(__OS2__) | ||||
|  | ||||
| 	ULONG count; | ||||
| 	if (size > QSE_TYPE_MAX(ULONG)) size = QSE_TYPE_MAX(ULONG); | ||||
| 	if (DosRead (fio->handle, buf, (ULONG)size, &count) != NO_ERROR) return -1; | ||||
| 	if (DosRead (fio->handle,  | ||||
| 		buf, (ULONG)size, &count) != NO_ERROR) return -1; | ||||
| 	return (qse_ssize_t)count; | ||||
|  | ||||
| #elif defined(__DOS__) | ||||
| 	/* UNSUPPORTED */ | ||||
| 	return -1; | ||||
|  | ||||
| 	if (size > QSE_TYPE_MAX(size_t)) size = QSE_TYPE_MAX(size_t); | ||||
| 	return read (fio->handle, buf, size); | ||||
|  | ||||
| #else | ||||
| 	if (size > QSE_TYPE_MAX(size_t)) size = QSE_TYPE_MAX(size_t); | ||||
| 	return QSE_READ (fio->handle, buf, size); | ||||
| @ -527,20 +587,28 @@ static qse_ssize_t fio_write (qse_fio_t* fio, const void* data, qse_size_t size) | ||||
| #if defined(_WIN32) | ||||
| 	DWORD count; | ||||
| 	if (size > QSE_TYPE_MAX(DWORD)) size = QSE_TYPE_MAX(DWORD); | ||||
| 	if (WriteFile(fio->handle, data, (DWORD)size, &count, QSE_NULL) == FALSE) return -1; | ||||
| 	if (WriteFile (fio->handle, | ||||
| 		data, (DWORD)size, &count, QSE_NULL) == FALSE) return -1; | ||||
| 	return (qse_ssize_t)count; | ||||
|  | ||||
| #elif defined(__OS2__) | ||||
|  | ||||
| 	ULONG count; | ||||
| 	if (size > QSE_TYPE_MAX(ULONG)) size = QSE_TYPE_MAX(ULONG); | ||||
| 	if (DosWrite(fio->handle, (PVOID)data, (ULONG)size, &count) != NO_ERROR) return -1; | ||||
| 	if (DosWrite(fio->handle,  | ||||
| 		(PVOID)data, (ULONG)size, &count) != NO_ERROR) return -1; | ||||
| 	return (qse_ssize_t)count; | ||||
|  | ||||
| #elif defined(__DOS__) | ||||
| 	/* UNSUPPORTED */ | ||||
| 	return -1; | ||||
|  | ||||
| 	if (size > QSE_TYPE_MAX(size_t)) size = QSE_TYPE_MAX(size_t); | ||||
| 	return write (fio->handle, data, size); | ||||
|  | ||||
| #else | ||||
|  | ||||
| 	if (size > QSE_TYPE_MAX(size_t)) size = QSE_TYPE_MAX(size_t); | ||||
| 	return QSE_WRITE (fio->handle, data, size); | ||||
|  | ||||
| #endif | ||||
| } | ||||
|  | ||||
| @ -667,6 +735,7 @@ static int get_volname_from_handle ( | ||||
| int qse_fio_chmod (qse_fio_t* fio, int mode) | ||||
| { | ||||
| #if defined(_WIN32) | ||||
|  | ||||
| 	int flags = FILE_ATTRIBUTE_NORMAL; | ||||
| 	qse_char_t name[MAX_PATH]; | ||||
|  | ||||
| @ -678,12 +747,15 @@ int qse_fio_chmod (qse_fio_t* fio, int mode) | ||||
|  | ||||
| 	if (!(mode & QSE_FIO_WUSR)) flags = FILE_ATTRIBUTE_READONLY; | ||||
| 	return (SetFileAttributes (name, flags) == FALSE)? -1: 0; | ||||
|  | ||||
| #elif defined(__OS2__) | ||||
|  | ||||
| 	int flags = FILE_NORMAL; | ||||
| 	FILESTATUS3L stat; | ||||
| 	ULONG size = QSE_SIZEOF(stat); | ||||
|  | ||||
| 	if (DosQueryFileInfo (fio->handle, FIL_STANDARDL, &stat, size) != NO_ERROR) return -1; | ||||
| 	if (DosQueryFileInfo (fio->handle, | ||||
| 		FIL_STANDARDL, &stat, size) != NO_ERROR) return -1; | ||||
|  | ||||
| 	if (!(mode & QSE_FIO_WUSR)) flags = FILE_READONLY; | ||||
| 	 | ||||
| @ -691,8 +763,17 @@ int qse_fio_chmod (qse_fio_t* fio, int mode) | ||||
| 	return (DosSetFileInfo (fio->handle, FIL_STANDARDL, &stat, size) != NO_ERROR)? -1: 0; | ||||
|  | ||||
| #elif defined(__DOS__) | ||||
| 	/* UNSUPPORTED */ | ||||
|  | ||||
| 	int permission = 0; | ||||
|  | ||||
| 	if (mode & QSE_FIO_RUSR) permission |= S_IREAD; | ||||
| 	if (mode & QSE_FIO_WUSR) permission |= S_IWRITE; | ||||
|  | ||||
| 	/* TODO: fchmod not available. find a way to do this | ||||
| 	return fchmod (fio->handle, permission); */ | ||||
|  | ||||
| 	return -1; | ||||
|  | ||||
| #else | ||||
| 	return QSE_FCHMOD (fio->handle, mode); | ||||
| #endif | ||||
| @ -701,15 +782,21 @@ int qse_fio_chmod (qse_fio_t* fio, int mode) | ||||
| int qse_fio_sync (qse_fio_t* fio) | ||||
| { | ||||
| #if defined(_WIN32) | ||||
|  | ||||
| 	return (FlushFileBuffers (fio->handle) == FALSE)? -1: 0; | ||||
|  | ||||
| #elif defined(__OS2__) | ||||
|  | ||||
| 	return (DosResetBuffer (fio->handle) == NO_ERROR)? 0: -1; | ||||
|  | ||||
| #elif defined(__DOS__) | ||||
| 	/* UNSUPPORTED */ | ||||
| 	return -1; | ||||
|  | ||||
| 	return fsync (fio->handle); | ||||
|  | ||||
| #else | ||||
|  | ||||
| 	return QSE_FSYNC (fio->handle); | ||||
|  | ||||
| #endif | ||||
| } | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user