void _AllocBuffer( ftnfile *fcb ) { //==================================== if( fcb->buffer == NULL ) { if( IsCarriage() ) { fcb->bufflen += strlen( NormalCtrlSeq ); } fcb->buffer = RChkAlloc( fcb->bufflen + 1 ); } }
void IOPrologue( void ) { //==================== ftnfile *fcb; byte form; byte accm; IOCB->typ = PT_NOT_STARTED; if( IOCB->flags & BAD_REC ) { IOErr( IO_IREC ); } if( IOCB->set_flags & SET_INTERNAL ) { F_Connect(); } else { ChkUnitId(); FindFtnFile(); if( IOCB->fileinfo == NULL ) { IOCB->set_flags &= ~SET_FILENAME; ConnectFile(); } } fcb = IOCB->fileinfo; if( fcb->action == ACT_DEFAULT ) { fcb->action = ACTION_RW; } ChkIOOperation( fcb ); if( fcb->cctrl == CC_DEFAULT ) { fcb->cctrl = CC_NO; } accm = fcb->accmode; if( accm == ACCM_DEFAULT ) { if( IOCB->set_flags & SET_RECORDNUM ) { accm = ACCM_DIRECT; } else { accm = ACCM_SEQUENTIAL; } fcb->accmode = accm; } else { if( ( accm == ACCM_DIRECT ) && (IOCB->set_flags & SET_RECORDNUM) == 0 ) { IOErr( IO_REC1_ACCM ); } else if( ( ( accm == ACCM_SEQUENTIAL ) || ( accm == ACCM_APPEND ) ) && (IOCB->set_flags & SET_RECORDNUM) ) { IOErr( IO_REC2_ACCM ); } } if( accm == ACCM_DIRECT ) { fcb->recnum = IOCB->recordnum; // set up recordnumber } form = fcb->formatted; if( form == 0 ) { // set up format if it was if( (IOCB->flags & IOF_NOFMT) == 0 ) { // not previously set form = FORMATTED_IO; } else { form = UNFORMATTED_IO; } fcb->formatted = form; } else { if( (form == FORMATTED_IO) && (IOCB->flags & IOF_NOFMT) ) { IOErr( IO_AF1 ); } else if( (form == UNFORMATTED_IO) && (IOCB->flags & IOF_NOFMT) == 0 ) { IOErr( IO_AF2 ); } } if( fcb->internal != NULL ) { fcb->bufflen = fcb->internal->len; fcb->buffer = RChkAlloc( fcb->bufflen ); } else { if( ( accm <= ACCM_SEQUENTIAL ) && ( fcb->eofrecnum != 0 ) && ( fcb->recnum >= fcb->eofrecnum ) && // Consider: READ( 1, *, END=10 ) // ... // 10 WRITE( 1, * ) 'write after EOF' // if an EOF condition was encounterd, we don't want IO_PAST_EOF // on the write (IOCB->flags & IOF_OUTPT) == 0 ) { if( fcb->recnum != fcb->eofrecnum ) { IOErr( IO_PAST_EOF ); } else { fcb->recnum++; SysEOF(); } } _AllocBuffer( fcb ); if( fcb->fileptr == NULL ) { DoOpen(); } if( fcb->accmode == ACCM_DIRECT ) { SeekFile( fcb ); ChkIOErr( fcb ); } fcb->col = 0; } if( (IOCB->flags & IOF_OUTPT) && ( fcb->col == 0 ) ) { memset( fcb->buffer, ' ', fcb->bufflen ); } }
static void FOHex( uint width ) { //=============================== uint len; int trunc; ftnfile *fcb; PTYPE typ; char *buff; fcb = IOCB->fileinfo; typ = IOCB->typ; len = GetLen(); trunc = 0; // Use this method when real and imaginary parts are formatted using // one edit descriptor: /* if( ( IOCB->typ == PT_CPLX_8 ) || ( IOCB->typ == PT_CPLX_16 ) ) { len *= 2; IOCB->flags &= ~IOF_FMTREALPART; // we'll print both parts at once } */ // Use this method when real and imaginary parts each require an // edit descriptor: if( IOCB->typ == PT_CPLX_8 ) { if( !(IOCB->flags & IOF_FMTREALPART) ) { IORslt.scomplex.realpart = IORslt.scomplex.imagpart; } } else if( IOCB->typ == PT_CPLX_16 ) { if( !(IOCB->flags & IOF_FMTREALPART) ) { IORslt.dcomplex.realpart = IORslt.dcomplex.imagpart; } } else if( IOCB->typ == PT_CPLX_32 ) { if( !(IOCB->flags & IOF_FMTREALPART) ) { IORslt.xcomplex.realpart = IORslt.xcomplex.imagpart; } } if( width == 0 ) { width = 2*len; } trunc = ( len * 2 ) - width; if( trunc < 0 ) { SendChar( ' ', -trunc ); } if( trunc <= 0 ) { trunc = 0; } if( typ != PT_CHAR ) { len *= 2; HexFlip( (char *)&IORslt, len ); BToHS( (char *)&IORslt , len, IOCB->buffer ); strupr( IOCB->buffer ); SendStr( IOCB->buffer + trunc, len - trunc ); } else { buff = IOCB->buffer; len *= 2; if( len > IO_FIELD_BUFF ) { buff = RChkAlloc( len + 1 ); } pgm_BToHS( IORslt.string.strptr, len, buff ); strupr( buff ); SendStr( buff + trunc, len - trunc ); if( len > IO_FIELD_BUFF ) { RMemFree( buff ); } } }