OSDN Git Service

(none)
authorryuz <ryuz>
Fri, 28 Dec 2007 21:20:15 +0000 (21:20 +0000)
committerryuz <ryuz>
Fri, 28 Dec 2007 21:20:15 +0000 (21:20 +0000)
93 files changed:
aplfw/application/example/hello/hello_main.c [moved from aplfw/application/example/hello/hello.c with 100% similarity]
aplfw/build/common/gmake/aplfwdep.inc
aplfw/build/common/gmake/aplfwsrc.inc
aplfw/build/common/nmake/aplfwdep.inc
aplfw/build/common/nmake/aplfwsrc.inc
aplfw/build/common/tmp_mkinc/mk_inc.pl
aplfw/build/win/win32/vc60/hosaplfw.dsp
aplfw/driver/console/vt100/vt100drv_open.c
aplfw/driver/ether/lan9000/lan9000drv_open.c
aplfw/driver/pipe/streampipe/streampipe.h
aplfw/driver/pipe/streampipe/streampipe_local.h
aplfw/driver/pipe/streampipe/streampipe_open.c
aplfw/driver/serial/at91/at91usartdrv_open.c
aplfw/driver/serial/mx1/mx1uartdrv_open.c
aplfw/driver/serial/pc16550/pc16550drv_open.c
aplfw/driver/serial/renesas/scidrv_open.c
aplfw/driver/serial/winsock/winsockdrv.c [deleted file]
aplfw/driver/serial/winsock/winsockdrv.h
aplfw/driver/serial/winsock/winsockdrv_close.c [new file with mode: 0755]
aplfw/driver/serial/winsock/winsockdrv_constructor.c [new file with mode: 0755]
aplfw/driver/serial/winsock/winsockdrv_create.c [new file with mode: 0755]
aplfw/driver/serial/winsock/winsockdrv_delete.c [new file with mode: 0755]
aplfw/driver/serial/winsock/winsockdrv_destructor.c [new file with mode: 0755]
aplfw/driver/serial/winsock/winsockdrv_flush.c [new file with mode: 0755]
aplfw/driver/serial/winsock/winsockdrv_iocontrol.c [new file with mode: 0755]
aplfw/driver/serial/winsock/winsockdrv_isr.c [new file with mode: 0755]
aplfw/driver/serial/winsock/winsockdrv_local.h
aplfw/driver/serial/winsock/winsockdrv_open.c [new file with mode: 0755]
aplfw/driver/serial/winsock/winsockdrv_read.c [new file with mode: 0755]
aplfw/driver/serial/winsock/winsockdrv_recv.c [new file with mode: 0755]
aplfw/driver/serial/winsock/winsockdrv_seek.c [new file with mode: 0755]
aplfw/driver/serial/winsock/winsockdrv_send.c [new file with mode: 0755]
aplfw/driver/serial/winsock/winsockdrv_write.c [new file with mode: 0755]
aplfw/driver/serial/winsock/winsockfile.c [deleted file]
aplfw/driver/serial/winsock/winsockfile.h [deleted file]
aplfw/driver/tcpip/ipether/ipether.h
aplfw/driver/tcpip/ipether/ipether_constructor.c
aplfw/driver/tcpip/ipether/ipether_open.c
aplfw/driver/tcpip/tcpip/tcpip.h
aplfw/driver/tcpip/tcpip/tcpip_constructor.c
aplfw/driver/tcpip/tcpip/tcpip_open.c
aplfw/driver/tcpip/tcpip/tcpipfile.h
aplfw/driver/tcpip/tcpip/tcpipfile_constructor.c
aplfw/driver/tcpip/tcpip/tcpipfile_create.c
aplfw/driver/tcpip/tcpip/tcpipfile_local.h
aplfw/driver/volume/fat/fatfile.h
aplfw/driver/volume/fat/fatfile_constructor.c
aplfw/driver/volume/fat/fatvol_flush.c
aplfw/driver/volume/fat/fatvol_read.c
aplfw/driver/volume/fat/fatvol_seek.c
aplfw/driver/volume/fat/fatvol_write.c
aplfw/sample/arm/utb_arm7at91/boot_task.c
aplfw/sample/sh/cq7144a/boot.c [moved from aplfw/sample/sh/cq7144a/boot_task.c with 98% similarity]
aplfw/sample/sh/cq7144a/boot.h [moved from aplfw/sample/sh/cq7144a/boot_task.h with 100% similarity]
aplfw/sample/sh/cq7144a/gcc/gmake.mak
aplfw/sample/sh/cq7144a/shc/gmake.mak
aplfw/sample/sh/cq7144a/system.cfg
aplfw/sample/win/win32/boot.c [moved from aplfw/sample/win/win32/boot_task.c with 98% similarity]
aplfw/sample/win/win32/boot.h [moved from aplfw/sample/win/win32/boot_task.h with 100% similarity]
aplfw/sample/win/win32/msc/nmake.mak
aplfw/sample/win/win32/wintimer.c
aplfw/system/event/event_create.c
aplfw/system/event/event_local.h
aplfw/system/file/file_getchar.c
aplfw/system/file/file_getstring.c
aplfw/system/file/fileobj.h
aplfw/system/file/fileobj_constructor.c
aplfw/system/file/fileobj_create.c
aplfw/system/file/fileobj_delete.c
aplfw/system/file/fileobj_local.h
aplfw/system/file/syncdrv.h
aplfw/system/file/syncdrv_local.h
aplfw/system/file/syncfile.h
aplfw/system/file/syncfile_constructor.c
aplfw/system/file/syncfile_create.c
aplfw/system/file/syncfile_local.h
aplfw/system/file/sysvol_open.c
aplfw/system/file/sysvolfile.h
aplfw/system/file/sysvolfile_constructor.c
aplfw/system/file/sysvolfile_create.c
aplfw/system/file/sysvolfile_local.h
aplfw/system/process/process_constructor.c
aplfw/system/process/process_destructor.c
aplfw/system/process/process_local.h
aplfw/system/shell/shell.c
aplfw/system/sysapi/sysapi.h
aplfw/system/sysapi/sysprc_create.c
kernel/build/sh/sh2/gcc/gmake.mak
kernel/include/arch/proc/win/win32/proc.h
kernel/source/arch/proc/win/win32/ctxctl.c
kernel/source/object/flg/twai_flg.c
kernel/source/object/flg/wai_flg.c
kernel/source/object/isr/exe_isr.c

index a631329..6c8f61d 100755 (executable)
@@ -370,7 +370,7 @@ $(OBJS_DIR)/filecat_main.$(EXT_OBJ):        $(FILECAT_DIR)/filecat_main.c   $(COMMON_HEAD
 $(OBJS_DIR)/filecopy_main.$(EXT_OBJ):  $(FILECOPY_DIR)/filecopy_main.c $(COMMON_HEADERS)
 $(OBJS_DIR)/filedump_main.$(EXT_OBJ):  $(FILEDUMP_DIR)/filedump_main.c $(COMMON_HEADERS)
 $(OBJS_DIR)/ethersnoop_main.$(EXT_OBJ):        $(ETHERSNOOP_DIR)/ethersnoop_main.c     $(COMMON_HEADERS)
-$(OBJS_DIR)/hello.$(EXT_OBJ):  $(HELLO_DIR)/hello.c    $(COMMON_HEADERS)
+$(OBJS_DIR)/hello_main.$(EXT_OBJ):     $(HELLO_DIR)/hello_main.c       $(COMMON_HEADERS)
 
 
 # end of file
index 68d2fe7..ef22a10 100755 (executable)
@@ -737,7 +737,7 @@ endif
 ifeq ($(LINK_HELLO),Yes)
 HELLO_DIR = $(HOSAPLFW_DIR)/application/example/hello
 SRC_DIRS += $(HELLO_DIR)
-CSRCS += $(HELLO_DIR)/hello.c
+CSRCS += $(HELLO_DIR)/hello_main.c
 endif
 
 
index a69e0f9..bbdb35d 100755 (executable)
@@ -462,7 +462,7 @@ $(OBJS_DIR)\filedump_main.$(EXT_OBJ):       $(OBJS_DIR)\filedump_main.c     $(COMMON_HEADE
 
 $(OBJS_DIR)\ethersnoop_main.$(EXT_OBJ):        $(OBJS_DIR)\ethersnoop_main.c   $(COMMON_HEADERS)
 
-$(OBJS_DIR)\hello.$(EXT_OBJ):  $(OBJS_DIR)\hello.c     $(COMMON_HEADERS)
+$(OBJS_DIR)\hello_main.$(EXT_OBJ):     $(OBJS_DIR)\hello_main.c        $(COMMON_HEADERS)
 
 
 
index 9aabed4..25d0c19 100755 (executable)
@@ -1059,8 +1059,8 @@ OBJS  = $(OBJS)  $(OBJS_DIR)\ethersnoop_main.$(EXT_OBJ)
 
 # Hello World
 HELLO_DIR = $(HOSAPLFW_DIR)\application\example\hello
-CSRCS = $(CSRCS) $(HELLO_DIR)\hello.c
-OBJS  = $(OBJS)  $(OBJS_DIR)\hello.$(EXT_OBJ)
+CSRCS = $(CSRCS) $(HELLO_DIR)\hello_main.c
+OBJS  = $(OBJS)  $(OBJS_DIR)\hello_main.$(EXT_OBJ)
 
 
 # end of file
index 714c2c6..3e26209 100755 (executable)
                        "\$(HOSAPLFW_DIR)/application/example/hello",
                        "HELLO",
                        "Yes",
-                       "hello.c",
+                       "hello_main.c",
                ],
        ],
 );
index 2a663d7..7ca9a52 100755 (executable)
@@ -255,16 +255,68 @@ SOURCE=..\..\..\..\library\container\streambuf\streambuf_senddata.c
 # PROP Default_Filter ""\r
 # Begin Source File\r
 \r
-SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv.c\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv.h\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv.h\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_close.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_constructor.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_create.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_delete.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_destructor.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_flush.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_iocontrol.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_isr.c\r
 # End Source File\r
 # Begin Source File\r
 \r
 SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_local.h\r
 # End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_open.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_read.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_recv.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_seek.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_send.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_write.c\r
+# End Source File\r
 # End Group\r
 # Begin Group "pc16550"\r
 \r
@@ -1091,6 +1143,34 @@ SOURCE=..\..\..\..\system\system\system_process.c
 SOURCE=..\..\..\..\system\system\system_requestproc.c\r
 # End Source File\r
 # End Group\r
+# Begin Group "event"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\system\event\event.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\system\event\event_create.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\system\event\event_delete.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\system\event\event_local.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\system\event\event_set.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\system\event\event_wait.c\r
+# End Source File\r
+# End Group\r
 # End Group\r
 # Begin Group "application"\r
 \r
index d7fea63..cb5687f 100755 (executable)
@@ -23,7 +23,7 @@ HANDLE Vt100Drv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
        self = (C_VT100DRV *)pDrvObj;
        
        /* create file descriptor */
-       if ( (hFile = FileObj_Create(&self->DrvObj)) == HANDLE_NULL )
+       if ( (hFile = FileObj_Create(&self->DrvObj, iMode)) == HANDLE_NULL )
        {
                return HANDLE_NULL;
        }
index 9f1bc72..ac24450 100755 (executable)
@@ -22,7 +22,7 @@ HANDLE Lan9000Drv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
        self = (C_LAN9000DRV *)pDrvObj;
 
        /* create file descriptor */
-       if ( (hFile = SyncFile_Create(&self->SyncDrv)) == HANDLE_NULL )
+       if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL )
        {
                return HANDLE_NULL;
        }
index bb87778..22574ac 100755 (executable)
 #define __HOS__streampipe_h__
 
 
-#include "system/sysapi/sysapi.h"
-#include "system/file/syncdrv.h"
-#include "library/container/streambuf/streambuf.h"
-
-
-/* ストリームパイプクラス */
-typedef struct c_streampipe
-{
-       C_SYNCDRV               SyncDrv;                /**< 同期機能付きデバイスドライバを継承 */
-
-       int                             iOpenCount;             /**< オープンカウンタ */
-
-       C_STREAMBUF             StreamBuf;              /**< バッファ */
-} C_STREAMPIPE;
+#include "hosaplfw.h"
 
 
 #ifdef __cplusplus
index 17bddce..9cc9f76 100755 (executable)
 
 #include "streampipe.h"
 #include "system/file/syncdrv_local.h"
+#include "library/container/streambuf/streambuf.h"
 #include "system/sysapi/sysapi.h"
 
 
+/* ストリームパイプクラス */
+typedef struct c_streampipe
+{
+       C_SYNCDRV               SyncDrv;                /**< 同期機能付きデバイスドライバを継承 */
+
+       int                             iOpenCount;             /**< オープンカウンタ */
+
+       C_STREAMBUF             StreamBuf;              /**< バッファ */
+} C_STREAMPIPE;
+
+
 #ifdef __cplusplus
 extern "C" {
 #endif
index cc6ca25..3eefeb0 100755 (executable)
@@ -22,7 +22,7 @@ HANDLE StreamPipe_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
        self = (C_STREAMPIPE *)pDrvObj;
 
        /* create file descriptor */
-       if ( (hFile = SyncFile_Create(&self->SyncDrv)) == HANDLE_NULL )
+       if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL )
        {
                return HANDLE_NULL;
        }
index dfece62..0a91608 100755 (executable)
@@ -22,7 +22,7 @@ HANDLE At91UsartDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
        self = (C_AT91USARTDRV *)pDrvObj;
 
        /* create file descriptor */
-       if ( (hFile = SyncFile_Create(&self->SyncDrv)) == HANDLE_NULL )
+       if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL )
        {
                return HANDLE_NULL;
        }
