added more code for OS/2 file operations

This commit is contained in:
2011-03-15 21:40:39 +00:00
parent f84872aee3
commit 3822b48eea
7 changed files with 109 additions and 42 deletions

View File

@ -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

View File

@ -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
}

View File

@ -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;
}