25#include <unordered_set>
81#define ENABLE_TRACINGSUPPORT 0
83#if defined(__APPLE__) && ENABLE_TRACINGSUPPORT
95#define REL_PATH_TO_ROOT "../../"
97static const char *
hex =
"0123456789ABCDEF";
109 if (s.empty())
return;
115 for (
size_t i=0;i<s.length();i++)
120 m_ol.writeNonBreakableSpace(1);
137 m_ol.lineBreak(
"typebreak");
138 for (
int i=0;i<indent;i++)
140 m_ol.writeNonBreakableSpace(3);
145 const QCString &anchor,std::string_view text
149 m_ol.writeObjectLink(extRef,file,anchor,
QCString(text));
178 auto startsWithColon = [](
const std::string &del)
180 for (
size_t i=0;i<del.size();i++)
182 if (del[i]==
'@')
return false;
183 else if (del[i]==
':')
return true;
189 auto endsWithColon = [](
const std::string &del)
191 for (
int i=
static_cast<int>(del.size())-1;i>=0;i--)
193 if (del[i]==
'@')
return false;
194 else if (del[i]==
':')
return true;
199 static const reg::Ex re(R
"([\s:]*@\d+[\s:]*)");
200 std::string s = str.str();
204 size_t sl=s.length();
205 bool needsSeparator=
false;
206 for ( ; iter!=
end ; ++iter)
208 const auto &match = *iter;
209 size_t i = match.position();
212 if (needsSeparator) result+=
"::";
213 needsSeparator=
false;
214 result+=s.substr(p,i-p);
216 std::string delim = match.str();
217 needsSeparator = needsSeparator || (startsWithColon(delim) && endsWithColon(delim));
218 p = match.position()+match.length();
222 if (needsSeparator) result+=
"::";
232 static const reg::Ex marker(R
"(@\d+)");
234 !replacement.isEmpty() ? replacement.data() : "__anonymous__");
245 int sl =
static_cast<int>(s.
length());
253 if (!newScope.
isEmpty()) newScope+=
"::";
254 newScope+=s.
mid(i,l);
259 if (!newScope.
isEmpty()) newScope+=
"::";
260 newScope+=s.
right(sl-i);
292 const int maxMarkerStrLen = 20;
293 char result[maxMarkerStrLen];
294 qsnprintf(result,maxMarkerStrLen,
"@%d",
id);
315 for (
const auto &s : l)
318 if (
prefix.length() > length &&
325 if (length>0)
return potential;
352 static const std::unordered_set<std::string> sourceExt = {
353 "c",
"cc",
"cxx",
"cpp",
"c++",
"cppm",
"ccm",
"cxxm",
"c++m",
357 "ii",
"ixx",
"ipp",
"i++",
"inl",
360 static const std::unordered_set<std::string> headerExt = {
361 "h",
"hh",
"hxx",
"hpp",
"h++",
"ixx",
362 "idl",
"ddl",
"pidl",
"ice"
368 if (sourceExt.find(extension.
str())!=sourceExt.end())
370 return EntryType::makeSource();
372 if (headerExt.find(extension.
str())!=headerExt.end())
374 return EntryType::makeHeader();
381 return EntryType::makeEmpty();
387 AUTO_TRACE(
"context='{}' qualifiedName='{}'",context?context->
name():
"",qualifiedName);
396 if (typedefContext) *typedefContext=context;
399 if (qualifiedName.
find(
'<')!=-1)
404 int scopeIndex = qualifiedName.
findRev(
"::");
408 resName=qualifiedName.
right(qualifiedName.
length()-scopeIndex-2);
416 while (mContext && md==
nullptr)
432 if (!tmp.
isEmpty()) qualScopePart=tmp;
435 if (resScope==
nullptr)
break;
447 bool searchRelated=
false;
448 bool mustBeRelated=
false;
459 if (mn==0 && searchRelated)
467 for (
const auto &tmd_p : *mn)
470 AUTO_TRACE_ADD(
"found candidate member '{}' isTypeDef={}' isRelated={} mustBeRelated={}",
485 if (dist!=-1 && (md==
nullptr || dist<minDist))
507 if (args.
find(
")(")!=-1)
511 else if (args.
find(
'[')!=-1)
531static const char constScope[] = {
'c',
'o',
'n',
's',
't',
':' };
532static const char volatileScope[] = {
'v',
'o',
'l',
'a',
't',
'i',
'l',
'e',
':' };
533static const char virtualScope[] = {
'v',
'i',
'r',
't',
'u',
'a',
'l',
':' };
534static const char operatorScope[] = {
'o',
'p',
'e',
'r',
'a',
't',
'o',
'r',
'?',
'?',
'?' };
590 if (s.
length()*3>growBufLen)
592 growBufLen = s.
length()*3;
593 growBuf =
static_cast<char *
>(realloc(growBuf,growBufLen+1));
595 if (growBuf==
nullptr)
return s;
597 const char *src=s.
data();
608 while (i<l && isspace(
static_cast<uint8_t
>(src[i])))
615 char nc=i+1<l ? src[i+1] :
' ';
617 auto searchForKeyword = [&](
const char *kw,
size_t &matchLen,
size_t totalLen)
619 if (matchLen<=totalLen && c==kw[matchLen] &&
654 if (c==
'\\' && i+1<l)
678 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
679 (
isId(pc) || pc==
'*' || pc==
'&' || pc==
'.' || pc==
'>') &&
680 (osp<8 || (osp==8 && pc!=
'-'))
686 if (i+1<l && (nc==
'-' || nc==
'&'))
693 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
694 ((i+1<l && (
isId(nc) || nc==
'[')) ||
695 (i+2<l && nc==
'$' &&
isId(src[i+2])) ||
696 (i+3<l && nc==
'&' && src[i+2]==
'$' &&
isId(src[i+3]))
706 if (cliSupport && i+1<l && (
isId(nc) || nc==
'-'))
713 if (i+1<l && (
isId(nc) || nc==
'-'))
719 if (i>0 && pc!=
' ' && pc!=
'\t' && pc!=
':' &&
720 pc!=
'*' && pc!=
'&' && pc!=
'(' && pc!=
'/' &&
730 if (i>0 &&
isId(pc) && osp<9)
750 if (i>0 && i+1<l && pc!=
'=' && pc!=
':' && !isspace(
static_cast<uint8_t
>(pc)) &&
781 !(pc==
',' && nc==
'.') &&
782 (osp<8 || (osp>=8 &&
isId(pc) &&
isId(nc)))
790 else if ((pc==
'*' || pc==
'&' || pc==
'.') && nc==
'>')
798 auto correctKeywordAllowedInsideScope = [&](
char cc,
size_t &matchLen,
size_t totalLen) {
799 if (c==cc && matchLen==totalLen)
801 if ((i+2<l && src[i+1] ==
':' && src[i+2] ==
':') ||
802 ((i>matchLen && src[i-matchLen] ==
':' && src[i-matchLen-1] ==
':'))
806 correctKeywordAllowedInsideScope(
't',csp, 5);
807 correctKeywordAllowedInsideScope(
'e',vosp,8);
808 correctKeywordAllowedInsideScope(
'l',vsp, 7);
810 auto correctKeywordNotPartOfScope = [&](
char cc,
size_t &matchLen,
size_t totalLen)
812 if (c==cc && matchLen==totalLen && i+1<l &&
820 correctKeywordNotPartOfScope(
't',csp, 5);
821 correctKeywordNotPartOfScope(
'e',vosp,8);
822 correctKeywordNotPartOfScope(
'l',vsp, 7);
842 if (templateDepth > 0)
844 int nextOpenPos=name.
findRev(
'>', pos);
845 int nextClosePos=name.
findRev(
'<', pos);
846 if (nextOpenPos!=-1 && nextOpenPos>nextClosePos)
851 else if (nextClosePos!=-1)
863 int lastAnglePos=name.
findRev(
'>', pos);
864 int bracePos=name.
findRev(
'(', pos);
865 if (lastAnglePos!=-1 && lastAnglePos>bracePos)
872 int bp = bracePos>0 ? name.
findRev(
'(',bracePos-1) : -1;
874 return bp==-1 || (bp>=8 && name.
mid(bp-8,10)==
"operator()") ? bracePos : bp;
885 return (name==scope ||
886 (scope.
right(nl)==name &&
887 sl>1+nl && scope.
at(sl-nl-1)==
':' && scope.
at(sl-nl-2)==
':'
896 return (name==scope ||
897 (name.
left(sl)==scope &&
898 nl>sl+1 && name.
at(sl)==
':' && name.
at(sl+1)==
':'
906 const QCString &text,
bool autoBreak,
bool external,
907 bool keepSpaces,
int indentLevel)
911 std::string_view txtStr=text.
view();
912 size_t strLen = txtStr.length();
913 if (strLen==0)
return;
915 static const reg::Ex regExp(R
"((::)?\a[\w~!\\.:$"]*)");
925 size_t floatingIndex=0;
926 for (; it!=
end ; ++it)
928 const auto &match = *it;
929 size_t newIndex = match.position();
930 size_t matchLen = match.length();
931 floatingIndex+=newIndex-
skipIndex+matchLen;
932 if (newIndex>0 && txtStr.at(newIndex-1)==
'0')
941 bool insideString=
FALSE;
942 for (
size_t i=index;i<newIndex;i++)
944 if (txtStr.at(i)==
'"') insideString=!insideString;
945 if (txtStr.at(i)==
'\\') i++;
949 if (strLen>35 && floatingIndex>30 && autoBreak)
952 size_t splitLength = splitText.length();
954 size_t i = splitText.find(
',');
955 if (i==std::string::npos) { i=splitText.find(
'<');
if (i!=std::string::npos) offset=0; }
956 if (i==std::string::npos) i=splitText.find(
'>');
957 if (i==std::string::npos) i=splitText.find(
' ');
959 if (i!=std::string::npos)
961 std::string_view part1 = splitText.substr(0,i+offset);
963 out.
writeBreak(indentLevel==0 ? 0 : indentLevel+1);
964 std::string_view part2 = splitText.substr(i+offset);
966 floatingIndex=splitLength-i-offset+matchLen;
980 std::string_view
word=txtStr.substr(newIndex,matchLen);
1009 auto writeCompoundName = [&](
const auto *cd_) {
1010 if (external ? cd_->isLinkable() : cd_->isLinkableInProject())
1015 out.
writeLink(cd_->getReference(),cd_->getOutputFileBase(),cd_->anchor(),
word);
1022 writeCompoundName(cd);
1026 writeCompoundName(cd);
1030 writeCompoundName(cnd);
1045 scopeName=scope->
name();
1059 if (result.
found && result.
md &&
1066 if (result.
md!=self && (self==
nullptr || result.
md->
name()!=self->
name()))
1104 std::function<
void(
size_t)> replaceFunc)
1106 static const reg::Ex marker(R
"(@(\d+))");
1111 for ( ; it!=
end ; ++it)
1113 const auto &match = *it;
1114 size_t newIndex = match.position();
1115 size_t matchLen = match.length();
1116 ol.
parseText(markerText.substr(index,newIndex-index));
1117 unsigned long entryIndex = std::stoul(match[1].str());
1118 if (entryIndex<
static_cast<unsigned long>(numMarkers))
1120 replaceFunc(entryIndex);
1122 index=newIndex+matchLen;
1129 auto replaceFunc = [&list,&ol](
size_t entryIndex)
1131 const auto &e = list[entryIndex];
1163 if (a.hasDocumentation())
1167 paramDocs+=
" \\ilinebr @param"+direction+
" "+a.name+
" "+docsWithoutDir;
1179 for (
auto it = al.
begin() ; it!=al.
end() ;)
1184 int i=type1.
find(
")(");
1188 type1=type1.
left(i);
1196 result+= type1+
" "+a.
name+type2+a.
array;
1200 result+= type1+type2;
1207 if (it!=al.
end()) result+=
", ";
1222 if (al.
empty())
return result;
1225 for (
const auto &a : al)
1227 if (a.defval.isEmpty() || includeDefault)
1229 if (!first) result+=
", ";
1230 if (!a.name.isEmpty())
1240 int i =
static_cast<int>(a.type.length())-1;
1241 while (i>=0 &&
isId(a.type.at(i))) i--;
1244 result+=a.type.
right(a.type.length()-i-1);
1245 if (a.type.find(
"...")!=-1)
1257 result+=
" extends ";
1258 result+=a.typeConstraint;
1279 size_t len = contents.length();
1283 char c = contents[src++];
1287 if (src<len && contents[src] ==
'\n')
1292 else if ( c ==
'\0' && src<len-1)
1296 contents[dest++] = c;
1298 contents.resize(dest);
1305 for (
const auto &filterStr : filterList)
1308 int i_equals=fs.
find(
'=');
1315 filterPattern = filterPattern.
lower();
1316 input = input.
lower();
1323 if (filterName.
find(
' ')!=-1)
1325 filterName=
"\""+filterName+
"\"";
1345 if (name.
isEmpty())
return "";
1352 if (isSourceCode && !filterSrcList.empty())
1367 if (filterName.
length()>=2 && filterName[0]==
'"' && filterName[
static_cast<int>(filterName.
length())-1]==
'"')
1369 filterName = filterName.
mid(1,filterName.
length()-2);
1378 const char *outputEncoding =
"UTF-8";
1379 if (inputEncoding==
nullptr ||
qstricmp(inputEncoding,outputEncoding)==0)
return true;
1380 size_t inputSize=input.length();
1381 size_t outputSize=inputSize*4;
1384 if (cd==
reinterpret_cast<void *
>(-1))
1389 size_t iLeft=inputSize;
1390 size_t oLeft=outputSize;
1391 const char *inputPtr = input.data();
1392 char *outputPtr = output.
rawData();
1395 outputSize-=
static_cast<int>(oLeft);
1396 output.
resize(outputSize);
1397 output.
at(outputSize)=
'\0';
1417 bool fileOpened=
false;
1418 if (name[0]==
'-' && name[1]==0)
1420 std::string contents;
1422 while (getline(std::cin,line))
1424 contents+=line+
'\n';
1433 err(
"file '{}' not found\n",name);
1446 err(
"cannot open file '{}' for reading\n",name);
1454 for (
const auto &bcd : bcl)
1475 if (target==str) { target.
clear();
return; }
1477 int l=
static_cast<int>(str.
length());
1479 while ((i=target.
find(str,p))!=-1)
1481 bool isMatch = (i==0 || !
isId(target.
at(i-1))) &&
1482 (i+l==
static_cast<int>(target.
length()) || !
isId(target.
at(i+l)));
1485 int i1=target.
find(
'*',i+l);
1486 int i2=target.
find(
'&',i+l);
1487 if (i1==-1 && i2==-1)
1494 else if ((i1!=-1 && i<i1) || (i2!=-1 && i<i2))
1536 int i=s.
find(
" class ");
1537 if (i!=-1)
return s.
left(i)+s.
mid(i+6);
1538 i=s.
find(
" typename ");
1539 if (i!=-1)
return s.
left(i)+s.
mid(i+9);
1540 i=s.
find(
" union ");
1541 if (i!=-1)
return s.
left(i)+s.
mid(i+6);
1542 i=s.
find(
" struct ");
1543 if (i!=-1)
return s.
left(i)+s.
mid(i+7);
1556 if (!templSpec.
isEmpty() && templSpec.
at(0) ==
'<')
1563 templSpec = resolvedType;
1574 if (count>10)
return word;
1576 QCString symName,result,templSpec,tmpName;
1577 if (tSpec && !tSpec->
isEmpty())
1598 bool isTemplInst = cd && !templSpec.
isEmpty();
1599 if (!cd && !templSpec.
isEmpty())
1610 cd?cd->
name():
"",mType?mType->
name():
"",ts,resolvedType);
1633 if (cd==d && tSpec) *tSpec=
"";
1637 result = resolvedType+ts;
1645 if (tSpec) *tSpec=
"";
1659 result=cd->
name()+templSpec;
1717 result = resolvedType;
1750 if (i>pp) canType += type.
mid(pp,i-pp);
1771 std::string ts = templSpec.
str();
1772 static const reg::Ex re(R
"(\a\w*)");
1779 for (; it!=
end ; ++it)
1781 const auto &match = *it;
1782 size_t ti = match.position();
1783 size_t tl = match.length();
1784 std::string matchStr = match.str();
1785 canType += ts.substr(tp,ti-tp);
1789 canType+=ts.substr(tp);
1805 if ((type==
"const" || type==
"volatile") && !name.
isEmpty())
1810 if (name==
"const" || name==
"volatile")
1812 if (!type.
isEmpty()) type+=
" ";
1838 AUTO_TRACE(
"srcType='{}' dstType='{}'",srcType,dstType);
1839 if (srcType==dstType)
return true;
1842 int i1=srcType.
find(
")(");
1843 if (i1==-1)
return false;
1844 int i2=dstType.
find(
")(");
1845 if (i1!=i2)
return false;
1848 int j1=srcType.
find(
"(");
1849 if (j1==-1 || j1>i1)
return false;
1850 int j2=dstType.
find(
"(");
1851 if (j2!=j1)
return false;
1852 if (srcType.
left(j1)!=dstType.
left(j2))
return false;
1861 dstScope,dstFileScope,dstAl.get(),
1871 AUTO_TRACE(
"src: scope={} type={} name={} canType={}, dst: scope={} type={} name={} canType={}",
1890 srcA.
type+=sSrcName;
1894 else if (sDstName==srcType.
right(sDstName.
length()))
1896 dstA.
type+=sDstName;
1912 dstScope,dstFileScope,dstA.
canType,
1935 ASSERT(srcScope!=
nullptr && dstScope!=
nullptr);
1937 AUTO_TRACE(
"srcScope='{}' dstScope='{}' srcArgs='{}' dstArgs='{}' checkCV={} lang={}",
1940 if (srcAl==
nullptr || dstAl==
nullptr)
1942 bool match = srcAl==dstAl;
1973 if (srcAl->
size() != dstAl->
size())
2001 auto srcIt = srcAl->
begin();
2002 auto dstIt = dstAl->
begin();
2003 for (;srcIt!=srcAl->
end() && dstIt!=dstAl->
end();++srcIt,++dstIt)
2008 dstScope,dstFileScope,dstA,
2027 AUTO_TRACE(
"srcAl='{}',dstAl='{}',forceNameOverwrite={}",
2035 auto srcIt=srcAl.
begin();
2036 auto dstIt=dstAl.
begin();
2037 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
2042 AUTO_TRACE_ADD(
"before merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
2058 if (srcA.
name==
"const" || srcA.
name==
"volatile")
2063 if (dstA.
name==
"const" || dstA.
name==
"volatile")
2089 if (forceNameOverwrite)
2132 j1=
static_cast<int>(srcA.
type.
length())-i1-2,
2133 j2=
static_cast<int>(dstA.
type.
length())-i2-2;
2141 else if (i1==-1 && i2!=-1 && dstA.
type.
right(j2)==srcA.
type)
2161 AUTO_TRACE_ADD(
"after merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
2174 std::vector<const MemberDef *> &members)
2178 for (
const auto &md_p : *mn)
2189 currentFile==
nullptr || fd==currentFile)
2205 members.push_back(md);
2241 result.
found =
true;
2246 result.
found =
true;
2251 result.
found =
true;
2256 result.
found =
true;
2261 result.
found =
true;
2303 memberName =
substitute(memberName,
"\\",
"::");
2308 while ((is=scopeName.
findRev(
"::"))!=-1 &&
2309 (im=memberName.
find(
"::",pm))!=-1 &&
2310 (scopeName.
right(scopeName.
length()-is-2)==memberName.
mid(pm,im-pm))
2313 scopeName=scopeName.
left(is);
2322 (im=memberName.
findRev(
"::"))!=-1 &&
2323 im<
static_cast<int>(memberName.
length())-2
2326 mScope=memberName.
left(im);
2331 if (mScope==scopeName) scopeName.
clear();
2342 int scopeOffset =
static_cast<int>(scopeName.
length());
2348 className+=
"::"+mScope;
2359 if (fcd==
nullptr && className.
find(
'<')!=-1)
2373 std::unique_ptr<ArgumentList> argList;
2378 for (
const auto &mmd_p : *mn)
2395 if (m<mdist && mcd->isLinkable())
2409 for (
const auto &mmd_p : *mn)
2419 if (m<mdist /* && mcd->isLinkable()*/ )
2435 result.
md =
nullptr;
2436 result.
cd =
nullptr;
2437 result.
found =
false;
2443 if (result.
gd) result.
cd=
nullptr;
2454 if (emd->localName()==mName)
2456 if (emd->isLinkable())
2460 result.
found =
true;
2465 result.
cd =
nullptr;
2466 result.
md =
nullptr;
2467 result.
found =
false;
2478 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
2482 }
while (scopeOffset>=0);
2489 std::unique_ptr<ArgumentList> argList;
2490 bool hasEmptyArgs = input.
args==
"()";
2497 for (
const auto &mmd_p : *mn)
2522 if (!fuzzy_mmd && hasEmptyArgs)
2530 result.
md = fuzzy_mmd;
2532 result.
found =
true;
2545 int scopeOffset =
static_cast<int>(scopeName.
length());
2551 namespaceName+=
"::"+mScope;
2555 namespaceName=mScope;
2558 if (!namespaceName.
isEmpty() &&
2566 for (
const auto &mmd_p : *mn)
2617 for (
const auto &mmd_p : *mn)
2642 result.
found =
true;
2650 for (
const auto &mmd_p : *mn)
2655 int ni=namespaceName.
findRev(
"::");
2661 (notInNS || sameNS) &&
2671 result.
found =
true;
2680 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
2684 }
while (scopeOffset>=0);
2688 std::vector<const MemberDef *> members;
2691 if (members.empty())
2697 if (members.size()!=1 && input.
args==
"()")
2703 for (
auto it = mn->
rbegin(); it!=mn->
rend(); ++it)
2705 const auto &mmd_p = *it;
2717 members.push_back(mmd);
2722 if (!members.empty())
2727 for (
const auto &rmd : members)
2729 if (rmd->getFileDef() && rmd->getFileDef()->name() == input.
currentFile->
name())
2737 result.
md = members.back();
2742 result.
md = members.back();
2752 result.
found =
true;
2766 printf(
"@@ ------ getDefsOld start\n");
2768 printf(
"@@ ------ getDefsOld end\n");
2769 printf(
"@@ ------ getDefsNew start\n");
2771 printf(
"@@ ------ getDefsNew end\n");
2773 result.
md!=newResult.
md ||
2774 result.
cd!=newResult.
cd ||
2775 result.
fd!=newResult.
fd ||
2776 result.
nd!=newResult.
nd ||
2777 result.
gd!=newResult.
gd
2780 printf(
"@@ getDefsOld(scName=%s, mbName=%s, args=%s, forceEmptyScope=%d "
2781 "currentFile=%s checkCV=%d)=%d md=%s (%p) cd=%s fd=%s nd=%s gd=%s\n",
2793 printf(
"@@ ------ getDefsOld start\n");
2794 printf(
"@@ getDefsNew(scName=%s, mbName=%s, args=%s, forceEmptyScope=%d "
2795 "currentFile=%s checkCV=%d)=%d md=%s (%p) cd=%s fd=%s nd=%s gd=%s\n",
2801 (
void*)newResult.
md,
2842 bool explicitGlobalScope=
FALSE;
2843 if (scopeName.
at(0)==
':' && scopeName.
at(1)==
':')
2846 explicitGlobalScope=
TRUE;
2854 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(docScopeName.
length());
2859 if (scopeOffset>0) fullName.
prepend(docScopeName.
left(scopeOffset)+
"::");
2883 else if ((scopeOffset=docScopeName.
findRev(
"::",scopeOffset-1))==-1)
2887 }
while (scopeOffset>=0);
2895 const char *p=s.
data();
2897 while ((c=
static_cast<uint8_t
>(*p++)))
if (!islower(c))
return false;
2910 bool lookForSpecialization,
2915 AUTO_TRACE(
"scope={} name={} inSeeBlock={}",scName,name,inSeeBlock);
2920 if (fullName.
find(
"anonymous_namespace{")==-1)
2932 int templEndPos = fullName.
findRev(
'>');
2933 if (templEndPos!=-1)
2941 int endNamePos=bracePos!=-1 ? bracePos :
static_cast<int>(fullName.
length());
2942 int scopePos=fullName.
findRev(
"::",endNamePos);
2943 bool explicitScope = fullName.
startsWith(
"::") &&
2948 bool allowTypeOnly=
false;
2951 *resContext=
nullptr;
2958 if (!inSeeBlock && scopePos==-1 &&
isLowerCase(tsName))
2972 if (scName!=fullName &&
getScopeDefs(scName,fullName,cd,cnd,nd,modd))
2995 else if (scName==fullName || (!inSeeBlock && scopePos==-1))
3014 if (explicitScope) nameStr=nameStr.
mid(2);
3019 if (bracePos!=-1) argsStr=fullName.
right(fullName.
length()-bracePos);
3023 int templPos=nameStr.
find(
'<');
3024 bool tryUnspecializedVersion =
FALSE;
3025 if (templPos!=-1 && nameStr.
find(
"operator")==-1)
3027 int endTemplPos=nameStr.
findRev(
'>');
3028 if (endTemplPos!=-1)
3030 if (!lookForSpecialization)
3032 nameStr=nameStr.
left(templPos)+nameStr.
right(nameStr.
length()-endTemplPos-1);
3036 tryUnspecializedVersion =
TRUE;
3044 nameStr=nameStr.
mid(scopeStr.
length()+2);
3070 *resContext=
nullptr;
3080 *resMember=result.
md;
3081 *resContext=result.
md;
3085 *resContext=
nullptr;
3091 else if (result.
cd) *resContext=result.
cd;
3092 else if (result.
nd) *resContext=result.
nd;
3093 else if (result.
fd) *resContext=result.
fd;
3094 else if (result.
gd) *resContext=result.
gd;
3095 else if (result.
cnd) *resContext=result.
cnd;
3096 else if (result.
modd) *resContext=result.
modd;
3099 *resContext=
nullptr; *resMember=
nullptr;
3126 else if (tsName.
find(
'.')!=-1)
3138 if (tryUnspecializedVersion)
3140 bool b =
resolveRef(scName,name,inSeeBlock,resContext,resMember,lang,
FALSE,
nullptr,checkScope);
3168 if (!isFileName && result.
find(
'<')==-1) result=
substitute(result,
".",
"::",3);
3170 if (result.
at(0)==
':' && result.
at(1)==
':')
3194 *resContext=
nullptr;
3202 AUTO_TRACE(
"scName='{}',ref='{}'",scName,lr);
3207 const DirDef *dir =
nullptr;
3225 if (si) resAnchor = si->
label();
3237 resAnchor = si->
label();
3268 (cd=
getClass(linkRefWithoutTemplates)))
3275 else if ((cd=
getClass(linkRef+
"-p")))
3292 resAnchor=modd->
anchor();
3313 if (md) resAnchor=md->
anchor();
3351 if (n.
isEmpty())
return nullptr;
3354 const int maxAddrSize = 20;
3355 char addr[maxAddrSize];
3356 qsnprintf(addr,maxAddrSize,
"%p:",
reinterpret_cast<const void*
>(fnMap));
3365 ambig = cachedResult->
isAmbig;
3376 if (name.
isEmpty())
return nullptr;
3383 if (name.
isEmpty())
return nullptr;
3390 const std::unique_ptr<FileDef> &fd = fn->front();
3392 fd->getPath().right(path.
length())==path :
3394 if (path.
isEmpty() || isSamePath)
3396 cachedResult->
fileDef = fd.get();
3405 for (
const auto &fd_p : *fn)
3417 cachedResult->
isAmbig = ambig;
3418 cachedResult->
fileDef = lastMatch;
3448 for (
const auto &s : examplePathList)
3482 path=name.
left(slashPos+1);
3489 for (
const auto &fd : *fn)
3491 if (path.
isEmpty() || fd->getPath().right(path.
length())==path)
3493 if (!first) result +=
"\n";
3495 result+=
" "+fd->absFilePath();
3506 std::string substRes;
3507 const char *p = s.
data();
3511 substRes.reserve(s.
length()+1024);
3518 for (
const auto &kw : keywords)
3520 size_t keyLen =
qstrlen(kw.keyword);
3521 if (
qstrncmp(p,kw.keyword,keyLen)==0)
3523 const char *startArg = p+keyLen;
3524 bool expectParam = std::holds_alternative<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3526 if (expectParam && *startArg==
'(')
3529 const char *endArg =
nullptr;
3530 while ((c=*(startArg+j)) && c!=
')' && c!=
'\n' && c!=0) j++;
3531 if (c==
')') endArg=startArg+j;
3535 auto &&getValue = std::get<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3536 substRes+=getValue(value).str();
3546 else if (!expectParam)
3548 auto &&getValue = std::get<KeywordSubstitution::GetValue>(kw.getValueVariant);
3549 substRes+=getValue().str();
3587 int wi = projectLogo.
find(
" width=");
3590 projectLogo = projectLogo.
left(wi);
3592 int hi = projectLogo.
find(
" height=");
3595 projectLogo = projectLogo.
left(hi);
3608 auto extractDimension = [&projectLogo](
const char *startMarker,
size_t startPos,
size_t endPos) ->
QCString
3611 if (result.
length()>=2 && result.
at(0)!=
'"' && result.
at(result.
length()-1)!=
'"')
3613 result=
"\""+result+
"\"";
3619 int wi = projectLogo.
find(
" width=");
3620 int hi = projectLogo.
find(
" height=");
3621 if (wi!=-1 && hi!=-1)
3625 sizeVal = extractDimension(
" width=", wi+7, hi) +
" "
3626 + extractDimension(
" height=", hi+8, projectLogo.
length());
3630 sizeVal = extractDimension(
" height=", hi+8, wi) +
" "
3631 + extractDimension(
" width=", wi+7, projectLogo.
length());
3636 sizeVal = extractDimension(
" width=", wi+7, projectLogo.
length());
3640 sizeVal = extractDimension(
" height=", hi+8, projectLogo.
length());
3653 {
"$title", [&]() {
return !title.
isEmpty() ? title : projName; } },
3658 {
"$doxygenversion", [&]() {
return getDoxygenVersion(); } },
3659 {
"$projectname", [&]() {
return projName; } },
3660 {
"$projectnumber", [&]() {
return projNum; } },
3661 {
"$projectbrief", [&]() {
return projBrief; } },
3665 {
"$langISO", [&]() {
return theTranslator->trISOLang(); } },
3680 for (
const auto &s : sl)
3682 const char *ps=s.c_str();
3683 const char *pd=name.
data();
3685 while (*ps!=0 && *pd!=0 && *ps==*pd) ps++,pd++,i++;
3686 if (*ps==0 && *pd!=0)
3702int getUtf8Char(
const char *input,
char ids[MAX_UTF8_CHAR_SIZE],CaseModifier modifier)
3705 const unsigned char uc = (
unsigned char)*input;
3706 bool validUTF8Char =
false;
3709 const char* pt = input+1;
3711 if ((uc&0x80)==0x00)
3715 case CaseModifier::None: ids[0]=*input;
break;
3716 case CaseModifier::ToUpper: ids[0]=(char)toupper(*input);
break;
3717 case CaseModifier::ToLower: ids[0]=(char)tolower(*input);
break;
3724 if ((uc&0xE0)==0xC0)
3728 if ((uc&0xF0)==0xE0)
3732 if ((uc&0xF8)==0xF0)
3737 validUTF8Char = l>0;
3738 for (
int m=1; m<l && validUTF8Char; ++m)
3740 unsigned char ct = (
unsigned char)*pt;
3741 if (ct==0 || (ct&0xC0)!=0x80)
3743 validUTF8Char=
false;
3764 if (caseSenseNames == CASE_SENSE_NAMES_t::YES)
return true;
3765 else if (caseSenseNames == CASE_SENSE_NAMES_t::NO)
return false;
3772 if (name.
isEmpty())
return name;
3777 const char *p=name.
data();
3782 case '_':
if (allowUnderscore) growBuf.
addChar(
'_');
else growBuf.
addStr(
"__");
break;
3783 case '-': growBuf.
addChar(
'-');
break;
3784 case ':': growBuf.
addStr(
"_1");
break;
3785 case '/': growBuf.
addStr(
"_2");
break;
3786 case '<': growBuf.
addStr(
"_3");
break;
3787 case '>': growBuf.
addStr(
"_4");
break;
3788 case '*': growBuf.
addStr(
"_5");
break;
3789 case '&': growBuf.
addStr(
"_6");
break;
3790 case '|': growBuf.
addStr(
"_7");
break;
3791 case '.':
if (allowDots) growBuf.
addChar(
'.');
else growBuf.
addStr(
"_8");
break;
3792 case '!': growBuf.
addStr(
"_9");
break;
3793 case ',': growBuf.
addStr(
"_00");
break;
3794 case ' ': growBuf.
addStr(
"_01");
break;
3795 case '{': growBuf.
addStr(
"_02");
break;
3796 case '}': growBuf.
addStr(
"_03");
break;
3797 case '?': growBuf.
addStr(
"_04");
break;
3798 case '^': growBuf.
addStr(
"_05");
break;
3799 case '%': growBuf.
addStr(
"_06");
break;
3800 case '(': growBuf.
addStr(
"_07");
break;
3801 case ')': growBuf.
addStr(
"_08");
break;
3802 case '+': growBuf.
addStr(
"_09");
break;
3803 case '=': growBuf.
addStr(
"_0a");
break;
3804 case '$': growBuf.
addStr(
"_0b");
break;
3805 case '\\': growBuf.
addStr(
"_0c");
break;
3806 case '@': growBuf.
addStr(
"_0d");
break;
3807 case ']': growBuf.
addStr(
"_0e");
break;
3808 case '[': growBuf.
addStr(
"_0f");
break;
3809 case '#': growBuf.
addStr(
"_0g");
break;
3810 case '"': growBuf.
addStr(
"_0h");
break;
3811 case '~': growBuf.
addStr(
"_0i");
break;
3812 case '\'': growBuf.
addStr(
"_0j");
break;
3813 case ';': growBuf.
addStr(
"_0k");
break;
3814 case '`': growBuf.
addStr(
"_0l");
break;
3818 bool doEscape =
true;
3819 if (allowUnicodeNames)
3824 growBuf.
addStr(p-1,charLen);
3832 unsigned char id =
static_cast<unsigned char>(c);
3841 else if (caseSenseNames || !isupper(c))
3848 growBuf.
addChar(
static_cast<char>(tolower(c)));
3854 return growBuf.
get();
3862 const char *p = s.
data();
3872 case '_': result+=c; p++;
break;
3873 case '1': result+=
':'; p++;
break;
3874 case '2': result+=
'/'; p++;
break;
3875 case '3': result+=
'<'; p++;
break;
3876 case '4': result+=
'>'; p++;
break;
3877 case '5': result+=
'*'; p++;
break;
3878 case '6': result+=
'&'; p++;
break;
3879 case '7': result+=
'|'; p++;
break;
3880 case '8': result+=
'.'; p++;
break;
3881 case '9': result+=
'!'; p++;
break;
3885 case '0': result+=
','; p+=2;
break;
3886 case '1': result+=
' '; p+=2;
break;
3887 case '2': result+=
'{'; p+=2;
break;
3888 case '3': result+=
'}'; p+=2;
break;
3889 case '4': result+=
'?'; p+=2;
break;
3890 case '5': result+=
'^'; p+=2;
break;
3891 case '6': result+=
'%'; p+=2;
break;
3892 case '7': result+=
'('; p+=2;
break;
3893 case '8': result+=
')'; p+=2;
break;
3894 case '9': result+=
'+'; p+=2;
break;
3895 case 'a': result+=
'='; p+=2;
break;
3896 case 'b': result+=
'$'; p+=2;
break;
3897 case 'c': result+=
'\\'; p+=2;
break;
3898 case 'd': result+=
'@'; p+=2;
break;
3899 case 'e': result+=
']'; p+=2;
break;
3900 case 'f': result+=
'['; p+=2;
break;
3901 case 'g': result+=
'#'; p+=2;
break;
3902 case 'h': result+=
'"'; p+=2;
break;
3903 case 'i': result+=
'~'; p+=2;
break;
3904 case 'j': result+=
'\''; p+=2;
break;
3905 case 'k': result+=
';'; p+=2;
break;
3906 case 'l': result+=
'`'; p+=2;
break;
3913 if (!caseSenseNames && c>=
'a' && c<=
'z')
3915 result+=
static_cast<char>(toupper(*p));
3946 if (name.
isEmpty())
return name;
3969 size_t resultLen = result.
length();
3973 uint8_t md5_sig[16];
3975 MD5Buffer(result.
data(),
static_cast<unsigned int>(resultLen),md5_sig);
3976 MD5SigToString(md5_sig,sigStr);
3977 result=result.
left(128-32)+sigStr;
3982 int l1Dir=0,l2Dir=0;
3983 int createSubdirsLevel =
Config_getInt(CREATE_SUBDIRS_LEVEL);
3984 int createSubdirsBitmaskL2 = (1<<createSubdirsLevel)-1;
3987 uint8_t md5_sig[16];
3988 MD5Buffer(result.
data(),
static_cast<unsigned int>(result.
length()),md5_sig);
3989 l1Dir = md5_sig[14] & 0xf;
3990 l2Dir = md5_sig[15] & createSubdirsBitmaskL2;
4001 const int sig_size=16;
4002 uint8_t md5_sig[sig_size];
4003 MD5Buffer(fn.
data(),
static_cast<unsigned int>(fn.
length()),md5_sig);
4004 char result[sig_size*3+2];
4007 for (
int i=0;i<sig_size;i++)
4009 static const char oct[]=
"01234567";
4010 uint8_t
byte = md5_sig[i];
4011 *p++=oct[(
byte>>6)&7];
4012 *p++=oct[(
byte>>3)&7];
4013 *p++=oct[(
byte>>0)&7];
4043 QCString absIncFileName = incFileName;
4053 else if (searchIncludes)
4056 for (
const auto &incPath : includePath)
4075 return absIncFileName;
4085 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
4086 for (
int l1=0; l1<16; l1++)
4092 term(
"Failed to create output directory '{}'\n",subdir);
4094 for (
int l2=0; l2<createSubdirsLevelPow2; l2++)
4097 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
4100 term(
"Failed to create output directory '{}'\n",subsubdir);
4112 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
4113 for (
int l1=0;l1<16;l1++)
4117 for (
int l2=0; l2 < createSubdirsLevelPow2; l2++)
4120 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
4139 bool allowEmptyClass)
4146 namespaceName=nd->
name();
4150 p=
static_cast<int>(clName.
length())-2;
4151 while (p>=0 && (i=clName.
findRev(
"::",p))!=-1)
4158 namespaceName=nd->
name();
4167 className=scopeName;
4168 namespaceName.
clear();
4171 if (className.
isEmpty() && !namespaceName.
isEmpty() && !allowEmptyClass)
4174 className=namespaceName;
4175 namespaceName.
clear();
4181 className = className.
left(className.
length()-2);
4222 int l =
static_cast<int>(result.
length());
4225 bool skipBracket=
FALSE;
4232 while (p>=0 && count>=0)
4234 char c=result.
at(p);
4240 if (p>0 && result.
at(p-1)==
':' && (count==0 || skipBracket))
4242 return result.
right(l-p-1);
4253 if (p>0 && result.
at(p-1)==
'>')
4261 bool foundMatch=
false;
4262 while (p>=0 && !foundMatch)
4274 if (round==0) count++;
4281 if (result.
at(p-1) ==
'<')
4288 foundMatch = count==0;
4303 done = count==0 || skipBracket;
4316 const char *p = s.
data();
4322 if ((c>=
'0' && c<=
'9') || (c>=
'a' && c<=
'z') || (c>=
'A' && c<=
'Z') || c==
'-' || c==
':' || c==
'.')
4324 if (first && c>=
'0' && c<=
'9') growBuf.
addChar(
'a');
4330 encChar[1]=
hex[
static_cast<unsigned char>(c)>>4];
4331 encChar[2]=
hex[
static_cast<unsigned char>(c)&0xF];
4338 return growBuf.
get();
4356 const char *p = s.
data();
4362 case '<': growBuf.
addStr(
"<");
break;
4363 case '>': growBuf.
addStr(
">");
break;
4364 case '&':
if (keepEntities)
4370 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
4376 while (p<e) growBuf.
addChar(*p++);
4388 case '\'': growBuf.
addStr(
"'");
break;
4389 case '"': growBuf.
addStr(
""");
break;
4390 case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
4391 case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
4392 case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
4393 case 27:
case 28:
case 29:
case 30:
case 31:
4395 default: growBuf.
addChar(c);
break;
4399 return growBuf.
get();
4407 const char *p=s.
data();
4413 case '<': growBuf.
addStr(
"<");
break;
4414 case '>': growBuf.
addStr(
">");
break;
4415 case '&':
if (keepEntities)
4421 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
4427 while (p<e) growBuf.
addChar(*p++);
4439 case '\'': growBuf.
addStr(
"'");
break;
4440 case '"': growBuf.
addStr(
""");
break;
4443 uint8_t uc =
static_cast<uint8_t
>(c);
4444 if (uc<32 && !isspace(c))
4460 return growBuf.
get();
4467 const char *p=s.
data();
4473 case '"': growBuf.
addStr(
"\\\"");
break;
4474 case '\\':
if (*p==
'u' && *(p+1)==
'{') growBuf.
addStr(
"\\");
4475 else growBuf.
addStr(
"\\\\");
4477 default: growBuf.
addChar(c);
break;
4488 std::string s = str.
data();
4489 static const reg::Ex re(R
"(&\a\w*;)");
4494 size_t p=0, i=0, l=0;
4495 for (; it!=
end ; ++it)
4497 const auto &match = *it;
4498 p = match.position();
4502 growBuf.
addStr(s.substr(i,p-i));
4506 const char *code=
nullptr;
4517 growBuf.
addStr(s.substr(i));
4520 return growBuf.
get();
4538 ASSERT(context!=
nullptr);
4540 if (ml==
nullptr)
return;
4542 struct MoveMemberInfo
4545 : memberDef(md), memberGroup(mg), sli(rv) {}
4550 std::vector<MoveMemberInfo> movedMembers;
4552 for (
const auto &md : *ml)
4554 if (md->isEnumerate())
4556 for (
const auto &fmd : md->enumFieldList())
4558 int groupId=fmd->getMemberGroupId();
4564 const auto &info = it->second;
4565 auto mg_it = std::find_if(pMemberGroups->begin(),
4566 pMemberGroups->end(),
4567 [&groupId](
const auto &g)
4568 { return g->groupId()==groupId; }
4571 if (mg_it==pMemberGroups->end())
4573 auto mg = std::make_unique<MemberGroup>(
4582 pMemberGroups->push_back(std::move(mg));
4586 mg_ptr = (*mg_it).get();
4598 int groupId=md->getMemberGroupId();
4604 const auto &info = it->second;
4605 auto mg_it = std::find_if(pMemberGroups->begin(),
4606 pMemberGroups->end(),
4607 [&groupId](
const auto &g)
4608 { return g->groupId()==groupId; }
4611 if (mg_it==pMemberGroups->end())
4613 auto mg = std::make_unique<MemberGroup>(
4622 pMemberGroups->push_back(std::move(mg));
4626 mg_ptr = (*mg_it).get();
4628 movedMembers.emplace_back(md,mg_ptr,info->m_sli);
4634 for (
const auto &mmi : movedMembers)
4636 ml->
remove(mmi.memberDef);
4637 mmi.memberGroup->insertMember(mmi.memberDef->resolveAlias());
4638 mmi.memberGroup->setRefItems(mmi.sli);
4654 static const reg::Ex re_norm(R
"(\a[\w:]*)");
4655 static const reg::Ex re_fortran(R
"(\a[\w:()=]*)");
4660 if (type.
isEmpty())
return -1;
4661 size_t typeLen=type.
length();
4666 if (type[pos]==
',')
return -1;
4672 std::string s = type.
str();
4678 const auto &match = *it;
4679 size_t i = match.position();
4680 size_t l = match.length();
4685 while (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
' ') ts++,tl++;
4686 if (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
'<')
4691 while (te<typeLen && brCount!=0)
4693 if (type[
static_cast<uint32_t
>(te)]==
'<')
4695 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'<') te++;
else brCount++;
4697 if (type[
static_cast<uint32_t
>(te)]==
'>')
4699 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'>') te++;
else brCount--;
4709 pos=
static_cast<int>(i+l+tl);
4713 pos=
static_cast<int>(i+l);
4717 return static_cast<int>(i);
4720 pos =
static_cast<int>(typeLen);
4732 int p=name.
find(
'<');
4733 if (p==-1)
return name;
4737 std::string s = name.
mid(p).
str();
4738 static const reg::Ex re(R
"([\a:][\w:]*)");
4743 for (; it!=
end ; ++it)
4745 const auto &match = *it;
4746 size_t i = match.position();
4747 size_t l = match.length();
4748 result += s.substr(pi,i-pi);
4751 for (
const Argument &formArg : formalArgs)
4753 if (formArg.name == n)
4779 result+=s.substr(pi);
4797 if (formalArgs.
empty())
return nm;
4800 static const reg::Ex re(R
"(\a\w*)");
4801 std::string name = nm.str();
4806 for (; it!=
end ; ++it)
4808 const auto &match = *it;
4809 size_t i = match.position();
4810 size_t l = match.length();
4811 if (i>p) result += name.substr(p,i-p);
4816 actIt = actualArgs->
begin();
4823 for (
auto formIt = formalArgs.
begin();
4824 formIt!=formalArgs.
end() && !
found;
4830 if (actualArgs && actIt!=actualArgs->
end())
4837 formArg.
type =
"class";
4842 formArg.
type =
"typename";
4846 formArg.
name +=
"...";
4851 formArg.
name +=
"...";
4858 if (formArg.
name==n && actualArgs && actIt!=actualArgs->
end() && !actArg.
type.
isEmpty())
4865 ii = subst.find(
'<');
4867 if (ii!=-1 &&
static_cast<int>(
prefix.length())>=ii+2 &&
prefix.mid(
prefix.length()-ii-2,ii+1)==subst.left(ii+1))
4872 while ((ii=subst.find(nameArg,pp))!=-1)
4874 bool beforeNonWord = ii==0 || !
isId(subst.at(ii-1));
4875 bool afterNonWord = subst.length()==ii+nameArg.length() || !
isId(subst.at(ii+nameArg.length()));
4876 if (beforeNonWord && afterNonWord)
4880 pp=ii+
static_cast<int>(nameArg.length());
4885 AUTO_TRACE_ADD(
"result={} n={} type={} hasRecursion={}",result,n,actArg.
type,hasRecursion(result,n,actArg.
type));
4886 if (!hasRecursion(result,n,actArg.
type))
4898 result += actArg.
type;
4904 result += actArg.
type+
" "+actArg.
name;
4909 else if (formArg.
name==n &&
4910 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4919 else if (formArg.
name==n &&
4920 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4928 if (actualArgs && actIt!=actualArgs->
end())
4939 result+=name.substr(p);
4957 bool allowArtificial)
4960 int i=fullName.
find(
'<');
4961 if (i==-1)
return fullName;
4964 int l=
static_cast<int>(fullName.
length());
4971 while (e<l && count>0)
4973 char c=fullName.
at(e++);
4976 case '(': round++;
break;
4977 case ')':
if (round>0) round--;
break;
4978 case '<':
if (round==0) count++;
break;
4979 case '>':
if (round==0) count--;
break;
4984 int si= fullName.
find(
"::",e);
4986 if (parentOnly && si==-1)
break;
4989 result+=fullName.
mid(p,i-p);
4992 if (cd!=
nullptr && (allowArtificial || !cd->
isArtificial()))
4994 result+=fullName.
mid(i,e-i);
4997 else if (pLastScopeStripped)
5000 *pLastScopeStripped=fullName.
mid(i,e-i);
5003 i=fullName.
find(
'<',p);
5005 result+=fullName.
right(l-p);
5022 AUTO_TRACE(
"leftScope='{}' rightScope='{}'",leftScope,rightScope);
5030 int i=0,p=
static_cast<int>(leftScope.
length());
5035 while ((i=leftScope.
findRev(
"::",p))>0)
5039 result = leftScope.
left(i+2)+rightScope;
5067 int sl=
static_cast<int>(s.
length());
5071 if (sp>=sl)
return -1;
5075 if (c==
':') sp++,p++;
else break;
5087 while (sp<sl && !done)
5093 case '<': count++;
break;
5094 case '>': count--;
if (count==0) done=
true;
break;
5127 bool newPage =
true;
5132 warn(fileName,startLine,
"multiple use of page label '{}' with different titles, (other occurrence: {}, line: {})",
5216 else if (si->
lineNr() != -1)
5218 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {}, line {})",pd->
name(),si->
fileName(),si->
lineNr());
5222 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {})",pd->
name(),si->
fileName());
5247 if (!key.
isEmpty() && key[0]!=
'@')
5252 item->setScope(scope);
5253 item->setName(name);
5254 item->setTitle(title);
5255 item->setArgs(args);
5256 item->setGroup(key);
5304 if (!first) { ol.
writeString(
" | "); }
else first=
false;
5316 if (!first) { ol.
writeString(
" | "); }
else first=
false;
5342 int i_fs = fName.
findRev(
'/');
5343 int i_bs = fName.
findRev(
'\\');
5344 int i = fName.
find(
'.',std::max({ i_fs, i_bs ,0}));
5369 printf(
"replaceNamespaceAliases(%s,%zu)\n",
qPrint(scope),i);
5382 if (i>0 && ns==scope.
left(i))
break;
5384 printf(
"result=%s\n",
qPrint(scope));
5394 result=result.
mid(i+1);
5399 result=result.
mid(i+1);
5408 static const reg::Ex re(R
"(\a+)");
5409 std::string s = str.str();
5412 if (it->
str()==
word)
return true;
5423 static reg::Ex re(R
"(\s*(<\a+>)\s*)");
5424 std::string s = sentence.str();
5430 for ( ; it!=
end ; ++it)
5432 const auto match = *it;
5433 std::string part = match[1].str();
5436 size_t i = match.position();
5437 size_t l = match.length();
5438 result+=s.substr(p,i-p);
5439 result+=match.str();
5445 size_t i = match[1].position();
5446 size_t l = match[1].length();
5447 result+=s.substr(p,i-p);
5451 result+=s.substr(p);
5467 const char *p = s.
data();
5470 int i=0,li=-1,l=
static_cast<int>(s.
length());
5474 if (c==
' ' || c==
'\t' || c==
'\r') i++,p++;
5475 else if (c==
'\\' &&
qstrncmp(p,
"\\ilinebr",8)==0) i+=8,li=i,p+=8;
5476 else if (c==
'\n') i++,li=i,docLine++,p++;
5486 if (c==
' ' || c==
'\t' || c==
'\r') b--,p--;
5487 else if (c==
'r' && b>=7 &&
qstrncmp(p-7,
"\\ilinebr",8)==0) bi=b-7,b-=8,p-=8;
5488 else if (c==
'>' && b>=11 &&
qstrncmp(p-11,
"\\ilinebr<br>",12)==0) bi=b-11,b-=12,p-=12;
5489 else if (c==
'\n') bi=b,b--,p--;
5494 if (li==-1 && bi==-1)
return s;
5501 return s.
mid(li,bi-li);
5544 [&langName](
const auto &info) { return info.langName==langName; });
5551 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5561 err(
"Failed to assign extension {} to parser {} for language {}\n",
5562 extName.
data(),it1->parserName,language);
5650 if (extName.
isEmpty()) extName=
".no_extension";
5651 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5671 if (langName.
at(0)==
'.') langName = langName.
mid(1);
5673 [&langName](
const auto &info) { return info.langName==langName; });
5676 lang = it->parserId;
5677 fileName = it->defExt;
5690 int lastDot = fn.
findRev(
'.');
5691 if (lastDot!=-1)
return fn.
mid(lastDot);
5700 if (scope==
nullptr ||
5720 if (qualifierIndex!=-1)
5722 explicitScopePart = name.
left(qualifierIndex);
5724 name = name.
mid(qualifierIndex+2);
5728 int minDistance = 10000;
5737 if (distance!=-1 && distance<minDistance)
5739 minDistance = distance;
5753 if (bestMatch && bestMatch->
isTypedef())
5761 if (startPos>=len)
return len;
5762 uint8_t c =
static_cast<uint8_t
>(utf8Str[startPos]);
5767 int (*matcher)(int) =
nullptr;
5768 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5772 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5776 matcher = std::isxdigit;
5780 matcher = std::isdigit;
5783 else if (std::isalnum(c))
5786 matcher = std::isalnum;
5790 while ((c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]))!=0 && matcher(c))
5800 return startPos+bytes;
5814 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast.get());
5818 std::visit(visitor,astImpl->root);
5823 int l=
static_cast<int>(result.
length());
5827 if (charCnt>=80)
break;
5834 if (result.
at(i)==
',' ||
5835 result.
at(i)==
'.' ||
5836 result.
at(i)==
'!' ||
5837 result.
at(i)==
'?' ||
5845 if ( i < l) result=result.
left(i)+
"...";
5846 return result.
data();
5853 if (al.
empty())
return;
5875#ifdef TRACINGSUPPORT
5876 void *backtraceFrames[128];
5877 int frameCount = backtrace(backtraceFrames, 128);
5878 const size_t cmdLen = 40960;
5879 static char cmd[cmdLen];
5881 p +=
qsnprintf(p,cmdLen,
"/usr/bin/atos -p %d ", (
int)getpid());
5882 for (
int x = 0; x < frameCount; x++)
5884 p +=
qsnprintf(p,cmdLen,
"%p ", backtraceFrames[x]);
5886 fprintf(stderr,
"========== STACKTRACE START ==============\n");
5890 while (
size_t len = fread(resBuf, 1,
sizeof(resBuf), fp))
5892 fwrite(resBuf, 1, len, stderr);
5896 fprintf(stderr,
"============ STACKTRACE END ==============\n");
5905 if (
qstricmp(inputEncoding,outputEncoding)==0)
return;
5907 if (cd==
reinterpret_cast<void *
>(-1))
5909 term(
"unsupported character conversion: '{}'->'{}': {}\n"
5910 "Check the INPUT_ENCODING setting in the config file!\n",
5911 inputEncoding,outputEncoding,strerror(errno));
5913 size_t iLeft = contents.size();
5914 const char *srcPtr = contents.data();
5915 size_t tmpBufSize = contents.size()*4+1;
5916 size_t oLeft = tmpBufSize;
5918 tmpBuf.resize(tmpBufSize);
5919 char *dstPtr = tmpBuf.data();
5923 newSize = tmpBufSize-oLeft;
5924 tmpBuf.resize(newSize);
5925 std::swap(contents,tmpBuf);
5930 term(
"{}: failed to translate characters from {} to {}: check INPUT_ENCODING\n",
5931 fileName,inputEncoding,outputEncoding);
5943 if (filterName.
isEmpty() || !filter)
5948 err(
"could not open file {}\n",fileName);
5952 auto fileSize = fi.
size();
5953 contents.resize(fileSize);
5954 f.read(contents.data(),fileSize);
5957 err(
"problems while reading file {}\n",fileName);
5963 QCString cmd=filterName+
" \""+fileName+
"\"";
5968 err(
"could not execute filter {}\n",filterName);
5971 const int bufSize=4096;
5974 while ((numRead=
static_cast<int>(fread(buf,1,bufSize,f)))>0)
5977 contents.append(buf,numRead);
5984 if (contents.size()>=2 &&
5985 static_cast<uint8_t
>(contents[0])==0xFF &&
5986 static_cast<uint8_t
>(contents[1])==0xFE
5991 else if (contents.size()>=2 &&
5992 static_cast<uint8_t
>(contents[0])==0xFE &&
5993 static_cast<uint8_t
>(contents[1])==0xFF
5998 else if (contents.size()>=3 &&
5999 static_cast<uint8_t
>(contents[0])==0xEF &&
6000 static_cast<uint8_t
>(contents[1])==0xBB &&
6001 static_cast<uint8_t
>(contents[2])==0xBF
6004 contents.erase(0,3);
6020 std::string t = title.
str();
6021 static const reg::Ex re(R
"(%[a-z_A-Z]+)");
6025 for (; it!=
end ; ++it)
6027 const auto &match = *it;
6028 size_t i = match.position();
6029 size_t l = match.length();
6030 if (i>p) tf+=t.substr(p,i-p);
6031 tf+=match.str().substr(1);
6040template<
class PatternList,
class PatternElem,
typename PatternGet = QCString(*)(const PatternElem &)>
6042 const PatternList &patList,
6052 caseSenseNames =
FALSE;
6055 if (!patList.empty())
6061 for (
const auto &li : patList)
6063 std::string pattern = getter(li).str();
6064 if (!pattern.empty())
6066 size_t i=pattern.find(
'=');
6067 if (i!=std::string::npos) pattern=pattern.substr(0,i);
6069 if (!caseSenseNames)
6100 auto getter = [](std::string s) {
return QCString(s); };
6121 if (extLinksInWindow)
6122 return "target=\"_blank\" ";
6124 return "target=\"_parent\" ";
6141 if (!targetFileName.
isEmpty())
6146 if (!anchor.
isEmpty() && isLocalFile)
6157 if (!anchor.
isEmpty()) url+=
"#"+anchor;
6170 result = it->second;
6171 size_t l = result.
length();
6172 if (!relPath.
isEmpty() && l>0 && result.
at(0)==
'.')
6177 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
6178 if (!href) result.
append(
"\" ");
6201 if (!img.
save(fileName))
6203 fprintf(stderr,
"Warning: Cannot open file %s for writing\n",data->
name);
6219 std::string s=str.
str();
6220 static const reg::Ex re(R
"(##[0-9A-Fa-f][0-9A-Fa-f])");
6226 size_t sl=s.length();
6228 for (; it!=
end ; ++it)
6230 const auto &match = *it;
6231 size_t i = match.position();
6232 size_t l = match.length();
6233 if (i>p) result+=s.substr(p,i-p);
6234 std::string lumStr = match.str().substr(2);
6235#define HEXTONUM(x) (((x)>='0' && (x)<='9') ? ((x)-'0') : \
6236 ((x)>='a' && (x)<='f') ? ((x)-'a'+10) : \
6237 ((x)>='A' && (x)<='F') ? ((x)-'A'+10) : 0)
6239 double r = 0,g = 0,b = 0;
6242 pow(level/255.0,gamma/100.0),&r,&g,&b);
6243 int red =
static_cast<int>(r*255.0);
6244 int green =
static_cast<int>(g*255.0);
6245 int blue =
static_cast<int>(b*255.0);
6248 colStr[1]=
hex[red>>4];
6249 colStr[2]=
hex[red&0xf];
6250 colStr[3]=
hex[green>>4];
6251 colStr[4]=
hex[green&0xf];
6252 colStr[5]=
hex[blue>>4];
6253 colStr[6]=
hex[blue&0xf];
6259 if (p<sl) result+=s.substr(p);
6270 err(
"could not copy file {} to {}\n",src,dest);
6284 int m1 = text.
find(marker);
6285 if (m1==-1)
return result;
6290 while (!
found && (i=text.
find(
'\n',p))!=-1)
6292 found = (p<=m1 && m1<i);
6344 static const std::unordered_set<std::string> schemes = {
6345 "http",
"https",
"ftp",
"ftps",
"sftp",
"file",
"news",
"irc",
"ircs"
6348 int colonPos = loc_url.
find(
':');
6349 return colonPos!=-1 && schemes.find(loc_url.
left(colonPos).
str())!=schemes.end();
6384 const char *p=s.
data();
6387 int minIndent=1000000;
6388 bool searchIndent=
TRUE;
6392 if (c==
'\t') indent+=tabSize - (indent%tabSize);
6393 else if (c==
'\n') indent=0,searchIndent=
TRUE;
6394 else if (c==
' ') indent++;
6395 else if (searchIndent)
6398 if (indent<minIndent) minIndent=indent;
6403 if (minIndent==0)
return substitute(s,
"@ilinebr",
"\\ilinebr");
6416 else if (indent<minIndent)
6420 int newIndent = indent+tabSize-(indent%tabSize);
6434 else if (c==
'\\' &&
qstrncmp(p,
"ilinebr ",8)==0)
6437 result <<
"\\ilinebr ";
6440 for (
int j=0;j<minIndent;j++)
if (*(p+j)==
' ') skipAmount++;
6441 if (skipAmount==minIndent)
6446 else if (c==
'@' &&
qstrncmp(p,
"ilinebr",7)==0)
6448 result <<
"\\ilinebr";
6459 return result.
str();
6466 if (indentationLevel <= 0 || doc.
isEmpty())
return;
6471 const char *src = doc.
data();
6473 bool insideIndent =
false;
6482 insideIndent =
true;
6483 cnt = indentationLevel;
6494 insideIndent =
false;
6504 insideIndent =
false;
6509 doc.
resize(
static_cast<uint32_t
>(dst-doc.
data()));
6518 return ( ((allExternals && fd->
isLinkable()) ||
6536uint32_t getUtf8Code(
const QCString& s,
int idx )
6538 const int length = s.
length();
6539 if (idx >= length) {
return 0; }
6540 const uint32_t c0 = (uint8_t)s.
at(idx);
6541 if ( c0 < 0xC2 || c0 >= 0xF8 )
6545 if (idx+1 >= length) {
return 0; }
6546 const uint32_t c1 = ((uint8_t)s.
at(idx+1)) & 0x3f;
6549 return ((c0 & 0x1f) << 6) | c1;
6551 if (idx+2 >= length) {
return 0; }
6552 const uint32_t c2 = ((uint8_t)s.
at(idx+2)) & 0x3f;
6555 return ((c0 & 0x0f) << 12) | (c1 << 6) | c2;
6557 if (idx+3 >= length) {
return 0; }
6559 const uint32_t c3 = ((uint8_t)s.
at(idx+3)) & 0x3f;
6560 return ((c0 & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
6572uint32_t getUtf8CodeToLower(
const QCString& s,
int idx )
6574 const uint32_t v = getUtf8Code( s, idx );
6575 return v < 0x7f ? tolower( v ) : v;
6587uint32_t getUtf8CodeToUpper(
const QCString& s,
int idx )
6589 const uint32_t v = getUtf8Code( s, idx );
6590 return v < 0x7f ? toupper( v ) : v;
6604 std::string s = docs.
str();
6605 static const reg::Ex re(R
"(\[([ inout,]+)\])");
6610 const auto &match = *it;
6611 size_t p = match.position();
6612 size_t l = match.length();
6616 std::string dir = match[1].str();
6618 dir.erase(std::remove_if(dir.begin(),dir.end(),
6619 [](
const char c) { return c==
' ' || c==
','; }
6621 unsigned char ioMask=0;
6622 size_t inIndex = dir.find(
"in");
6623 size_t outIndex = dir.find(
"out");
6624 if ( inIndex!=std::string::npos) dir.erase( inIndex,2),ioMask|=(1<<0);
6625 if (outIndex!=std::string::npos) dir.erase(outIndex,3),ioMask|=(1<<1);
6626 if (dir.empty() && ioMask!=0)
6629 if (ioMask==((1<<0)|(1<<1)))
return "[in,out]";
6630 else if (ioMask==(1<<0))
return "[in]";
6631 else if (ioMask==(1<<1))
return "[out]";
6663 *outListType1=inListType;
6681 *outListType2=inListType.
toPublic();
6694 *outListType1=inListType.
toPublic();
6716 int i= imgExt.
find(
':');
6717 return i==-1 ? imgExt : imgExt.
left(i);
6722 assert(!f.is_open());
6723 bool fileOpened=
FALSE;
6724 bool writeToStdout=outFile==
"-";
6727 f.basic_ios<char>::rdbuf(std::cout.rdbuf());
6742 fileOpened = f.is_open();
6749 static const std::unordered_set<std::string> fortran_C_keywords = {
6750 "character",
"call",
"close",
"common",
"continue",
6751 "case",
"contains",
"cycle",
"class",
"codimension",
6752 "concurrent",
"contiguous",
"critical"
6755 if (*contents !=
'c' && *contents !=
'C')
return false;
6757 const char *c = contents;
6759 while (*c && *c !=
' ') {keyword += *c; c++;}
6760 keyword = keyword.
lower();
6762 return (fortran_C_keywords.find(keyword.
str()) != fortran_C_keywords.end());
6770 bool skipLine=
FALSE;
6776 size_t sizCont = contents.
length();
6777 for (
size_t i=0;i<sizCont;i++)
6781 switch(contents.
at(i))
6788 column += tabSize-1;
6805 if (column==1)
return TRUE;
6806 if (skipLine)
break;
6809 if (column!=6) skipLine=
TRUE;
6812 if (skipLine)
break;
6813 if (column>=7)
return TRUE;
6838 auto skipBlock = [&markerInfo](
const char *p,
const SelectionBlock &blk)
6845 size_t len = markerInfo.
endLen;
6846 bool negate = *(p+markerInfo.
endLen)==
'!';
6848 size_t blkNameLen =
qstrlen(blk.name);
6849 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6853 return p+len+blkNameLen+markerInfo.
closeLen;
6870 const char *p = s.
data();
6880 bool negate = *(p+len)==
'!';
6882 for (
const auto &blk : blockList)
6884 size_t blkNameLen =
qstrlen(blk.name);
6885 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6888 bool blockEnabled = blk.enabled!=negate;
6890 p+=len+blkNameLen+markerInfo.
closeLen;
6909 size_t len = markerInfo.
endLen;
6910 bool negate = *(p+len)==
'!';
6912 for (
const auto &blk : blockList)
6914 size_t blkNameLen =
qstrlen(blk.name);
6915 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6919 p+=len+blkNameLen+markerInfo.
closeLen;
6950 const char *p = s.
data();
6959 bool negate = *(p+len)==
'!';
6965 if (markerInfo.
closeLen==0 && *p==
'\n')
6967 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
6973 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
6982 size_t len = markerInfo.
endLen;
6983 bool negate = *(p+len)==
'!';
6989 if (markerInfo.
closeLen==0 && *p==
'\n')
6991 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
6997 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
7014 const char *p=s.
data();
7023 while (*e==
' ' || *e==
'\t') e++;
7045 size_t prev = 0, pos = 0, len = s.length();
7048 pos = s.find(delimiter, prev);
7049 if (pos == std::string::npos) pos = len;
7050 if (pos>prev) result.push_back(s.substr(prev,pos-prev));
7051 prev = pos + delimiter.length();
7053 while (pos<len && prev<len);
7065 for ( ; iter !=
end; ++iter)
7067 const auto &match = *iter;
7068 size_t i=match.position();
7069 size_t l=match.length();
7070 if (i>p) result.push_back(s.substr(p,i-p));
7073 if (p<s.length()) result.push_back(s.substr(p));
7080 auto it = std::find(sv.begin(),sv.end(),s);
7081 return it!=sv.end() ?
static_cast<int>(it-sv.begin()) : -1;
7089 return reg::search(s,match,re) ?
static_cast<int>(match.position()) : -1;
7097 for (
const auto &s : sv)
7099 if (!first) result+=delimiter;
7113 while (residual > 0)
7115 modVal[0] = (upper ?
'A':
'a') + (residual-1)%26;
7116 result = modVal + result;
7117 residual = (residual-1) / 26;
7124 static const char *str_romans_upper[] = {
"M",
"CM",
"D",
"CD",
"C",
"XC",
"L",
"XL",
"X",
"IX",
"V",
"IV",
"I" };
7125 static const char *str_romans_lower[] = {
"m",
"cm",
"d",
"cd",
"c",
"xc",
"l",
"xl",
"x",
"ix",
"v",
"iv",
"i" };
7126 static const int values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
7127 static const char **str_romans = upper ? str_romans_upper : str_romans_lower;
7132 for (
int i = 0; i < 13; ++i)
7134 while (residual - values[i] >= 0)
7136 result += str_romans[i];
7137 residual -= values[i];
7147 size_t size = s.
length();
7149 const char *data = s.
data();
7152 constexpr auto doxy_nbsp =
"&_doxy_nbsp;";
7153 const int maxIndent=1000000;
7154 int minIndent=maxIndent;
7163 int stop = tabSize - (col%tabSize);
7166 while (stop--) out.
addChar(
' ');
7170 if (data[i] ==
'\\')
7176 else if (i+5<size &&
qstrncmp(&data[i],
"iskip",5)==0)
7181 else if (i+8<size &&
qstrncmp(&data[i],
"endiskip",8)==0)
7213 for (
int j=0;j<bytes-1 && c;j++)
7225 if (!skip && col<minIndent) minIndent=col;
7229 if (minIndent!=maxIndent) refIndent=minIndent;
else refIndent=0;
7239 uint8_t md5_sig[16];
7241 MD5Buffer(projectCookie.
data(),
static_cast<unsigned int>(projectCookie.
length()),md5_sig);
7242 MD5SigToString(md5_sig,sigStr);
7243 sigStr[32]=
'_'; sigStr[33]=0;
7250 int l =
static_cast<int>(name.
length());
7251 int lastSepPos = -1;
7252 const char *p = name.
data();
7261 if (sharpCount==0 && p[i+1]==
':' && p[i+2]==
':')
7275 if (ts==-1) ts=0;
else p+=++ts;
7276 for (i=ts;i<l-1;i++)
7279 if (c==
':' && *p==
':') lastSepPos=i;
7314 case '\t': col+=tabSize - (col%tabSize);
7323 for (
int i=0;i<numBytes-1 && (c=*s++);i++) {}
7324 if (c==0)
return col;
7339 int idx = name.
find(
'<');
7352 int idx = result.
find(
'-');
7353 result = result.
left(idx)+templArgs;
This class represents an function or template argument list.
RefQualifierType refQualifier() const
bool pureSpecifier() const
bool hasParameters() const
bool hasDocumentation() const
QCString trailingReturnType() const
typename Vec::const_iterator const_iterator
bool constSpecifier() const
bool volatileSpecifier() const
A abstract class representing of a compound symbol.
virtual const ArgumentList & templateArguments() const =0
Returns the template arguments of this class.
virtual bool isTemplate() const =0
Returns TRUE if this class is a template.
virtual const BaseClassList & baseClasses() const =0
Returns the list of base classes from which this class directly inherits.
virtual QCString qualifiedNameWithTemplateParameters(const ArgumentLists *actualParams=nullptr, uint32_t *actualParamIndex=nullptr) const =0
virtual FileDef * getFileDef() const =0
Returns the namespace this compound is in, or 0 if it has a global scope.
virtual bool isUsedOnly() const =0
Class representing a bitmap image colored based on hue/sat/gamma settings.
static void hsl2rgb(double h, double s, double l, double *pRed, double *pGreen, double *pBlue)
bool save(const QCString &fileName)
virtual const FileDef * getFileDef() const =0
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
The common base class of all entity definitions found in the sources.
virtual QCString docFile() const =0
virtual const QCString & localName() const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual int docLine() const =0
virtual bool isLinkable() const =0
virtual DefType definitionType() const =0
virtual QCString anchor() const =0
virtual bool isLinkableInProject() const =0
virtual const Definition * findInnerCompound(const QCString &name) const =0
virtual QCString getReference() const =0
virtual const GroupList & partOfGroups() const =0
virtual QCString qualifiedName() const =0
virtual QCString displayName(bool includeScope=TRUE) const =0
virtual bool isArtificial() const =0
virtual QCString getOutputFileBase() const =0
virtual Definition * getOuterScope() const =0
virtual int getStartBodyLine() const =0
virtual bool isReference() const =0
virtual const QCString & name() const =0
virtual void setBodySegment(int defLine, int bls, int ble)=0
virtual void setDocumentation(const QCString &d, const QCString &docFile, int docLine, bool stripWhiteSpace=TRUE)=0
virtual void setLanguage(SrcLangExt lang)=0
virtual void setReference(const QCString &r)=0
virtual void setRefItems(const RefItemVector &sli)=0
A model of a directory symbol.
Class representing a directory in the file system.
bool isEmpty(const std::string subdir) const
bool mkdir(const std::string &path, bool acceptsAbsPath=true) const
bool remove(const std::string &path, bool acceptsAbsPath=true) const
bool rmdir(const std::string &path, bool acceptsAbsPath=true) const
bool rename(const std::string &orgName, const std::string &newName, bool acceptsAbsPath=true) const
static std::string cleanDirPath(const std::string &path)
Class representing the abstract syntax tree of a documentation block.
static NamespaceLinkedMap * namespaceLinkedMap
static ConceptLinkedMap * conceptLinkedMap
static std::unique_ptr< PageDef > mainPage
static FileNameLinkedMap * inputNameLinkedMap
static ParserManager * parserManager
static InputFileEncodingList inputFileEncodingList
static MemberNameLinkedMap * functionNameLinkedMap
static PageLinkedMap * exampleLinkedMap
static NamespaceDefMutable * globalScope
static MemberGroupInfoMap memberGroupInfoMap
static IndexList * indexList
static StringMap tagDestinationMap
static QCString htmlFileExtension
static PageLinkedMap * pageLinkedMap
static DirLinkedMap * dirLinkedMap
static NamespaceAliasInfoMap namespaceAliasMap
static MemberNameLinkedMap * memberNameLinkedMap
static SymbolMap< Definition > * symbolMap
static FileNameLinkedMap * exampleNameLinkedMap
static GroupLinkedMap * groupLinkedMap
Wrapper class for the Entry type.
A model of a file symbol.
virtual ModuleDef * getModuleDef() const =0
virtual QCString getPath() const =0
virtual bool generateSourceFile() const =0
virtual QCString absFilePath() const =0
virtual bool isDocumentationFile() const =0
Minimal replacement for QFileInfo.
std::string extension(bool complete) const
std::string fileName() const
std::string dirPath(bool absPath=true) const
std::string filePath() const
std::string absFilePath() const
Class representing all files with a certain base name.
Ordered dictionary of FileName objects.
A model of a group of symbols.
virtual void addPage(PageDef *def)=0
Class representing a string buffer optimized for growing.
void addStr(const QCString &s)
static HtmlEntityMapper & instance()
Returns the one and only instance of the HTML entity mapper.
SymType name2sym(const QCString &symName) const
Give code of the requested HTML entity name.
const T * find(const std::string &key) const
A model of a class/file/namespace member symbol.
virtual QCString typeString() const =0
virtual bool isForeign() const =0
virtual bool isRelated() const =0
virtual const ClassDef * getClassDef() const =0
virtual bool hasReferencesRelation() const =0
virtual GroupDef * getGroupDef()=0
virtual bool isTypedef() const =0
virtual const MemberVector & enumFieldList() const =0
virtual bool hasCallGraph() const =0
virtual const FileDef * getFileDef() const =0
virtual const ArgumentList & argumentList() const =0
virtual bool isStrongEnumValue() const =0
virtual bool isStatic() const =0
virtual bool hasInlineSource() const =0
virtual MemberDef * resolveAlias()=0
virtual bool hasEnumValues() const =0
virtual bool isDefine() const =0
virtual const NamespaceDef * getNamespaceDef() const =0
virtual bool hasCallerGraph() const =0
virtual void setMemberGroup(MemberGroup *grp)=0
virtual bool isEnumerate() const =0
virtual bool hasReferencedByRelation() const =0
virtual bool isVariable() const =0
virtual bool isStrong() const =0
virtual QCString argsString() const =0
virtual const MemberDef * getEnumScope() const =0
virtual void overrideReferencesRelation(bool e)=0
virtual void overrideReferencedByRelation(bool e)=0
virtual void overrideCallGraph(bool e)=0
virtual void overrideInlineSource(bool e)=0
virtual void overrideEnumValues(bool e)=0
virtual void overrideCallerGraph(bool e)=0
A class representing a group of members.
void insertMember(MemberDef *md)
A list of MemberDef objects as shown in documentation sections.
MemberListContainer container() const
Wrapper class for the MemberListType type.
constexpr bool isProtected() const
MemberListType toProtected() const
MemberListType toPublic() const
static MemberListType Invalid()
constexpr bool isPrivate() const
ML_TYPES constexpr bool isPublic() const
reverse_iterator rbegin()
Ordered dictionary of MemberName objects.
void remove(const MemberDef *md)
static ModuleManager & instance()
An abstract interface of a namespace symbol.
Class representing a list of output generators that are written to in parallel.
void endPageRef(const QCString &c, const QCString &a)
void writeString(const QCString &text)
void disable(OutputType o)
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name)
void startConstraintParam()
void docify(const QCString &s)
void startConstraintDocs()
void startConstraintType()
void generateDoc(const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &docStr, bool indexWords, bool isExample, const QCString &exampleName, bool singleLine, bool linkFromIndex, bool markdownSupport)
void pushGeneratorState()
void disableAllBut(OutputType o)
void endConstraintParam()
void startConstraintList(const QCString &header)
void parseText(const QCString &textStr)
A model of a page symbol.
virtual void setTitle(const QCString &title)=0
virtual void setNestingLevel(int)=0
virtual bool hasTitle() const =0
virtual void setFileName(const QCString &name)=0
virtual void setShowLineNo(bool)=0
virtual QCString title() const =0
virtual void setPageScope(Definition *)=0
virtual const GroupDef * getGroupDef() const =0
This is an alternative implementation of QCString.
int find(char c, int index=0, bool cs=TRUE) const
QCString & prepend(const char *s)
size_t length() const
Returns the length of the string, not counting the 0-terminator.
bool startsWith(const char *s) const
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
bool endsWith(const char *s) const
char & at(size_t i)
Returns a reference to the character at index i.
char * rawData()
Returns a writable pointer to the data.
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 & setNum(short n)
QCString simplifyWhiteSpace() const
return a copy of this string with leading and trailing whitespace removed and multiple whitespace cha...
QCString & append(char c)
QCString right(size_t len) const
void reserve(size_t size)
Reserve space for size bytes without changing the string contents.
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.
std::string_view view() const
QCString left(size_t len) const
int contains(char c, bool cs=TRUE) const
bool stripPrefix(const QCString &prefix)
This struct represents an item in the list of references.
class that provide information about a section.
Definition * definition() const
QCString fileName() const
void setTitle(const QCString &t)
SectionInfo * replace(const QCString &label, const QCString &fileName, int lineNr, const QCString &title, SectionType type, int level, const QCString &ref=QCString())
SectionInfo * add(const SectionInfo &si)
static SectionManager & instance()
returns a reference to the singleton
static constexpr int Page
const Definition * resolveSymbol(const Definition *scope, const QCString &name, const QCString &args=QCString(), bool checkCV=false, bool insideCode=false)
Find the symbool definition matching name within the scope set.
int isAccessibleFrom(const Definition *scope, const Definition *item)
Checks if symbol item is accessible from within scope.
int isAccessibleFromWithExpScope(const Definition *scope, const Definition *item, const QCString &explicitScopePart)
Check if symbol item is accessible from within scope, where it has to match the explicitScopePart.
QCString getResolvedType() const
In case a call to resolveClass() points to a typedef or using declaration.
const ClassDef * resolveClass(const Definition *scope, const QCString &name, bool maybeUnlinkable=false, bool mayBeHidden=false)
Find the class definition matching name within the scope set.
QCString getTemplateSpec() const
In case a call to resolveClass() points to a template specialization, the template part is return via...
void setFileScope(const FileDef *fd)
Sets or updates the file scope using when resolving symbols.
const MemberDef * getTypedef() const
In case a call to resolveClass() resolves to a type member (e.g.
Concrete visitor implementation for TEXT output.
Abstract interface for a hyperlinked text fragment.
virtual void writeString(std::string_view, bool) const =0
virtual void writeBreak(int indent) const =0
virtual void writeLink(const QCString &extRef, const QCString &file, const QCString &anchor, std::string_view text) const =0
Implements TextGeneratorIntf for an OutputDocInterface stream.
TextGeneratorOLImpl(OutputList &ol)
void writeBreak(int indent) const override
void writeLink(const QCString &extRef, const QCString &file, const QCString &anchor, std::string_view text) const override
void writeString(std::string_view s, bool keepSpaces) const override
Text streaming class that buffers data.
std::string str() const
Return the contents of the buffer as a std::string object.
int minClassDistance(const ClassDef *cd, const ClassDef *bcd, int level)
ClassDef * getClass(const QCString &n)
ClassDef * toClassDef(Definition *d)
std::vector< BaseClassDef > BaseClassList
Class representing a regular expression.
@ Wildcard
simple globbing pattern.
Iterator class to iterator through matches.
Object representing the matching results.
std::string str() const
Return a string representing the matching part.
size_t length() const
Returns the position of the match or std::string::npos if no length is set.
ConceptDef * toConceptDef(Definition *d)
ConceptDef * getConcept(const QCString &n)
#define Config_getInt(name)
#define Config_getList(name)
#define Config_getEnumAsString(name)
#define Config_getBool(name)
#define Config_getString(name)
#define Config_getEnum(name)
std::vector< std::string > StringVector
QCString dateToString(DateTimeType includeTime)
Returns the current date, when includeTime is set also the time is provided.
QCString yearToString()
Returns the current year as a string.
QCString formatDateTime(const QCString &format, const std::tm &dt, int &formatUsed)
Return a string representation for a given std::tm value that is formatted according to the pattern g...
QCString dateTimeFromString(const QCString &spec, std::tm &dt, int &format)
Returns the filled in std::tm for a given string representing a date and/or time.
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const QCString &argsString, QCString *extraTypeChars=nullptr)
DirIterator end(const DirIterator &) noexcept
static constexpr auto hex
#define AUTO_TRACE_ADD(...)
#define AUTO_TRACE_EXIT(...)
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
IDocParserPtr createDocParser()
factory function to create a parser
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &input, bool indexWords, bool isExample, const QCString &exampleName, bool singleLine, bool linkFromIndex, bool markdownSupport)
static void addMembersToMemberGroup()
FileDef * toFileDef(Definition *d)
Translator * theTranslator
MemberDefMutable * toMemberDefMutable(Definition *d)
MemberDef * toMemberDef(Definition *d)
#define warn(file, line, fmt,...)
ModuleDef * toModuleDef(Definition *d)
std::ifstream openInputStream(const QCString &name, bool binary=false, bool openAtEnd=false)
FILE * popen(const QCString &name, const QCString &type)
std::ofstream openOutputStream(const QCString &name, bool append=false)
bool fileSystemIsCaseSensitive()
void replaceNamespaceAliases(QCString &name)
NamespaceDef * getResolvedNamespace(const QCString &name)
NamespaceDef * toNamespaceDef(Definition *d)
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.
std::string replace(std::string_view str, const Ex &re, std::string_view replacement)
Searching in a given input string for parts that match regular expression re and replaces those parts...
bool match(std::string_view str, Match &match, const Ex &re)
Matches a given string str for a match against regular expression re.
Token literal values and constants.
std::unique_ptr< PageDef > createPageDef(const QCString &f, int l, const QCString &n, const QCString &d, const QCString &t)
Portable versions of functions that are platform dependent.
int portable_iconv_close(void *cd)
size_t portable_iconv(void *cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
void * portable_iconv_open(const char *tocode, const char *fromcode)
int qstricmp(const char *s1, const char *s2)
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
int qstrncmp(const char *str1, const char *str2, size_t len)
const char * qPrint(const char *s)
uint32_t qstrlen(const char *str)
Returns the length of string str, or 0 if a null pointer is passed.
std::vector< RefItem * > RefItemVector
Web server based search engine.
Some helper functions for std::string.
void addTerminalCharIfMissing(std::string &s, char c)
This class contains the information about the argument of a function or template.
Data associated with a HSV colored image.
const unsigned char * content
const unsigned char * alpha
Cache element for the file name to FileDef mapping cache.
FindFileCacheElem(FileDef *fd, bool ambig)
This struct is used to capture the tag file information for an Entry.
Protection
Protection level of members.
SrcLangExt
Language as given by extension.
int isUTF8NonBreakableSpace(const char *input)
Check if the first character pointed at by input is a non-breakable whitespace character.
uint8_t getUTF8CharNumBytes(char c)
Returns the number of bytes making up a single UTF8 character given the first byte in the sequence.
Various UTF8 related helper functions.
QCString externalRef(const QCString &relPath, const QCString &ref, bool href)
QCString removeRedundantWhiteSpace(const QCString &s)
QCString extractDirection(QCString &docs)
Strip the direction part from docs and return it as a string in canonical form The input docs string ...
QCString mergeScopes(const QCString &leftScope, const QCString &rightScope)
QCString findFilePath(const QCString &file, bool &ambig)
QCString normalizeNonTemplateArgumentsInString(const QCString &name, const Definition *context, const ArgumentList &formalArgs)
QCString linkToText(SrcLangExt lang, const QCString &link, bool isFileName)
size_t updateColumnCount(const char *s, size_t col)
void trimBaseClassScope(const BaseClassList &bcl, QCString &s, int level=0)
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
QCString insertTemplateSpecifierInScope(const QCString &scope, const QCString &templ)
bool protectionLevelVisible(Protection prot)
QCString generateAnonymousAnchor(const QCString &fileName, int count)
const int maxInheritanceDepth
std::string join(const StringVector &sv, const std::string &delimiter)
create a string where the string in the vector are joined by the given delimiter
static void stripIrrelevantString(QCString &target, const QCString &str)
int lineBlock(const QCString &text, const QCString &marker)
Returns the line number of the line following the line with the marker.
void addCodeOnlyMappings()
QCString convertToHtml(const QCString &s, bool keepEntities)
QCString substituteTemplateArgumentsInString(const QCString &nm, const ArgumentList &formalArgs, const ArgumentList *actualArgs)
static int g_usedNamesCount
static void filterCRLF(std::string &contents)
bool resolveRef(const QCString &scName, const QCString &name, bool inSeeBlock, const Definition **resContext, const MemberDef **resMember, SrcLangExt lang, bool lookForSpecialization, const FileDef *currentFile, bool checkScope)
GetDefResult getDefsOld(const GetDefInput &input)
QCString parseCommentAsText(const Definition *scope, const MemberDef *md, const QCString &doc, const QCString &fileName, int lineNr)
int extractClassNameFromType(const QCString &type, int &pos, QCString &name, QCString &templSpec, SrcLangExt lang)
QCString integerToRoman(int n, bool upper)
void checkBlocks(const QCString &s, const QCString fileName, const SelectionMarkerInfo &markerInfo)
void writeTypeConstraints(OutputList &ol, const Definition *d, const ArgumentList &al)
bool leftScopeMatch(const QCString &scope, const QCString &name)
QCString correctURL(const QCString &url, const QCString &relPath)
Corrects URL url according to the relative path relPath.
QCString stripAnonymousNamespaceScope(const QCString &s)
QCString stripPath(const QCString &s)
QCString stripFromIncludePath(const QCString &path)
static Cache< std::string, FindFileCacheElem > g_findFileDefCache(5000)
QCString removeEmptyLines(const QCString &s)
static const char constScope[]
static bool recursivelyAddGroupListToTitle(OutputList &ol, const Definition *d, bool root)
bool containsWord(const QCString &str, const char *word)
returns TRUE iff string s contains word w
bool checkIfTypedef(const Definition *scope, const FileDef *fileScope, const QCString &n)
bool readInputFile(const QCString &fileName, std::string &contents, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
bool transcodeCharacterStringToUTF8(std::string &input, const char *inputEncoding)
static bool matchCanonicalTypes(const Definition *srcScope, const FileDef *srcFileScope, const QCString &srcType, const Definition *dstScope, const FileDef *dstFileScope, const QCString &dstType, SrcLangExt lang)
bool patternMatch(const FileInfo &fi, const StringVector &patList)
void generateFileRef(OutputList &ol, const QCString &name, const QCString &text)
QCString generateMarker(int id)
QCString selectBlocks(const QCString &s, const SelectionBlockList &blockList, const SelectionMarkerInfo &markerInfo)
remove disabled blocks and all block markers from s and return the result as a string
static std::mutex g_findFileDefMutex
QCString escapeCharsInString(const QCString &name, bool allowDots, bool allowUnderscore)
static std::unordered_map< std::string, SrcLangExt > g_extLookup
static QCString stripDeclKeywords(const QCString &s)
bool recognizeFixedForm(const QCString &contents, FortranFormat format)
bool openOutputFile(const QCString &outFile, std::ofstream &f)
static MemberDef * getMemberFromSymbol(const Definition *scope, const FileDef *fileScope, const QCString &n)
QCString tempArgListToString(const ArgumentList &al, SrcLangExt lang, bool includeDefault)
static QCString extractCanonicalType(const Definition *d, const FileDef *fs, QCString type, SrcLangExt lang)
static ModuleDef * findModuleDef(const Definition *d)
void addRefItem(const RefItemVector &sli, const QCString &key, const QCString &prefix, const QCString &name, const QCString &title, const QCString &args, const Definition *scope)
void addGroupListToTitle(OutputList &ol, const Definition *d)
QCString relativePathToRoot(const QCString &name)
SrcLangExt getLanguageFromCodeLang(QCString &fileName)
Routine to handle the language attribute of the \code command.
QCString integerToAlpha(int n, bool upper)
void writePageRef(OutputList &ol, const QCString &cn, const QCString &mn)
void clearSubDirs(const Dir &d)
static void transcodeCharacterBuffer(const QCString &fileName, std::string &contents, const QCString &inputEncoding, const QCString &outputEncoding)
QCString showFileDefMatches(const FileNameLinkedMap *fnMap, const QCString &n)
QCString demangleCSharpGenericName(const QCString &name, const QCString &templArgs)
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
QCString stripExtensionGeneral(const QCString &fName, const QCString &ext)
QCString filterTitle(const QCString &title)
QCString unescapeCharsInString(const QCString &s)
QCString removeAnonymousScopes(const QCString &str)
void createSubDirs(const Dir &d)
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
bool fileVisibleInIndex(const FileDef *fd, bool &genSourceFile)
QCString stripScope(const QCString &name)
QCString resolveTypeDef(const Definition *context, const QCString &qualifiedName, const Definition **typedefContext)
bool checkExtension(const QCString &fName, const QCString &ext)
bool isURL(const QCString &url)
Checks whether the given url starts with a supported protocol.
QCString substituteKeywords(const QCString &s, const KeywordSubstitutionList &keywords)
void stripIndentationVerbatim(QCString &doc, const int indentationLevel)
void stripIrrelevantConstVolatile(QCString &s)
bool resolveLink(const QCString &scName, const QCString &lr, bool, const Definition **resContext, QCString &resAnchor, SrcLangExt lang, const QCString &prefix)
int computeQualifiedIndex(const QCString &name)
Return the index of the last :: in the string name that is still before the first <.
QCString stripExtension(const QCString &fName)
void initDefaultExtensionMapping()
bool findAndRemoveWord(QCString &sentence, const char *word)
removes occurrences of whole word from sentence, while keeps internal spaces and reducing multiple se...
static QCString stripFromPath(const QCString &p, const StringVector &l)
QCString convertNameToFile(const QCString &name, bool allowDots, bool allowUnderscore)
static bool isLowerCase(QCString &s)
QCString convertToJSString(const QCString &s)
static const char virtualScope[]
GetDefResult getDefsNew(const GetDefInput &input)
QCString convertToXML(const QCString &s, bool keepEntities)
std::string_view lastPart
QCString langToString(SrcLangExt lang)
Returns a string representation of lang.
QCString determineAbsoluteIncludeName(const QCString &curFile, const QCString &incFileName)
QCString detab(const QCString &s, size_t &refIndent)
EntryType guessSection(const QCString &name)
void extractNamespaceName(const QCString &scopeName, QCString &className, QCString &namespaceName, bool allowEmptyClass)
void convertProtectionLevel(MemberListType inListType, Protection inProt, MemberListType *outListType1, MemberListType *outListType2)
Computes for a given list type inListType, which are the the corresponding list type(s) in the base c...
static const char volatileScope[]
QCString argListToString(const ArgumentList &al, bool useCanonicalType, bool showDefVals)
int findIndex(const StringVector &sv, const std::string &s)
find the index of a string in a vector of strings, returns -1 if the string could not be found
static void findMembersWithSpecificName(const MemberName *mn, const QCString &args, bool checkStatics, const FileDef *currentFile, bool checkCV, std::vector< const MemberDef * > &members)
QCString removeLongPathMarker(QCString path)
QCString correctId(const QCString &s)
static QCString extractCanonicalArgType(const Definition *d, const FileDef *fs, const Argument &arg, SrcLangExt lang)
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
void mergeMemberOverrideOptions(MemberDefMutable *md1, MemberDefMutable *md2)
static int nextUTF8CharPosition(const QCString &utf8Str, uint32_t len, uint32_t startPos)
QCString getDotImageExtension()
static QCString getCanonicalTypeForIdentifier(const Definition *d, const FileDef *fs, const QCString &word, SrcLangExt lang, QCString *tSpec, int count=0)
QCString mangleCSharpGenericName(const QCString &name)
GetDefResult getDefs(const GetDefInput &input)
QCString projectLogoFile()
static std::mutex g_usedNamesMutex
PageDef * addRelatedPage(const QCString &name, const QCString &ptitle, const QCString &doc, const QCString &fileName, int docLine, int startLine, const RefItemVector &sli, GroupDef *gd, const TagInfo *tagInfo, bool xref, SrcLangExt lang)
static bool matchArgument2(const Definition *srcScope, const FileDef *srcFileScope, Argument &srcA, const Definition *dstScope, const FileDef *dstFileScope, Argument &dstA, SrcLangExt lang)
void mergeArguments(ArgumentList &srcAl, ArgumentList &dstAl, bool forceNameOverwrite)
StringVector split(const std::string &s, const std::string &delimiter)
split input string s by string delimiter delimiter.
QCString getEncoding(const FileInfo &fi)
static bool keyWordsFortranC(const char *contents)
FortranFormat convertFileNameFortranParserCode(QCString fn)
static QCString getCanonicalTemplateSpec(const Definition *d, const FileDef *fs, const QCString &spec, SrcLangExt lang)
bool genericPatternMatch(const FileInfo &fi, const PatternList &patList, PatternElem &elem, PatternGet getter)
QCString stripLeadingAndTrailingEmptyLines(const QCString &s, int &docLine)
Special version of QCString::stripWhiteSpace() that only strips completely blank lines.
int findParameterList(const QCString &name)
Returns the position in the string where a function parameter list begins, or -1 if one is not found.
bool copyFile(const QCString &src, const QCString &dest)
Copies the contents of file with name src to the newly created file with name dest.
QCString externalLinkTarget(const bool parent)
QCString getFileFilter(const QCString &name, bool isSourceCode)
QCString stripTemplateSpecifiersFromScope(const QCString &fullName, bool parentOnly, QCString *pLastScopeStripped, QCString scopeName, bool allowArtificial)
QCString getOverloadDocs()
static QCString getFilterFromList(const QCString &name, const StringVector &filterList, bool &found)
static QCString projectLogoSize()
QCString stripIndentation(const QCString &s)
static QCString showDate(const QCString &fmt)
int getPrefixIndex(const QCString &name)
bool rightScopeMatch(const QCString &scope, const QCString &name)
void writeMarkerList(OutputList &ol, const std::string &markerText, size_t numMarkers, std::function< void(size_t)> replaceFunc)
static bool getScopeDefs(const QCString &docScope, const QCString &scope, ClassDef *&cd, ConceptDef *&cnd, NamespaceDef *&nd, ModuleDef *&modd)
bool updateLanguageMapping(const QCString &extension, const QCString &language)
QCString inlineArgListToDoc(const ArgumentList &al)
void linkifyText(const TextGeneratorIntf &out, const Definition *scope, const FileDef *fileScope, const Definition *self, const QCString &text, bool autoBreak, bool external, bool keepSpaces, int indentLevel)
static std::unordered_map< std::string, int > g_usedNames
static CharAroundSpace g_charAroundSpace
QCString replaceColorMarkers(const QCString &str)
Replaces any markers of the form ##AA in input string str by new markers of the form #AABBCC,...
QCString getFileNameExtension(const QCString &fn)
QCString convertToId(const QCString &s)
void writeExamples(OutputList &ol, const ExampleList &list)
static std::mutex g_matchArgsMutex
QCString replaceAnonymousScopes(const QCString &s, const QCString &replacement)
void writeColoredImgData(const QCString &dir, ColoredImgDataItem data[])
Writes the intensity only bitmap represented by data as an image to directory dir using the colors de...
static const char operatorScope[]
FileDef * findFileDef(const FileNameLinkedMap *fnMap, const QCString &n, bool &ambig)
QCString convertCharEntitiesToUTF8(const QCString &str)
static std::vector< Lang2ExtMap > g_lang2extMap
int getScopeFragment(const QCString &s, int p, int *l)
void addHtmlExtensionIfMissing(QCString &fName)
QCString createHtmlUrl(const QCString &relPath, const QCString &ref, bool href, bool isLocalFile, const QCString &targetFileName, const QCString &anchor)
A bunch of utility functions.
std::vector< KeywordSubstitution > KeywordSubstitutionList
std::vector< SelectionBlock > SelectionBlockList