index 85bdd81..e269c7e 100755 (executable)
@@ -22,7 +22,7 @@ HANDLE Mx1UartDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
        self = (C_MX1UARTDRV *)pDrvObj;
 
        /* create file descriptor */
-       if ( (hFile = SyncFile_Create(&self->SyncDrv)) == HANDLE_NULL)
+       if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL)
        {
                return HANDLE_NULL;
        }
index 191088f..575b998 100755 (executable)
@@ -22,7 +22,7 @@ HANDLE Pc16550Drv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
        self = (C_PC16550DRV *)pDrvObj;
 
        /* create file descriptor */
-       if ( (hFile = SyncFile_Create(&self->SyncDrv)) == HANDLE_NULL )
+       if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL )
        {
                return HANDLE_NULL;
        }
index 6603ef6..63339ad 100755 (executable)
@@ -22,7 +22,7 @@ HANDLE SciDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
        self = (C_SCIDRV *)pDrvObj;
        
        /* create file descriptor */
-       if ( (hFile = SyncFile_Create(&self->SyncDrv)) == HANDLE_NULL )
+       if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL )
        {
                return HANDLE_NULL;
        }
diff --git a/aplfw/driver/serial/winsock/winsockdrv.c b/aplfw/driver/serial/winsock/winsockdrv.c
deleted file mode 100755 (executable)
index 6e4601f..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-
-
-
-#include "winsockdrv_local.h"
-
-
-const T_DRVOBJ_METHODS  WinSockDrv_Methods = 
-       {
-               { WinSockDrv_Delete },
-               WinSockDrv_Open,
-               WinSockDrv_Close,
-               WinSockDrv_IoControl,
-               WinSockDrv_Seek,
-               WinSockDrv_Read,
-               WinSockDrv_Write,
-               WinSockDrv_Flush,
-       };
-
-
-/** コンストラクタ */
-HANDLE WinSockDrv_Create(int iPortNum, int iIntNum, int iBufSize)
-{
-       C_WINSOCKDRV *self;
-       
-       /* メモリ確保 */
-       if ( (self = (C_WINSOCKDRV *)SysMem_Alloc(sizeof(C_WINSOCKDRV))) == NULL )
-       {
-               return HANDLE_NULL;
-       }
-       
-       /* コンストラクタ呼び出し */
-       if ( WinSockDrv_Constructor(self, NULL, iPortNum, iIntNum, iBufSize) != FILE_ERR_OK )
-       {
-               SysMem_Free(self);
-               return HANDLE_NULL;
-       }
-       
-       return (HANDLE)self;
-}
-
-
-/** コンストラクタ */
-FILE_ERR WinSockDrv_Constructor(C_WINSOCKDRV *self, const T_DRVOBJ_METHODS *pMethods, int iPortNum, int iIntNum, int iBufSize)
-{
-       WSADATA         wsaData;
-       struct sockaddr_in addr;
-
-       if ( pMethods == NULL )
-       {
-               pMethods = &WinSockDrv_Methods;
-       }
-       
-       /* 親クラスコンストラクタ呼び出し */
-       DrvObj_Constructor(&self->DrvObj, pMethods);
-       
-       WSAStartup(MAKEWORD(2,0), &wsaData);
-       
-       self->sock0 = socket(AF_INET, SOCK_STREAM, 0);
-       
-       addr.sin_family = AF_INET;
-       addr.sin_port = htons((u_short)iPortNum);
-       addr.sin_addr.S_un.S_addr = INADDR_ANY;
-       
-       bind(self->sock0, (struct sockaddr *)&addr, sizeof(addr));
-       
-       listen(self->sock0, 5);
-
-       return FILE_ERR_OK;
-}
-
-
-/** 削除 */
-void WinSockDrv_Delete(HANDLE hDriver)
-{
-       C_WINSOCKDRV    *self;
-       
-       /* upper cast */
-       self = (C_WINSOCKDRV *)hDriver;
-
-       /* デストラクタ呼び出し */
-       WinSockDrv_Destructor(self);
-       
-       /* メモリ削除 */
-       SysMem_Free(self);
-}
-
-
-/** デストラクタ */
-void WinSockDrv_Destructor(C_WINSOCKDRV *self)
-{
-       WSACleanup();
-
-       /* 親クラスデストラクタ */
-       DrvObj_Destructor(&self->DrvObj);
-}
-
-
-/** オープン */
-HANDLE WinSockDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
-{
-       C_WINSOCKDRV            *self;
-       HANDLE                          hFile;
-       struct sockaddr_in      client;
-       int                                     len;
-
-       /* upper cast */
-       self = (C_WINSOCKDRV *)pDrvObj;
-
-       /* create file descriptor */
-       if ( (hFile = FileObj_Create(pDrvObj)) == HANDLE_NULL )
-       {
-               return HANDLE_NULL;
-       }
-
-       /* オープン処理 */
-       if ( self->iOpenCount++ == 0 )
-       {
-               len = sizeof(client);
-               self->sock = accept(self->sock0, (struct sockaddr *)&client, &len);
-       }
-
-       return hFile;
-}
-
-
-/** クローズ */
-FILE_ERR WinSockDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
-{
-       C_WINSOCKDRV *self;
-
-       /* upper cast */
-       self = (C_WINSOCKDRV *)pDrvObj;
-
-       if ( --self->iOpenCount == 0 )
-       {
-               closesocket(self->sock);
-       }
-
-       return FILE_ERR_OK;
-}
-
-
-FILE_ERR  WinSockDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize)
-{
-       return FILE_ERR_NG;
-}
-
-
-FILE_POS  WinSockDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign)
-{
-       return FILE_ERR_NG;
-}
-
-
-/** 読み出し */
-FILE_SIZE WinSockDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size)
-{
-       C_WINSOCKDRV *self;
-
-       /* upper cast */
-       self = (C_WINSOCKDRV *)pDrvObj;
-
-       return recv(self->sock, pBuf, Size, 0);
-}
-
-
-/** 書き込み */
-FILE_SIZE WinSockDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
-{
-       C_WINSOCKDRV *self;
-
-       /* upper cast */
-       self = (C_WINSOCKDRV *)pDrvObj;
-
-       return send(self->sock, pData, Size, 0);
-}
-
-
-FILE_ERR  WinSockDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
-{
-       return FILE_ERR_OK;
-}
-
index 4e23a24..8ef6b47 100755 (executable)
@@ -4,7 +4,7 @@
  * @file  winsockdrv.h
  * @brief %jp{WinSockでシリアルを擬似するドライバ}
  *
- * Copyright (C) 2006 by Project HOS
+ * Copyright (C) 2006-2007 by Project HOS
  * http://sourceforge.jp/projects/hos/
  */
 
 #define __HOS__winsockdrv_h__
 
 
-#define SIZE   WINSIZE
-#include <winsock2.h>
-#include "system/file/drvobj.h"
-#include "system/sysapi/sysapi.h"
-#include "library/container/streambuf/streambuf.h"
-
-
-/* WinSock用ドライバ制御部 */
-typedef struct c_winsockdrv
-{
-       C_DRVOBJ                DrvObj;                 /* デバイスドライバクラスを継承 */
-       
-       int                             iOpenCount;
-       SYSEVT_HANDLE   hEvtSend;
-       SYSEVT_HANDLE   hEvtRecv;
-       SYSMTX_HANDLE   hMtxSend;
-       SYSMTX_HANDLE   hMtxRecv;
-
-       SOCKET                  sock0;
-       SOCKET                  sock;
-
-       C_STREAMBUF             StmBuf;
-} C_WINSOCKDRV;
-
-
-
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/aplfw/driver/serial/winsock/winsockdrv_close.c b/aplfw/driver/serial/winsock/winsockdrv_close.c
new file mode 100755 (executable)
index 0000000..43b86fc
--- /dev/null
@@ -0,0 +1,35 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+/** クローズ */
+FILE_ERR WinSockDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
+{
+       C_WINSOCKDRV *self;
+
+       /* upper cast */
+       self = (C_WINSOCKDRV *)pDrvObj;
+
+       if ( --self->iOpenCount == 0 )
+       {
+               closesocket(self->sock);
+       }
+
+       return FILE_ERR_OK;
+}
+
+
+
+/* end of file */
diff --git a/aplfw/driver/serial/winsock/winsockdrv_constructor.c b/aplfw/driver/serial/winsock/winsockdrv_constructor.c
new file mode 100755 (executable)
index 0000000..d8469fd
--- /dev/null
@@ -0,0 +1,92 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+/** 仮想関数テーブル */
+const T_DRVOBJ_METHODS  WinSockDrv_Methods = 
+       {
+               { WinSockDrv_Delete },
+               WinSockDrv_Open,
+               WinSockDrv_Close,
+               WinSockDrv_IoControl,
+               WinSockDrv_Seek,
+               WinSockDrv_Read,
+               WinSockDrv_Write,
+               WinSockDrv_Flush,
+       };
+
+
+/** コンストラクタ */
+FILE_ERR WinSockDrv_Constructor(C_WINSOCKDRV *self, const T_DRVOBJ_METHODS *pMethods, int iPortNum, int iIntNum, int iBufSize)
+{
+       DWORD           dwThreadId;
+       FILE_ERR        ErrCode;
+       void            *pRecvMem;
+       void            *pSendMem;
+       
+       /* 仮想関数テーブル */
+       if ( pMethods == NULL )
+       {
+               pMethods = &WinSockDrv_Methods;
+       }
+
+       /* バッファ用メモリ確保 */
+       if ( (pRecvMem = SysMem_Alloc(iBufSize)) == NULL )
+       {
+               return FILE_ERR_NG;
+       }
+       if ( (pSendMem = SysMem_Alloc(iBufSize)) == NULL )
+       {
+               SysMem_Free(pRecvMem);
+               return FILE_ERR_NG;
+       }
+
+
+       /* 親クラスコンストラクタ呼び出し */
+       if ( (ErrCode = SyncDrv_Constructor(&self->SyncDrv, pMethods, SYNCDRV_FACTOR_NUM)) != FILE_ERR_OK )
+       {
+               SysMem_Free(pRecvMem);
+               SysMem_Free(pSendMem);
+               return ErrCode;
+       }
+       
+       /* メンバ変数初期化 */
+       self->iOpenCount  = 0;
+       self->iPortNum    = iPortNum;
+       self->iIntNum     = iIntNum;
+       self->iConnection = FALSE;
+
+       /* バッファ生成 */
+       StreamBuf_Create(&self->StmBufRecv, iBufSize, pRecvMem);
+       StreamBuf_Create(&self->StmBufSend, iBufSize, pSendMem);
+
+       /* 割込み処理登録 */
+       self->hIsr = SysIsr_Create(self->iIntNum, WinSockDrv_Isr, (VPARAM)self);
+       
+       /* イベント生成 */
+       self->hConnectEvent    = CreateEvent(NULL, FALSE, FALSE, NULL);
+       self->hDisconnectEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+       self->hSendEvent       = CreateEvent(NULL, FALSE, FALSE, NULL);
+
+       /* %jp{スレッド生成} */
+       self->hRecvThread = CreateThread(NULL, 0, WinSockDrv_Recv, (LPVOID)self, 0, &dwThreadId);
+       self->hSendThread = CreateThread(NULL, 0, WinSockDrv_Send, (LPVOID)self, 0, &dwThreadId);
+
+       return FILE_ERR_OK;
+}
+
+
+
+/* end of file */
diff --git a/aplfw/driver/serial/winsock/winsockdrv_create.c b/aplfw/driver/serial/winsock/winsockdrv_create.c
new file mode 100755 (executable)
index 0000000..6a5f296
--- /dev/null
@@ -0,0 +1,38 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+/**  生成 */
+HANDLE WinSockDrv_Create(int iPortNum, int iIntNum, int iBufSize)
+{
+       C_WINSOCKDRV *self;
+       
+       /* メモリ確保 */
+       if ( (self = (C_WINSOCKDRV *)SysMem_Alloc(sizeof(C_WINSOCKDRV))) == NULL )
+       {
+               return HANDLE_NULL;
+       }
+       
+       /* コンストラクタ呼び出し */
+       if ( WinSockDrv_Constructor(self, NULL, iPortNum, iIntNum, iBufSize) != FILE_ERR_OK )
+       {
+               SysMem_Free(self);
+               return HANDLE_NULL;
+       }
+       
+       return (HANDLE)self;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/serial/winsock/winsockdrv_delete.c b/aplfw/driver/serial/winsock/winsockdrv_delete.c
new file mode 100755 (executable)
index 0000000..2834804
--- /dev/null
@@ -0,0 +1,33 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+/** 削除 */
+void WinSockDrv_Delete(HANDLE hDriver)
+{
+       C_WINSOCKDRV    *self;
+       
+       /* upper cast */
+       self = (C_WINSOCKDRV *)hDriver;
+
+       /* デストラクタ呼び出し */
+       WinSockDrv_Destructor(self);
+       
+       /* メモリ削除 */
+       SysMem_Free(self);
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/serial/winsock/winsockdrv_destructor.c b/aplfw/driver/serial/winsock/winsockdrv_destructor.c
new file mode 100755 (executable)
index 0000000..00fa3a9
--- /dev/null
@@ -0,0 +1,27 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+/** デストラクタ */
+void WinSockDrv_Destructor(C_WINSOCKDRV *self)
+{
+       
+
+       /* 親クラスデストラクタ */
+       SyncDrv_Destructor(&self->SyncDrv);
+}
+
+
+
+/* end of file */
diff --git a/aplfw/driver/serial/winsock/winsockdrv_flush.c b/aplfw/driver/serial/winsock/winsockdrv_flush.c
new file mode 100755 (executable)
index 0000000..5cc25f4
--- /dev/null
@@ -0,0 +1,23 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+FILE_ERR  WinSockDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
+{
+       return FILE_ERR_OK;
+}
+
+
+
+/* end of file */
diff --git a/aplfw/driver/serial/winsock/winsockdrv_iocontrol.c b/aplfw/driver/serial/winsock/winsockdrv_iocontrol.c
new file mode 100755 (executable)
index 0000000..531cff5
--- /dev/null
@@ -0,0 +1,24 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+FILE_ERR WinSockDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize)
+{
+       return SyncDrv_IoControl(pDrvObj, pFileObj, iFunc, pInBuf, InSize, pOutBuf, OutSize);
+}
+
+
+
+/* end of file */
diff --git a/aplfw/driver/serial/winsock/winsockdrv_isr.c b/aplfw/driver/serial/winsock/winsockdrv_isr.c
new file mode 100755 (executable)
index 0000000..4382583
--- /dev/null
@@ -0,0 +1,29 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+/** 割込みサービスルーチン */
+void WinSockDrv_Isr(VPARAM Param)
+{
+       C_WINSOCKDRV            *self;
+
+       self = (C_WINSOCKDRV *)Param;
+
+       SyncDrv_SendSignal(&self->SyncDrv, SYNCDRV_FACTOR_WRITE);
+       SyncDrv_SendSignal(&self->SyncDrv, SYNCDRV_FACTOR_READ);
+}
+
+
+/* end of file */
index dca0543..9bd1f83 100755 (executable)
 #ifndef __HOS__winsockdrv_local_h__
 #define __HOS__winsockdrv_local_h__
 
+#define SIZE   WINSIZE
+#include <winsock2.h>
+#undef SIZE
 
 #include "winsockdrv.h"
-#include "system/file/drvobj_local.h"
+#include "system/file/syncdrv_local.h"
+#include "library/container/streambuf/streambuf.h"
+#include "system/sysapi/sysapi.h"
+
+
+/* WinSock用ドライバ制御部 */
+typedef struct c_winsockdrv
+{
+       C_SYNCDRV               SyncDrv;                        /* デバイスドライバクラスを継承 */
+       
+       int                             iOpenCount;
+       
+       int                             iIntNum;
+       int                             iPortNum;
+       SYSISR_HANDLE   hIsr;
+
+       C_STREAMBUF             StmBufSend;
+       C_STREAMBUF             StmBufRecv;
+       
+       volatile int    iConnection;
+       HANDLE                  hConnectEvent;
+       HANDLE                  hDisconnectEvent;
+       HANDLE                  hSendEvent;
+       HANDLE                  hRecvThread;
+       HANDLE                  hSendThread;
+
+       SOCKET                  sock0;
+       SOCKET                  sock;
+} C_WINSOCKDRV;
+
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-FILE_ERR WinSockDrv_Constructor(C_WINSOCKDRV *self, const T_DRVOBJ_METHODS *pMethods, int iPortNum, int iIntNum, int iBufSize);        /** コンストラクタ */
-void     WinSockDrv_Destructor(C_WINSOCKDRV *self);                                                                                                                                                            /** デストラクタ */
+FILE_ERR     WinSockDrv_Constructor(C_WINSOCKDRV *self, const T_DRVOBJ_METHODS *pMethods, int iPortNum, int iIntNum, int iBufSize);    /** コンストラクタ */
+void         WinSockDrv_Destructor(C_WINSOCKDRV *self);                                                                                                                                                                /** デストラクタ */
+
+HANDLE       WinSockDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode);
+FILE_ERR     WinSockDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+FILE_ERR     WinSockDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
+FILE_POS     WinSockDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign);
+FILE_SIZE    WinSockDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size);
+FILE_SIZE    WinSockDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size);
+FILE_ERR     WinSockDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+
+DWORD WINAPI WinSockDrv_Recv(LPVOID Param);
+DWORD WINAPI WinSockDrv_Send(LPVOID Param);
+void         WinSockDrv_Isr(VPARAM Param);
 
