usage.cpp

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C++ 代码 · 共 553 行 · 第 1/2 页

CPP
553
字号
        prevColumn = NULL;
        while( curColumn != NULL && curColumn->column < column ){
            prevColumn = curColumn;
            curColumn = curColumn->next;
        }

        if( curColumn == NULL ){
            _right = curFile->lines.FindRight( line );
        } else {
            _right = curColumn;
            if( curColumn->column == column ){
                found = TRUE;
            }
        }
        if( !found ){
            if( prevColumn != NULL ){
                _left = curLine;
                while( _left->column < prevColumn->column ){
                    _left = _left->next;
                }
            } else {
                prevColumn = curFile->lines.FindLeft( line );
                if( prevColumn != NULL ){
                    _left = prevColumn;
                    while( prevColumn->next != NULL ){
                        prevColumn = prevColumn->next;
                        if( prevColumn->column != _left->column ){
                            _left = prevColumn;
                        }
                    }
                } else {
                    _left = NULL;
                }
            }
        }
    } else {
        _left = _right = NULL;
    }


    // If we found the exact line/column requested, return the
    // first reference at that position.  Otherwise, return NULL
    // and prepare to iterate over the references at the next
    // valid line/column positions to the right and left.

    if( found ){
        result = _right;
        _right = _right->next;
    } else {
        result = NULL;
    }
    return result;
}


UsageRec * UsageList::NextAt()
/****************************/
{
    UsageRec *  result = NULL;
    uint_32     column;

    // Return the next reference at the same line/column.
    // Assumes that a previous call to UsageList::At returned
    // a non-NULL value.

    result = _right;
    if( result != NULL ){
        column = result->column;
        _right = result->next;
        if( _right != NULL && _right->column != column ){
            _right = NULL;
        }
    }
    return result;
}


UsageRec * UsageList::NextAtLeft()
/********************************/
{
    UsageRec *  result = NULL;
    uint_32     column;

    // Return the next reference at the line/column position
    // to the left.  Assumes that a previous call to UsageList::At
    // returned NULL.

    result = _left;
    if( result != NULL ){
        column = result->column;
        _left = result->next;
        if( _left != NULL && _left->column != column ){
            _left = NULL;
        }
    }
    return result;
}


UsageRec * UsageList::NextAtRight()
/*********************************/
{
    UsageRec *  result = NULL;
    uint_32     column;

    // Return the next reference at the line/column position
    // to the right.  Assumes that a previous call to UsageList::At
    // returned NULL.

    result = _right;
    if( result != NULL ){
        column = result->column;
        _right = result->next;
        if( _right != NULL && _right->column != column ){
            _right = NULL;
        }
    }
    return result;
}


void UsageList::Reset()
/*********************/
{
    FileData    *current;

    _curFile = NULL;
    _curUsage = NULL;
    _left = NULL;
    _right = NULL;

    current = _firstFile;
    while( current != NULL ){
        current->curLine = 0;
        current->curColumn = 0;
        current = current->next;
    }
}


// Flags used by SaveTo and LoadFrom
enum  SaveLoadFlags {
    END_FLAG    = 0x00,
    FILE_FLAG   = 0x01,
    LINE_FLAG   = 0x02,
    COLUMN_FLAG = 0x03,
};

static const int SIZE_SL_FLAGS = 1;


WBool UsageList::SaveTo( CacheOutFile *cache )
/******************************************/
{
    FileData    *current;
    UsageRec    *currLine;
    UsageRec    *currColumn;

    cache->StartComponent( "Usages" );
    cache->AddDword( _count );
    current = _firstFile;
    while( current != NULL ){
        cache->AddByte( FILE_FLAG );
        cache->AddDword( current->filename );
        cache->AddDword( current->curLine );
        cache->AddDword( current->curColumn );
        currLine = current->lines.First();
        while( currLine != NULL ){
            cache->AddByte( LINE_FLAG );
            cache->AddDword( current->lines.CurrentKey() );
            cache->AddDword( currLine->column );
            cache->AddData( &currLine->type, BRI_SIZE_REFERENCETYPE );
            cache->AddDword( currLine->targetID );
            cache->AddDword( currLine->enclosing );
            currColumn = currLine->next;
            while( currColumn != NULL ){
                cache->AddByte( COLUMN_FLAG );
                cache->AddDword( currColumn->column );
                cache->AddData( &currColumn->type, BRI_SIZE_REFERENCETYPE );
                cache->AddDword( currColumn->targetID );
                cache->AddDword( currColumn->enclosing );
                currColumn = currColumn->next;
            }
            currLine = current->lines.Next();
        }
        current = current->next;
    }
    cache->EndComponent();
    return TRUE;
}


WBool UsageList::LoadFrom( CacheInFile *cache )
/*******************************************/
{
    WBool               result;
    uint_8              flag;
    uint_32             count;
    uint_32             lineNum;
    FileData            *current;
    UsageRec            *lastColumn;
    FileData            *newFile;
    UsageRec            *newLine;
    UsageRec            *newColumn;

    result = cache->OpenComponent( "Usages" );

    if( !result ){
        return result;
    }

    if( _openFileStack.Count() > 0 ){
        _openFileStack.Clear();
    }

    cache->ReadDword( &count );
    _count = count;
    current = NULL;
    lastColumn = NULL;
    while( count > 0 ){
        cache->ReadByte( flag );
        switch( flag ){
            case FILE_FLAG:
                if( lastColumn != NULL ){
                    lastColumn->next = NULL;
                }
                newFile = new FileData;
                cache->ReadDword( &newFile->filename );
                cache->ReadDword( &newFile->curLine );
                cache->ReadDword( &newFile->curColumn );
                newFile->next = NULL;
                if( current != NULL ){
                    current->next = newFile;
                } else {
                    _firstFile = newFile;
                }
                current = newFile;
            break;

            case LINE_FLAG:
                if( lastColumn != NULL ){
                    lastColumn->next = NULL;
                }
                newLine = new UsageRec;
                cache->ReadDword( &lineNum );
                cache->ReadDword( &newLine->column );
                newLine->type = (BRI_ReferenceType) 0;
                cache->ReadData( &newLine->type, BRI_SIZE_REFERENCETYPE );
                cache->ReadDword( &newLine->targetID );
                cache->ReadDword( &newLine->enclosing );
                current->lines.Insert( lineNum, newLine );
                lastColumn = newLine;
                count--;
            break;

            case COLUMN_FLAG:
                newColumn = new UsageRec;
                cache->ReadDword( &newColumn->column );
                newColumn->type = (BRI_ReferenceType) 0;
                cache->ReadData( &newColumn->type, BRI_SIZE_REFERENCETYPE );
                cache->ReadDword( &newColumn->targetID );
                cache->ReadDword( &newColumn->enclosing );
                lastColumn->next = newColumn;
                lastColumn = newColumn;
                count--;
            break;
        }
    }
    if( lastColumn != NULL ){
        lastColumn->next = NULL;
    }
    cache->CloseComponent();

    return result;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?