rfmtexec.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 597 行 · 第 1/2 页
C
597 行
R_ChkFType();
if( IOCB->flags & IOF_OUTPT ) {
R_FOE( 0, 'D' );
R_ChkRecLen();
} else {
R_FIFloat();
}
FmtIOType();
if( --rep == 0 ) break;
}
IOCB->flags |= IOF_FMTREP;
IOCB->fmtptr = (fmt_desc PGM *)((fmt2 PGM *)IOCB->fmtptr + 1);
}
static void R_FEQ( uint rep, char dummy2 ) {
//==============================================
for(;;) {
if( IOCB->typ == PT_NOTYPE ) {
IOCB->flags |= IOF_FMTDONE;
}
if( IOCB->typ == PT_NOTYPE ) break;
FmtPrepOp();
R_ChkFType();
if( IOCB->flags & IOF_OUTPT ) {
R_FOE( 0, 'Q' );
R_ChkRecLen();
} else {
R_FIFloat();
}
FmtIOType();
if( --rep == 0 ) break;
}
IOCB->flags |= IOF_FMTREP;
IOCB->fmtptr = (fmt_desc PGM *)((fmt2 PGM *)IOCB->fmtptr + 1);
}
static void R_FEE( uint rep, char ch ) {
//==========================================
for(;;) {
if( IOCB->typ == PT_NOTYPE ) {
IOCB->flags |= IOF_FMTDONE;
}
if( IOCB->typ == PT_NOTYPE ) break;
FmtPrepOp();
R_ChkFType();
if( IOCB->flags & IOF_OUTPT ) {
R_FOE( IOCB->fmtptr->fmt3.fld3, ch );
R_ChkRecLen();
} else {
R_FIFloat();
}
FmtIOType();
if( --rep == 0 ) break;
}
IOCB->flags |= IOF_FMTREP;
IOCB->fmtptr = (fmt_desc PGM *)((fmt3 PGM *)IOCB->fmtptr + 1);
}
static void R_FEG( uint rep, char dummy2 ) {
//=================================
for(;;) {
if( IOCB->typ == PT_NOTYPE ) {
IOCB->flags |= IOF_FMTDONE;
}
if( IOCB->typ == PT_NOTYPE ) break;
FmtPrepOp();
R_ChkType( PT_LOG_1, PT_CPLX_32 );
if( IOCB->flags & IOF_OUTPT ) {
R_FOG();
R_ChkRecLen();
} else {
R_FIFloat();
}
FmtIOType();
if( --rep == 0 ) break;
}
IOCB->flags |= IOF_FMTREP;
IOCB->fmtptr = (fmt_desc PGM *)((fmt3 PGM *)IOCB->fmtptr + 1);
}
static void R_FEP( uint dummy1 , char dummy2 ) {
//=======================
IOCB->scale = IOCB->fmtptr->fmt4.fld1;
IOCB->fmtptr = (fmt_desc PGM *)((fmt4 PGM *)IOCB->fmtptr + 1);
}
static void R_FELParen( uint rep_spec, char dummy2 ) {
//===========================================
fmt_desc PGM *revert;
IOCB->fmtptr = (fmt_desc PGM *)((fmt PGM *)IOCB->fmtptr + 1);
revert = IOCB->fmtptr;
for(;;) {
IOCB->fmtptr = revert;
for(;;) {
if( (IOCB->fmtptr->fmt.code & ~EXTEND_FORMAT) == RP_FORMAT ) break;
if( IOCB->flags & IOF_FMTDONE ) break;
ExecCode();
}
if( IOCB->flags & IOF_FMTDONE ) break;
if( --rep_spec == 0 ) break;
}
IOCB->fmtptr = (fmt_desc PGM *)((fmt PGM *)IOCB->fmtptr + 1);
}
static void R_FERParen( uint dummy1 , char dummy2 ) {
//============================
IOCB->fmtptr = (fmt_desc PGM *)((fmt PGM *)IOCB->fmtptr + 1);
}
static void R_FEnd( uint dummy1 , char dummy2 ) {
//========================
int revert;
if( IOCB->typ != PT_NOTYPE ) {
if( ( IOCB->flags & IOF_FMTREP ) == 0 ) {
RTErr( FM_REP );
}
IOCB->flags &= ~IOF_FMTREP;
revert = IOCB->fmtptr->fmt4.fld1;
IOCB->fmtptr = (fmt_desc PGM *)((char PGM *)IOCB->fmtptr -
revert + sizeof( fmt ));
R_NewRec();
} else {
IOCB->flags |= IOF_FMTDONE;
}
}
static void R_FEZ( uint rep, char dummy2 ) {
//=================================
for(;;) {
if( IOCB->typ == PT_NOTYPE ) {
IOCB->flags |= IOF_FMTDONE;
}
if( IOCB->typ == PT_NOTYPE ) break;
FmtPrepOp();
if( IOCB->flags & IOF_OUTPT ) {
R_FOHex();
R_ChkRecLen();
} else {
R_FIHex();
}
FmtIOType();
if( --rep == 0 ) break;
}
IOCB->flags |= IOF_FMTREP;
IOCB->fmtptr = (fmt_desc PGM *)((fmt1 PGM *)IOCB->fmtptr + 1);
}
static void R_FEM( uint dummy1 , char dummy2 ) {
//=======================
if( IOCB->flags & IOF_OUTPT ) {
IOCB->flags |= IOF_NOCR;
}
IOCB->fmtptr = (fmt_desc PGM *)((fmt PGM *)IOCB->fmtptr + 1);
}
static void FmtPrepOp( void ) {
//===========================
ftnfile *fcb;
byte width;
fcb = IOCB->fileinfo;
width = IOCB->fmtptr->fmt1.fld1;
if( width + fcb->col > fcb->bufflen ) {
IOErr( IO_BUFF_LEN );
}
}
static void FmtIOType( void ) {
//===========================
if( IOCB->flags & IOF_FMTREALPART ) {
IOCB->flags &= ~IOF_FMTREALPART;
} else {
ArrayIOType();
if( (IOCB->typ >= PT_CPLX_8) && (IOCB->typ <= PT_CPLX_32) ) {
IOCB->flags |= IOF_FMTREALPART;
}
}
}
static const void (* const __FAR FmtExec[])( uint , char ) = {
&R_FEA,
&R_FEBN,
&R_FEBZ,
&R_FED,
&R_FEE,
&R_FEE,
&R_FEF,
&R_FEG,
&R_FEH,
&R_FEI,
&R_FEL,
&R_FEP,
&R_FES,
&R_FESP,
&R_FESS,
&R_FET,
&R_FETL,
&R_FETR,
&R_FEX,
&R_FEColon,
&R_FELParen,
&R_FERParen,
&R_FESlash,
&R_FEM,
&R_FEZ,
&R_FEnd,
NULL,
&R_FEE,
&R_FEQ
};
static void ExecInit( void ) {
//==========================
ftnfile *fcb;
fcb = IOCB->fileinfo;
IOCB->flags &= ~IOF_FMTDONE;
IOCB->flags &= ~IOF_FMTREP;
IOCB->flags &= ~IOF_FMTREALPART;
IOCB->fmtlen = fcb->col;
IOCB->scale = 0;
FmtIOType();
if( ( IOCB->flags & IOF_OUTPT ) == 0 ) {
R_NewRec();
}
}
static void ExecCode( void ) {
//==========================
byte code;
uint repeat;
char ch;
if( (IOCB->fmtptr->fmt4.code & ~EXTEND_FORMAT) == REP_FORMAT ) {
repeat = IOCB->fmtptr->fmt4.fld1;
IOCB->fmtptr = (fmt_desc PGM *)((fmt4 PGM *)IOCB->fmtptr + 1);
} else {
repeat = 1;
}
IOCB->flags &= ~IOF_EXTEND_FORMAT;
code = IOCB->fmtptr->fmt.code;
if( code & EXTEND_FORMAT ) {
IOCB->flags |= IOF_EXTEND_FORMAT;
code &= ~EXTEND_FORMAT;
}
if( code == E_FORMAT ) {
ch = 'E';
} else if( code == ED_FORMAT ) {
ch = 'D';
} else if( code == EQ_FORMAT ) {
ch = 'Q';
}
FmtExec[ code ]( repeat, ch );
}
void R_FExec( void ) {
//=================
ExecInit();
for(;;) {
ExecCode();
if( IOCB->flags & IOF_FMTDONE ) break;
}
if( IOCB->flags & IOF_OUTPT ) {
R_NewRec();
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?