-HANDLE    WinSockDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode);
-FILE_ERR  WinSockDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
-FILE_ERR  WinSockDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
-FILE_POS  WinSockDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign);
-FILE_SIZE WinSockDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size);
-FILE_SIZE WinSockDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size);
-FILE_ERR  WinSockDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
 
 #ifdef __cplusplus
 }
diff --git a/aplfw/driver/serial/winsock/winsockdrv_open.c b/aplfw/driver/serial/winsock/winsockdrv_open.c
new file mode 100755 (executable)
index 0000000..40914f4
--- /dev/null
@@ -0,0 +1,40 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+/** オープン */
+HANDLE WinSockDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
+{
+       C_WINSOCKDRV            *self;
+       HANDLE                          hFile;
+
+       /* upper cast */
+       self = (C_WINSOCKDRV *)pDrvObj;
+
+       /* create file descriptor */
+       if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL )
+       {
+               return HANDLE_NULL;
+       }
+
+       /* オープン処理 */
+       if ( self->iOpenCount++ == 0 )
+       {
+       }
+
+       return hFile;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/serial/winsock/winsockdrv_read.c b/aplfw/driver/serial/winsock/winsockdrv_read.c
new file mode 100755 (executable)
index 0000000..a3e7787
--- /dev/null
@@ -0,0 +1,74 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+/** 読み出し */
+FILE_SIZE WinSockDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size)
+{
+       C_WINSOCKDRV    *self;
+       C_SYNCFILE              *pFile;
+       unsigned char   *pubBuf;
+       FILE_ERR                ErrCode;
+       FILE_SIZE               i;
+       int                             c;
+       
+       /* upper cast */
+       self  = (C_WINSOCKDRV *)pDrvObj;
+       pFile = (C_SYNCFILE *)pFileObj;
+
+
+       pubBuf = (unsigned char *)pBuf;
+
+       /* 読込み処理開始 */
+       if ( (ErrCode = SyncDrv_StartProcess(&self->SyncDrv, pFile, SYNCDRV_FACTOR_READ)) != FILE_ERR_OK )
+       {
+               return (FILE_SIZE)ErrCode;
+       }
+
+       /* 読込みシグナルを一旦クリア */
+       SyncFile_ClearSignal(pFile, SYNCDRV_FACTOR_READ);
+       
+       for ( i = 0; i < Size; i++ )
+       {
+               /* 読み出し */
+               while ( (c = StreamBuf_RecvChar(&self->StmBufRecv)) < 0 )
+               {
+                       /* ブロッキングモードでなければ抜ける */
+                       if ( SyncFile_GetSyncMode(pFile, SYNCDRV_FACTOR_READ) != FILE_SYNCMODE_BLOCKING )
+                       {
+                               SyncDrv_EndProcess(&self->SyncDrv, SYNCDRV_FACTOR_READ, i);
+                               return i;
+                       }
+                       
+                       /* 受信を待つ */
+                       SyncFile_WaitSignal(pFile, SYNCDRV_FACTOR_READ);
+                       
+                       /* 読込みシグナルをクリアしてリトライ */
+                       SyncFile_ClearSignal(pFile, SYNCDRV_FACTOR_READ);
+               }
+               
+               /* 読み出せた文字を格納 */    
+               *pubBuf++ = (unsigned char)c;
+       }
+       
+       /* 読み出し処理完了 */
+       SyncDrv_EndProcess(&self->SyncDrv, SYNCDRV_FACTOR_READ, (VPARAM)i);
+
+       return i;
+}
+
+
+
+/* end of file */
diff --git a/aplfw/driver/serial/winsock/winsockdrv_recv.c b/aplfw/driver/serial/winsock/winsockdrv_recv.c
new file mode 100755 (executable)
index 0000000..9a4bda4
--- /dev/null
@@ -0,0 +1,85 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+DWORD WINAPI WinSockDrv_Recv(LPVOID Param)
+{
+       C_WINSOCKDRV            *self;
+       WSADATA                         wsaData;
+       struct sockaddr_in      addr;
+       struct sockaddr_in      client;
+       int                                     len;
+       unsigned char           ubBuf[128];
+       int                                     iSize;
+
+       self = (C_WINSOCKDRV *)Param;
+       
+       /* socket 準備 */
+       WSAStartup(MAKEWORD(2,0), &wsaData);
+       self->sock0 = socket(AF_INET, SOCK_STREAM, 0);
+       addr.sin_family = AF_INET;
+       addr.sin_port = htons((u_short)self->iPortNum);
+       addr.sin_addr.S_un.S_addr = INADDR_ANY;
+       bind(self->sock0, (struct sockaddr *)&addr, sizeof(addr));
+       listen(self->sock0, 5);
+
+       for ( ; ; )
+       {
+               /* 接続待ち */
+               len = sizeof(client);
+               self->sock = accept(self->sock0, (struct sockaddr *)&client, &len);
+               if (self->sock == INVALID_SOCKET )
+               {
+                       break;
+               }
+               
+               /* 送信スレッド開始指示 */
+               self->iConnection = TRUE;
+               SetEvent(self->hConnectEvent);
+               
+               for ( ; ; )
+               {
+                       /* 受信 */
+                       if ( (iSize = recv(self->sock, ubBuf, sizeof(ubBuf), 0)) == SOCKET_ERROR )
+                       {
+                               break;
+                       }
+                       
+                       /* 受信バッファに格納 */
+                       StreamBuf_SendData(&self->StmBufRecv, ubBuf, iSize);
+                       
+                       /* 擬似割込み生成 */
+                       vsig_int(self->iIntNum);
+               }
+               
+               /* 送信スレッド停止指示 */
+               self->iConnection = FALSE;
+               SetEvent(self->hSendEvent);
+               
+               /* 送信スレッド停止待ち */
+               WaitForSingleObject(self->hDisconnectEvent, INFINITE);
+
+               /* 切断 */
+               closesocket(self->sock);
+       }
+       
+       WSACleanup();
+       
+       return 0;
+}
+
+
+
+/* end of file */
diff --git a/aplfw/driver/serial/winsock/winsockdrv_seek.c b/aplfw/driver/serial/winsock/winsockdrv_seek.c
new file mode 100755 (executable)
index 0000000..bac5cd4
--- /dev/null
@@ -0,0 +1,25 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+
+FILE_POS  WinSockDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign)
+{
+       return FILE_ERR_NG;
+}
+
+
+
+/* end of file */
diff --git a/aplfw/driver/serial/winsock/winsockdrv_send.c b/aplfw/driver/serial/winsock/winsockdrv_send.c
new file mode 100755 (executable)
index 0000000..68d2d37
--- /dev/null
@@ -0,0 +1,59 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+/* 送信スレッド */
+DWORD WINAPI WinSockDrv_Send(LPVOID Param)
+{
+       C_WINSOCKDRV    *self;
+       unsigned char   ubBuf[128];
+       int                             iSize;
+
+       self = (C_WINSOCKDRV *)Param;
+       
+       for ( ; ; )
+       {
+               /* 接続待ち */
+               WaitForSingleObject(self->hConnectEvent, INFINITE);
+               
+               for ( ; ; )
+               {
+                       /* 送信イベント待ち */
+                       WaitForSingleObject(self->hSendEvent, INFINITE);
+                       if ( self->iConnection != TRUE )
+                       {
+                               break;
+                       }
+
+                       /* 送信バッファから取り出し */
+                       while ( (iSize = StreamBuf_RecvData(&self->StmBufSend, ubBuf, sizeof(ubBuf))) > 0 )
+                       {
+                               /* 送信 */
+                               send(self->sock, ubBuf, iSize, 0);
+
+                               /* 擬似割込み生成 */
+                               vsig_int(self->iIntNum);
+                       }
+               }
+               
+               /* 停止通知 */
+               SetEvent(self->hDisconnectEvent);
+       }
+       
+       return 0;
+}
+
+
+
+/* end of file */
diff --git a/aplfw/driver/serial/winsock/winsockdrv_write.c b/aplfw/driver/serial/winsock/winsockdrv_write.c
new file mode 100755 (executable)
index 0000000..70aa28b
--- /dev/null
@@ -0,0 +1,76 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+/** 書き込み */
+FILE_SIZE WinSockDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
+{
+       C_WINSOCKDRV            *self;
+       C_SYNCFILE                      *pFile;
+       const unsigned char     *pubData;
+       FILE_ERR                        ErrCode;
+       FILE_SIZE                       SendSize = 0;
+       int                                     iLen;
+       
+       /* upper cast */
+       self  = (C_WINSOCKDRV *)pDrvObj;
+       pFile = (C_SYNCFILE *)pFileObj;
+       
+       pubData = (const unsigned char *)pData;
+       
+       /* 書込み処理開始 */
+       if ( (ErrCode = SyncDrv_StartProcess(&self->SyncDrv, pFile, SYNCDRV_FACTOR_WRITE)) != FILE_ERR_OK )
+       {
+               return (FILE_SIZE)ErrCode;
+       }
+
+       /* 書込みシグナルを一旦クリア */
+       SyncFile_ClearSignal(pFile, SYNCDRV_FACTOR_WRITE);
+       
+       while ( Size > 0 )
+       {
+               /* 送信可能かチェック */
+               while ( (iLen = StreamBuf_SendData(&self->StmBufSend, pubData, Size)) <= 0 )
+               {
+                       /* ブロッキングモードでなければ抜ける */
+                       if ( SyncFile_GetSyncMode(pFile, SYNCDRV_FACTOR_WRITE) != FILE_SYNCMODE_BLOCKING )
+                       {
+                               SyncDrv_EndProcess(&self->SyncDrv, SYNCDRV_FACTOR_WRITE, SendSize);
+                               return SendSize;
+                       }
+                       
+                       /* 書込みシグナルを待つ */
+                       SyncFile_WaitSignal(pFile, SYNCDRV_FACTOR_WRITE);
+                       
+                       /* 書込みシグナルをクリアしてリトライ */
+                       SyncFile_ClearSignal(pFile, SYNCDRV_FACTOR_WRITE);
+               }
+
+               /* 送信文字取り出し */
+               pubData  += iLen;
+               Size     -= iLen;
+               SendSize += iLen;
+               
+               /* 送信 */
+               SetEvent(self->hSendEvent);
+       }
+       
+       /* 書込み処理完了 */
+       SyncDrv_EndProcess(&self->SyncDrv, SYNCDRV_FACTOR_WRITE, (VPARAM)SendSize);
+       
+       return SendSize;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/serial/winsock/winsockfile.c b/aplfw/driver/serial/winsock/winsockfile.c
deleted file mode 100755 (executable)
index baeb906..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/** 
- *  Hyper Operating System  Application Framework
- *
- * @file  scifile.c
- * @brief %jp{SCI用デバイスドライバ用ファイルI/Fクラス}
- *
- * Copyright (C) 2006 by Project HOS
- * http://sourceforge.jp/projects/hos/
- */
-
-#include <stdio.h>
-#include "winsockfile.h"
-
-
-static void      WinSockFile_Delete(HANDLE hFile);                             /**< デストラクタ */
-static FILE_ERR  WinSockFile_IoControl(HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize);
-static FILE_POS  WinSockFile_Seek(HANDLE hFile, FILE_POS Offset, int iOrign);
-static FILE_SIZE WinSockFile_Read(HANDLE hFile, void *pBuf, FILE_SIZE Size);
-static FILE_SIZE WinSockFile_Write(HANDLE hFile, const void *pData, FILE_SIZE Size);
-
-
-const T_HANDLEOBJ_METHODS WinSockFile_HandleObjMethods =
-{
-       WinSockFile_Delete,                     /* デストラクタ */
-};
-
-const T_FILEOBJ_METHODS WinSockFile_FileObjMethods =
-{
-       { WinSockFile_Delete },         /* デストラクタ */
-       WinSockFile_IoControl,          /* IoControl */
-       NULL,                                           /* Seek */
-       WinSockFile_Read,                       /* Read */
-       WinSockFile_Write,                      /* Write */
-};
-
-
-/** コンストラクタ */
-FILE_ERR WinSockFile_Create(HANDLE hFile, void *pParam, int iMode)
-{
-       C_WINSOCKFILE *self;
-
-       self = (C_WINSOCKFILE *)hFile;
-       
-       /* 親クラスコンストラクタ呼び出し */
-       FileObj_Create(&self->FileObj, &WinSockFile_FileObjMethods);
-       
-       /* デバイスドライバ本体と関連付け */
-       self->pWinSockDrv = (C_WINSOCKDRV *)pParam;
-       
-       /* デバイスを開く */
-       WinSockDrv_Open(self->pWinSockDrv);
-
-       return FILE_ERR_OK;
-}
-
-
-/** デストラクタ */
-void WinSockFile_Delete(HANDLE hFile)
-{
-       C_WINSOCKFILE *self;
-
-       self = (C_WINSOCKFILE *)hFile;
-
-       /* デバイスを閉じる */
-       WinSockDrv_Close(self->pWinSockDrv);
-
-       /* 親クラスデストラクタ呼び出し */
-       FileObj_Delete(&self->FileObj);
-}
-
-
-FILE_ERR  WinSockFile_IoControl(HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize)
-{
-       return FILE_ERR_NG;
-}
-
-
-FILE_SIZE WinSockFile_Read(HANDLE hFile, void *pBuf, FILE_SIZE Size)
-{
-       C_WINSOCKFILE *self;
-
-       self = (C_WINSOCKFILE *)hFile;
-
-       return WinSockDrv_Read(self->pWinSockDrv, pBuf, Size);
-}
-
-FILE_SIZE WinSockFile_Write(HANDLE hFile, const void *pData, FILE_SIZE Size)
-{
-       C_WINSOCKFILE *self;
-
-       self = (C_WINSOCKFILE *)hFile;
-
-       return WinSockDrv_Write(self->pWinSockDrv, pData, Size);
-}
-
-
-/* end of file */
diff --git a/aplfw/driver/serial/winsock/winsockfile.h b/aplfw/driver/serial/winsock/winsockfile.h
deleted file mode 100755 (executable)
index 899addb..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/** 
- *  Hyper Operating System  Application Framework
- *
- * @file  winsockfile.h
- * @brief 
- *
- * Copyright (C) 2006 by Project HOS
- * http://sourceforge.jp/projects/hos/
- */
-
-
-#ifndef __HOS__winsockfile_h__
-#define __HOS__winsockfile_h__
-
-
-#include "winsockdrv.h"
-#include "system/file/fileobj.h"
-
-
-/* SCI用ドライバ制御部 */
-typedef struct c_winsockfile
-{
-       C_FILEOBJ     FileObj;                  /* ファイルオブジェクトを継承 */
-
-       C_WINSOCKDRV  *pWinSockDrv;             /* SciDrvクラスの参照 */
-} C_WINSOCKFILE;
-
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* SCI用デバイスドライバ */
-FILE_ERR WinSockFile_Create(HANDLE hFile, void *pParam, int iMode);                    /**< コンストラクタ */
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* __HOS__winsockfile_h__ */
-
-
-/* end of file */
index 564e422..13b73b6 100755 (executable)
@@ -14,7 +14,7 @@
 
 
 #include "system/sysapi/sysapi.h"
-#include "system/file/syncdrv.h"
+#include "system/file/syncdrv_local.h"
 
 
 #define IPETHER_ARPTBL_SIZE                    4
index 0f1bda4..5135800 100755 (executable)
@@ -45,7 +45,7 @@ FILE_ERR IpEther_Constructor(C_IPETHER *self, const T_DRVOBJ_METHODS *pMethods,
        self->hMtxArp  = SysMtx_Create(SYSMTX_ATTR_NORMAL);
 
        /* 受信プロセス生成 */
-       self->hPrcRecv = SysPrc_Create(IpEther_Recv, (VPARAM)self, 1024, 2, SYSPRC_ATTR_NORMAL);
+       self->hPrcRecv = SysPrc_Create(IpEther_Recv, (VPARAM)self, NULL, 1024, 2, SYSPRC_ATTR_NORMAL);
 
        return FILE_ERR_OK;
 }
index af3ec3d..a42fb37 100755 (executable)
@@ -22,7 +22,7 @@ HANDLE IpEther_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
        self = (C_IPETHER *)pDrvObj;
        
        /* create file descriptor */
-       if ( (hFile = SyncFile_Create(&self->SyncDrv)) == HANDLE_NULL )
+       if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL )
        {
                return HANDLE_NULL;
        }
