示例#1
0
文件: linkio.c 项目: JWasm/JWlink
void LnkFilesInit( void )
/******************************/
// the linker doesn't use stdaux or stdprn, so close these.
{
    CaughtBreak = NOT_HIT;
    if( !AuxFilesClosed ) {
        OpenFiles = 2;      // will be 0 when done closing stdaux & stdprn.
        QClose( STDAUX_HANDLE, "stdaux" );
        QClose( STDPRN_HANDLE, "stdprn" );
        AuxFilesClosed = TRUE;
        OpenFiles = 0;
    }
}
示例#2
0
void CacheClose( file_list *list, unsigned pass )
/******************************************************/
{
    infilelist *file;
    bool        nukecache;

    if( list == NULL )
        return;
    file = list->file;
//    if( file->handle == NIL_FHANDLE ) return;
    file->flags &= ~INSTAT_IN_USE;
    switch( pass ) {
    case 1: /* first pass */
        nukecache = !(file->flags & INSTAT_LIBRARY);
        if( file->flags & INSTAT_FULL_CACHE ) {
            if( nukecache ) {
                FreeObjCache( list );
            }
        } else {
            DumpFileCache( file, nukecache );   // don't cache .obj's
        }
        break;
    case 3: /* freeing structure */
        FreeObjCache( list );
        if( file->handle != NIL_FHANDLE ) {
            QClose( file->handle, file->name );
            file->handle = NIL_FHANDLE;
        }
        break;
    }
}
示例#3
0
static void CleanSubSystems( void )
/*********************************/
{
    if( MapFile != NIL_HANDLE ) {
        QClose( MapFile, MapFName );
        MapFile = NIL_HANDLE;
    }
    FreeOutFiles();
    _LnkFree( MapFName );
    BurnSystemList();
    FreeList( LibPath );
    CloseSpillFile();
    CleanTraces();
    FreePaths();
    FreeUndefs();
    FreeLocalImports();
    CleanLoadFile();
    CleanLinkStruct();
    FreeFormatStuff();
    FreeObjInfo();
    FreeVirtMem();
    CleanToc();
    CleanSym();
    CleanPermData();
}
示例#4
0
bool CleanCachedHandles( void )
/************************************/
{
    infilelist *list;

    for( list = CachedFiles; list != NULL; list = list->next ) {
        if( !(list->flags & INSTAT_IN_USE) && list->handle != NIL_HANDLE )break;
    }
    if( list == NULL ) return( FALSE );
    QClose( list->handle, list->name );
    list->handle = NIL_HANDLE;
    return( TRUE );
}
示例#5
0
static void RestoreCmdLine( void )
/********************************/
// Restore a saved command line.
{
    void *  temp;

    QClose( CmdFile->file, CmdFile->name );
    MemFree( CmdFile->name );
    MemFree( CmdFile->buffer );
    temp = CmdFile->next;
    MemFree( CmdFile );
    CmdFile = temp;
}
示例#6
0
static void RestoreCmdLine( void )
/********************************/
// Restore a saved command line.
{
    cmdfilelist *temp;

    temp = CmdFile;
    CmdFile = CmdFile->next;
    QClose( temp->file, temp->name );
    MemFree( temp->name );
    MemFree( temp->buffer );
    MemFree( temp );
}
示例#7
0
void CloseSpillFile( void )
/*************************/
/*  Close temporary file.  */
{
    if( TempFile != NIL_FHANDLE ) {
        RestoreBreak();
        QClose( TempFile, TFileName );
        QDelete( TFileName );
        _LnkFree( TFileName );
        TFileName = NULL;
        TempFile = NIL_FHANDLE;
    }
}
示例#8
0
void FreeParserMem( void )
/*******************************/
{
    cmdfilelist     *curr;

    while( (curr = CmdFile) != NULL ) {
        CmdFile = CmdFile->next;
        if( curr->file != NIL_FHANDLE ) {
            QClose( curr->file, curr->name );
        }
        MemFree( curr->buffer );
        MemFree( curr->name );
        MemFree( curr );
    }
}
示例#9
0
extern void FreeParserMem( void )
/*******************************/
{
    cmdfilelist     *next;


    for( ; CmdFile != NULL; CmdFile = next ) {
        next = CmdFile->next;
        if( CmdFile->file != NIL_HANDLE ) {
            QClose( CmdFile->file, CmdFile->name );
        }
        MemFree( CmdFile->buffer );
        MemFree( CmdFile->name );
        MemFree( CmdFile );
    }
}
示例#10
0
static void WriteQNXResource( void )
/**********************************/
{
    unsigned long   len;
    lmf_record      rec;
    f_handle        file;
    lmf_resource    resource;
    void *          buf;

    if( FmtData.resource != NULL ) {
        rec.reserved = 0;
        rec.spare = 0;
        rec.rec_type = LMF_RESOURCE_REC;
        memset( &resource, 0, sizeof( lmf_resource ) );
        if( FmtData.res_name_only ) {
            file = QObjOpen( FmtData.resource );
            if( file == NIL_FHANDLE ) {
                PrintIOError( WRN+MSG_CANT_OPEN_NO_REASON, "s",
                                        FmtData.resource );
                return;
            }
            len = QFileSize( file );
            if( len + sizeof(lmf_resource) > QNX_MAX_REC_SIZE ) {
                LnkMsg( WRN+MSG_RESOURCE_TOO_BIG, "s", FmtData.resource );
                return;
            }
            _ChkAlloc( buf, len );
            rec.data_nbytes = len + sizeof( lmf_resource );
            WriteLoad( &rec, sizeof( lmf_record ) );
            WriteLoad( &resource, sizeof( lmf_resource ) );
            QRead( file, buf, len, FmtData.resource );
            WriteLoad( buf, len );
            _LnkFree( buf );
            QClose( file, FmtData.resource );
        } else {
            len = strlen( FmtData.resource );
            FmtData.resource[len] = '\n';
            len++;
            rec.data_nbytes = len + sizeof( lmf_resource );
            WriteLoad( &rec, sizeof( lmf_record ) );
            WriteLoad( &resource, sizeof( lmf_resource ) );
            WriteLoad( FmtData.resource, len );
        }
    }
}
示例#11
0
f_handle OpenTempFile( char **fname )
/***********************************/
{
    const char  *ptr;
    size_t      tlen;
    char        *tptr;
    f_handle    fhdl;

    ptr = GetEnvString( "WLINKTMP" );
    if( ptr == NULL )
        ptr = GetEnvString( "TMP" );
    if( ptr == NULL )
        ptr = GetEnvString( "TMPDIR" );
    if( ptr == NULL ) {
        _ChkAlloc( tptr, TEMPFNAME_SIZE );
        *fname = tptr;
    } else {
        tlen = strlen( ptr );
        _ChkAlloc( tptr, tlen + 1 + TEMPFNAME_SIZE );
        memcpy( tptr, ptr, tlen );
        *fname = tptr;
        tptr += tlen;
        if( !IS_PATH_SEP( tptr[-1] ) ) {
            *tptr++ = DIR_SEP;
        }
    }
    tptr = MakeTempName( tptr );
    tlen = 0;
    for( ;; ) {
        if( tlen >= 26 ) {
            LnkMsg( FTL+MSG_CANT_OPEN_SPILL, NULL );
        }
        *tptr += 1;                     // change temp file extension
        fhdl = TempFileOpen( *fname );
        if( fhdl == NIL_FHANDLE )
            break;
        QClose( fhdl, *fname );
        ++tlen;
    }
    return( QOpenRW( *fname ) );
}