Beispiel #1
0
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 );
    }
}
Beispiel #2
0
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;
    }
}
Beispiel #3
0
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 );
    }
}