index 466328e..9530deb 100755 (executable)
@@ -14,7 +14,7 @@
 
 
 #include "system/sysapi/sysapi.h"
-#include "system/file/syncdrv.h"
+#include "system/file/syncdrv_local.h"
 
 
 
index 89eb191..0c8baf2 100755 (executable)
@@ -34,7 +34,7 @@ FILE_ERR  TcpIp_Constructor(C_TCPIP *self, const T_DRVOBJ_METHODS *pMethods, con
        self->hMtxSend = SysMtx_Create(SYSMTX_ATTR_NORMAL);
        
        /* 受信プロセス生成 */
-       self->hPrcRecv = SysPrc_Create(TcpIp_Recv, (VPARAM)self, 1024, 2, SYSPRC_ATTR_NORMAL);
+       self->hPrcRecv = SysPrc_Create(TcpIp_Recv, (VPARAM)self, NULL, 1024, 2, SYSPRC_ATTR_NORMAL);
        
        return FILE_ERR_OK;
 }
index b2cb261..d907144 100755 (executable)
@@ -24,7 +24,7 @@ HANDLE TcpIp_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
        self = (C_TCPIP *)pDrvObj;
 
        /* create file descriptor */
-       if ( (hFile = TcpIpFile_Create(self)) == HANDLE_NULL )
+       if ( (hFile = TcpIpFile_Create(self, iMode)) == HANDLE_NULL )
        {
                return HANDLE_NULL;
        }
index 1d90186..41e696f 100755 (executable)
@@ -48,7 +48,7 @@ typedef struct c_tcpipfile
 extern "C" {
 #endif
 
-HANDLE TcpIpFile_Create(C_TCPIP *pTcpIp);
+HANDLE TcpIpFile_Create(C_TCPIP *pTcpIp, int iMode);
 void   TcpIpFile_Delete(HANDLE hFile);
 
 
index bfcb271..95d8cd0 100755 (executable)
 #include "tcpipfile_local.h"
 
 
-void TcpIpFile_Constructor(C_TCPIPFILE *self, const T_FILEOBJ_METHODS *pMethods, C_TCPIP *pTcpIp)
+void TcpIpFile_Constructor(C_TCPIPFILE *self, const T_FILEOBJ_METHODS *pMethods, C_TCPIP *pTcpIp, int iMode)
 {
        /* 親クラスコンストラクタ */
-       SyncFile_Constructor(&self->SyncFile, pMethods, &pTcpIp->SyncDrv);
+       SyncFile_Constructor(&self->SyncFile, pMethods, &pTcpIp->SyncDrv, iMode);
        
        /* メンバ変数初期化 */
        /* 初期化 */
index 5b8f150..a10a7ae 100755 (executable)
@@ -18,7 +18,7 @@ static const T_FILEOBJ_METHODS TcpIpFile_FileObjMethods =
        };
 
 
-HANDLE TcpIpFile_Create(C_TCPIP *pTcpIp)
+HANDLE TcpIpFile_Create(C_TCPIP *pTcpIp, int iMode)
 {
        C_TCPIPFILE *self;
 
@@ -29,7 +29,7 @@ HANDLE TcpIpFile_Create(C_TCPIP *pTcpIp)
        }
        
        /* コンストラクタ呼び出し */
-       FatFile_Constructor(self, &TcpIpFile_FileObjMethods, pTcpIp);
+       FatFile_Constructor(self, &TcpIpFile_FileObjMethods, pTcpIp, iMode);
        
        return (HANDLE)self;
 }
