📄 tmcrt.c
字号:
/*COPYRIGHT (c) 1997 by Philips SemiconductorsTHIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED AND COPIED IN ACCORDANCE WITH THE TERMS AND CONDITIONS OF SUCH A LICENSE AND WITH THE INCLUSION OF THE THIS COPY RIGHT NOTICE. THIS SOFTWARE OR ANY OTHER COPIES OF THIS SOFTWARE MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHERPERSON. THE OWNERSHIP AND TITLE OF THIS SOFTWARE IS NOT TRANSFERRED. THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT ANY PRIOR NOTICEAND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY Philips Semiconductor. PHILIPS ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF THIS SOFTWAREON PLATFORMS OTHER THAN THE ONE ON WHICH THIS SOFTWARE IS FURNISHED.*//* Copyright (c) 1996 Philips Semiconductors - TriMedia. All rights reserved.FILE tmcrt.cHISTORY : 960201 Tilakraj Roy Created 961113 Tilakraj Roy Pulled in from ctcmon sources 970226 Tilakraj Roy Pulled in from TMCons sources to incorporate functionality into TMMan32.dll 970310 Tilakraj Roy Added the file redirection + event signalling + context passing functionality. 970627 Tilakraj Roy Added multiple DSP support and interfaces for the new TMMan interface 970929 Tilakraj Roy
Retrofitted for the new TMIF interface
COMMNETS Requires host_comm.lib & TMMan32.dll services Also requires that host_comm:INITFunc return immedately and create another worked thread.*/#include "windows.h"#include "stdio.h"#include "fcntl.h"#include "io.h"#include "time.h"#include "sys\stat.h"#include "tmtypes.h"#include "tmwincom.h"#include "tmman32.h"#include "TM1IF.h"#include "OpenDll.h"#include "tmcrt.h"/* CONSTANTS */#define MAX_PATH_INDEX 0x20 // maximum of 32 entries may be picked from the ini file#undef USE_TRACE// this is worst kludge i have ever made
// to save a parameter to a callback function.
#define TMCRT_MAGIC_PATTERN 0x005a5a5a
#define MAXIMUM_DSPS 10
/* TYPEDEFS */
enum tStdHandles
{
kLevel2StdinHandle = 0,
kLevel2StdoutHandle = 1,
kLevel2StderrHandle = 2
};
typedef struct _TMCRT_STD_HANDLE
{
DWORD Magic:24;
DWORD StdType:3;
DWORD DSPNumber:5;
} TMCRT_STD_HANDLE, *PTMCRT_STD_HANDLE;
/* GLOBALS */typedef struct _TMCRT_CONTEXT { DWORD OptionBitmap; DWORD DSPHandle; DWORD DSPNumber; HANDLE StdInHandle; HANDLE StdOutHandle; HANDLE StdErrHandle; //event that is sianalled when the exit function is called. HANDLE SynchObject; HANDLE ExitObject; DWORD ExitCode; BOOL fServerLoaded; DWORD VirtualNodeNumber; DWORD ServerStatus; BOOL fTargetExited; DWORD ArgumentCount; PVOID ArgumentVector;} TMCRT_CONTEXT, *PTMCRT_CONTEXT;
///////////////////////////////////////////////////////////VOID StripCR ( PCHAR pBuffer, DWORD *BytesRead );UInt32 crtPrintf ( HANDLE FileHandle, UInt8* Format, ...);UInt32 ODS( UInt8* FormatString, ... );DWORD OpenFunc ( PCHAR PathName, DWORD Flags, DWORD Mode );
///////////////////////////////////////////////////////////PTMCRT_CONTEXT GlobalContext[MAXIMUM_DSPS];BOOL fExitProcess = FALSE;
///////////////////////////////////////////////////////////
DWORD ExitCodeFunc ( DWORD DSPNumber, DWORD ExitCode ){ PTMCRT_CONTEXT pCRT = (PTMCRT_CONTEXT)GlobalContext[DSPNumber]; DWORD BytesWritten; CHAR szTemp[0x80];
#ifdef USE_TRACE ODS("[ExitCodeFunc|NodeID:%x]", NodeID );#endif if ( pCRT->OptionBitmap & constCRunTimeFlagsNonInteractive ); else { crtPrintf ( pCRT->StdOutHandle, "\r\nCRunTime : TriMedia # %d Program Exit Code [%x]\n", DSPNumber, ExitCode ); } /*fprintf(stdout, szTemp ); */ if ( pCRT->OptionBitmap & constCRunTimeFlagsUseSynchObject) { SetEvent ( pCRT->SynchObject ); } /* get out of this program */ pCRT->fTargetExited = TRUE; pCRT->ExitCode = ExitCode; SetEvent ( pCRT->ExitObject ); return 0;}DWORD OpenDLLFunc( PCHAR pszFilename ){#ifdef USE_TRACE ODS("[OpenDLLFunc|FileName:%s]", pszFilename );#endif return OpenDll_open_dll ( pszFilename, (PVOID)OpenFunc, LittleEndian );}DWORD ReadFunc ( DWORD Handle, PVOID pBuffer, DWORD Count ){
PTMCRT_STD_HANDLE EncodedHandle = (PTMCRT_STD_HANDLE)&Handle;
static DWORD FuncCount = 0; DWORD BytesRead;#ifdef USE_TRACE ODS("[ReadFunc#%x|Handle:%x|Buffer:%x|Count:%x]", FuncCount, Handle, pBuffer, Count );#endif
if ( fExitProcess == TRUE )
{
BytesRead = 0;
goto ReadFuncExit;
}
if ( EncodedHandle->Magic == TMCRT_MAGIC_PATTERN )
{
PTMCRT_CONTEXT pCRT = (PTMCRT_CONTEXT)GlobalContext[EncodedHandle->DSPNumber];
if ( EncodedHandle->StdType == kLevel2StdinHandle ) { BOOL Status; HANDLE Objects[2]; DWORD ObjectSignalled; if ( pCRT->OptionBitmap & constCRunTimeFlagsNoConsole ) { BytesRead = 0; goto ReadFuncExit; } Objects[0] = pCRT->StdInHandle; Objects[1] = pCRT->ExitObject; ObjectSignalled = WaitForMultipleObjects ( 2, Objects, FALSE, INFINITE ); if ( (ObjectSignalled - WAIT_OBJECT_0 ) == 1 ) { BytesRead = 0; goto ReadFuncExit; } Status = ReadFile ( pCRT->StdInHandle, pBuffer, Count, &BytesRead, NULL ); if ( GetFileType (pCRT->StdInHandle) == FILE_TYPE_CHAR ) StripCR ( pBuffer, &BytesRead ); if ( Status == TRUE ) { goto ReadFuncExit; } else { BytesRead = 0; goto ReadFuncExit; } }
}
BytesRead = _read ( Handle, pBuffer, Count ); // fall throughReadFuncExit :#ifdef USE_TRACE ODS("[ReadFunc#%x|Returned:%x]", FuncCount++, BytesRead );#endif return BytesRead;}DWORD WriteFunc ( DWORD Handle, PVOID pBuffer, DWORD Count ){ PTMCRT_STD_HANDLE EncodedHandle = (PTMCRT_STD_HANDLE)&Handle;
DWORD BytesWritten; static DWORD FuncCount = 0;#ifdef USE_TRACE ODS("[WriteFunc#%x|Handle:%x|Buffer:%x|Count:%x]", FuncCount, Handle, pBuffer, Count );#endif
if ( EncodedHandle->Magic == TMCRT_MAGIC_PATTERN )
{
PTMCRT_CONTEXT pCRT = (PTMCRT_CONTEXT)GlobalContext[EncodedHandle->DSPNumber];
if ( EncodedHandle->StdType == kLevel2StdoutHandle ) { if ( pCRT->OptionBitmap & constCRunTimeFlagsNoConsole ) { BytesWritten = 0; goto WriteFuncExit; } if ( WriteFile ( pCRT->StdOutHandle, pBuffer, Count, &BytesWritten, NULL ) != TRUE ) { BytesWritten = 0; goto WriteFuncExit; } else { goto WriteFuncExit; } } // fall through if ( EncodedHandle->StdType == kLevel2StderrHandle ) { if ( pCRT->OptionBitmap & constCRunTimeFlagsNoConsole ) { BytesWritten = 0; goto WriteFuncExit; } if ( WriteFile ( pCRT->StdErrHandle, pBuffer, Count, &BytesWritten, NULL ) != TRUE ) { BytesWritten = 0; goto WriteFuncExit; } else { goto WriteFuncExit; } }
}
BytesWritten = _write ( Handle, pBuffer, Count ); // fall throughWriteFuncExit :#ifdef USE_TRACE ODS("[WriteFunc#%x|Returned:%x]", FuncCount++, BytesWritten );#endif return BytesWritten;}DWORD FstatFunc (DWORD Handle, struct stat *pStat ){
PTMCRT_STD_HANDLE EncodedHandle = (PTMCRT_STD_HANDLE)&Handle;
#ifdef USE_TRACE ODS("[FstatFunc|Handle:%x|pStat:%x]", Handle, pStat );#endif
if ( EncodedHandle->Magic == TMCRT_MAGIC_PATTERN )
{
PTMCRT_CONTEXT pCRT = (PTMCRT_CONTEXT)GlobalContext[EncodedHandle->DSPNumber];
if ( ( EncodedHandle->StdType == kLevel2StdinHandle ) || ( EncodedHandle->StdType == kLevel2StdoutHandle ) || ( EncodedHandle->StdType == kLevel2StderrHandle ) ) { pStat->st_mode = S_IFCHR; pStat->st_size = 512; return 0; }
}
return _fstat ( Handle, (struct _stat *)pStat );}DWORD StatFunc (PCHAR pFilename, struct stat *pStat ){#ifdef USE_TRACE ODS("[StatFunc|FileName:%s|pStat:%x]", pFilename, pStat );#endif return _stat ( pFilename, (struct _stat *)pStat );}DWORD FcntlFunc ( DWORD Handle, DWORD Command, DWORD Flags ){#ifdef USE_TRACE ODS("[FcntlFunc|Handle:%x|Command:%x|Flags:%x]", Handle, Command, Flags );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -