Doxygen
Loading...
Searching...
No Matches
definition.cpp File Reference
#include <algorithm>
#include <iterator>
#include <unordered_map>
#include <string>
#include <optional>
#include <cctype>
#include <cstdio>
#include <cstdlib>
#include <cassert>
#include "anchor.h"
#include "md5.h"
#include "regex.h"
#include "config.h"
#include "definitionimpl.h"
#include "doxygen.h"
#include "language.h"
#include "message.h"
#include "portable.h"
#include "outputlist.h"
#include "code.h"
#include "util.h"
#include "groupdef.h"
#include "pagedef.h"
#include "section.h"
#include "htags.h"
#include "parserintf.h"
#include "debug.h"
#include "vhdldocgen.h"
#include "memberlist.h"
#include "namespacedef.h"
#include "filedef.h"
#include "dirdef.h"
#include "reflist.h"
#include "utf8.h"
#include "indexlist.h"
#include "fileinfo.h"
Include dependency graph for definition.cpp:

Go to the source code of this file.

Classes

class  DefinitionImpl::Private
 Private data associated with a Symbol DefinitionImpl object. More...
class  FilterCache
struct  FilterCache::FilterCacheItem

Functions

static bool matchExcludedSymbols (const QCString &name)
static void addToMap (const QCString &name, Definition *d)
static void removeFromMap (const QCString &name, Definition *d)
bool readCodeFragment (const QCString &fileName, bool isMacro, int &startLine, int &endLine, QCString &result)
 Reads a fragment from file fileName starting with line startLine and ending with line endLine.
static MemberVector refMapToVector (const std::unordered_map< std::string, MemberDef * > &map)
static bool stripWord (QCString &s, QCString w)
static QCString abbreviate (const QCString &s, const QCString &name)
DefinitiontoDefinition (DefinitionMutable *dm)
DefinitionMutabletoDefinitionMutable (Definition *d)

Variables

static std::recursive_mutex g_qualifiedNameMutex
static std::mutex g_memberReferenceMutex

Function Documentation

◆ abbreviate()

QCString abbreviate ( const QCString & s,
const QCString & name )
static

Definition at line 1570 of file definition.cpp.

1571{
1572 QCString scopelessName=name;
1573 int i=scopelessName.findRev("::");
1574 if (i!=-1) scopelessName=scopelessName.mid(i+2);
1575 QCString result=s;
1576 result=result.stripWhiteSpace();
1577 // strip trailing .
1578 if (!result.isEmpty() && result.at(result.length()-1)=='.')
1579 result=result.left(result.length()-1);
1580
1581 // strip any predefined prefix
1582 const StringVector &briefDescAbbrev = Config_getList(ABBREVIATE_BRIEF);
1583 for (const auto &p : briefDescAbbrev)
1584 {
1585 QCString str = substitute(p,"$name",scopelessName); // replace $name with entity name
1586 str += " ";
1587 stripWord(result,str);
1588 }
1589
1590 // capitalize first character
1591 if (!result.isEmpty())
1592 {
1593 char c = result[0];
1594 if (c >= 'a' && c <= 'z') result[0] += 'A' - 'a';
1595 }
1596
1597 return result;
1598}
This is an alternative implementation of QCString.
Definition qcstring.h:101
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:166
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
Definition qcstring.h:241
char & at(size_t i)
Returns a reference to the character at index i.
Definition qcstring.h:593
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition qcstring.h:260
int findRev(char c, int index=-1, bool cs=TRUE) const
Definition qcstring.cpp:96
QCString left(size_t len) const
Definition qcstring.h:229
#define Config_getList(name)
Definition config.h:38
std::vector< std::string > StringVector
Definition containers.h:33
static bool stripWord(QCString &s, QCString w)
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition qcstring.cpp:571

References QCString::at(), Config_getList, QCString::findRev(), QCString::isEmpty(), QCString::left(), QCString::length(), QCString::mid(), QCString::stripWhiteSpace(), stripWord(), and substitute().

Referenced by Definition::briefDescription(), DefinitionAliasMixin< Base >::briefDescription(), DefinitionImpl::briefDescription(), DefinitionMixin< Base >::briefDescription(), and DefinitionImpl::operator=().

◆ addToMap()

void addToMap ( const QCString & name,
Definition * d )
static

Definition at line 217 of file definition.cpp.