index 84b08ca..6ca8a41 100755 (executable)
@@ -23,7 +23,7 @@
 extern "C" {
 #endif
 
-void  TcpIpFile_Constructor(C_TCPIPFILE *self, const T_FILEOBJ_METHODS *pMethods, C_TCPIP *pTcpIp);
+void  TcpIpFile_Constructor(C_TCPIPFILE *self, const T_FILEOBJ_METHODS *pMethods, C_TCPIP *pTcpIp, int iMode);
 void  TcpIpFile_Destructor(C_TCPIPFILE *self);
 
 #ifdef __cplusplus
index 73940ab..0e58def 100755 (executable)
@@ -22,7 +22,6 @@ typedef struct c_fatfile
 {
        C_FILEOBJ       FileObj;                        /* ボリュームオブジェクトを継承 */
        
-       int                     iMode;                          /* ファイルのモード */
        FATVOL_UINT     uiStartCluster;         /* ファイルの先頭クラスタ */
        
        FATVOL_UINT     uiDirCluster;           /* 所属するディレクトリのクラスタ位置 */
index b06fdd2..92567a0 100755 (executable)
 void FatFile_Constructor(C_FATFILE *self, const T_FILEOBJ_METHODS *pMethods, C_FATVOL *pFatVol, FATVOL_UINT uiStartCluster, FATVOL_UINT uiDirCluster, FATVOL_UINT uiDirEntryPos, FILE_POS FileSize, int iMode)
 {
        /* 親クラスコンストラクタ */
-       FileObj_Constructor(&self->FileObj, pMethods, &pFatVol->VolumeObj.DrvObj);
+       FileObj_Constructor(&self->FileObj, pMethods, &pFatVol->VolumeObj.DrvObj, iMode);
        
        /* メンバ変数初期化 */
-       self->iMode          = iMode;
        self->uiStartCluster = uiStartCluster;
        self->uiDirCluster   = uiDirCluster;
        self->uiDirEntryPos  = uiDirEntryPos;
index 16fd419..6a6cd69 100755 (executable)
 FILE_ERR FatVol_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
 {
        C_FATVOL        *self;
-       C_FATFILE       *pFile;
        
        /* upper cast */
        self  = (C_FATVOL *)pDrvObj;
-       pFile = (C_FATFILE *)pFileObj;
 
        /* クリティカルセクションに入る */
        SysMtx_Lock(self->hMtx);
index 035bca1..c91ee0e 100755 (executable)
@@ -35,7 +35,7 @@ FILE_SIZE FatVol_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_S
        SysMtx_Lock(self->hMtx);
        
        /* サイズチェック */
-       if ( !(pFile->iMode & FILE_OPEN_DIR) )
+       if ( !(FileObj_GetMode(&pFile->FileObj) & FILE_OPEN_DIR) )
        {
                if ( Size > pFile->FileSize - pFile->FilePos )
                {
@@ -57,7 +57,7 @@ FILE_SIZE FatVol_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_S
        }
        
        /* 読み出し */
-       while ( Size > 0 && (pFile->FilePos < pFile->FileSize || (pFile->iMode & FILE_OPEN_DIR)) )
+       while ( Size > 0 && (pFile->FilePos < pFile->FileSize || (FileObj_GetMode(&pFile->FileObj) & FILE_OPEN_DIR)) )
        {
                FILE_POS                        ReadStart;
                FILE_SIZE                       ReadSize;
index 88b5046..a21f5dc 100755 (executable)
@@ -52,7 +52,7 @@ FILE_POS FatVol_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, in
        }
        
        /* サイズクリップ */
-       if ( pFile->FilePos > pFile->FileSize && !(pFile->iMode & FILE_OPEN_DIR) )
+       if ( pFile->FilePos > pFile->FileSize && !(pFile->FileObj.iMode & FILE_OPEN_DIR) )
        {
                pFile->FilePos = pFile->FileSize;
        }
index 22d9dbd..06c5168 100755 (executable)
@@ -44,7 +44,7 @@ FILE_SIZE FatVol_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData
        SysMtx_Lock(self->hMtx);
        
        /* モードチェック */
-       if ( !(pFile->iMode & FILE_OPEN_WRITE) || (pFile->iMode & FILE_OPEN_DIR) )
+       if ( !(FileObj_GetMode(&pFile->FileObj) & FILE_OPEN_WRITE) || (FileObj_GetMode(&pFile->FileObj) & FILE_OPEN_DIR) )
        {
                SysMtx_Unlock(self->hMtx);
                return 0;
@@ -147,7 +147,7 @@ FILE_SIZE FatVol_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData
        }
        
        /* ディレクトリテーブルのサイズ更新 */
-       if ( iResizeFlag &&     !(pFile->iMode & FILE_OPEN_DIR) )
+       if ( iResizeFlag &&     !(FileObj_GetMode(&pFile->FileObj) & FILE_OPEN_DIR) )
        {
                FatVol_SyncFileSize(self, pFile);
        }
index 13c0ea2..03806bf 100755 (executable)
@@ -166,7 +166,7 @@ int Boot_Process(VPARAM Param)
        /*      シェル起動       */
        /*************************/
        
-       Command_Execute("hsh", NULL);
+       Command_Execute("hsh -i", NULL);
        
        return 0;
 }
similarity index 98%
rename from aplfw/sample/sh/cq7144a/boot_task.c
rename to aplfw/sample/sh/cq7144a/boot.c
index d1b39fc..66191d6 100755 (executable)
@@ -29,6 +29,7 @@
 #include "application/utility/memwrite/memwrite.h"
 #include "application/utility/memtest/memtest.h"
 #include "application/utility/keytest/keytest.h"
+#include "boot.h"
 #include "regs_sh7144.h"
 
 int Boot_Process(VPARAM Param);
@@ -138,7 +139,7 @@ int Boot_Process(VPARAM Param)
        /*      シェル起動       */
        /*************************/
        
-       Command_Execute("hsh", NULL);
+       Command_Execute("hsh -i", NULL);
        
        return 0;
 }
index 8f1ba1c..2d715ad 100755 (executable)
@@ -89,7 +89,7 @@ ASRCS += ./vector.S                   \
 # %jp{C言語ファイルの追加}
 CSRCS += ../kernel_cfg.c       \
          ../main.c                     \
-         ../boot_task.c                \
+         ../boot.c                     \
          ../ostimer.c
 
 # %jp{ライブラリの追加}
index aa50ef5..1345ce5 100755 (executable)
@@ -87,7 +87,7 @@ ASRCS += ./vcttbl.src         \
 CSRCS += ./dbsct.c                     \
          ../kernel_cfg.c       \
          ../main.c                     \
-         ../boot_task.c                \
+         ../boot.c                     \
          ../ostimer.c
 
 
index 820db38..0367512 100755 (executable)
@@ -25,7 +25,7 @@ INCLUDE("\"ostimer.h\"");
 ATT_INI({TA_HLNG, 0, OsTimer_Initialize});
 
 /* %jp{サンプル}%en{Sample program} */
-INCLUDE("\"boot_task.h\"");
+INCLUDE("\"boot.h\"");
 CRE_TSK(TSKID_BOOT, {TA_HLNG | TA_ACT, 0, Boot_Task, 2, 1024, NULL});
 
 
similarity index 98%
rename from aplfw/sample/win/win32/boot_task.c
rename to aplfw/sample/win/win32/boot.c
index 0f52857..0cf9497 100755 (executable)
@@ -118,7 +118,7 @@ int Boot_Process(VPARAM Param)
        /*      シェル起動       */
        /*************************/
        
-       Command_Execute("hsh", NULL);
+       Command_Execute("hsh -i", NULL);
 
        return 0;
 }
index 4172127..bf99123 100755 (executable)
@@ -69,7 +69,7 @@ ASRCS = $(ASRCS)
 # %jp{C言語ファイルの追加}
 CSRCS = $(CSRCS) ..\kernel_cfg.c
 CSRCS = $(CSRCS) ..\main.c
-CSRCS = $(CSRCS) ..\sample.c
+CSRCS = $(CSRCS) ..\boot.c
 CSRCS = $(CSRCS) ..\ostimer.c
 CSRCS = $(CSRCS) ..\wintimer.c
 
index dee54f7..2ffa84b 100755 (executable)
@@ -50,7 +50,7 @@ DWORD WINAPI WinTimer_Thread(LPVOID param)
        {
                /* %jp{タイマイベントを待つ} */
                WaitForSingleObject(hEventTimer, INFINITE);
-
+               
                /* %jp{割り込みシグナルを入れる} */
                vsig_int(inhno);
        }
index 59c5ebe..e65411b 100755 (executable)
@@ -14,7 +14,7 @@
 
 
 /* 仮想関数テーブル */
-const static T_HANDLEOBJ_METHODS Event_Methods =
+static const T_HANDLEOBJ_METHODS Event_Methods =
        {
                Event_Delete
        };
index 1e23d32..2213ed6 100755 (executable)
@@ -15,7 +15,7 @@
 
 
 #include "event.h"
-#include "system/handle/handleobj.h"
+#include "system/handle/handleobj_local.h"
 #include "system/sysapi/sysapi.h"
 
 
index 9c2f59b..978d11b 100755 (executable)
 
 int File_GetChar(HANDLE hFile)
 {
-       char c;
-       if ( File_Read(hFile, &c, 1) != 1 )
-       {
-               return FILE_EOF;
-       }
+       C_FILEOBJ       *pFileObj;
+       char            c;
+
+       pFileObj = (C_FILEOBJ *)hFile;
+       
+       do
+       {       
+               if ( File_Read(hFile, &c, 1) != 1 )
+               {
+                       return FILE_EOF;
+               }
+       } while ( c == '\r' && (FileObj_GetMode(pFileObj) & FILE_OPEN_TEXT) );
+
+       
        return c;
 }
 
index 5f50517..38fd624 100755 (executable)
 
 int File_GetString(HANDLE hFile, char *pszString, int iSize)
 {
-       int i;
-       int c;
-
+       int     i;
+       int     c;
+       
        for ( i = 0; i < iSize - 1; i++ )
        {
                c = File_GetChar(hFile);
+               
                if ( c == FILE_EOF )
                {
                        if ( i == 0 )
@@ -34,11 +35,12 @@ int File_GetString(HANDLE hFile, char *pszString, int iSize)
 
                if ( c == '\n' )
                {
+                       i++;
                        break;
                }
        }
        pszString[i] = '\0';
-
+       
        return i;
 }
 
index c360804..73bede6 100755 (executable)
@@ -31,6 +31,8 @@ typedef struct t_fileobj_methods
 typedef struct c_fileobj
 {
        C_HANDLEOBJ             HandleObj;                              /* ハンドルオブジェクトを継承 */
+
+       int                             iMode;                                  /* オープン時のモード */
        
        struct c_drvobj *pDrvObj;                               /* ドライバへの参照 */
 } C_FILEOBJ;
@@ -47,9 +49,11 @@ typedef struct c_fileobj
 extern "C" {
 #endif
 
-HANDLE FileObj_Create(struct c_drvobj *pDrvObj);
+HANDLE FileObj_Create(struct c_drvobj *pDrvObj, int iMode);
 void   FileObj_Delete(HANDLE Handle);
 
+#define FileObj_GetMode(self)          ((self)->iMode)
+
 #ifdef __cplusplus
 }
 #endif
index bbda103..f6fa346 100755 (executable)
 
 
 /* コンストラクタ */
-void FileObj_Constructor(C_FILEOBJ *self, const T_FILEOBJ_METHODS *pMethods, C_DRVOBJ *pDrvObj)
+void FileObj_Constructor(C_FILEOBJ *self, const T_FILEOBJ_METHODS *pMethods, C_DRVOBJ *pDrvObj, int iMode)
 {
        /* 親クラスコンストラクタ呼び出し */
        HandleObj_Constructor(&self->HandleObj, &pMethods->HandlObjMethods);
        
        /* メンバ変数初期化 */
        self->pDrvObj = pDrvObj;
+       self->iMode   = iMode;
 }
 
 
index a40a80c..8ead52e 100755 (executable)
@@ -10,7 +10,7 @@
 
 
 #include "fileobj_local.h"
-#include "system/sysapi/sysapi.h"
+
 
 
 static const T_FILEOBJ_METHODS FileObj_FileObjMethods =
@@ -19,7 +19,7 @@ static const T_FILEOBJ_METHODS FileObj_FileObjMethods =
        };
 
 
-HANDLE FileObj_Create(struct c_drvobj *pDrvObj)
+HANDLE FileObj_Create(struct c_drvobj *pDrvObj, int iMode)
 {
        C_FILEOBJ *self;
        
@@ -30,7 +30,7 @@ HANDLE FileObj_Create(struct c_drvobj *pDrvObj)
        }
        
        /* コンストラクタ呼び出し */
-       FileObj_Constructor(self, &FileObj_FileObjMethods, pDrvObj);
+       FileObj_Constructor(self, &FileObj_FileObjMethods, pDrvObj, iMode);
        
        return (HANDLE)self;
 }
index 36e238a..dd6e2a8 100755 (executable)
@@ -8,7 +8,7 @@
  * http://sourceforge.jp/projects/hos/
  */
 
-#include "fileobj.h"
+#include "fileobj_local.h"
 
 
 void FileObj_Delete(HANDLE hFile)
@@ -17,7 +17,9 @@ void FileObj_Delete(HANDLE hFile)
        
        self = (C_FILEOBJ *)hFile;
 
-       HandleObj_Delete(&self->HandleObj);
+       FileObj_Destructor(self);
+       
+       SysMem_Free(self);
 }
 
 
index e1c9a71..6e272b4 100755 (executable)
 
 #include "fileobj.h"
 #include "system/handle/handleobj_local.h"
+#include "system/sysapi/sysapi.h"
 
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-void FileObj_Constructor(C_FILEOBJ *self, const T_FILEOBJ_METHODS *pMethods, struct c_drvobj *pDrvObj);        /**< コンストラクタ */
-void FileObj_Destructor(C_FILEOBJ *self);                                                                                                                              /**< デストラクタ */
+void FileObj_Constructor(C_FILEOBJ *self, const T_FILEOBJ_METHODS *pMethods, struct c_drvobj *pDrvObj, int iMode);     /**< コンストラクタ */
+void FileObj_Destructor(C_FILEOBJ *self);                                                                                                                                                      /**< デストラクタ */
 
 #ifdef __cplusplus
 }
index 0b69aa7..313d1a5 100755 (executable)
 #define __HOS__syncdrv_h__
 
 
