usage.cpp
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C++ 代码 · 共 553 行 · 第 1/2 页
CPP
553 行
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
* DESCRIBE IT HERE!
*
****************************************************************************/
#include "wpch.hpp"
#include "handle.hpp"
#include "reindex.hpp"
#include "scopes.hpp"
#include "usage.hpp"
#include "cache.hpp"
// Silence the compiler warning about taking the "sizeof" a
// class with virtual functions
#pragma warning 549 9
static Pool UsageRec::_usagePool( UsagePool, sizeof(UsageRec) );
#pragma warning 549 3
UsageList::UsageList()
/********************/
{
_count = 0;
_firstFile = NULL;
_curFile = NULL;
}
UsageList::~UsageList()
/*********************/
{
FileData * currFile;
FileData * prevFile;
UsageRec * currLine;
UsageRec * currCol;
UsageRec * prevCol;
prevFile = NULL;
currFile = _firstFile;
while( currFile != NULL ){
currLine = currFile->lines.First();
while( currLine != NULL ) {
prevCol = NULL;
currCol = currLine->next;
while( currCol != NULL ){
prevCol = currCol;
currCol = currCol->next;
delete prevCol;
}
delete currLine;
currLine = currFile->lines.Next();
}
prevFile = currFile;
currFile = currFile->next;
delete prevFile;
}
}
void UsageList::Insert( UsageRec * data )
/***************************************/
{
UsageRec * current;
UsageRec * prev;
if( _firstFile == NULL ){
_firstFile = new FileData;
_firstFile->next = NULL;
_firstFile->filename = (BRI_StringID) 0;
_firstFile->curLine = 0;
_firstFile->curColumn = 0;
_curFile = _firstFile;
}
data->column = _curFile->curColumn;
// Find the right line and column...
current = _curFile->lines.Find( _curFile->curLine );
prev = NULL;
while( current != NULL && current->column < _curFile->curColumn ){
prev = current;
current = current->next;
}
data->next = current;
if( prev == NULL ){
_curFile->lines.Insert( _curFile->curLine, data, TRUE );
} else {
prev->next = data;
}
_count += 1;
}
void UsageList::Delta( int_8 dcol, int_16 dline )
/***********************************************/
{
_curFile->curLine += dline;
_curFile->curColumn += dcol;
}
void UsageList::SetFile( BRI_StringID filename )
/**********************************************/
{
FileData * curr;
FileData * prev;
FileData * newfile;
prev = NULL;
curr = _firstFile;
while( curr != NULL && curr->filename < filename ){
prev = curr;
curr = curr->next;
}
if( _curFile != NULL ){
_openFileStack.Push( _curFile );
}
if( curr == NULL || curr->filename > filename ){
newfile = new FileData;
newfile->next = curr;
newfile->filename = filename;
newfile->curLine = 0;
newfile->curColumn = 0;
if( prev == NULL ){
_firstFile = newfile;
} else {
prev->next = newfile;
}
_curFile = newfile;
} else {
curr->curLine = 0;
curr->curColumn = 0;
_curFile = curr;
}
}
void UsageList::EndFile()
/***********************/
{
_curFile = _openFileStack.Pop();
}
UsageRec * UsageList::First()
/***************************/
{
UsageRec * result = NULL;
_curFile = _firstFile;
while( _curFile != NULL && _curFile->lines.Empty() ){
_curFile = _curFile->next;
}
if( _curFile != NULL ){
result = _curFile->lines.First();
_curUsage = result;
}
return result;
}
UsageRec * UsageList::Next()
/**************************/
{
UsageRec * result = NULL;
if( _curFile != NULL ){
if( _curUsage != NULL ){
_curUsage = _curUsage->next;
if( _curUsage != NULL ){
_curFile->curColumn = _curUsage->column;
result = _curUsage;
} else {
_curUsage = _curFile->lines.Next();
if( _curUsage != NULL ){
_curFile->curLine = _curFile->lines.CurrentKey();
_curFile->curColumn = _curUsage->column;
result = _curUsage;
} else {
do {
_curFile = _curFile->next;
} while( _curFile != NULL && _curFile->lines.Empty() );
if( _curFile != NULL ){
_curUsage = _curFile->lines.First();
_curFile->curLine = _curFile->lines.CurrentKey();
_curFile->curColumn = _curUsage->column;
result = _curUsage;
}
}
}
}
}
return result;
}
BRI_StringID UsageList::GetFileName()
/***********************************/
{
if( _curFile == NULL ){
return (BRI_StringID) 0;
} else {
return _curFile->filename;
}
}
uint_32 UsageList::GetLine()
/**************************/
{
if( _curFile == NULL ){
return 0;
} else {
return _curFile->curLine;
}
}
uint_32 UsageList::GetColumn()
/****************************/
{
if( _curFile == NULL ){
return 0;
} else {
return _curFile->curColumn;
}
}
UsageRec * UsageList::At( BRI_StringID fname, uint_32 line,
uint_32 column )
/*********************************************************/
{
UsageRec * result;
FileData * curFile;
UsageRec * curLine;
UsageRec * curColumn;
UsageRec * prevColumn;
WBool found = FALSE;
// Find the right file...
curFile = _firstFile;
while( curFile != NULL && curFile->filename != fname ){
curFile = curFile->next;
}
if( curFile != NULL ){
curLine = curFile->lines.Find( line );
curColumn = curLine;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?