218{
219 bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
220 QCString symbolName = name;
221 int index=computeQualifiedIndex(symbolName);
222 if (!vhdlOpt && index!=-1) symbolName=symbolName.mid(index+2);
223 if (!symbolName.isEmpty())
224 {
225 //printf("adding symbol %s\n",qPrint(symbolName));
226 Doxygen::symbolMap->add(symbolName,d);
227
228 d->_setSymbolName(symbolName);
229 }
230}
virtual void _setSymbolName(const QCString &name)=0
static SymbolMap< Definition > * symbolMap
Definition doxygen.h:124
#define Config_getBool(name)
Definition config.h:33
int computeQualifiedIndex(const QCString &name)
Return the index of the last :: in the string name that is still before the first <.
Definition util.cpp:6774

References Definition::_setSymbolName(), computeQualifiedIndex(), Config_getBool, QCString::isEmpty(), QCString::mid(), DefinitionImpl::name(), Doxygen::symbolMap, and DefinitionImpl::symbolName().

Referenced by DefinitionImpl::DefinitionImpl(), DefinitionImpl::DefinitionImpl(), and DefinitionAliasImpl::init().

◆ matchExcludedSymbols()

bool matchExcludedSymbols ( const QCString & name)
static

Definition at line 156 of file definition.cpp.

157{
158 const StringVector &exclSyms = Config_getList(EXCLUDE_SYMBOLS);
159 if (exclSyms.empty()) return FALSE; // nothing specified
160 const std::string &symName = name.str();
161 for (const auto &pat : exclSyms)
162 {
163 QCString pattern = pat;
164 bool forceStart=FALSE;
165 bool forceEnd=FALSE;
166 if (pattern.at(0)=='^')
167 {
168 pattern = pattern.mid(1);
169 forceStart = true;
170 }
171 if (pattern.at(pattern.length() - 1) == '$')
172 {
173 pattern = pattern.left(pattern.length() - 1);
174 forceEnd = true;
175 }
176 if (pattern.find('*')!=-1) // wildcard mode
177 {
178 const reg::Ex re(substitute(pattern,"*",".*").str());
180 if (reg::search(symName,match,re)) // wildcard match
181 {
182 size_t ui = match.position();
183 size_t pl = match.length();
184 size_t sl = symName.length();
185 if ((ui==0 || pattern.at(0)=='*' || (!isId(symName.at(ui-1)) && !forceStart)) &&
186 (ui+pl==sl || pattern.at(pattern.length()-1)=='*' || (!isId(symName.at(ui+pl)) && !forceEnd))
187 )
188 {
189 //printf("--> name=%s pattern=%s match at %d\n",qPrint(symName),qPrint(pattern),i);
190 return TRUE;
191 }
192 }
193 }
194 else if (!pattern.isEmpty()) // match words
195 {
196 size_t i = symName.find(pattern.str());
197 if (i!=std::string::npos) // we have a match!
198 {
199 size_t ui=i;
200 size_t pl=pattern.length();
201 size_t sl=symName.length();
202 // check if it is a whole word match
203 if ((ui==0 || (!isId(symName.at(ui-1)) && !forceStart)) &&
204 (ui+pl==sl || (!isId(symName.at(ui+pl)) && !forceEnd))
205 )
206 {
207 //printf("--> name=%s pattern=%s match at %d\n",qPrint(symName),qPrint(pattern),i);
208 return TRUE;
209 }
210 }
211 }
212 }
213 //printf("--> name=%s: no match\n",name);
214 return FALSE;
215}
int find(char c, int index=0, bool cs=TRUE) const
Definition qcstring.cpp:43
const std::string & str() const
Definition qcstring.h:552
Class representing a regular expression.
Definition regex.h:39
Object representing the matching results.
Definition regex.h:151
bool search(std::string_view str, Match &match, const Ex &re, size_t pos)
Search in a given string str starting at position pos for a match against regular expression re.
Definition regex.cpp:844
bool match(std::string_view str, Match &match, const Ex &re)
Matches a given string str for a match against regular expression re.
Definition regex.cpp:855
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
bool isId(int c)
Definition util.h:207

References QCString::at(), Config_getList, FALSE, QCString::find(), QCString::isEmpty(), isId(), QCString::left(), QCString::length(), QCString::mid(), DefinitionImpl::name(), reg::search(), QCString::str(), substitute(), and TRUE.

Referenced by DefinitionImpl::DefinitionImpl().

◆ readCodeFragment()

bool readCodeFragment ( const QCString & fileName,
bool isMacro,
int & startLine,
int & endLine,
QCString & result )

Reads a fragment from file fileName starting with line startLine and ending with line endLine.

Reads a fragment of code from file fileName starting at line startLine and ending at line endLine (inclusive). The fragment is stored in result. If FALSE is returned the code fragment could not be found.