-#include "system/sysapi/sysapi.h"
-#include "system/file/syncfile.h"
-#include "system/file/drvobj.h"
-
-
-/* デバイスドライバオブジェクト基本クラス(抽象クラス) */
-typedef struct c_syncdrv
-{
-       C_DRVOBJ                DrvObj;                         /**< DrvObjクラスを継承 */
-
-       C_SYNCFILE              *pFileHead;                     /**< ファイルオブジェクトの連結ポインタ */
-       
-       SYSEVT_HANDLE   hMtx;                           /**< 排他制御ミューテックス */
-       
-       int                             iSyncFactorNum;         /**< 同期要因の数 */
-       C_SYNCFILE              **ppBusyFile;           /**< 処理中ファイルオブジェクト */
-} C_SYNCDRV;
-
-
-
 #ifdef __cplusplus
 extern "C" {
 #endif
index 9eb5d8c..dce99f7 100755 (executable)
 #define __HOS__syncdrv_local_h__
 
 
-#include "system/file/syncdrv.h"
+#include "syncdrv.h"
 #include "system/file/drvobj_local.h"
+#include "system/sysapi/sysapi.h"
+
 
 
 /* 処理要因定義 */
 
 #define SYNCDRV_FACTOR_NUM                     3
 
+struct c_syncfile;
+
+/* デバイスドライバオブジェクト基本クラス(抽象クラス) */
+typedef struct c_syncdrv
+{
+       C_DRVOBJ                        DrvObj;                         /**< DrvObjクラスを継承 */
+
+       struct c_syncfile       *pFileHead;                     /**< ファイルオブジェクトの連結ポインタ */
+       
+       SYSEVT_HANDLE           hMtx;                           /**< 排他制御ミューテックス */
+       
+       int                                     iSyncFactorNum;         /**< 同期要因の数 */
+       struct c_syncfile       **ppBusyFile;           /**< 処理中ファイルオブジェクト */
+} C_SYNCDRV;
+
+
+#include "system/file/syncfile_local.h"
 
 
 #ifdef __cplusplus
@@ -35,7 +54,7 @@ void     SyncDrv_Destructor(C_SYNCDRV *self);                                                                                                                 /**< デストラク
 
 #define  SyncDrv_GetSyncFactorNum(self)                ((self)->iSyncFactorNum)                                                                        /**< 同期要因数取得 */
 
-FILE_ERR SyncDrv_StartProcess(C_SYNCDRV *self, C_SYNCFILE *pSyncFile, int iFactor);                                            /**< 処理の開始 */
+FILE_ERR SyncDrv_StartProcess(C_SYNCDRV *self, struct c_syncfile *pSyncFile, int iFactor);                             /**< 処理の開始 */
 void     SyncDrv_EndProcess(C_SYNCDRV *self, int iFactor, VPARAM ErrCode);                                                             /**< 処理の完了 */
 void     SyncDrv_SendSignal(C_SYNCDRV *self, int iFactor);                                                                                             /**< シグナルの送信 */
 
index e37a601..14c6fc2 100755 (executable)
 #define __HOS__syncfile_h__
 
 
-#include "system/sysapi/sysapi.h"
-#include "system/handle/handleobj.h"
-#include "system/file/fileobj.h"
+#include "hosaplfw.h"
 
 
 struct c_syncdrv;
 
-/* 同期オブジェクト */
-typedef struct t_syncfile_syncobj
-{
-       int                                     Mode;                   /**< 同期モード */
-       VPARAM                          ErrCode;                /**< エラーコード */
-       SYSEVT_HANDLE           hEvt;                   /**< 同期イベント */
-       T_FILE_SYNCINF          Inf;                    /**< 同期情報 */
-} T_SYNCFILE_SYNCOBJ;
-
-
-/* ファイルブジェクト基本クラス定義 */
-typedef struct c_syncfile
-{
-       C_FILEOBJ                       FileObj;                /**< ファイルオブジェクトを継承 */
-       
-       struct c_syncfile       *pNext;                 /**< イベント監視リスト連結用 */
-       struct c_syncfile       *pPrev;                 /**< イベント監視リスト連結用 */
-
-       T_SYNCFILE_SYNCOBJ      *pSyncObj;              /**< 同期オブジェクト */
-} C_SYNCFILE;
-
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-HANDLE   SyncFile_Create(struct c_syncdrv *pSyncDrv);
+HANDLE   SyncFile_Create(struct c_syncdrv *pSyncDrv, int iMode);
 void     SyncFile_Delete(HANDLE hFile);
 
-void     SyncFile_SetSignal(C_SYNCFILE *self, int iFactor);                                                                                                                    /**< シグナルのセット */
-#define  SyncFile_ClearSignal(self, iFactor)           do { SysEvt_Clear((self)->pSyncObj[iFactor].hEvt); } while(0)   /**< シグナルのクリア */
-#define  SyncFile_WaitSignal(self, iFactor)                    do { SysEvt_Wait((self)->pSyncObj[iFactor].hEvt); } while(0)    /**< シグナルを待つ */
-#define  SyncFile_RefSignal(self, iFactor)                     (SysEvt_RefStatus((self)->pSyncObj[iFactor].hEvt))                              /**< シグナルの状態参照 */
-
-#define  SyncFile_SetSyncMode(self, iFactor, x)                do { ((self)->pSyncObj[iFactor].Mode) = (x); } while(0)                 /**< 同期モード設定 */
-#define  SyncFile_GetSyncMode(self, iFactor)           ((self)->pSyncObj[iFactor].Mode)                                                                /**< 同期モード取得 */
-
-#define  SyncFile_SetSyncInf(self, iFactor, x)         do { ((self)->pSyncObj[iFactor].Inf) = (x); } while(0)                  /**< 同期情報設定 */
-#define  SyncFile_GetSyncInf(self, iFactor)                    ((self)->pSyncObj[iFactor].Inf)                                                                 /**< 同期情報取得 */
-
-#define  SyncFile_SetErrCode(self, iFactor, x)         do { ((self)->pSyncObj[iFactor].ErrCode) = (x); } while(0)              /**< エラーコード設定 */
-#define  SyncFile_GetErrCode(self, iFactor)                    ((self)->pSyncObj[iFactor].ErrCode)                                                             /**< エラーコード取得 */
-
-
 #ifdef __cplusplus
 }
 #endif
index d35f27d..2291be6 100755 (executable)
@@ -15,7 +15,7 @@
 #include "syncfile_local.h"
 
 
-FILE_ERR SyncFile_Constructor(C_SYNCFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_syncdrv *pSyncDrv)
+FILE_ERR SyncFile_Constructor(C_SYNCFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_syncdrv *pSyncDrv, int iMode)
 {
        int iFactorNum;
        int i;
@@ -30,7 +30,7 @@ FILE_ERR SyncFile_Constructor(C_SYNCFILE *self, const T_FILEOBJ_METHODS *pMethod
        }
 
        /* 親クラスコンストラクタ呼び出し */
-       FileObj_Constructor(&self->FileObj, pMethods, &pSyncDrv->DrvObj);
+       FileObj_Constructor(&self->FileObj, pMethods, &pSyncDrv->DrvObj, iMode);
        
        /* メンバ初期化 */
        for ( i = 0; i < iFactorNum; i++ )
index b166e43..bba3e25 100755 (executable)
@@ -21,7 +21,7 @@ static const T_FILEOBJ_METHODS SyncFile_FileObjMethods =
        };
 
 
-HANDLE SyncFile_Create(struct c_syncdrv *pSyncDrv)
+HANDLE SyncFile_Create(struct c_syncdrv *pSyncDrv, int iMode)
 {
        C_SYNCFILE *self;
        
@@ -32,7 +32,7 @@ HANDLE SyncFile_Create(struct c_syncdrv *pSyncDrv)
        }
        
        /* コンストラクタ呼び出し */
-       if ( SyncFile_Constructor(self, &SyncFile_FileObjMethods, pSyncDrv) != FILE_ERR_OK )
+       if ( SyncFile_Constructor(self, &SyncFile_FileObjMethods, pSyncDrv, iMode) != FILE_ERR_OK )
        {
                SysMem_Free(self);
                return HANDLE_NULL;
index 3a33377..7ac2a09 100755 (executable)
 
 #include "syncfile.h"
 #include "system/file/fileobj_local.h"
-#include "syncdrv_local.h"
+#include "system/file/syncdrv_local.h"
+#include "system/sysapi/sysapi.h"
+
+
+/* 同期オブジェクト */
+typedef struct t_syncfile_syncobj
+{
+       int                                     Mode;                   /**< 同期モード */
+       VPARAM                          ErrCode;                /**< エラーコード */
+       SYSEVT_HANDLE           hEvt;                   /**< 同期イベント */
+       T_FILE_SYNCINF          Inf;                    /**< 同期情報 */
+} T_SYNCFILE_SYNCOBJ;
+
+
+/* ファイルブジェクト基本クラス定義 */
+typedef struct c_syncfile
+{
+       C_FILEOBJ                       FileObj;                /**< ファイルオブジェクトを継承 */
+       
+       struct c_syncfile       *pNext;                 /**< イベント監視リスト連結用 */
+       struct c_syncfile       *pPrev;                 /**< イベント監視リスト連結用 */
+
+       T_SYNCFILE_SYNCOBJ      *pSyncObj;              /**< 同期オブジェクト */
+} C_SYNCFILE;
+
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-FILE_ERR SyncFile_Constructor(C_SYNCFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_syncdrv *pSyncDrv);
+FILE_ERR SyncFile_Constructor(C_SYNCFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_syncdrv *pSyncDrv, int iMode);
 void     SyncFile_Destructor(C_SYNCFILE *self);
 
+void     SyncFile_SetSignal(C_SYNCFILE *self, int iFactor);                                                                                                                    /**< シグナルのセット */
+#define  SyncFile_ClearSignal(self, iFactor)           do { SysEvt_Clear((self)->pSyncObj[iFactor].hEvt); } while(0)   /**< シグナルのクリア */
+#define  SyncFile_WaitSignal(self, iFactor)                    do { SysEvt_Wait((self)->pSyncObj[iFactor].hEvt); } while(0)    /**< シグナルを待つ */
+#define  SyncFile_RefSignal(self, iFactor)                     (SysEvt_RefStatus((self)->pSyncObj[iFactor].hEvt))                              /**< シグナルの状態参照 */
+
+#define  SyncFile_SetSyncMode(self, iFactor, x)                do { ((self)->pSyncObj[iFactor].Mode) = (x); } while(0)                 /**< 同期モード設定 */
+#define  SyncFile_GetSyncMode(self, iFactor)           ((self)->pSyncObj[iFactor].Mode)                                                                /**< 同期モード取得 */
+
+#define  SyncFile_SetSyncInf(self, iFactor, x)         do { ((self)->pSyncObj[iFactor].Inf) = (x); } while(0)                  /**< 同期情報設定 */
+#define  SyncFile_GetSyncInf(self, iFactor)                    ((self)->pSyncObj[iFactor].Inf)                                                                 /**< 同期情報取得 */
+
+#define  SyncFile_SetErrCode(self, iFactor, x)         do { ((self)->pSyncObj[iFactor].ErrCode) = (x); } while(0)              /**< エラーコード設定 */
+#define  SyncFile_GetErrCode(self, iFactor)                    ((self)->pSyncObj[iFactor].ErrCode)                                                             /**< エラーコード取得 */
+
 #ifdef __cplusplus
 }
 #endif
index aff1018..27e6c78 100755 (executable)
@@ -38,7 +38,7 @@ HANDLE SysVol_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
                }
                
                /* ディスクリプタ生成 */
-               if ( (hDir = SysVolFile_Create(self)) == HANDLE_NULL )
+               if ( (hDir = SysVolFile_Create(self, iMode)) == HANDLE_NULL )
                {
                        return HANDLE_NULL;
                }
index 29b10ed..a91a422 100755 (executable)
@@ -34,7 +34,7 @@ typedef struct c_sysvolfile
 extern "C" {
 #endif
 
-HANDLE   SysVolFile_Create(struct c_sysvol *pSysVol);
+HANDLE   SysVolFile_Create(struct c_sysvol *pSysVol, int iMode);
 void     SysVolFile_Delete(HANDLE hFile);
 
 #ifdef __cplusplus
index b6bf5c6..85f3399 100755 (executable)
 
 
 /* コンストラクタ */
-void SysVolFile_Constructor(C_SYSVOLFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_sysvol *pSysVol)
+void SysVolFile_Constructor(C_SYSVOLFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_sysvol *pSysVol, int iMode)
 {
        /* 親クラスコンストラクタ呼び出し */
-       FileObj_Constructor(&self->FileObj, pMethods, &pSysVol->VolumeObj.DrvObj);
+       FileObj_Constructor(&self->FileObj, pMethods, &pSysVol->VolumeObj.DrvObj, iMode);
        
        /* メンバ変数初期化 */
        self->iReadPtr = 0;
index 6111c3f..0c9c46d 100755 (executable)
@@ -20,7 +20,7 @@ static const T_FILEOBJ_METHODS SysVolFile_FileObjMethods =
        };
 
 
-HANDLE SysVolFile_Create(struct c_sysvol *pSysVol)
+HANDLE SysVolFile_Create(struct c_sysvol *pSysVol, int iMode)
 {
        C_SYSVOLFILE *self;
        
@@ -31,7 +31,7 @@ HANDLE SysVolFile_Create(struct c_sysvol *pSysVol)
        }
        
        /* コンストラクタ呼び出し */
-       SysVolFile_Constructor(self, &SysVolFile_FileObjMethods, pSysVol);      
+       SysVolFile_Constructor(self, &SysVolFile_FileObjMethods, pSysVol, iMode);       
        
        return (HANDLE)self;    
 }
index 2dc2995..499671d 100755 (executable)
@@ -14,7 +14,7 @@
 extern "C" {
 #endif
 
-void SysVolFile_Constructor(C_SYSVOLFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_sysvol *pSysVol);
+void SysVolFile_Constructor(C_SYSVOLFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_sysvol *pSysVol, int iMode);
 void SysVolFile_Destructor(C_SYSVOLFILE *self);
 
 #ifdef __cplusplus
index a34f851..4960017 100755 (executable)
@@ -52,11 +52,18 @@ PROCESS_ERR Process_Constructor(C_PROCESS *self, const T_HANDLEOBJ_METHODS *pMet
        }
        SysEvt_Clear(self->hEvt);
        
+       /* スタック用メモリ確保 */
+       if ( (self->pStack = SysMem_Alloc(self->StackSize)) == NULL )
+       {
+               return PROCESS_ERR_NG;
+       }
+
        /* プロセス生成 */
-       self->hPrc = SysPrc_Create(Process_Entry, (VPARAM)self, self->StackSize, self->Priority, SYSPRC_ATTR_NORMAL);
+       self->hPrc = SysPrc_Create(Process_Entry, (VPARAM)self, self->pStack, self->StackSize, self->Priority, SYSPRC_ATTR_NORMAL);
        if ( self->hPrc == SYSPRC_HANDLE_NULL )
        {
                SysEvt_Delete(self->hEvt);
+               SysMem_Free(self->pStack);
                return PROCESS_ERR_NG;
        }
        
index e66d894..31d2caa 100755 (executable)
@@ -22,6 +22,9 @@ void Process_Destructor(C_PROCESS *self)
        /* 待ち合わせ用イベント生成 */
        SysEvt_Delete(self->hEvt);
        
+       /* スタック用メモリ開放 */
+       SysMem_Free(self->pStack);
+
        /* 親クラスデストラクタ呼び出し */
        HandleObj_Destructor(&self->HandleObj);
 }
index dec4f82..01b7fc0 100755 (executable)
@@ -27,7 +27,8 @@ typedef struct c_process
        SYSEVT_HANDLE   hEvt;                                                   /**< 待ち合わせ用イベント */
        int                             iExitCode;                                              /**< 終了コード */
        HANDLE                  *pHandleList;                                   /**< 所有するハンドルのリスト(終了時に開放) */
