bool UeBase::CSimpleFileReader::ConnectFile() { m_connected = false; if(!m_pathBasic.IsFileExist(m_fileName)) { m_dataBegin = NULL; return false; } if(!m_dataBegin) { bool rt = m_fileBasic.CreateMemoryMapping(m_fileName, &m_fileHandle, &m_mappedMemory, (void **)&m_dataBegin, CFileBasic::UL_Native); assert(rt && m_fileBasic.IsValidHandle(m_fileHandle, CFileBasic::UL_Native)); if(!rt || !m_fileBasic.IsValidHandle(m_fileHandle, CFileBasic::UL_Native)) { m_fileBasic.ReleaseMemoryMapping(&m_fileHandle, &m_mappedMemory, (void **)&m_dataBegin, CFileBasic::UL_Native); m_dataBegin = NULL; return false; } if( !m_dataBegin && ConnectFile() ) { return false; } m_dataCount = m_fileBasic.GetFileSize(m_fileHandle,CFileBasic::UL_Native) / m_blockSize; m_connected = true; } return true; }
bool FindFName( void ) { //=================== ftnfile *fcb; char *fname; ConnectFile(); fname = IOCB->fileinfo->filename; fcb = Files; for(;;) { if( fcb == NULL ) return( FALSE ); if( ( IOCB->fileinfo != fcb ) && SameFile( fname, fcb->filename ) ) break; fcb = fcb->link; } // file already connected DiscoFile( IOCB->fileinfo ); IOCB->fileinfo = fcb; return( TRUE ); }
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 ); } }