18#include <unordered_map>
76 std::optional<BodyInfo>
body;
124 if (lname!=
"<globalScope>")
145 lang = SrcLangExt::Unknown;
150 p->setDefFileName(df);
151 p->defLine = defLine;
152 p->defColumn = defCol;
160 if (exclSyms.empty())
return FALSE;
161 std::string symName =
name.
str();
162 for (
const auto &pat : exclSyms)
165 bool forceStart=
FALSE;
167 if (pattern.
at(0)==
'^')
168 pattern=pattern.
mid(1),forceStart=
TRUE;
169 if (pattern.
at(pattern.
length()-1)==
'$')
171 if (pattern.
find(
'*')!=-1)
177 size_t ui = match.position();
178 size_t pl = match.length();
179 size_t sl = symName.length();
180 if ((ui==0 || pattern.
at(0)==
'*' || (!
isId(symName.at(ui-1)) && !forceStart)) &&
181 (ui+pl==sl || pattern.
at(pattern.
length()-1)==
'*' || (!
isId(symName.at(ui+pl)) && !forceEnd))
191 size_t i = symName.find(pattern.
str());
192 if (i!=std::string::npos)
195 size_t pl=pattern.
length();
196 size_t sl=symName.length();
198 if ((ui==0 || (!
isId(symName.at(ui-1)) && !forceStart)) &&
199 (ui+pl==sl || (!
isId(symName.at(ui+pl)) && !forceEnd))
235 const char *d,
bool isSymbol)
243 p->isSymbol = isSymbol;
263 p = std::make_unique<Private>(*other.
p);
278 if (
name.isEmpty())
return;
280 p->isAnonymous =
p->name.isEmpty() ||
281 p->name.at(0)==
'@' ||
282 p->name.find(
"::@")!=-1;
287 if (
id.isEmpty())
return;
315 if (
p->sectionRefs.find(gsi->
label())==
nullptr)
317 p->sectionRefs.add(gsi);
327 if (
p->sectionRefs.empty())
return FALSE;
340 if (!
p->sectionRefs.empty())
351 tagFile <<
" <docanchor file=\"" << fn <<
"\"";
356 tagFile <<
">" << si->
label() <<
"</docanchor>\n";
369 MD5Buffer(docStr.
data(),
static_cast<unsigned int>(docStr.
length()),md5_sig);
370 MD5SigToString(md5_sig,sigStr);
373 if (sigList.
find(sigStr)==-1)
401 if (!
p->details.has_value())
403 p->details = std::make_optional<DocInfo>();
405 DocInfo &details =
p->details.value();
412 details.
doc = doc+
"\n\n"+details.
doc;
416 details.
doc +=
"\n\n"+doc;
444 size_t bl = brief.
length();
449 int c = brief.
at(bl-1);
452 case '.':
case '!':
case '?':
case '>':
case ':':
case ')':
break;
462 if (
p->brief && !
p->brief->doc.isEmpty())
470 if (!
p->brief.has_value())
472 p->brief = std::make_optional<BriefInfo>();
504 if (!
p->inbodyDocs.has_value())
506 p->inbodyDocs = std::make_optional<DocInfo>();
508 DocInfo &inbodyDocs =
p->inbodyDocs.value();
511 inbodyDocs.
doc = doc;
552 bool usePipe = !filter.
isEmpty() && filterSourceFiles;
558 size_t startLine,
size_t endLine,std::string &str)
560 std::unique_lock<std::mutex> lock(
m_mutex);
565 auto item = it->second;
573 auto [ startLineOffset, fragmentSize] =
getFragmentLocation(it_off->second,startLine,endLine);
577 item.filePos+startLineOffset, fragmentSize);
584 QCString cmd=filter+
" \""+fileName+
"\"";
590 err(
"Error opening filter pipe command '{}'\n",cmd);
607 const int blockSize = 4096;
609 size_t bytesRead = fread(buf,1,blockSize,f);
610 size_t bytesWritten = fwrite(buf,1,bytesRead,bf);
611 if (bytesRead!=bytesWritten)
614 err(
"Failed to write to filter database {}. Wrote {} out of {} bytes\n",
621 str+=std::string_view(buf,bytesWritten);
625 m_cache.emplace(fileName.str(),item);
643 std::unique_lock<std::mutex> lock(
m_mutex);
671 const char *p=str.data();
675 while ((c=*p)!=
'\n' && c!=0) p++;
677 it->second.push_back(p-str.data());
684 size_t startLine,
size_t endLine) -> std::tuple<size_t,size_t>
686 assert(startLine > 0);
687 assert(startLine <= endLine);
688 const size_t startLineOffset = lineOffsets[std::min(startLine-1,lineOffsets.size()-1)];
689 const size_t endLineOffset = lineOffsets[std::min(endLine, lineOffsets.size()-1)];
690 assert(startLineOffset <= endLineOffset);
691 const size_t fragmentSize = endLineOffset-startLineOffset;
692 return std::tie(startLineOffset,fragmentSize);
704 auto [ startLineOffset, fragmentSize] =
getFragmentLocation(lineOffsets,startLine,endLine);
707 str.erase(0,startLineOffset);
708 str.resize(fragmentSize);
717 if (size==0) { startOffset=0; size =
static_cast<size_t>(ifs.tellg()); }
718 ifs.seekg(startOffset, std::ios::beg);
720 ifs.read(str.data(), size);
724 std::unordered_map<std::string,FilterCacheItem>
m_cache;
751 int &startLine,
int &endLine,
QCString &result)
755 bool usePipe = !filter.
isEmpty() && filterSourceFiles;
758 const int blockSize = 4096;
761 static_cast<size_t>(std::max(1,startLine)),
762 static_cast<size_t>(std::max({1,startLine,endLine})),str);
765 bool found = lang==SrcLangExt::VHDL ||
766 lang==SrcLangExt::Python ||
767 lang==SrcLangExt::Fortran ||
775 int lineNr=startLine;
781 while ((c=*p++)!=
'{' && c!=
':' && c!=0)
790 col+=tabSize - (col%tabSize);
792 else if (pc==
'/' && c==
'/')
794 while ((c=*p++)!=
'\n' && c!=0);
795 if (c==
'\n') lineNr++,col=0;
797 else if (pc==
'/' && c==
'*')
799 while (((c=*p++)!=
'/' || pc!=
'*') && c!=0)
801 if (c==
'\n') lineNr++,col=0;
831 if (endLine!=startLine)
834 spaces.
fill(
' ',col);
843 if (cn==
'\n') lineNr++;
845 char lineStr[blockSize];
854 while ((c=*p) && i<blockSize-1)
863 }
while (size_read == (blockSize-1));
868 int newLineIndex = result.
findRev(
'\n');
869 int braceIndex = result.
findRev(
'}');
870 if (braceIndex > newLineIndex)
872 result.
resize(
static_cast<size_t>(braceIndex+1));
883 if (encoding!=
"UTF-8")
885 std::string encBuf = result.
str();
893 err(
"failed to transcode characters in code fragment in file {} lines {} to {}, from input encoding {} to UTF-8\n",
894 fileName,startLine,endLine,encoding);
898 if (!result.
isEmpty() && result.
at(result.
length()-1)!=
'\n') result +=
"\n";
909 p->body &&
p->body->startLine!=-1 &&
p->body->fileDef)
911 fn =
p->body->fileDef->getSourceFileBase();
918 const int maxAnchorStrLen = 20;
919 char anchorStr[maxAnchorStrLen];
921 if (
p->body &&
p->body->startLine!=-1)
925 qsnprintf(anchorStr,maxAnchorStrLen,
"L%d",
p->body->defLine);
929 qsnprintf(anchorStr,maxAnchorStrLen,
"l%05d",
p->body->defLine);
943 int lineMarkerPos = refText.
find(
"@0");
944 int fileMarkerPos = refText.
find(
"@1");
945 if (lineMarkerPos!=-1 && fileMarkerPos!=-1)
948 lineStr.
sprintf(
"%d",
p->body->defLine);
951 if (lineMarkerPos<fileMarkerPos)
957 ol.
parseText(refText.
mid(lineMarkerPos+2,fileMarkerPos-lineMarkerPos-2));
970 ol.
parseText(refText.
mid(fileMarkerPos+2,lineMarkerPos-fileMarkerPos-2));
980 err(
"translation error: invalid markers in trDefinedAtLineInSourceFile()\n");
987 if (!
p->body.has_value())
989 p->body = std::make_optional<BodyInfo>();
999 if (!
p->body.has_value())
1001 p->body = std::make_optional<BodyInfo>();
1003 p->body.value().fileDef=fd;
1008 return p->body &&
p->body->startLine!=-1 &&
1009 p->body->endLine>=
p->body->startLine &&
1029 int actualStart=
p->body->startLine,actualEnd=
p->body->endLine;
1031 actualStart,actualEnd,codeFragment)
1037 intf->resetCodeParserState();
1042 intf->parseCode(codeOL,
1056 codeOL.endCodeFragment(
"DoxyCode");
1066 std::transform(map.begin(),map.end(),
1067 std::back_inserter(result),
1068 [](
const auto &item)
1069 { return item.second; }
1072 std::stable_sort(result.
begin(),result.
end(),
1073 [](
const auto &m1,
const auto &m2) { return genericCompareMembers(m1,m2)<0; });
1081 const QCString &text,
const std::unordered_map<std::string,MemberDef *> &membersMap,
1084 if (!membersMap.empty())
1088 auto replaceFunc = [
this,&members,scopeName,&ol](
size_t entryIndex)
1092 const MemberDef *md=members[entryIndex];
1098 if (!scope.
isEmpty() && scope!=scopeName)
1110 if (sourceBrowser &&
1116 const int maxLineNrStr = 10;
1117 char anchorStr[maxLineNrStr];
1139 theTranslator->trWriteList(
static_cast<int>(members.size())).str(),
1160 return !
p->sourceRefByDict.empty();
1165 return !
p->sourceRefsDict.empty();
1173 (
p->details && !
p->details->doc.isEmpty()) ||
1174 (
p->brief && !
p->brief->doc.isEmpty()) ||
1175 (
p->inbodyDocs && !
p->inbodyDocs->doc.isEmpty()) ||
1186 (
p->details && !
p->details->doc.isEmpty()) ||
1187 (
p->brief && !
p->brief->doc.isEmpty()) ||
1188 (
p->inbodyDocs && !
p->inbodyDocs->doc.isEmpty());
1196 p->sourceRefByDict.emplace(sourceRefName.
str(),md);
1204 p->sourceRefsDict.emplace(sourceRefName.
str(),md);
1215 err(
"DefinitionImpl::addInnerCompound() called\n");
1223 if (!
p->qualifiedName.isEmpty())
1225 return p->qualifiedName;
1229 if (
p->outerScope==
nullptr)
1231 if (
p->localName==
"<globalScope>")
1237 return p->localName;
1241 if (
p->outerScope->name()==
"<globalScope>")
1243 p->qualifiedName =
p->localName;
1247 p->qualifiedName =
p->outerScope->qualifiedName()+
1253 return p->qualifiedName;
1263 while (outerScope && !
found)
1265 found = (outerScope==d);
1270 p->qualifiedName.clear();
1274 assert(
p->def!=
p->outerScope);
1279 return p->localName;
1284 p->partOfGroups.push_back(gd);
1289 p->xrefListItems.insert(
p->xrefListItems.end(), sli.cbegin(), sli.cend());
1297 p->xrefListItems.reserve(
p->xrefListItems.size()+otherXrefList.size());
1298 p->xrefListItems.insert (
p->xrefListItems.end(),
1299 otherXrefList.begin(),otherXrefList.end());
1302 std::stable_sort(
p->xrefListItems.begin(),
p->xrefListItems.end(),
1304 { return left->id() <right->id() ||
1305 (left->id()==right->id() &&
1306 left->list()->listName() < right->list()->listName());
1310 auto last = std::unique(
p->xrefListItems.begin(),
p->xrefListItems.end(),
1312 { return left->id()==right->id() &&
1313 left->list()->listName()==right->list()->listName();
1315 p->xrefListItems.erase(last,
p->xrefListItems.end());
1320 for (
const RefItem *item :
p->xrefListItems)
1332 return p->xrefListItems;
1340 result =
p->outerScope->pathFragment();
1342 if (
p->def->isLinkable())
1344 if (!result.
isEmpty()) result+=
"/";
1357 result+=
p->localName;
1362 result+=
p->localName;
1385 result+=(
toFileDef(
p->def))->getDirDef()->navigationPathAsString();
1387 result+=
"<li class=\"navelem\">";
1388 if (
p->def->isLinkableInProject())
1390 QCString fn =
p->def->getOutputFileBase();
1395 result+=
"<a href=\"$relpath^"+fn+
"\">"+
1401 result+=
"<a href=\"$relpath^"+fn+
"\">"+
1407 if (
name.endsWith(
"-p"))
1411 result+=
"<a href=\"$relpath^"+fn;
1412 if (!
p->def->anchor().isEmpty()) result+=
"#"+
p->def->anchor();
1417 result+=
"<a href=\"$relpath^"+fn+
"\">"+
1436 navPath +=
"<div id=\"nav-path\" class=\"navpath\">\n"
1439 navPath +=
" </ul>\n"
1448 if (
p->sectionRefs.empty())
return;
1456 return p->sectionRefs;
1461 return p->symbolName;
1468 return p->details ?
p->details->doc :
QCString(
"");
1473 return p->details ?
p->details->line :
p->brief ?
p->brief->line : 1;
1478 if (
p->details && !
p->details->file.isEmpty())
return p->details->file;
1479 else if (
p->brief && !
p->brief->file.isEmpty())
return p->brief->file;
1480 else return "<" +
p->name +
">";
1501 int i=scopelessName.
findRev(
"::");
1502 if (i!=-1) scopelessName=scopelessName.
mid(i+2);
1511 for (
const auto &p : briefDescAbbrev)
1522 if (c>=
'a' && c<=
'z') c+=
'A'-
'a';
1535 (abbr ?
abbreviate(
p->brief->doc,
p->def->displayName()) :
p->brief->doc) :
1541 if (
p->brief &&
p->brief->tooltip.isEmpty() && !
p->brief->doc.isEmpty())
1546 p->brief->doc,
p->brief->file,
p->brief->line);
1552 return p->brief ?
p->brief->tooltip :
QCString();
1557 return p->brief ?
p->brief->line : 1;
1562 return p->brief && !
p->brief->file.isEmpty() ?
p->brief->file :
QCString(
"<"+
p->name+
">");
1569 return p->inbodyDocs ?
p->inbodyDocs->doc :
QCString(
"");
1574 return p->inbodyDocs ?
p->inbodyDocs->line : 1;
1579 return p->inbodyDocs && !
p->inbodyDocs->file.isEmpty() ?
p->inbodyDocs->file :
QCString(
"<"+
p->name+
">");
1587 return p->defFileName;
1592 return p->defFileExt;
1602 return p->def->isLinkableInProject() && !
p->hidden;
1607 return p->def->isLinkable() && !
p->hidden;
1612 return p->isArtificial;
1617 return p->isExported;
1627 return !
p->ref.isEmpty();
1632 return p->body ?
p->body->defLine : -1;
1637 return p->body ?
p->body->startLine : -1;
1642 return p->body ?
p->body->endLine : -1;
1647 return p->body ?
p->body->fileDef :
nullptr;
1652 return p->partOfGroups;
1659 if (gd->isLinkable())
return true;
1666 return p->outerScope;
1674 if (
p->referencesMembers.empty() && !
p->sourceRefsDict.empty())
1678 return p->referencesMembers;
1684 if (
p->referencedByMembers.empty() && !
p->sourceRefByDict.empty())
1688 return p->referencedByMembers;
1696 for (
const auto &kv : defImpl->
p->sourceRefsDict)
1698 auto it =
p->sourceRefsDict.find(kv.first);
1699 if (it !=
p->sourceRefsDict.end())
1701 p->sourceRefsDict.insert(kv);
1712 for (
const auto &kv : defImpl->
p->sourceRefByDict)
1714 auto it =
p->sourceRefByDict.find(kv.first);
1715 if (it !=
p->sourceRefByDict.end())
1717 p->sourceRefByDict.emplace(kv.first,kv.second);
1736 p->hidden =
p->hidden || b;
1741 p->isArtificial = b;
1767 return p->symbolName;
1785 size_t l = result.
length();
1786 if (!relPath.
isEmpty() && l>0 && result.
at(0)==
'.')
1791 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
1805 return p->isAnonymous;
1815 return p->defColumn;
1872 if (dm==
nullptr)
return nullptr;
1878 if (d==
nullptr)
return nullptr;
static AnchorGenerator & instance()
Returns the singleton instance.
virtual QCString className() const =0
Returns the name of the class including outer classes, but not including namespaces.
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
DefinitionAliasImpl(Definition *def, const Definition *scope, const Definition *alias)
const Definition * m_scope
const QCString & name() const
QCString qualifiedName() const
virtual ~DefinitionAliasImpl()
The common base class of all entity definitions found in the sources.
virtual const RefItemVector & xrefListItems() const =0
virtual QCString navigationPathAsString() const =0
virtual bool isLinkable() const =0
virtual QCString anchor() const =0
virtual DefinitionMutable * toDefinitionMutable_()=0
virtual const FileDef * getBodyDef() const =0
virtual bool isHidden() const =0
virtual QCString getReference() const =0
virtual void _setSymbolName(const QCString &name)=0
virtual QCString getSourceFileBase() const =0
virtual QCString getOutputFileBase() const =0
virtual Definition * getOuterScope() const =0
virtual int getStartBodyLine() const =0
virtual const DefinitionImpl * toDefinitionImpl_() const =0
virtual const QCString & name() const =0
Private data associated with a Symbol DefinitionImpl object.
MemberVector referencesMembers
std::optional< BriefInfo > brief
std::optional< BodyInfo > body
void init(const QCString &df, const QCString &n)
std::optional< DocInfo > inbodyDocs
MemberVector referencedByMembers
std::unordered_map< std::string, MemberDef * > sourceRefByDict
std::unordered_map< std::string, MemberDef * > sourceRefsDict
RefItemVector xrefListItems
void setDefFileName(const QCString &df)
void setId(const QCString &name)
void setBodySegment(int defLine, int bls, int ble)
void mergeRefItems(Definition *d)
QCString documentation() const
void addSourceReferencedBy(MemberDef *d, const QCString &sourceRefName)
const RefItemVector & xrefListItems() const
void writeSummaryLinks(OutputList &) const
QCString _symbolName() const
QCString getSourceFileBase() const
QCString externalReference(const QCString &relPath) const
void addSectionsToDefinition(const std::vector< const SectionInfo * > &anchorList)
bool isLinkableViaGroup() const
void setDefFile(const QCString &df, int defLine, int defColumn)
const Definition * findInnerCompound(const QCString &name) const
void setName(const QCString &name)
SrcLangExt getLanguage() const
void addInnerCompound(Definition *d)
void setArtificial(bool b)
bool hasSourceReffedBy() const
void _writeSourceRefList(OutputList &ol, const QCString &scopeName, const QCString &text, const std::unordered_map< std::string, MemberDef * > &members, bool) const
void writeNavigationPath(OutputList &ol) const
QCString getDefFileName() const
void writeSourceReffedBy(OutputList &ol, const QCString &scopeName) const
bool _docsAlreadyAdded(const QCString &doc, QCString &sigList)
void _setInbodyDocumentation(const QCString &d, const QCString &docFile, int docLine)
void setRefItems(const RefItemVector &sli)
int getStartBodyLine() const
void setLocalName(const QCString &name)
QCString symbolName() const
void setOuterScope(Definition *d)
void _setBriefDescription(const QCString &b, const QCString &briefFile, int briefLine)
QCString qualifiedName() const
const MemberVector & getReferencesMembers() const
void setBodyDef(const FileDef *fd)
void writeInlineCode(OutputList &ol, const QCString &scopeName) const
void setInbodyDocumentation(const QCString &d, const QCString &docFile, int docLine)
bool isArtificial() const
QCString briefDescriptionAsTooltip() const
int _getXRefListId(const QCString &listName) const
QCString inbodyDocumentation() const
QCString getSourceAnchor() const
QCString getDefFileExtension() const
void writeQuickMemberLinks(OutputList &, const MemberDef *) const
const GroupList & partOfGroups() const
void setBriefDescription(const QCString &b, const QCString &briefFile, int briefLine)
const QCString & name() const
QCString briefFile() const
bool hasUserDocumentation() const
QCString briefDescription(bool abbreviate=FALSE) const
bool hasBriefDescription() const
const SectionRefs & getSectionRefs() const
DefinitionImpl & operator=(const DefinitionImpl &d)
bool isVisibleInProject() const
void writeSourceRefs(OutputList &ol, const QCString &scopeName) const
void makePartOfGroup(GroupDef *gd)
const QCString & localName() const
void mergeReferencedBy(const Definition *other)
int getStartDefLine() const
void setDocumentation(const QCString &d, const QCString &docFile, int docLine, bool stripWhiteSpace=TRUE)
void setReference(const QCString &r)
bool hasSourceRefs() const
void writeToc(OutputList &ol, const LocalToc <) const
QCString navigationPathAsString() const
void _setDocumentation(const QCString &d, const QCString &docFile, int docLine, bool stripWhiteSpace, bool atTop)
const FileDef * getBodyDef() const
void writeSourceDef(OutputList &ol) const
void setLanguage(SrcLangExt lang)
void mergeReferences(const Definition *other)
QCString inbodyFile() const
std::unique_ptr< Private > p
bool hasDocumentation() const
Definition * getOuterScope() const
const MemberVector & getReferencedByMembers() const
QCString pathFragment() const
DefinitionImpl(Definition *def, const QCString &defFileName, int defLine, int defColumn, const QCString &name, const char *b=nullptr, const char *d=nullptr, bool isSymbol=TRUE)
int getEndBodyLine() const
void writeDocAnchorsToTagFile(TextStream &) const
void _setSymbolName(const QCString &name)
QCString getReference() const
void addSourceReferences(MemberDef *d, const QCString &sourceRefName)
virtual Definition * toDefinition_()=0
static ParserManager * parserManager
static NamespaceDefMutable * globalScope
static StringMap tagDestinationMap
static QCString filterDBFileName
static SymbolMap< Definition > * symbolMap
static ClangUsrMap * clangUsrMap
A model of a file symbol.
Minimal replacement for QFileInfo.
std::string extension(bool complete) const
void shrinkBuffer(std::string &str, const QCString &fileName, size_t startLine, size_t endLine)
std::vector< size_t > LineOffsets
auto getFragmentLocation(const LineOffsets &lineOffsets, size_t startLine, size_t endLine) -> std::tuple< size_t, size_t >
std::unordered_map< std::string, LineOffsets > m_lineOffsets
bool getFileContentsDisk(const QCString &fileName, size_t startLine, size_t endLine, std::string &str)
static FilterCache & instance()
void readFragmentFromFile(std::string &str, const QCString &fileName, size_t startOffset, size_t size=0)
void compileLineOffsets(const QCString &fileName, const std::string &str)
bool getFileContents(const QCString &fileName, size_t startLine, size_t endLine, std::string &str)
bool getFileContentsPipe(const QCString &fileName, const QCString &filter, size_t startLine, size_t endLine, std::string &str)
std::unordered_map< std::string, FilterCacheItem > m_cache
A model of a group of symbols.
virtual QCString groupTitle() const =0
const T * find(const std::string &key) const
A model of a class/file/namespace member symbol.
virtual bool isSignal() const =0
virtual bool isObjCMethod() const =0
virtual bool isSlot() const =0
virtual bool isFunction() const =0
virtual QCString getScopeString() const =0
virtual bool hasInlineSource() const =0
virtual MemberType memberType() const =0
virtual bool isPrototype() const =0
A vector of MemberDef object.
iterator begin() noexcept
void startCodeFragment(const QCString &style)
Class representing a list of output generators that are written to in parallel.
void writeString(const QCString &text)
const OutputCodeList & codeGenerators() const
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name)
void docify(const QCString &s)
void startParagraph(const QCString &classDef=QCString())
void pushGeneratorState()
void disableAllBut(OutputType o)
void writeLocalToc(const SectionRefs &refs, const LocalToc <)
void writeNavigationPath(const QCString &s)
void parseText(const QCString &textStr)
virtual QCString title() const =0
This is an alternative implementation of QCString.
int find(char c, int index=0, bool cs=TRUE) const
void fill(char c, int len=-1)
Fills a string with a predefined character.
QCString & prepend(const char *s)
size_t length() const
Returns the length of the string, not counting the 0-terminator.
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
char & at(size_t i)
Returns a reference to the character at index i.
bool isEmpty() const
Returns TRUE iff the string is empty.
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
void resize(size_t newlen)
const std::string & str() const
QCString simplifyWhiteSpace() const
return a copy of this string with leading and trailing whitespace removed and multiple whitespace cha...
QCString right(size_t len) const
QCString & sprintf(const char *format,...)
int findRev(char c, int index=-1, bool cs=TRUE) const
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
QCString left(size_t len) const
This struct represents an item in the list of references.
QCString listName() const
class that provide information about a section.
void setDefinition(Definition *d)
QCString fileName() const
singleton class that owns the list of all sections
SectionInfo * add(const SectionInfo &si)
static SectionManager & instance()
returns a reference to the singleton
class that represents a list of constant references to sections.
constexpr bool isSection() const
Text streaming class that buffers data.
ClassDef * toClassDef(Definition *d)
Class representing a regular expression.
Object representing the matching results.
#define Config_getInt(name)
#define Config_getList(name)
#define Config_getBool(name)
std::vector< std::string > StringVector
static std::mutex g_memberReferenceMutex
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 void addToMap(const QCString &name, Definition *d)
static bool matchExcludedSymbols(const QCString &name)
static QCString abbreviate(const QCString &s, const QCString &name)
Definition * toDefinition(DefinitionMutable *dm)
static MemberVector refMapToVector(const std::unordered_map< std::string, MemberDef * > &map)
static std::recursive_mutex g_qualifiedNameMutex
static bool stripWord(QCString &s, QCString w)
DefinitionMutable * toDefinitionMutable(Definition *d)
DirIterator end(const DirIterator &) noexcept
FileDef * toFileDef(Definition *d)
GroupDef * toGroupDef(Definition *d)
Translator * theTranslator
MemberDef * toMemberDef(Definition *d)
std::ifstream openInputStream(const QCString &name, bool binary=false, bool openAtEnd=false)
FILE * popen(const QCString &name, const QCString &type)
FILE * fopen(const QCString &fileName, const QCString &mode)
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.
PageDef * toPageDef(Definition *d)
Portable versions of functions that are platform dependent.
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
std::vector< RefItem * > RefItemVector
std::string_view stripWhiteSpace(std::string_view s)
Given a string view s, returns a new, narrower view on that string, skipping over any leading or trai...
Data associated with description found in the body.
int startLine
line number of the start of the definition's body
int endLine
line number of the end of the definition's body
int defLine
line number of the start of the definition
Data associated with a brief description.
Data associated with a detailed description.
bool isUTF8CharUpperCase(const std::string &input, size_t pos)
Returns true iff the input string at byte position pos holds an upper case character.
bool lastUTF8CharIsMultibyte(const std::string &input)
Returns true iff the last character in input is a multibyte character.
Various UTF8 related helper functions.
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
QCString convertToHtml(const QCString &s, bool keepEntities)
QCString parseCommentAsText(const Definition *scope, const MemberDef *md, const QCString &doc, const QCString &fileName, int lineNr)
bool transcodeCharacterStringToUTF8(std::string &input, const char *inputEncoding)
QCString stripScope(const QCString &name)
int computeQualifiedIndex(const QCString &name)
Return the index of the last :: in the string name that is still before the first <.
QCString convertToXML(const QCString &s, bool keepEntities)
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
QCString getEncoding(const FileInfo &fi)
QCString stripLeadingAndTrailingEmptyLines(const QCString &s, int &docLine)
Special version of QCString::stripWhiteSpace() that only strips completely blank lines.
QCString getFileFilter(const QCString &name, bool isSourceCode)
void writeMarkerList(OutputList &ol, const std::string &markerText, size_t numMarkers, std::function< void(size_t)> replaceFunc)
void addHtmlExtensionIfMissing(QCString &fName)
A bunch of utility functions.