added more code for OS/2 file operations
This commit is contained in:
		| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: fio.c 396 2011-03-14 15:40:35Z hyunghwan.chung $ | ||||
|  * $Id: fio.c 397 2011-03-15 03:40:39Z hyunghwan.chung $ | ||||
|  * | ||||
|     Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -27,6 +27,8 @@ | ||||
| #	include <psapi.h> | ||||
| #	include <tchar.h> | ||||
| #elif defined(__OS2__) | ||||
| #	define INCL_DOSFILEMGR | ||||
| #	define INCL_DOSERRORS | ||||
| #	include <os2.h> | ||||
| #else | ||||
| #	include "syscall.h" | ||||
| @ -171,6 +173,10 @@ qse_fio_t* qse_fio_init ( | ||||
| 		APIRET ret; | ||||
| 		ULONG action_taken = 0; | ||||
| 		ULONG open_action, open_mode; | ||||
| 		LONGLONG zero; | ||||
|  | ||||
| 		zero.ulLo = 0; | ||||
| 		zero.ulHi = 0; | ||||
|  | ||||
| 		if (flags & QSE_FIO_CREATE) | ||||
| 		{ | ||||
| @ -206,12 +212,14 @@ qse_fio_t* qse_fio_init ( | ||||
| 			path,          /* file name */ | ||||
| 			&handle,       /* file handle */ | ||||
| 			&action_taken, /* store action taken */ | ||||
| 			(LONGLONG)0,   /* size */ | ||||
| 			zero,          /* size */ | ||||
| 			FILE_NORMAL,   /* attribute */ | ||||
| 			open_action,    /* action if it exists */ | ||||
| 			open_mode      /* open mode */ | ||||
| 			0L | ||||
| 			open_action,   /* action if it exists */ | ||||
| 			open_mode,     /* open mode */ | ||||
| 			0L                             | ||||
| 		); | ||||
|  | ||||
| 		if (ret != NO_ERROR) return QSE_NULL; | ||||
| 	} | ||||
| #else | ||||
|  | ||||
| @ -355,8 +363,26 @@ qse_fio_off_t qse_fio_seek ( | ||||
|  | ||||
| 	return (qse_fio_off_t)x.QuadPart; | ||||
| 	*/ | ||||
| #elif defined(__OS2__) | ||||
| #	error NOT IMPLEMENTED | ||||
| #elif defined(__OS2__) | ||||
| 	static int seek_map[] = | ||||
| 	{ | ||||
| 		FILE_BEGIN, | ||||
| 		FILE_CURRENT, | ||||
| 		FILE_END | ||||
| 	}; | ||||
|  | ||||
| 	LONGLONG pos, newpos; | ||||
| 	APIRET ret; | ||||
|  | ||||
| 	QSE_ASSERT (QSE_SIZEOF(offset) >= QSE_SIZEOF(pos)); | ||||
|  | ||||
| 	pos.ulLo = (ULONG)(offset&0xFFFFFFFFlu); | ||||
| 	pos.ulHi = (ULONG)(offset>>32); | ||||
|  | ||||
| 	ret = DosSetFilePtrL (fio->handle, pos, seek_map[origin], &newpos); | ||||
| 	if (ret != NO_ERROR) return (qse_fio_off_t)-1; | ||||
|  | ||||
| 	return ((qse_fio_off_t)pos.ulHi << 32) | pos.ulLo; | ||||
| #else | ||||
| 	static int seek_map[] = | ||||
| 	{ | ||||
| @ -400,8 +426,13 @@ int qse_fio_truncate (qse_fio_t* fio, qse_fio_off_t size) | ||||
| 	return 0; | ||||
| #elif defined(__OS2__) | ||||
| 	APIRET ret; | ||||
| 	LONGLONG sz; | ||||
| 	/* the file must have the write access for it to succeed */ | ||||
| 	ret = DosSetFileSizeL (fio->handle, 0); | ||||
|  | ||||
| 	sz.ulLo = (ULONG)(size&0xFFFFFFFFlu); | ||||
| 	sz.ulHi = (ULONG)(size>>32); | ||||
|  | ||||
| 	ret = DosSetFileSizeL (fio->handle, sz); | ||||
| 	return (ret == NO_ERROR)? 0: -1; | ||||
| #else | ||||
| 	return QSE_FTRUNCATE (fio->handle, size); | ||||
| @ -413,10 +444,13 @@ 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, 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__) | ||||
| #	error NOT IMPLEMENTED | ||||
| 	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; | ||||
| 	return (qse_ssize_t)count; | ||||
| #else | ||||
| 	if (size > QSE_TYPE_MAX(size_t)) size = QSE_TYPE_MAX(size_t); | ||||
| 	return QSE_READ (fio->handle, buf, size); | ||||
| @ -436,10 +470,13 @@ 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, 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__) | ||||
| #	error NOT IMPLEMENTED | ||||
| 	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; | ||||
| 	return (qse_ssize_t)count; | ||||
| #else | ||||
| 	if (size > QSE_TYPE_MAX(size_t)) size = QSE_TYPE_MAX(size_t); | ||||
| 	return QSE_WRITE (fio->handle, data, size); | ||||
| @ -570,7 +607,16 @@ 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__) | ||||
| #	error NOT IMPLEMENTED | ||||
| 	int flags = FILE_NORMAL; | ||||
| 	FILESTATUS3L stat; | ||||
| 	ULONG size = QSE_SIZEOF(stat); | ||||
|  | ||||
| 	if (DosQueryFileInfo (fio->handle, FIL_STANDARDL, &stat, size) != NO_ERROR) return -1; | ||||
|  | ||||
| 	if (!(mode & QSE_FIO_WUSR)) flags = FILE_READONLY; | ||||
| 	 | ||||
| 	stat.attrFile = flags; | ||||
| 	return (DosSetFileInfo (fio->handle, FIL_STANDARDL, &stat, size) != NO_ERROR)? -1: 0; | ||||
| #else | ||||
| 	return QSE_FCHMOD (fio->handle, mode); | ||||
| #endif | ||||
|  | ||||
| @ -27,12 +27,13 @@ int qse_runmain ( | ||||
| 	int argc, qse_achar_t* argv[], qse_runmain_handler_t handler) | ||||
| { | ||||
| 	setlocale (LC_ALL, ""); /* TODO: remove dependency on setlocale */ | ||||
|  | ||||
| 	if (QSE_SIZEOF(qse_achar_t) == QSE_SIZEOF(qse_char_t)) | ||||
|  | ||||
| #if (defined(QSE_ACHAR_IS_MCHAR) && defined(QSE_CHAR_IS_MCHAR)) || \ | ||||
|     (defined(QSE_ACHAR_IS_WCHAR) && defined(QSE_CHAR_IS_WCHAR)) | ||||
| 	{ | ||||
| 		return handler (argc, (qse_char_t**)argv); | ||||
| 	} | ||||
| 	else | ||||
| 	} | ||||
| #else | ||||
| 	{ | ||||
| 		int i, ret; | ||||
| 		qse_char_t** v; | ||||
| @ -83,21 +84,22 @@ int qse_runmain ( | ||||
| 		} | ||||
| 		QSE_MMGR_FREE (mmgr, v); | ||||
|  | ||||
| 		return ret; | ||||
| 	} | ||||
| 		return ret;	 | ||||
| #endif | ||||
| } | ||||
|  | ||||
| int qse_runmainwithenv ( | ||||
| 	int argc, qse_achar_t* argv[],  | ||||
| 	qse_achar_t* envp[], qse_runmainwithenv_handler_t handler) | ||||
| { | ||||
| 	setlocale (LC_ALL, ""); /* TODO: remove dependency on setlocale */ | ||||
| 	setlocale (LC_ALL, ""); /* TODO: remove dependency on setlocale */ | ||||
|  | ||||
| 	if (QSE_SIZEOF(qse_achar_t) == QSE_SIZEOF(qse_char_t)) | ||||
| #if (defined(QSE_ACHAR_IS_MCHAR) && defined(QSE_CHAR_IS_MCHAR)) || \ | ||||
|     (defined(QSE_ACHAR_IS_WCHAR) && defined(QSE_CHAR_IS_WCHAR)) | ||||
| 	{ | ||||
| 		return handler (argc, (qse_char_t**)argv, (qse_char_t**)envp); | ||||
| 	} | ||||
| 	else | ||||
| #else | ||||
| 	{ | ||||
| 		int i, ret, envc; | ||||
| 		qse_char_t** v; | ||||
| @ -156,5 +158,6 @@ int qse_runmainwithenv ( | ||||
| 		QSE_MMGR_FREE (mmgr, v); | ||||
|  | ||||
| 		return ret; | ||||
| 	} | ||||
| 	} | ||||
| #endif | ||||
| } | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: pio.c 368 2010-11-03 14:24:29Z hyunghwan.chung $ | ||||
|  * $Id: pio.c 397 2011-03-15 03:40:39Z hyunghwan.chung $ | ||||
|  * | ||||
|     Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -22,9 +22,11 @@ | ||||
| #include <qse/cmn/str.h> | ||||
| #include "mem.h" | ||||
|  | ||||
| #ifdef _WIN32 | ||||
| #if defined(_WIN32) | ||||
| #	include <windows.h> | ||||
| #	include <tchar.h> | ||||
| #	include <tchar.h> | ||||
| #elif defined(__OS2__) | ||||
| #	include <os2.h> | ||||
| #else | ||||
| #	include "syscall.h" | ||||
| #	include <fcntl.h> | ||||
| @ -986,7 +988,7 @@ static qse_ssize_t pio_input (int cmd, void* arg, void* buf, qse_size_t size) | ||||
|  | ||||
| 	/* take no actions for OPEN and CLOSE as they are handled | ||||
| 	 * by pio */ | ||||
|         return 0; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static qse_ssize_t pio_output (int cmd, void* arg, void* buf, qse_size_t size) | ||||
| @ -1001,5 +1003,5 @@ static qse_ssize_t pio_output (int cmd, void* arg, void* buf, qse_size_t size) | ||||
|  | ||||
| 	/* take no actions for OPEN and CLOSE as they are handled | ||||
| 	 * by pio */ | ||||
|         return 0; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user