The file is scanned for a opening bracket ('{') from startLine onward The line actually containing the bracket is returned via startLine. The file is scanned for a closing bracket ('}') from endLine backward. The line actually containing the bracket is returned via endLine. Note that for VHDL code the bracket search is not done.

Definition at line 754 of file definition.cpp.

756{
757 bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
758 QCString filter = getFileFilter(fileName,TRUE);
759 bool usePipe = !filter.isEmpty() && filterSourceFiles;
760 int tabSize = Config_getInt(TAB_SIZE);
761 SrcLangExt lang = getLanguageFromFileName(fileName);
762 const int blockSize = 4096;
763 std::string str;
765 static_cast<size_t>(std::max(1,startLine)),
766 static_cast<size_t>(std::max({1,startLine,endLine})),str);
767 //printf("readCodeFragment(%s,startLine=%d,endLine=%d)=\n[[[\n%s]]]\n",qPrint(fileName),startLine,endLine,qPrint(str));
768
769 bool found = lang==SrcLangExt::VHDL ||
770 lang==SrcLangExt::Python ||
771 lang==SrcLangExt::Fortran ||
772 isMacro;
773 // for VHDL, Python, and Fortran no bracket search is possible
774 char *p=str.data();
775 if (p && *p)
776 {
777 char c=0;
778 int col=0;
779 int lineNr=startLine;
780 // skip until the opening bracket or lonely : is found
781 char cn=0;
782 while (*p && !found)
783 {
784 int pc=0;
785 while ((c=*p++)!='{' && c!=':' && c!=0)
786 {
787 //printf("parsing char '%c'\n",c);
788 if (c=='\n')
789 {
790 lineNr++;
791 col = 0;
792 }
793 else if (c=='\t')
794 {
795 col+=tabSize - (col%tabSize);
796 }
797 else if (pc=='/' && c=='/') // skip single line comment
798 {
799 while ((c=*p++)!='\n' && c!=0);
800 if (c == '\n')
801 {
802 lineNr++;
803 col = 0;
804 }
805 }
806 else if (pc=='/' && c=='*') // skip C style comment
807 {
808 while (((c=*p++)!='/' || pc!='*') && c!=0)
809 {
810 if (c == '\n')
811 {
812 lineNr++;
813 col = 0;
814 }
815 pc=c;
816 }
817 }
818 else
819 {
820 col++;
821 }
822 pc = c;
823 }
824 if (c==':')
825 {
826 cn=*p++;
827 if (cn!=':') found=TRUE;
828 }
829 else if (c=='{')
830 {
831 found=TRUE;
832 }
833 else if (c==0)
834 {
835 break;
836 }
837 }
838 //printf(" -> readCodeFragment(%s,%d,%d) lineNr=%d\n",fileName,startLine,endLine,lineNr);
839 if (found)
840 {
841 // For code with more than one line,
842 // fill the line with spaces until we are at the right column
843 // so that the opening brace lines up with the closing brace
844 if (endLine!=startLine)
845 {
846 QCString spaces;
847 spaces.fill(' ',col);
848 result+=spaces;
849 }
850 // copy until end of line
851 if (c) result+=c;
852 startLine=lineNr;
853 if (c==':')
854 {
855 result+=cn;
856 if (cn=='\n') lineNr++;
857 }
858 char lineStr[blockSize];
859 do
860 {
861 //printf("reading line %d in range %d-%d\n",lineNr,startLine,endLine);
862 int size_read=0;
863 do
864 {
865 // read up to blockSize-1 non-zero characters
866 int i=0;
867 while ((c=*p) && i<blockSize-1)
868 {
869 lineStr[i++]=c;
870 p++;
871 if (c=='\n') break; // stop at end of the line
872 }
873 lineStr[i]=0;
874 size_read=i;
875 result+=lineStr; // append line to the output
876 } while (size_read == (blockSize-1)); // append more if line does not fit in buffer
877 lineNr++;
878 } while (*p);
879
880 // strip stuff after closing bracket
881 int newLineIndex = result.findRev('\n');
882 int braceIndex = result.findRev('}');
883 if (braceIndex > newLineIndex)
884 {
885 result.resize(static_cast<size_t>(braceIndex+1));
886 }
887 endLine=lineNr-1;
888 }
889 if (usePipe)
890 {
891 Debug::print(Debug::FilterOutput, 0, "Filter output\n");
892 Debug::print(Debug::FilterOutput,0,"-------------\n{}\n-------------\n",result);
893 }
894 }
895 QCString encoding = getEncoding(FileInfo(fileName.str()));
896 if (encoding!="UTF-8")
897 {
898 std::string encBuf = result.str();
899 bool ok = transcodeCharacterStringToUTF8(encBuf,encoding.data());
900 if (ok)
901 {
902 result = encBuf;
903 }
904 else
905 {
906 err("failed to transcode characters in code fragment in file {} lines {} to {}, from input encoding {} to UTF-8\n",
907 fileName,startLine,endLine,encoding);
908
909 }
910 }
911 if (!result.isEmpty() && result.at(result.length()-1)!='\n') result += "\n";
912 //printf("readCodeFragment(%d-%d)=%s\n",startLine,endLine,qPrint(result));
913 return found;
914}
@ FilterOutput
Definition debug.h:38
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
Definition debug.h:76
Minimal replacement for QFileInfo.
Definition fileinfo.h:23
static FilterCache & instance()
bool getFileContents(const QCString &fileName, size_t startLine, size_t endLine, std::string &str)
void resize(size_t newlen)
Definition qcstring.h:180
QCString fill(char c, int len=-1)
Fills a string with a predefined character.
Definition qcstring.h:193
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition qcstring.h:172
#define Config_getInt(name)
Definition config.h:34
#define err(fmt,...)
Definition message.h:127
SrcLangExt
Definition types.h:207
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5147
bool transcodeCharacterStringToUTF8(std::string &input, const char *inputEncoding)
Definition util.cpp:1400
QCString getEncoding(const FileInfo &fi)
Definition util.cpp:5647
QCString getFileFilter(const QCString &name, bool isSourceCode)
Definition util.cpp:1366

