|
|
|
/***************************************************************************
|
|
|
|
* Copyright (C) 2004 by Jens Dagerbo *
|
|
|
|
* jens.dagerbo@swipnet.se *
|
|
|
|
* *
|
|
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
|
|
* it under the terms of the GNU General Public License as published by *
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
|
|
* (at your option) any later version. *
|
|
|
|
* *
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
namespace ctags
|
|
|
|
{
|
|
|
|
#include "readtags.h"
|
|
|
|
}
|
|
|
|
|
|
|
|
#include "ctagskinds.h"
|
|
|
|
|
|
|
|
#include "tags.h"
|
|
|
|
|
|
|
|
TQStringList Tags::_tagFiles;
|
|
|
|
|
|
|
|
Tags::TagEntry::TagEntry() {}
|
|
|
|
|
|
|
|
Tags::TagEntry::TagEntry( const TQString & tag, const TQString & type, const TQString & file, const TQString & pattern )
|
|
|
|
: tag(tag), type(type), file(file), pattern(pattern)
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
|
|
bool Tags::hasTag(const TQString & tag )
|
|
|
|
{
|
|
|
|
TQStringList::iterator it;
|
|
|
|
for (it = _tagFiles.begin(); it != _tagFiles.end() ; it++) {
|
|
|
|
if (hasTag((*it).ascii(), tag))
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Tags::hasTag(const char* tagFile, const TQString & tag )
|
|
|
|
{
|
|
|
|
ctags::tagFileInfo info;
|
|
|
|
ctags::tagFile * file = ctags::tagsOpen(tagFile, &info );
|
|
|
|
ctags::tagEntry entry;
|
|
|
|
|
|
|
|
bool found = ( ctags::tagsFind( file, &entry, tag.ascii(), TAG_FULLMATCH | TAG_OBSERVECASE ) == ctags::TagSuccess );
|
|
|
|
|
|
|
|
ctags::tagsClose( file );
|
|
|
|
|
|
|
|
return found;
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned int Tags::numberOfMatches( const TQString & tagpart, bool partial )
|
|
|
|
{
|
|
|
|
unsigned int n = 0;
|
|
|
|
TQStringList::iterator it;
|
|
|
|
for (it = _tagFiles.begin(); it != _tagFiles.end(); it++)
|
|
|
|
{
|
|
|
|
n += numberOfMatches( (*it).ascii(), tagpart, partial );
|
|
|
|
}
|
|
|
|
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned int Tags::numberOfMatches(const char* tagFile, const TQString & tagpart, bool partial )
|
|
|
|
{
|
|
|
|
unsigned int n = 0;
|
|
|
|
|
|
|
|
if ( tagpart.isEmpty() ) return 0;
|
|
|
|
|
|
|
|
ctags::tagFileInfo info;
|
|
|
|
ctags::tagFile * file = ctags::tagsOpen( tagFile, &info );
|
|
|
|
ctags::tagEntry entry;
|
|
|
|
|
|
|
|
if ( ctags::tagsFind( file, &entry, tagpart.ascii(), TAG_OBSERVECASE | (partial ? TAG_PARTIALMATCH : TAG_FULLMATCH) ) == ctags::TagSuccess )
|
|
|
|
{
|
|
|
|
do
|
|
|
|
{
|
|
|
|
n++;
|
|
|
|
}
|
|
|
|
while ( ctags::tagsFindNext( file, &entry ) == ctags::TagSuccess );
|
|
|
|
}
|
|
|
|
|
|
|
|
ctags::tagsClose( file );
|
|
|
|
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Tags::TagList Tags::getMatches( const TQString & tagpart, bool partial, const TQStringList & types )
|
|
|
|
{
|
|
|
|
Tags::TagList list;
|
|
|
|
|
|
|
|
// build a compound tag list from all the configured tag files
|
|
|
|
TQStringList::iterator it;
|
|
|
|
for ( it = _tagFiles.begin(); it != _tagFiles.end(); it++ )
|
|
|
|
{
|
|
|
|
list += getMatches((*it).ascii(), tagpart, partial, types);
|
|
|
|
}
|
|
|
|
|
|
|
|
return list;
|
|
|
|
}
|
|
|
|
|
|
|
|
Tags::TagList Tags::getMatches(const char* tagFile, const TQString & tagpart, bool partial, const TQStringList & types )
|
|
|
|
{
|
|
|
|
Tags::TagList list;
|
|
|
|
|
|
|
|
if ( tagpart.isEmpty() ) return list;
|
|
|
|
|
|
|
|
ctags::tagFileInfo info;
|
|
|
|
ctags::tagFile * file = ctags::tagsOpen(tagFile, &info );
|
|
|
|
ctags::tagEntry entry;
|
|
|
|
|
|
|
|
if ( ctags::tagsFind( file, &entry, tagpart.ascii(), TAG_OBSERVECASE | (partial ? TAG_PARTIALMATCH : TAG_FULLMATCH) ) == ctags::TagSuccess )
|
|
|
|
{
|
|
|
|
do
|
|
|
|
{
|
|
|
|
TQString type( CTagsKinds::findKind( entry.kind, TQString( entry.file ).section( '.', -1 ) ) );
|
|
|
|
TQString file( entry.file );
|
|
|
|
|
|
|
|
if ( type.isEmpty() && file.endsWith( "Makefile" ) )
|
|
|
|
{
|
|
|
|
type = "macro";
|
|
|
|
}
|
|
|
|
if ( types.isEmpty() || types.contains( entry.kind ) )
|
|
|
|
{
|
|
|
|
list << TagEntry( TQString( entry.name ), type, file, TQString( entry.address.pattern ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
while ( ctags::tagsFindNext( file, &entry ) == ctags::TagSuccess );
|
|
|
|
}
|
|
|
|
|
|
|
|
ctags::tagsClose( file );
|
|
|
|
|
|
|
|
return list;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Tags::setTagFiles(const TQStringList& tagFiles )
|
|
|
|
{
|
|
|
|
_tagFiles = tagFiles;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQStringList Tags::getTagFiles( )
|
|
|
|
{
|
|
|
|
return _tagFiles;
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned int Tags::numberOfPartialMatches( const TQString & tagpart )
|
|
|
|
{
|
|
|
|
return numberOfMatches( tagpart, true );
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned int Tags::numberOfExactMatches( const TQString & tagpart )
|
|
|
|
{
|
|
|
|
return numberOfMatches( tagpart, false );
|
|
|
|
}
|
|
|
|
|
|
|
|
Tags::TagList Tags::getPartialMatches( const TQString & tagpart )
|
|
|
|
{
|
|
|
|
return getMatches( tagpart, true );
|
|
|
|
}
|
|
|
|
|
|
|
|
Tags::TagList Tags::getExactMatches( const TQString & tag )
|
|
|
|
{
|
|
|
|
return getMatches( tag, false );
|
|
|
|
}
|
|
|
|
|
|
|
|
// kate: space-indent off; indent-width 4; tab-width 4; show-tabs off;
|
|
|
|
|
|
|
|
|