-       
+       void                    *pStack;                                                /**< スタック領域のメモリ */
+
        int                             (*pfncEntry)(VPARAM Param);             /**< 起動アドレス */
        VPARAM                  Param;                                                  /**< ユーザーパラメータ */
        MEMSIZE                 StackSize;                                              /**< スタックサイズ */
index a59cacf..cd7b273 100755 (executable)
@@ -29,57 +29,136 @@ typedef struct c_shell
 } C_SHELL;
 
 
-void Shell_Create(C_SHELL *self);
-void Shell_Delete(C_SHELL *self);
-int  Shell_Execute(C_SHELL *self, int argc, char *argv[]);
-int  Shell_InputLine(C_SHELL *self, char *pszBuf, int  iBufSize);
-void Shell_PutChar(C_SHELL *self, int c);
-void Shell_CurRight(C_SHELL *self);
-void Shell_CurLeft(C_SHELL *self);
-void Shell_ExecuteCommand(C_SHELL *self, const char *pszCommand);
-void Shell_ReplaceLine(C_SHELL *self, const char *pszNewLine); /* ラインを置き換える */
+C_SHELL *Shell_Create(void);
+void    Shell_Delete(C_SHELL *self);
+int     Shell_Interactive(C_SHELL *self);
+int     Shell_ExecuteScript(C_SHELL *self, const char *pszFileName);
+int     Shell_ExecuteCommand(C_SHELL *self, const char *pszCommand);
+int     Shell_InputLine(C_SHELL *self, char *pszBuf, int  iBufSize);
+void    Shell_PutChar(C_SHELL *self, int c);
+void    Shell_CurRight(C_SHELL *self);
+void    Shell_CurLeft(C_SHELL *self);
+void    Shell_ReplaceLine(C_SHELL *self, const char *pszNewLine);      /* ラインを置き換える */
 
 
 
 int Shell_Main(int argc, char *argv[])
 {
-       C_SHELL *pShell;
+       C_SHELL *self;
        int     iExitCode;
-
+       int             i;
+       
        /* オブジェクト生成 */
-       if ( (pShell = Memory_Alloc(sizeof(C_SHELL))) == NULL )
+       if ( (self = Shell_Create()) == NULL )
        {
-               StdIo_PutString("Memory error\n");
-               return 1;
+               return 0;
        }
-       Shell_Create(pShell);
        
-       /* 実行 */
-       iExitCode = Shell_Execute(pShell, argc, argv);
-               
-       /* オブジェクト開放 */
-       Shell_Delete(pShell);
-       Memory_Free(pShell);
+       /* オプションを解析して実行 */
+       for ( i = 1; i < argc; i++ )
+       {
+               if ( argv[i][0] == '-' )
+               {
+                       if ( argv[i][1] == 'i' )                /* インタラクティブモード */
+                       {
+                               iExitCode = Shell_Interactive(self);
+                       }
+                       else if ( argv[i][1] == 's' )   /* 文字列実行 */
+                       {
+                               /* 後続を結合 */
+                               self->szCommanBuf[0] = '\0';
+                               for ( i++; i < argc; i++ )
+                               {
+                                       strcat(self->szCommanBuf, argv[i]);
+                                       if ( i + 1 < argc )
+                                       {
+                                               strcat(self->szCommanBuf, " ");
+                                       }
+                               }
+                               
+                               /* 実行 */
+                               iExitCode = Shell_ExecuteCommand(self, self->szCommanBuf);
+                       }
+               }
+               else    /* スクリプト実行 */
+               {
+                       return Shell_ExecuteScript(self, argv[i]);
+               }
+       }
+       
+       /* オブジェクト削除 */
+       Shell_Delete(self);
        
        return iExitCode;
 }
 
 
 /* コンストラクタ */
-void Shell_Create(C_SHELL *self)
+C_SHELL *Shell_Create(void)
 {
+       C_SHELL *self;
+
+       /* オブジェクト生成 */
+       if ( (self = Memory_Alloc(sizeof(C_SHELL))) == NULL )
+       {
+               StdIo_PutString("Memory error\n");
+               return NULL;
+       }
+       
+       /* メンバ初期化 */
        self->iScreenWidth = 80;
        self->iHistoryNum  = 0;
+       
+       return self;
 }
 
 
 /* デストラクタ */
 void Shell_Delete(C_SHELL *self)
 {
+       Memory_Free(self);
 }
 
 
-int Shell_Execute(C_SHELL *self, int argc, char *argv[])
+/* スクリプト実行 */
+int Shell_ExecuteScript(C_SHELL *self, const char *pszFileName)
+{
+       HANDLE  hFile;
+       int             iLen;
+       
+       /* ファイルオープン */
+       if ( (hFile = File_Open(pszFileName, FILE_OPEN_READ | FILE_OPEN_TEXT)) == HANDLE_NULL )
+       {
+               StdIo_PrintFormat("open error : %s\n", pszFileName);
+               return 1;
+       }
+       
+       /* ファイルを実行 */
+       while ( (iLen = File_GetString(hFile, self->szCommanBuf, sizeof(self->szCommanBuf))) > 0 )
+       {
+               /* 末尾の改行削除 */
+               if ( self->szCommanBuf[iLen-1] == '\n' )
+               {
+                       self->szCommanBuf[iLen-1] = '\0';
+               }
+               
+               /* 実行 */
+               if ( self->szCommanBuf[0] != '\0' && self->szCommanBuf[0] != '#' )
+               {
+                       Shell_ExecuteCommand(self, self->szCommanBuf);
+               }
+       }
+       
+       /* ファイルクローズ */
+       File_Close(hFile);
+       
+       return 0;
+}
+
+
+
+/* インタラクティブモード */
+int Shell_Interactive(C_SHELL *self)
 {
        int i;
 
@@ -143,10 +222,10 @@ int Shell_ExecEntry(VPARAM Param)
 }
 
 
-void Shell_ExecuteCommand(C_SHELL *self, const char *pszCommand)
+int Shell_ExecuteCommand(C_SHELL *self, const char *pszCommand)
 {
        T_PROCESS_CREATE_INF Inf;
-       
+       int iExitCode;
 
        int iLen;
        iLen = strlen(pszCommand);
@@ -173,11 +252,13 @@ void Shell_ExecuteCommand(C_SHELL *self, const char *pszCommand)
        }
        else
        {
-               if ( Command_Execute(pszCommand, NULL) != COMMAND_ERR_OK )
+               if ( Command_Execute(pszCommand, &iExitCode) != COMMAND_ERR_OK )
                {
                        StdIo_PutString("command is not found.\r\n");
                }
        }
+       
+       return iExitCode;
 }
 
 
