static void ExClose( void ) { //========================= byte cl_stat; byte op_stat; if( IOCB->flags & BAD_UNIT ) { IOErr( IO_IUNIT ); } FindFtnFile(); if( IOCB->fileinfo != NULL ) { CloseFile( IOCB->fileinfo ); cl_stat = FindKWord( ClStatTab, STAT_SPEC, STATUS_UNKNOWN, ( IOCB->set_flags & SET_STATPTR ) ? IOCB->statptr : NULL ); op_stat = IOCB->fileinfo->status; if( cl_stat == STATUS_UNKNOWN ) { cl_stat = STATUS_KEEP; if( op_stat == STATUS_SCRATCH ) { cl_stat = STATUS_DELETE; } } if( ( cl_stat == STATUS_KEEP ) && ( op_stat == STATUS_SCRATCH ) ) { IOErr( IO_ISTAT ); } if( (cl_stat == STATUS_DELETE) && (IOCB->fileinfo->flags & FTN_FSEXIST) ) { CloseDeleteFile( IOCB->fileinfo ); } else { CloseFile( IOCB->fileinfo ); } DiscoFile( IOCB->fileinfo ); } }
static void ExBkSpace( void ) { //=========================== ftnfile *fcb; ChkUnitId(); FindFtnFile(); ChkConnected(); ChkExist(); fcb = IOCB->fileinfo; // backspace statement only valid for SEQUENTIAL files. ChkSequential( IO_ABACK ); ChkRecordStructure(); ClrBuff(); if( fcb->eofrecnum != 1 ) { if( fcb->recnum > 1 ) { fcb->recnum--; if( fcb->recnum != fcb->eofrecnum ) { BackSpacef( fcb ); ChkIOErr( fcb ); } } fcb->flags &= ~FTN_EOF; } }
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 ); } }