References QCString::at(), Config_getBool, Config_getInt, QCString::data(), err, QCString::fill(), Debug::FilterOutput, QCString::findRev(), getEncoding(), FilterCache::getFileContents(), getFileFilter(), getLanguageFromFileName(), FilterCache::instance(), QCString::isEmpty(), QCString::length(), Debug::print(), QCString::resize(), QCString::str(), transcodeCharacterStringToUTF8(), and TRUE.

Referenced by VhdlDocGen::createFlowChart(), DefinitionMutable::toDefinition_(), and DefinitionImpl::writeInlineCode().

◆ refMapToVector()

MemberVector refMapToVector ( const std::unordered_map< std::string, MemberDef * > & map)
inlinestatic

Definition at line 1076 of file definition.cpp.

1077{
1078 // convert map to a vector of values
1079 MemberVector result;
1080 std::transform(map.begin(),map.end(), // iterate over map
1081 std::back_inserter(result), // add results to vector
1082 [](const auto &item)
1083 { return item.second; } // extract value to add from map Key,Value pair
1084 );
1085 // and sort it
1086 std::stable_sort(result.begin(),result.end(),
1087 [](const auto &m1,const auto &m2) { return genericCompareMembers(m1,m2)<0; });
1088 return result;
1089}
A vector of MemberDef object.
Definition memberlist.h:35
iterator end() noexcept
Definition memberlist.h:56
iterator begin() noexcept
Definition memberlist.h:54

References MemberVector::begin(), and MemberVector::end().

Referenced by DefinitionImpl::_writeSourceRefList(), DefinitionImpl::getReferencedByMembers(), and DefinitionImpl::getReferencesMembers().

◆ removeFromMap()

void removeFromMap ( const QCString & name,
Definition * d )
static

Definition at line 232 of file definition.cpp.

233{
234 Doxygen::symbolMap->remove(name,d);
235}

References DefinitionImpl::name(), and Doxygen::symbolMap.

Referenced by DefinitionAliasImpl::deinit(), and DefinitionImpl::~DefinitionImpl().

◆ stripWord()

bool stripWord ( QCString & s,
QCString w )
static

Definition at line 1557 of file definition.cpp.

1558{
1559 bool success=FALSE;
1560 if (s.left(w.length())==w)
1561 {
1562 success=TRUE;
1563 s=s.right(s.length()-w.length());
1564 }
1565 return success;
1566}
QCString right(size_t len) const
Definition qcstring.h:234

References FALSE, QCString::left(), QCString::length(), QCString::right(), and TRUE.

Referenced by abbreviate().

◆ toDefinition()

◆ toDefinitionMutable()

DefinitionMutable * toDefinitionMutable ( Definition * d)

Variable Documentation

◆ g_memberReferenceMutex

std::mutex g_memberReferenceMutex
static

◆ g_qualifiedNameMutex

std::recursive_mutex g_qualifiedNameMutex
static