index f0c77cc..2491f94 100755 (executable)
@@ -81,7 +81,7 @@ SYSISR_HANDLE  SysIsr_Create(int iIntNum, void (*pfncIsr)(VPARAM Param), VPARAM
 void           SysIsr_Delete(SYSISR_HANDLE hIsr);
 
 /* システム用プロセス制御API */
-SYSPRC_HANDLE  SysPrc_Create(void (*pfncEntry)(VPARAM Param), VPARAM Param, MEMSIZE StackSize, int Priority, int iAttr);
+SYSPRC_HANDLE  SysPrc_Create(void (*pfncEntry)(VPARAM Param), VPARAM Param, void *pStack, MEMSIZE StackSize, int Priority, int iAttr);
                                                                                                                                        /**< プロセス生成(システム用) */
 void           SysPrc_Delete(SYSPRC_HANDLE hPrc);                                      /**< プロセス削除(システム用) */
 VPARAM         SysPrc_GetParam(SYSPRC_HANDLE hPrc);                                    /**< プロセスのパラメータ取得(システム用) */
index e4ce82b..96f5890 100755 (executable)
@@ -13,7 +13,7 @@
 
 
 /* プロセス生成 */
-SYSPRC_HANDLE SysPrc_Create(void (*pfncEntry)(VPARAM Param), VPARAM Param, MEMSIZE StackSize, int Priority, int iAttr)
+SYSPRC_HANDLE SysPrc_Create(void (*pfncEntry)(VPARAM Param), VPARAM Param, void *pStack, MEMSIZE StackSize, int Priority, int iAttr)
 {
        T_CTSK ctsk;
        ER_ID  erid;
@@ -23,7 +23,7 @@ SYSPRC_HANDLE SysPrc_Create(void (*pfncEntry)(VPARAM Param), VPARAM Param, MEMSI
        ctsk.task    = (FP)pfncEntry;
        ctsk.itskpri = (PRI)Priority;
        ctsk.stksz   = (SIZE)StackSize;
-       ctsk.stk     = NULL;
+       ctsk.stk     = pStack;
        erid = acre_tsk(&ctsk);
        if ( erid < 0 )
        {
index f3e8002..94259ba 100755 (executable)
@@ -352,7 +352,6 @@ clean: makelib_clean
 depend: makelib_depend
 
 
-
 # %jp{gcc用の設定読込み}
 include $(KERNEL_MAKINC_DIR)/gcc_d.inc
 
index 1e68742..77966af 100755 (executable)
@@ -31,7 +31,7 @@
 /** %jp{コンテキスト情報保存ブロック} */
 typedef struct _kernel_t_ctxcb
 {
-       HANDLE  hEvent;                         /**< %jp{ã\82¹ã\83¬ã\83\83ã\83\89ハンドル} */
+       HANDLE  hEvent;                         /**< %jp{ã\82¤ã\83\99ã\83³ã\83\88ハンドル} */
        HANDLE  hThread;                        /**< %jp{スレッドハンドル} */
        DWORD   dwThreadId;                     /**< %jp{スレッドID} */
        BOOL    blIntSuspend;           /**< %jp{割り込みディスパッチされた} */
index 0fe3456..3f2d77f 100755 (executable)
@@ -4,7 +4,7 @@
  * @file  ctxctlc
  * @brief %jp{コンテキスト制御}%en{context control}
  *
- * Copyright (C) 1998-2006 by Project HOS
+ * Copyright (C) 1998-2007 by Project HOS
  * http://sourceforge.jp/projects/hos/
  */
 
 
 
 
-static DWORD WINAPI _kernel_ctx_ent(LPVOID param);                                     /* %jp{スレッドの開始関数} */
-static void         _kernel_run_ctx(_KERNEL_T_CTXCB *pk_ctxcb);                /* %jp{スレッドの実行開始} */
-static void         _kernel_wai_ctx(_KERNEL_T_CTXCB *pk_ctxcb);                /* %jp{スレッドの停止待ち} */
+static DWORD WINAPI            _kernel_ctx_ent(LPVOID param);                                  /* %jp{スレッドの開始関数} */
+static void                            _kernel_run_ctx(_KERNEL_T_CTXCB *pk_ctxcb);             /* %jp{スレッドの実行開始} */
+static void                            _kernel_wai_ctx(_KERNEL_T_CTXCB *pk_ctxcb);             /* %jp{スレッドの停止待ち} */
 
 
-static _KERNEL_T_CTXCB *_kernel_win32_runctxcb        = NULL;          /**< %jp{実行中のコンテキスト} */
-static _KERNEL_T_CTXCB *_kernel_win32_oldctxcb        = NULL;          /**< %jp{直前の実行コンテキスト} */
-static HANDLE          _kernel_win32_hSemIntCtx       = NULL;          /**< %jp{割り込みの排他制御セマフォ} */
-static HANDLE          _kernel_win32_hSemDisInt       = NULL;          /**< %jp{システムの排他制御用セマフォ} */
-static volatile BOOL   _kernel_win32_blIntCtx         = FALSE;         /**< %jp{割込み処理中フラグ} */
-static volatile BOOL   _kernel_win32_blDisInt         = TRUE;          /**< %jp{割込み禁止フラグ} */
-static volatile BOOL   _kernel_win32_blDlyDsp         = FALSE;         /**< %jp{遅延ディスパッチフラグ} */
-static DWORD           _kernel_win32_hPrimaryThreadId = 0;                     /**< %jp{プライマリスレッドID} */
+static CRITICAL_SECTION        _kernel_win32_CriticalSection;
+static _KERNEL_T_CTXCB *_kernel_win32_runctxcb        = NULL;          /**< %jp{実行中のコンテキスト} */
+static _KERNEL_T_CTXCB *_kernel_win32_intctxcb        = NULL;          /**< %jp{割込みからスイッチされたコンテキスト} */
+static HANDLE                  _kernel_win32_hSemDisInt       = NULL;          /**< %jp{システムの排他制御用セマフォ} */
+static volatile BOOL   _kernel_win32_blIntCtx         = FALSE;         /**< %jp{割込み処理中フラグ} */
+static volatile BOOL   _kernel_win32_blDisInt         = TRUE;          /**< %jp{割込み禁止フラグ} */
+static volatile BOOL   _kernel_win32_blIntDsp         = FALSE;         /**< %jp{割込み時ディスパッチフラグ} */
+static DWORD                   _kernel_win32_hPrimaryThreadId = 0;                     /**< %jp{プライマリスレッドID} */
 
 
 
 /** %jp{システムの初期化} */
 void _kernel_ini_prc(void)
 {
+       InitializeCriticalSection(&_kernel_win32_CriticalSection);
+
        /* %jp{プライマリスレッドIDの保存} */
        _kernel_win32_hPrimaryThreadId = GetCurrentThreadId();
 
        /* %jp{割り込み禁止に見立てるセマフォの作成} */
        _kernel_win32_hSemDisInt = CreateSemaphore(NULL, 0, 1, NULL);
-
-       /* %jp{割り込みの排他制御セマフォの生成} */
-       _kernel_win32_hSemIntCtx = CreateSemaphore(NULL, 1, 1, NULL);
 }
 
 
-/** %jp{割り込み許可} */
-void _kernel_ena_int(void)
+/** %jp{割り込み禁止} */
+void _kernel_dis_int(void)
 {
+       /* 割込みコンテキストから呼ばれたなら何もしない */
        if ( _kernel_win32_blIntCtx )
        {
                return;
        }
 
-       if ( _kernel_win32_blDisInt )
+       /* 既に割込み禁止で無ければセマフォを取る */
+       if ( !_kernel_win32_blDisInt )
        {
-               _kernel_win32_blDisInt = FALSE;
-               ReleaseSemaphore(_kernel_win32_hSemDisInt, 1, NULL);
+               WaitForSingleObject(_kernel_win32_hSemDisInt, INFINITE);
+               _kernel_win32_blDisInt = TRUE;
        }
 }
 
 
-/** %jp{割り込み禁止} */
-void _kernel_dis_int(void)
+/** %jp{割り込み許可} */
+void _kernel_ena_int(void)
 {
+       /* 割込みコンテキストから呼ばれたなら何もしない */
        if ( _kernel_win32_blIntCtx )
        {
                return;
        }
-
-       if ( !_kernel_win32_blDisInt )
+       
+       /* 既に割込み禁止ならセマフォを返す */
+       if ( _kernel_win32_blDisInt )
        {
-               WaitForSingleObject(_kernel_win32_hSemDisInt, INFINITE);
-               _kernel_win32_blDisInt = TRUE;
+               _kernel_win32_blDisInt = FALSE;
+               ReleaseSemaphore(_kernel_win32_hSemDisInt, 1, NULL);
        }
 }
 
 
+
 /** %jp{実行コンテキストの作成} */
 void _kernel_cre_ctx(
                _KERNEL_T_CTXCB *pk_ctxcb,              /* コンテキストを作成するアドレス */
@@ -93,17 +97,8 @@ void _kernel_cre_ctx(
        
        /* %jp{コンテキストスレッド生成} */
        pk_ctxcb->hEvent  = CreateEvent(NULL, FALSE, FALSE, NULL);
-#if 1
        pk_ctxcb->hThread = CreateThread(NULL, 0, _kernel_ctx_ent, (LPVOID)pk_ctxcb,
                                                                        0, &pk_ctxcb->dwThreadId);
-#else
-       pk_ctxcb->hThread = _beginthread(_kernel_ctx_ent, 0, (void *)pk_ctxcb);
-#endif
-
-       /* %jp{pk_ctxcb->hThreadの格納完了後に開始} */
-       SetEvent(pk_ctxcb->hEvent);
-
-       _kernel_wai_ctx(pk_ctxcb);
 }
 
 
@@ -121,13 +116,7 @@ DWORD WINAPI _kernel_ctx_ent(LPVOID param)
        /* %jp{リスタート用setjmp} */
        setjmp(pk_ctxcb->jmpenv);
 
-       /* %jp{自分自身をサスペンドさせる} */
-       SuspendThread(pk_ctxcb->hThread);
-
-       /* %jp{直前のコンテキストスレッドが確実にサスペンドするのを待つ} */
-       _kernel_wai_ctx(_kernel_win32_oldctxcb);
-       _kernel_win32_oldctxcb = NULL;
-
+       /* 開始 */
        pk_ctxcb->entry(pk_ctxcb->exinf1, pk_ctxcb->exinf2);
        
        return 0;
@@ -138,8 +127,9 @@ DWORD WINAPI _kernel_ctx_ent(LPVOID param)
 void _kernel_del_ctx(_KERNEL_T_CTXCB *pk_ctxcb)
 {
        /* スレッド削除 */
-       CloseHandle(pk_ctxcb->hEvent);
        TerminateThread(pk_ctxcb->hThread, 0);
+       CloseHandle(pk_ctxcb->hThread);
+       CloseHandle(pk_ctxcb->hEvent);
 }
 
 
@@ -161,51 +151,22 @@ void _kernel_swi_ctx(
                return;
        }
        
-       /* %jp{割り込みの終わりで発生した場合} */
+       /* 割込み処理から呼ばれたら */
        if ( _kernel_win32_blIntCtx )
        {
-               /* %jp{割り込み状態を解除} */
-               _kernel_win32_blIntCtx = FALSE;
-
-               /* 切り替え先のスレッドを起こす */
-               _kernel_run_ctx(ctxcb_nxt);
-
-               /* 遅延ディスパッチあり */
-               _kernel_win32_blDlyDsp = TRUE;
-
-               return;
+               /* 切り替えを予約 */
+               _kernel_win32_blIntDsp = TRUE;
+               _kernel_win32_intctxcb = ctxcb_nxt;
        }
        else
        {
-               /* %jp{切り替え先のスレッドを起こす} */
+               /* 切り替え先スレッドの動作開始 */
                _kernel_run_ctx(ctxcb_nxt);
                
-               /* %jp{自分自身をサスペンドさせる} */
-               SuspendThread(ctxcb_now->hThread);
-
-               /* %jp{直前のタスクが確実にサスペンドするのを待つ} */
-               _kernel_wai_ctx(_kernel_win32_oldctxcb);
-               _kernel_win32_oldctxcb = NULL;
-       }
-}
-
-
-/** %jp{スレッドの停止待ち} */
-void _kernel_wai_ctx(_KERNEL_T_CTXCB *pk_ctxcb)
-{
-       if ( pk_ctxcb == NULL )
-       {
-               return;
-       }
-
-       while ( SuspendThread(pk_ctxcb->hThread) != 1 )
-       {
-               ResumeThread(pk_ctxcb->hThread);
-               Sleep(1);
+               /* %jp{再開待ち} */
+               WaitForSingleObject(ctxcb_now->hEvent, INFINITE);
        }
-       ResumeThread(pk_ctxcb->hThread);
-}
-
+}      
 
 
 /** %jp{アイドル時の処理} */
@@ -236,20 +197,24 @@ void _kernel_sta_ctx(_KERNEL_T_CTXCB *pk_ctxcb)
 void _kernel_run_ctx(_KERNEL_T_CTXCB *pk_ctxcb)
 {
        /* %jp{実行中コンテキストの登録} */
-       _kernel_win32_oldctxcb = _kernel_win32_runctxcb;
        _kernel_win32_runctxcb = pk_ctxcb;
        
        /* %jp{割り込みから中断されていた場合} */
        if ( pk_ctxcb->blIntSuspend )
        {
-               pk_ctxcb->blIntSuspend = FALSE;
-
+               /* %jp{割り込み用セマフォを返す} */
                _kernel_win32_blDisInt = FALSE;
                ReleaseSemaphore(_kernel_win32_hSemDisInt, 1, NULL);
+               
+               /* スレッド動作再開 */
+               pk_ctxcb->blIntSuspend = FALSE;
+               ResumeThread(pk_ctxcb->hThread);
+       }
+       else
+       {
+               /* %jp{スレッドを起こす} */
+               SetEvent(pk_ctxcb->hEvent);
        }
-       
-       /* %jp{スレッドを起こす} */
-       ResumeThread(pk_ctxcb->hThread);
 }
 
 
@@ -257,7 +222,7 @@ void _kernel_run_ctx(_KERNEL_T_CTXCB *pk_ctxcb)
 /* %jp{割り込み用処理} */
 void vsig_int(int inhno)
 {
-       WaitForSingleObject(_kernel_win32_hSemIntCtx, INFINITE);
+       EnterCriticalSection(&_kernel_win32_CriticalSection);
 
        /* %jp{割り込み用セマフォを取る} */
        WaitForSingleObject(_kernel_win32_hSemDisInt, INFINITE);
@@ -265,33 +230,40 @@ void vsig_int(int inhno)
        
        /* %jp{現在実行中のスレッドを止める} */
        SuspendThread(_kernel_win32_runctxcb->hThread);
-       _kernel_win32_runctxcb->blIntSuspend = TRUE;
        
        /* %jp{割り込み状態に設定} */
        _kernel_win32_blIntCtx = TRUE;
-       _kernel_win32_blDlyDsp = FALSE;
+       _kernel_win32_blIntDsp = FALSE;
        
        /* %jp{割り込み処理} */
        _kernel_sta_inh();
        _kernel_exe_inh(inhno);
        _kernel_end_inh();
+
+       /* %jp{割り込み状態を解除} */
+       _kernel_win32_blIntCtx = FALSE;
        
-       /* %jp{遅延ディスパッチが発生しなければ復帰処理} */
-       if ( !_kernel_win32_blDlyDsp )
+
+       /* %jp{遅延ディスパッチ発生なら} */
+       if ( _kernel_win32_blIntDsp )
        {
-               /* %jp{割り込み状態を解除} */
-               _kernel_win32_blIntCtx = FALSE;
+               /* 元のスレッドをサスペンドのままマーク */
+               _kernel_win32_runctxcb->blIntSuspend = TRUE;
                
+               /* 切り替え先スレッドの動作開始 */
+               _kernel_run_ctx(_kernel_win32_intctxcb);
+       }
+       else
+       {
                /* %jp{割り込み用セマフォを返す} */
                _kernel_win32_blDisInt = FALSE;
                ReleaseSemaphore(_kernel_win32_hSemDisInt, 1, NULL);
                
                /* %jp{現在実行中のスレッドを再開} */
-               _kernel_win32_runctxcb->blIntSuspend = FALSE;
-               ResumeThread(_kernel_win32_runctxcb->hThread);          
+               ResumeThread(_kernel_win32_runctxcb->hThread);
        }
 
-       ReleaseSemaphore(_kernel_win32_hSemIntCtx, 1, NULL);            
+       LeaveCriticalSection(&_kernel_win32_CriticalSection);
 }
 
 
index 4c900b7..e7958d7 100755 (executable)
@@ -55,6 +55,15 @@ ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout)
        }
 #endif
        
+       /* %jp{パラメータのチェック} */
+#ifdef _KERNEL_SPT_TWAI_FLG_E_PAR
+       if ( waiptn == 0 )
+       {
+               return E_PAR;   /* %jp{パラメータ不正} */
+       }
+#endif
+
+
        _KERNEL_ENTER_SVC();            /* %jp{サービスコール開始} */
        
        /* %jp{オブジェクト存在チェック} */
@@ -123,7 +132,10 @@ ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout)
                        /* %jp{条件を満たして解除されたのなら} */
                        if ( ercd == E_OK )
                        {
-                               *p_flgptn = flginf.waiptn;                      /* %jp{解除時のフラグパターンを格納} */
+                               if ( p_flgptn != NULL )
+                               {
+                                       *p_flgptn = flginf.waiptn;                      /* %jp{解除時のフラグパターンを格納} */
+                               }
                        }
                }
                else
index 7ea3e3b..4575b9e 100755 (executable)
@@ -77,6 +77,14 @@ ER wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
                return E_ID;    /* %jp{ID不正} */
        }
 #endif
+
+       /* %jp{パラメータのチェック} */
+#ifdef _KERNEL_SPT_WAI_FLG_E_PAR
+       if ( waiptn == 0 )
+       {
+               return E_PAR;   /* %jp{パラメータ不正} */
+       }
+#endif
        
        _KERNEL_ENTER_SVC();            /* %jp{サービスコール開始} */
        
@@ -109,8 +117,11 @@ ER wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
        if ( _kernel_chk_flg(flgcb, &flginf) )
        {
                /* %jp{既に条件を満たしているなら} */
-               *p_flgptn = _KERNEL_FLG_GET_FLGPTN(flgcb);              /* %jp{解除時のフラグパターンを格納} */
-
+               if ( p_flgptn != NULL )
+               {
+                       *p_flgptn = _KERNEL_FLG_GET_FLGPTN(flgcb);              /* %jp{解除時のフラグパターンを格納} */
+               }
+               
 #if _KERNEL_SPT_FLG_TA_CLR
                if ( _KERNEL_FLG_GET_FLGATR(_KERNEL_FLG_GET_FLGCB_RO(flgid, flgcb)) & TA_CLR )
                {
@@ -142,7 +153,10 @@ ER wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
                /* %jp{条件を満たして解除されたのなら} */
                if ( ercd == E_OK )
                {
-                       *p_flgptn = flginf.waiptn;                      /* %jp{解除時のフラグパターンを格納} */
+                       if ( p_flgptn != NULL )
+                       {
+                               *p_flgptn = flginf.waiptn;              /* %jp{解除時のフラグパターンを格納} */
+                       }
                }
        }
                
index e7aa059..f536d5e 100755 (executable)
@@ -22,12 +22,13 @@ void _kernel_exe_isr(INTNO intno)
        _KERNEL_T_ISRCB_PTR    isrcb;
        _KERNEL_T_ISRHDL       isrhdl;
        
-       isrhdl   = _KERNEL_INT_GET_HEAD(intno);
-       isrcb    = _KERNEL_ISR_ISRHDL2ISRCB(isrhdl);
-       isrcb_ro = _KERNEL_ISR_ISRHDL2ISRCBRO(isrhdl);
+       isrhdl = _KERNEL_INT_GET_HEAD(intno);
 
        while ( isrhdl != _KERNEL_ISRHDL_NULL )
        {
+               isrcb    = _KERNEL_ISR_ISRHDL2ISRCB(isrhdl);
+               isrcb_ro = _KERNEL_ISR_ISRHDL2ISRCBRO(isrhdl);
+
                _KERNEL_ENA_INT();                      /* %jp{多重割込み許可} */
                _KERNEL_ISR_GET_ISR(isrcb_ro)(_KERNEL_ISR_GET_EXINF(isrcb_ro));
                _KERNEL_DIS_INT();                      /* %jp{割込み禁止} */