inout.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 968 行 · 第 1/2 页
C
968 行
ProgSw |= PS_ERR_OPEN_TRIED;
SDSetAttr( ErrAttr );
ErrFile = Open( SDFName( SrcName ), ErrExtn, WRITE_FILE );
if( ErrFile != NULL ) {
SDInitAttr();
ErrCursor = 0;
// ErrBuff will be non-NULL iff we have opened the error file
// before initializing memory (i.e. a warning message during
// options processing).
if( ErrBuff == NULL ) {
ErrBuff = FMemAlloc( ERR_BUFF_SIZE );
}
}
}
}
void CompErr( uint msg ) {
//===========================
InfoError( msg );
}
void PrintErr( char *string ) {
//================================
JustErr( string );
PrtLst( string );
}
static bool ErrToTerm( void ) {
//===========================
if( ( Options & OPT_TERM ) == 0 ) return( FALSE );
if( ( Options & OPT_TYPE ) &&
( ListFile != NULL ) ) return( FALSE );
return( TRUE );
}
void PrtErrNL( void ) {
//==================
if( ErrToTerm() ) {
TOutNL( "" );
}
ErrNL();
PrtLstNL( "" );
}
void JustErr( char *string ) {
//===============================
if( ErrToTerm() ) {
TOut( string );
}
ErrOut( string );
}
static void ErrNL( void ) {
//=======================
if( ErrFile != NULL ) {
SDWrite( ErrFile, ErrBuff, ErrCursor );
ChkErrErr();
}
ErrCursor = 0;
}
static void ChkErrErr( void ) {
//===========================
char msg[81];
char fnbuff[MAX_FILE+1];
if( SDError( ErrFile, msg ) ) {
CloseErr();
Options |= OPT_TERM;
TermCursor = 0;
MakeName( SDFName( SrcName ), ErrExtn, fnbuff );
InfoError( SM_IO_WRITE_ERR, fnbuff, msg );
}
}
void ChkErrFile( void ) {
//==========================
// Make sure error file is opened.
if( ErrFile == NULL ) {
OpenErr();
}
}
static void ErrOut( char *string ) {
//======================================
if( ErrFile != NULL ) {
SendBuff( string, ErrBuff, ERR_BUFF_SIZE, &ErrCursor, ErrFile,
&ChkErrErr );
}
}
void CloseErr( void ) {
//==================
if( ErrFile == NULL ) return;
SDClose( ErrFile );
ErrFile = NULL;
if( ErrBuff == NULL ) return;
FMemFree( ErrBuff );
ErrBuff = NULL;
}
//========================================================================
//
// Terminal output routines
//
//========================================================================
static void ChkTermErr( void ) {
//============================
}
void TOutNL( char *string ) {
//==============================
TOut( string );
SDWrite( TermFile, TermBuff, TermCursor );
TermCursor = 0;
}
void TOut( char *string ) {
//============================
SendBuff( string, TermBuff, TERM_BUFF_SIZE, &TermCursor, TermFile,
&ChkTermErr );
}
//========================================================================
//
// Listing file routines
//
//========================================================================
static void OpenListingFile( bool reopen ) {
//==============================================
char errmsg[81];
char name[MAX_FILE+1];
reopen = reopen;
if( ( Options & OPT_LIST ) == 0 ) {
// no listing file
// ignore other listing file options
} else {
GetLstName( name );
if( Options & OPT_TYPE ) {
SDSetAttr( TrmAttr );
// On the VAX, /PRINT means to generate a disk file "xxx.LIS"
// and set the spooling bit
} else if( Options & OPT_PRINT ) {
SDSetAttr( PrtAttr );
} else { // DISK file
SDSetAttr( DskAttr );
}
ListFile = SDOpen( name, WRITE_FILE );
if( SDError( ListFile, errmsg ) ) {
InfoError( SM_OPENING_FILE, name, errmsg );
} else {
ListBuff = FMemAlloc( LIST_BUFF_SIZE + 1 );
if( ListBuff == NULL ) {
CloseLst();
InfoError( MO_DYNAMIC_OUT );
}
}
SDInitAttr();
}
}
void OpenLst( void ) {
//=================
OpenListingFile( FALSE );
}
void ReOpenLst( void ) {
//===================
OpenListingFile( TRUE );
}
void ChkPntLst( void ) {
//===================
if( ListFlag & LF_QUIET ) {
ListFlag &= ~LF_STMT_LISTED;
} else {
ListFlag |= LF_STMT_LISTED;
}
}
bool WasStmtListed( void ) {
//=======================
return( ( ListFlag & LF_STMT_LISTED ) != 0 );
}
#define MAX_TIME_STR (4+1+2+1+2+1+2+1+2+1+2)
void GetBanner( char *buff ) {
//===============================
time_t time_of_day;
struct tm *t;
strcpy( buff, banner1w( _Banner, VERSION ) );
time_of_day = time( NULL );
t = localtime( &time_of_day );
MsgFormat( " %4d1/%2d2/%2d3 %2d4:%2d5:%2d6", buff + strlen( buff ),
1900 + t->tm_year, t->tm_mon + 1, t->tm_mday,
t->tm_hour, t->tm_min, t->tm_sec );
}
void GetCopyright( char *buff ) {
//==================================
strcpy( buff, banner2( _Copyright ) );
}
void GetTrademark( char *buff ) {
//==================================
strcpy( buff, banner3 );
}
void GetMoreInfo( char *buff ) {
//=================================
strcpy( buff, banner3a );
}
void PrtBanner( void ) {
//===================
char banner[LIST_BUFF_SIZE+1];
GetBanner( banner );
if( !(Options & OPT_QUIET) && !(Options & OPT_TYPE) ) {
TOutNL( banner );
}
PrtLstNL( banner );
GetCopyright( banner );
if( !(Options & OPT_QUIET) && !(Options & OPT_TYPE) ) {
TOutNL( banner );
}
PrtLstNL( banner );
GetTrademark( banner );
if( !(Options & OPT_QUIET) && !(Options & OPT_TYPE) ) {
TOutNL( banner );
}
PrtLstNL( banner );
GetMoreInfo( banner );
if( !(Options & OPT_QUIET) && !(Options & OPT_TYPE) ) {
TOutNL( banner );
}
PrtLstNL( banner );
PrtOptions();
LFSkip();
}
void GetLstName( char *buffer ) {
//==================================
if( Options & OPT_TYPE ) {
strcpy( buffer, SDTermOut );
#if ! defined( __UNIX__ )
// On the VAX, /PRINT means to generate a disk file "xxx.LIS"
// and set the spooling bit
// On QNX, there is no /PRINT option
} else if( Options & OPT_PRINT ) {
strcpy( buffer, SDPrtName );
#endif
} else {
MakeName( SDFName( SrcName ), LstExtn, buffer );
}
}
void PrtLstNL( char *string ) {
//================================
ListFlag |= LF_NEW_LINE;
PrtLst( string );
ListFlag &= LF_OFF;
}
void PrtLst( char *string ) {
//==============================
if( ListFlag & LF_QUIET ) return;
if( ListFile == NULL ) return;
PutLst( string );
}
void CloseLst( void ) {
//==================
if( ListFile == NULL ) return;
SDClose( ListFile );
ListFile = NULL;
if( ListBuff == NULL ) return;
FMemFree( ListBuff );
ListBuff = NULL;
}
void LFEndSrc( void ) {
//==================
if( ListFile == NULL ) return;
ListFlag &= LF_OFF;
ListCursor = 0;
SetCtrlSeq();
SendRec();
}
void LFNewPage( void ) {
//===================
ListFlag |= LF_PAGE_FLAG;
}
void LFSkip( void ) {
//================
ListFlag |= LF_SKIP_FLAG;
if( ( ListFlag & LF_QUIET ) == 0 ) {
++ListCount;
}
}
static void PutLst( char *string ) {
//======================================
int len;
bool newline;
newline = ( ListFlag & LF_NEW_LINE );
for(;;) {
if( ListFile == NULL ) break;
if( ListCursor == 0 ) {
SetCtrlSeq();
}
len = LIST_BUFF_SIZE - ListCursor - 1; // -1 for NULLCHAR
len = CharSetInfo.extract_text( string, len );
len = CopyMaxStr( string, &ListBuff[ ListCursor ], len );
ListCursor += len;
string += len;
if( *string == NULLCHAR ) break;
SendRec();
}
if( newline ) {
SendRec();
}
}
static void SetCtrlSeq( void ) {
//============================
char *ctrlseq;
++ListCount;
if( ListCount >= LinesPerPage - LF_PAGE_BOUNDARY ) {
ListFlag |= LF_PAGE_FLAG;
}
if( ListFlag & LF_PAGE_FLAG ) {
ListCount = 0;
if( Options & OPT_TYPE ) {
ctrlseq = SkipCtrlSeq;
} else {
ctrlseq = FFCtrlSeq;
}
} else if( ListFlag & LF_SKIP_FLAG ) {
ctrlseq = SkipCtrlSeq;
} else {
ctrlseq = NormalCtrlSeq;
}
ListCursor = CopyMaxStr( ctrlseq, ListBuff, LIST_BUFF_SIZE );
}
static void SendRec( void ) {
//=========================
if( ListFile != NULL ) {
SDWrite( ListFile, ListBuff, ListCursor );
ChkLstErr();
}
ListFlag &= LF_OFF;
ListCursor = 0;
}
static void ChkLstErr( void ) {
//===========================
char msg[81];
char fnbuff[MAX_FILE+1];
if( SDError( ListFile, msg ) ) {
CloseLst();
Options |= OPT_TERM;
TermCursor = 0;
GetLstName( fnbuff );
InfoError( SM_IO_WRITE_ERR, fnbuff, msg );
}
}
static void Erase( char *extn ) {
//===================================
char buffer[MAX_FILE+1];
MakeName( SDFName( SrcName ), extn, buffer );
SDScratch( buffer );
}
static void SendBuff( char *str, char *buff, int buff_size, int *cursor,
file_handle fp, void (*err_rtn)( void ) ) {
//==========================================================================
int len;
for(;;) {
if( fp == NULL ) break;
len = buff_size - 1 - *cursor;
len = CharSetInfo.extract_text( str, len );
len = CopyMaxStr( str, &buff[ *cursor ], len );
*cursor += len;
str += len;
if( *str == NULLCHAR ) break;
SDWrite( fp, buff, *cursor );
err_rtn();
*cursor = 0;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?