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;
1181 if (!a.docs.isEmpty())
1183 if (!a.name.isEmpty())
1185 paramDocs+=
" \\ilinebr @tparam "+a.name+
" "+a.docs;
1187 else if (!a.type.isEmpty())
1193 paramDocs+=
" \\ilinebr @tparam "+type+
" "+a.docs;
1206 for (
auto it = al.
begin() ; it!=al.
end() ;)
1211 int i=type1.
find(
")(");
1215 type1=type1.
left(i);
1223 result+= type1+
" "+a.
name+type2+a.
array;
1227 result+= type1+type2;
1234 if (it!=al.
end()) result+=
", ";
1249 if (al.
empty())
return result;
1252 for (
const auto &a : al)
1254 if (a.defval.isEmpty() || includeDefault)
1256 if (!first) result+=
", ";
1257 if (!a.name.isEmpty())
1267 int i =
static_cast<int>(a.type.length())-1;
1268 while (i>=0 &&
isId(a.type.at(i))) i--;
1271 result+=a.type.
right(a.type.length()-i-1);
1272 if (a.type.find(
"...")!=-1)
1284 result+=
" extends ";
1285 result+=a.typeConstraint;
1306 size_t len = contents.length();
1310 char c = contents[src++];
1314 if (src<len && contents[src] ==
'\n')
1319 else if ( c ==
'\0' && src<len-1)
1323 contents[dest++] = c;
1325 contents.resize(dest);
1332 for (
const auto &filterStr : filterList)
1335 int i_equals=fs.
find(
'=');
1342 filterPattern = filterPattern.
lower();
1343 input = input.
lower();
1350 if (filterName.
find(
' ')!=-1)
1352 filterName=
"\""+filterName+
"\"";
1372 if (name.
isEmpty())
return "";
1379 if (isSourceCode && !filterSrcList.empty())
1394 if (filterName.
length()>=2 && filterName[0]==
'"' && filterName[
static_cast<int>(filterName.
length())-1]==
'"')
1396 filterName = filterName.
mid(1,filterName.
length()-2);
1405 const char *outputEncoding =
"UTF-8";
1406 if (inputEncoding==
nullptr ||
qstricmp(inputEncoding,outputEncoding)==0)
return true;
1407 size_t inputSize=input.length();
1408 size_t outputSize=inputSize*4;
1411 if (cd==
reinterpret_cast<void *
>(-1))
1416 size_t iLeft=inputSize;
1417 size_t oLeft=outputSize;
1418 const char *inputPtr = input.data();
1419 char *outputPtr = output.
rawData();
1422 outputSize-=
static_cast<int>(oLeft);
1423 output.
resize(outputSize);
1424 output.
at(outputSize)=
'\0';
1444 bool fileOpened=
false;
1445 if (name[0]==
'-' && name[1]==0)
1447 std::string contents;
1449 while (getline(std::cin,line))
1451 contents+=line+
'\n';
1460 err(
"file '{}' not found\n",name);
1473 err(
"cannot open file '{}' for reading\n",name);
1481 for (
const auto &bcd : bcl)
1502 if (target==str) { target.
clear();
return; }
1504 int l=
static_cast<int>(str.
length());
1506 while ((i=target.
find(str,p))!=-1)
1508 bool isMatch = (i==0 || !
isId(target.
at(i-1))) &&
1509 (i+l==
static_cast<int>(target.
length()) || !
isId(target.
at(i+l)));
1512 int i1=target.
find(
'*',i+l);
1513 int i2=target.
find(
'&',i+l);
1514 if (i1==-1 && i2==-1)
1521 else if ((i1!=-1 && i<i1) || (i2!=-1 && i<i2))
1563 int i=s.
find(
" class ");
1564 if (i!=-1)
return s.
left(i)+s.
mid(i+6);
1565 i=s.
find(
" typename ");
1566 if (i!=-1)
return s.
left(i)+s.
mid(i+9);
1567 i=s.
find(
" union ");
1568 if (i!=-1)
return s.
left(i)+s.
mid(i+6);
1569 i=s.
find(
" struct ");
1570 if (i!=-1)
return s.
left(i)+s.
mid(i+7);
1583 if (!templSpec.
isEmpty() && templSpec.
at(0) ==
'<')
1590 templSpec = resolvedType;
1601 if (count>10)
return word;
1603 QCString symName,result,templSpec,tmpName;
1604 if (tSpec && !tSpec->
isEmpty())
1625 bool isTemplInst = cd && !templSpec.
isEmpty();
1626 if (!cd && !templSpec.
isEmpty())
1637 cd?cd->
name():
"",mType?mType->
name():
"",ts,resolvedType);
1660 if (cd==d && tSpec) *tSpec=
"";
1664 result = resolvedType+ts;
1672 if (tSpec) *tSpec=
"";
1686 result=cd->
name()+templSpec;
1744 result = resolvedType;
1777 if (i>pp) canType += type.
mid(pp,i-pp);
1798 std::string ts = templSpec.
str();
1799 static const reg::Ex re(R
"(\a\w*)");
1806 for (; it!=
end ; ++it)
1808 const auto &match = *it;
1809 size_t ti = match.position();
1810 size_t tl = match.length();
1811 std::string matchStr = match.str();
1812 canType += ts.substr(tp,ti-tp);
1816 canType+=ts.substr(tp);
1832 if ((type==
"const" || type==
"volatile") && !name.
isEmpty())
1837 if (name==
"const" || name==
"volatile")
1839 if (!type.
isEmpty()) type+=
" ";
1865 AUTO_TRACE(
"srcType='{}' dstType='{}'",srcType,dstType);
1866 if (srcType==dstType)
return true;
1869 int i1=srcType.
find(
")(");
1870 if (i1==-1)
return false;
1871 int i2=dstType.
find(
")(");
1872 if (i1!=i2)
return false;
1875 int j1=srcType.
find(
"(");
1876 if (j1==-1 || j1>i1)
return false;
1877 int j2=dstType.
find(
"(");
1878 if (j2!=j1)
return false;
1879 if (srcType.
left(j1)!=dstType.
left(j2))
return false;
1888 dstScope,dstFileScope,dstAl.get(),
1898 AUTO_TRACE(
"src: scope={} type={} name={} canType={}, dst: scope={} type={} name={} canType={}",
1917 srcA.
type+=sSrcName;
1921 else if (sDstName==srcType.
right(sDstName.
length()))
1923 dstA.
type+=sDstName;
1939 dstScope,dstFileScope,dstA.
canType,
1962 ASSERT(srcScope!=
nullptr && dstScope!=
nullptr);
1964 AUTO_TRACE(
"srcScope='{}' dstScope='{}' srcArgs='{}' dstArgs='{}' checkCV={} lang={}",
1967 if (srcAl==
nullptr || dstAl==
nullptr)
1969 bool match = srcAl==dstAl;
2000 if (srcAl->
size() != dstAl->
size())
2028 auto srcIt = srcAl->
begin();
2029 auto dstIt = dstAl->
begin();
2030 for (;srcIt!=srcAl->
end() && dstIt!=dstAl->
end();++srcIt,++dstIt)
2035 dstScope,dstFileScope,dstA,
2054 AUTO_TRACE(
"srcAl='{}',dstAl='{}',forceNameOverwrite={}",
2062 auto srcIt=srcAl.
begin();
2063 auto dstIt=dstAl.
begin();
2064 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
2069 AUTO_TRACE_ADD(
"before merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
2085 if (srcA.
name==
"const" || srcA.
name==
"volatile")
2090 if (dstA.
name==
"const" || dstA.
name==
"volatile")
2116 if (forceNameOverwrite)
2159 j1=
static_cast<int>(srcA.
type.
length())-i1-2,
2160 j2=
static_cast<int>(dstA.
type.
length())-i2-2;
2168 else if (i1==-1 && i2!=-1 && dstA.
type.
right(j2)==srcA.
type)
2188 AUTO_TRACE_ADD(
"after merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
2204 auto isUnconstraintTemplate = [](
const QCString &type)
2206 return type==
"typename" || type==
"class" || type.startsWith(
"typename ") || type.startsWith(
"class ");
2208 auto srcIt = srcAl.
begin();
2209 auto dstIt = dstAl.
begin();
2210 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
2214 if ((!isUnconstraintTemplate(srcA.
type) || !isUnconstraintTemplate(dstA.
type)) && srcA.
type!=dstA.
type)
2234 std::vector<const MemberDef *> &members)
2238 for (
const auto &md_p : *mn)
2249 currentFile==
nullptr || fd==currentFile)
2265 members.push_back(md);
2301 result.
found =
true;
2306 result.
found =
true;
2311 result.
found =
true;
2316 result.
found =
true;
2321 result.
found =
true;
2363 memberName =
substitute(memberName,
"\\",
"::");
2368 while ((is=scopeName.
findRev(
"::"))!=-1 &&
2369 (im=memberName.
find(
"::",pm))!=-1 &&
2370 (scopeName.
right(scopeName.
length()-is-2)==memberName.
mid(pm,im-pm))
2373 scopeName=scopeName.
left(is);
2382 (im=memberName.
findRev(
"::"))!=-1 &&
2383 im<
static_cast<int>(memberName.
length())-2
2386 mScope=memberName.
left(im);
2391 if (mScope==scopeName) scopeName.
clear();
2402 int scopeOffset =
static_cast<int>(scopeName.
length());
2408 className+=
"::"+mScope;
2419 if (fcd==
nullptr && className.
find(
'<')!=-1)
2433 std::unique_ptr<ArgumentList> argList;
2438 for (
const auto &mmd_p : *mn)
2455 if (m<mdist && mcd->isLinkable())
2469 for (
const auto &mmd_p : *mn)
2479 if (m<mdist /* && mcd->isLinkable()*/ )
2495 result.
md =
nullptr;
2496 result.
cd =
nullptr;
2497 result.
found =
false;
2503 if (result.
gd) result.
cd=
nullptr;
2514 if (emd->localName()==mName)
2516 if (emd->isLinkable())
2520 result.
found =
true;
2525 result.
cd =
nullptr;
2526 result.
md =
nullptr;
2527 result.
found =
false;
2538 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
2542 }
while (scopeOffset>=0);
2549 std::unique_ptr<ArgumentList> argList;
2550 bool hasEmptyArgs = input.
args==
"()";
2557 for (
const auto &mmd_p : *mn)
2582 if (!fuzzy_mmd && hasEmptyArgs)
2590 result.
md = fuzzy_mmd;
2592 result.
found =
true;
2605 int scopeOffset =
static_cast<int>(scopeName.
length());
2611 namespaceName+=
"::"+mScope;
2615 namespaceName=mScope;
2618 if (!namespaceName.
isEmpty() &&
2626 for (
const auto &mmd_p : *mn)
2677 for (
const auto &mmd_p : *mn)
2702 result.
found =
true;
2710 for (
const auto &mmd_p : *mn)
2715 int ni=namespaceName.
findRev(
"::");
2721 (notInNS || sameNS) &&
2731 result.
found =
true;
2740 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
2744 }
while (scopeOffset>=0);
2748 std::vector<const MemberDef *> members;
2751 if (members.empty())
2757 if (members.size()!=1 && input.
args==
"()")
2763 for (
auto it = mn->
rbegin(); it!=mn->
rend(); ++it)
2765 const auto &mmd_p = *it;
2777 members.push_back(mmd);
2782 if (!members.empty())
2787 for (
const auto &rmd : members)
2789 if (rmd->getFileDef() && rmd->getFileDef()->name() == input.
currentFile->
name())
2797 result.
md = members.back();
2802 result.
md = members.back();
2812 result.
found =
true;
2826 printf(
"@@ ------ getDefsOld start\n");
2828 printf(
"@@ ------ getDefsOld end\n");
2829 printf(
"@@ ------ getDefsNew start\n");
2831 printf(
"@@ ------ getDefsNew end\n");
2833 result.
md!=newResult.
md ||
2834 result.
cd!=newResult.
cd ||
2835 result.
fd!=newResult.
fd ||
2836 result.
nd!=newResult.
nd ||
2837 result.
gd!=newResult.
gd
2840 printf(
"@@ getDefsOld(scName=%s, mbName=%s, args=%s, forceEmptyScope=%d "
2841 "currentFile=%s checkCV=%d)=%d md=%s (%p) cd=%s fd=%s nd=%s gd=%s\n",
2853 printf(
"@@ ------ getDefsOld start\n");
2854 printf(
"@@ getDefsNew(scName=%s, mbName=%s, args=%s, forceEmptyScope=%d "
2855 "currentFile=%s checkCV=%d)=%d md=%s (%p) cd=%s fd=%s nd=%s gd=%s\n",
2861 (
void*)newResult.
md,
2902 bool explicitGlobalScope=
FALSE;
2903 if (scopeName.
at(0)==
':' && scopeName.
at(1)==
':')
2906 explicitGlobalScope=
TRUE;
2914 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(docScopeName.
length());
2919 if (scopeOffset>0) fullName.
prepend(docScopeName.
left(scopeOffset)+
"::");
2943 else if ((scopeOffset=docScopeName.
findRev(
"::",scopeOffset-1))==-1)
2947 }
while (scopeOffset>=0);
2955 const char *p=s.
data();
2957 while ((c=
static_cast<uint8_t
>(*p++)))
if (!islower(c))
return false;
2970 bool lookForSpecialization,
2975 AUTO_TRACE(
"scope={} name={} inSeeBlock={}",scName,name,inSeeBlock);
2980 if (fullName.
find(
"anonymous_namespace{")==-1)
2992 int templEndPos = fullName.
findRev(
'>');
2993 if (templEndPos!=-1)
3001 int endNamePos=bracePos!=-1 ? bracePos :
static_cast<int>(fullName.
length());
3002 int scopePos=fullName.
findRev(
"::",endNamePos);
3003 bool explicitScope = fullName.
startsWith(
"::") &&
3008 bool allowTypeOnly=
false;
3011 *resContext=
nullptr;
3018 if (!inSeeBlock && scopePos==-1 &&
isLowerCase(tsName))
3032 if (scName!=fullName &&
getScopeDefs(scName,fullName,cd,cnd,nd,modd))
3055 else if (scName==fullName || (!inSeeBlock && scopePos==-1))
3074 if (explicitScope) nameStr=nameStr.
mid(2);
3079 if (bracePos!=-1) argsStr=fullName.
right(fullName.
length()-bracePos);
3083 int templPos=nameStr.
find(
'<');
3084 bool tryUnspecializedVersion =
FALSE;
3085 if (templPos!=-1 && nameStr.
find(
"operator")==-1)
3087 int endTemplPos=nameStr.
findRev(
'>');
3088 if (endTemplPos!=-1)
3090 if (!lookForSpecialization)
3092 nameStr=nameStr.
left(templPos)+nameStr.
right(nameStr.
length()-endTemplPos-1);
3096 tryUnspecializedVersion =
TRUE;
3104 nameStr=nameStr.
mid(scopeStr.
length()+2);
3130 *resContext=
nullptr;
3140 *resMember=result.
md;
3141 *resContext=result.
md;
3145 *resContext=
nullptr;
3151 else if (result.
cd) *resContext=result.
cd;
3152 else if (result.
nd) *resContext=result.
nd;
3153 else if (result.
fd) *resContext=result.
fd;
3154 else if (result.
gd) *resContext=result.
gd;
3155 else if (result.
cnd) *resContext=result.
cnd;
3156 else if (result.
modd) *resContext=result.
modd;
3159 *resContext=
nullptr; *resMember=
nullptr;
3186 else if (tsName.
find(
'.')!=-1)
3198 if (tryUnspecializedVersion)
3200 bool b =
resolveRef(scName,name,inSeeBlock,resContext,resMember,lang,
FALSE,
nullptr,checkScope);
3228 if (!isFileName && result.
find(
'<')==-1) result=
substitute(result,
".",
"::",3);
3230 if (result.
at(0)==
':' && result.
at(1)==
':')
3254 *resContext=
nullptr;
3262 AUTO_TRACE(
"scName='{}',ref='{}'",scName,lr);
3267 const DirDef *dir =
nullptr;
3285 if (si) resAnchor = si->
label();
3297 resAnchor = si->
label();
3328 (cd=
getClass(linkRefWithoutTemplates)))
3335 else if ((cd=
getClass(linkRef+
"-p")))
3352 resAnchor=modd->
anchor();
3373 if (md) resAnchor=md->
anchor();
3411 if (n.
isEmpty())
return nullptr;
3414 const int maxAddrSize = 20;
3415 char addr[maxAddrSize];
3416 qsnprintf(addr,maxAddrSize,
"%p:",
reinterpret_cast<const void*
>(fnMap));
3425 ambig = cachedResult->
isAmbig;
3436 if (name.
isEmpty())
return nullptr;
3443 if (name.
isEmpty())
return nullptr;
3450 const std::unique_ptr<FileDef> &fd = fn->front();
3452 fd->getPath().right(path.
length())==path :
3454 if (path.
isEmpty() || isSamePath)
3456 cachedResult->
fileDef = fd.get();
3465 for (
const auto &fd_p : *fn)
3477 cachedResult->
isAmbig = ambig;
3478 cachedResult->
fileDef = lastMatch;
3508 for (
const auto &s : examplePathList)
3542 path=name.
left(slashPos+1);
3549 for (
const auto &fd : *fn)
3551 if (path.
isEmpty() || fd->getPath().right(path.
length())==path)
3553 if (!first) result +=
"\n";
3555 result+=
" "+fd->absFilePath();
3566 std::string substRes;
3567 const char *p = s.
data();
3571 substRes.reserve(s.
length()+1024);
3578 for (
const auto &kw : keywords)
3580 size_t keyLen =
qstrlen(kw.keyword);
3581 if (
qstrncmp(p,kw.keyword,keyLen)==0)
3583 const char *startArg = p+keyLen;
3584 bool expectParam = std::holds_alternative<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3586 if (expectParam && *startArg==
'(')
3589 const char *endArg =
nullptr;
3590 while ((c=*(startArg+j)) && c!=
')' && c!=
'\n' && c!=0) j++;
3591 if (c==
')') endArg=startArg+j;
3595 auto &&getValue = std::get<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3596 substRes+=getValue(value).str();
3606 else if (!expectParam)
3608 auto &&getValue = std::get<KeywordSubstitution::GetValue>(kw.getValueVariant);
3609 substRes+=getValue().str();
3647 int wi = projectLogo.
find(
" width=");
3650 projectLogo = projectLogo.
left(wi);
3652 int hi = projectLogo.
find(
" height=");
3655 projectLogo = projectLogo.
left(hi);
3668 auto extractDimension = [&projectLogo](
const char *startMarker,
size_t startPos,
size_t endPos) ->
QCString
3671 if (result.
length()>=2 && result.
at(0)!=
'"' && result.
at(result.
length()-1)!=
'"')
3673 result=
"\""+result+
"\"";
3679 int wi = projectLogo.
find(
" width=");
3680 int hi = projectLogo.
find(
" height=");
3681 if (wi!=-1 && hi!=-1)
3685 sizeVal = extractDimension(
" width=", wi+7, hi) +
" "
3686 + extractDimension(
" height=", hi+8, projectLogo.
length());
3690 sizeVal = extractDimension(
" height=", hi+8, wi) +
" "
3691 + extractDimension(
" width=", wi+7, projectLogo.
length());
3696 sizeVal = extractDimension(
" width=", wi+7, projectLogo.
length());
3700 sizeVal = extractDimension(
" height=", hi+8, projectLogo.
length());
3713 {
"$title", [&]() {
return !title.
isEmpty() ? title : projName; } },
3718 {
"$doxygenversion", [&]() {
return getDoxygenVersion(); } },
3719 {
"$projectname", [&]() {
return projName; } },
3720 {
"$projectnumber", [&]() {
return projNum; } },
3721 {
"$projectbrief", [&]() {
return projBrief; } },
3725 {
"$langISO", [&]() {
return theTranslator->trISOLang(); } },
3740 for (
const auto &s : sl)
3742 const char *ps=s.c_str();
3743 const char *pd=name.
data();
3745 while (*ps!=0 && *pd!=0 && *ps==*pd) ps++,pd++,i++;
3746 if (*ps==0 && *pd!=0)
3762int getUtf8Char(
const char *input,
char ids[MAX_UTF8_CHAR_SIZE],CaseModifier modifier)
3765 const unsigned char uc = (
unsigned char)*input;
3766 bool validUTF8Char =
false;
3769 const char* pt = input+1;
3771 if ((uc&0x80)==0x00)
3775 case CaseModifier::None: ids[0]=*input;
break;
3776 case CaseModifier::ToUpper: ids[0]=(char)toupper(*input);
break;
3777 case CaseModifier::ToLower: ids[0]=(char)tolower(*input);
break;
3784 if ((uc&0xE0)==0xC0)
3788 if ((uc&0xF0)==0xE0)
3792 if ((uc&0xF8)==0xF0)
3797 validUTF8Char = l>0;
3798 for (
int m=1; m<l && validUTF8Char; ++m)
3800 unsigned char ct = (
unsigned char)*pt;
3801 if (ct==0 || (ct&0xC0)!=0x80)
3803 validUTF8Char=
false;
3824 if (caseSenseNames == CASE_SENSE_NAMES_t::YES)
return true;
3825 else if (caseSenseNames == CASE_SENSE_NAMES_t::NO)
return false;
3832 if (name.
isEmpty())
return name;
3837 const char *p=name.
data();
3842 case '_':
if (allowUnderscore) growBuf.
addChar(
'_');
else growBuf.
addStr(
"__");
break;
3843 case '-': growBuf.
addChar(
'-');
break;
3844 case ':': growBuf.
addStr(
"_1");
break;
3845 case '/': growBuf.
addStr(
"_2");
break;
3846 case '<': growBuf.
addStr(
"_3");
break;
3847 case '>': growBuf.
addStr(
"_4");
break;
3848 case '*': growBuf.
addStr(
"_5");
break;
3849 case '&': growBuf.
addStr(
"_6");
break;
3850 case '|': growBuf.
addStr(
"_7");
break;
3851 case '.':
if (allowDots) growBuf.
addChar(
'.');
else growBuf.
addStr(
"_8");
break;
3852 case '!': growBuf.
addStr(
"_9");
break;
3853 case ',': growBuf.
addStr(
"_00");
break;
3854 case ' ': growBuf.
addStr(
"_01");
break;
3855 case '{': growBuf.
addStr(
"_02");
break;
3856 case '}': growBuf.
addStr(
"_03");
break;
3857 case '?': growBuf.
addStr(
"_04");
break;
3858 case '^': growBuf.
addStr(
"_05");
break;
3859 case '%': growBuf.
addStr(
"_06");
break;
3860 case '(': growBuf.
addStr(
"_07");
break;
3861 case ')': growBuf.
addStr(
"_08");
break;
3862 case '+': growBuf.
addStr(
"_09");
break;
3863 case '=': growBuf.
addStr(
"_0a");
break;
3864 case '$': growBuf.
addStr(
"_0b");
break;
3865 case '\\': growBuf.
addStr(
"_0c");
break;
3866 case '@': growBuf.
addStr(
"_0d");
break;
3867 case ']': growBuf.
addStr(
"_0e");
break;
3868 case '[': growBuf.
addStr(
"_0f");
break;
3869 case '#': growBuf.
addStr(
"_0g");
break;
3870 case '"': growBuf.
addStr(
"_0h");
break;
3871 case '~': growBuf.
addStr(
"_0i");
break;
3872 case '\'': growBuf.
addStr(
"_0j");
break;
3873 case ';': growBuf.
addStr(
"_0k");
break;
3874 case '`': growBuf.
addStr(
"_0l");
break;
3878 bool doEscape =
true;
3879 if (allowUnicodeNames)
3884 growBuf.
addStr(p-1,charLen);
3892 unsigned char id =
static_cast<unsigned char>(c);
3901 else if (caseSenseNames || !isupper(c))
3908 growBuf.
addChar(
static_cast<char>(tolower(c)));
3914 return growBuf.
get();
3922 const char *p = s.
data();
3932 case '_': result+=c; p++;
break;
3933 case '1': result+=
':'; p++;
break;
3934 case '2': result+=
'/'; p++;
break;
3935 case '3': result+=
'<'; p++;
break;
3936 case '4': result+=
'>'; p++;
break;
3937 case '5': result+=
'*'; p++;
break;
3938 case '6': result+=
'&'; p++;
break;
3939 case '7': result+=
'|'; p++;
break;
3940 case '8': result+=
'.'; p++;
break;
3941 case '9': result+=
'!'; p++;
break;
3945 case '0': result+=
','; p+=2;
break;
3946 case '1': result+=
' '; p+=2;
break;
3947 case '2': result+=
'{'; p+=2;
break;
3948 case '3': result+=
'}'; p+=2;
break;
3949 case '4': result+=
'?'; p+=2;
break;
3950 case '5': result+=
'^'; p+=2;
break;
3951 case '6': result+=
'%'; p+=2;
break;
3952 case '7': result+=
'('; p+=2;
break;
3953 case '8': result+=
')'; p+=2;
break;
3954 case '9': result+=
'+'; p+=2;
break;
3955 case 'a': result+=
'='; p+=2;
break;
3956 case 'b': result+=
'$'; p+=2;
break;
3957 case 'c': result+=
'\\'; p+=2;
break;
3958 case 'd': result+=
'@'; p+=2;
break;
3959 case 'e': result+=
']'; p+=2;
break;
3960 case 'f': result+=
'['; p+=2;
break;
3961 case 'g': result+=
'#'; p+=2;
break;
3962 case 'h': result+=
'"'; p+=2;
break;
3963 case 'i': result+=
'~'; p+=2;
break;
3964 case 'j': result+=
'\''; p+=2;
break;
3965 case 'k': result+=
';'; p+=2;
break;
3966 case 'l': result+=
'`'; p+=2;
break;
3973 if (!caseSenseNames && c>=
'a' && c<=
'z')
3975 result+=
static_cast<char>(toupper(*p));
4006 if (name.
isEmpty())
return name;
4029 size_t resultLen = result.
length();
4033 uint8_t md5_sig[16];
4035 MD5Buffer(result.
data(),
static_cast<unsigned int>(resultLen),md5_sig);
4036 MD5SigToString(md5_sig,sigStr);
4037 result=result.
left(128-32)+sigStr;
4042 int l1Dir=0,l2Dir=0;
4043 int createSubdirsLevel =
Config_getInt(CREATE_SUBDIRS_LEVEL);
4044 int createSubdirsBitmaskL2 = (1<<createSubdirsLevel)-1;
4047 uint8_t md5_sig[16];
4048 MD5Buffer(result.
data(),
static_cast<unsigned int>(result.
length()),md5_sig);
4049 l1Dir = md5_sig[14] & 0xf;
4050 l2Dir = md5_sig[15] & createSubdirsBitmaskL2;
4061 const int sig_size=16;
4062 uint8_t md5_sig[sig_size];
4063 MD5Buffer(fn.
data(),
static_cast<unsigned int>(fn.
length()),md5_sig);
4064 char result[sig_size*3+2];
4067 for (
int i=0;i<sig_size;i++)
4069 static const char oct[]=
"01234567";
4070 uint8_t
byte = md5_sig[i];
4071 *p++=oct[(
byte>>6)&7];
4072 *p++=oct[(
byte>>3)&7];
4073 *p++=oct[(
byte>>0)&7];
4103 QCString absIncFileName = incFileName;
4113 else if (searchIncludes)
4116 for (
const auto &incPath : includePath)
4135 return absIncFileName;
4145 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
4146 for (
int l1=0; l1<16; l1++)
4152 term(
"Failed to create output directory '{}'\n",subdir);
4154 for (
int l2=0; l2<createSubdirsLevelPow2; l2++)
4157 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
4160 term(
"Failed to create output directory '{}'\n",subsubdir);
4172 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
4173 for (
int l1=0;l1<16;l1++)
4177 for (
int l2=0; l2 < createSubdirsLevelPow2; l2++)
4180 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
4199 bool allowEmptyClass)
4206 namespaceName=nd->
name();
4210 p=
static_cast<int>(clName.
length())-2;
4211 while (p>=0 && (i=clName.
findRev(
"::",p))!=-1)
4218 namespaceName=nd->
name();
4227 className=scopeName;
4228 namespaceName.
clear();
4231 if (className.
isEmpty() && !namespaceName.
isEmpty() && !allowEmptyClass)
4234 className=namespaceName;
4235 namespaceName.
clear();
4241 className = className.
left(className.
length()-2);
4282 int l =
static_cast<int>(result.
length());
4285 bool skipBracket=
FALSE;
4292 while (p>=0 && count>=0)
4294 char c=result.
at(p);
4300 if (p>0 && result.
at(p-1)==
':' && (count==0 || skipBracket))
4302 return result.
right(l-p-1);
4313 if (p>0 && result.
at(p-1)==
'>')
4321 bool foundMatch=
false;
4322 while (p>=0 && !foundMatch)
4334 if (round==0) count++;
4341 if (result.
at(p-1) ==
'<')
4348 foundMatch = count==0;
4363 done = count==0 || skipBracket;
4376 const char *p = s.
data();
4382 if ((c>=
'0' && c<=
'9') || (c>=
'a' && c<=
'z') || (c>=
'A' && c<=
'Z') || c==
'-' || c==
':' || c==
'.')
4384 if (first && c>=
'0' && c<=
'9') growBuf.
addChar(
'a');
4390 encChar[1]=
hex[
static_cast<unsigned char>(c)>>4];
4391 encChar[2]=
hex[
static_cast<unsigned char>(c)&0xF];
4398 return growBuf.
get();
4416 const char *p = s.
data();
4422 case '<': growBuf.
addStr(
"<");
break;
4423 case '>': growBuf.
addStr(
">");
break;
4424 case '&':
if (keepEntities)
4430 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
4436 while (p<e) growBuf.
addChar(*p++);
4448 case '\'': growBuf.
addStr(
"'");
break;
4449 case '"': growBuf.
addStr(
""");
break;
4450 case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
4451 case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
4452 case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
4453 case 27:
case 28:
case 29:
case 30:
case 31:
4455 default: growBuf.
addChar(c);
break;
4459 return growBuf.
get();
4467 const char *p=s.
data();
4473 case '<': growBuf.
addStr(
"<");
break;
4474 case '>': growBuf.
addStr(
">");
break;
4475 case '&':
if (keepEntities)
4481 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
4487 while (p<e) growBuf.
addChar(*p++);
4499 case '\'': growBuf.
addStr(
"'");
break;
4500 case '"': growBuf.
addStr(
""");
break;
4503 uint8_t uc =
static_cast<uint8_t
>(c);
4504 if (uc<32 && !isspace(c))
4520 return growBuf.
get();
4527 const char *p=s.
data();
4533 case '"': growBuf.
addStr(
"\\\"");
break;
4534 case '\\':
if (*p==
'u' && *(p+1)==
'{') growBuf.
addStr(
"\\");
4535 else growBuf.
addStr(
"\\\\");
4537 default: growBuf.
addChar(c);
break;
4548 std::string s = str.
data();
4549 static const reg::Ex re(R
"(&\a\w*;)");
4554 size_t p=0, i=0, l=0;
4555 for (; it!=
end ; ++it)
4557 const auto &match = *it;
4558 p = match.position();
4562 growBuf.
addStr(s.substr(i,p-i));
4566 const char *code=
nullptr;
4577 growBuf.
addStr(s.substr(i));
4580 return growBuf.
get();
4598 ASSERT(context!=
nullptr);
4600 if (ml==
nullptr)
return;
4602 struct MoveMemberInfo
4605 : memberDef(md), memberGroup(mg), sli(rv) {}
4610 std::vector<MoveMemberInfo> movedMembers;
4612 for (
const auto &md : *ml)
4614 if (md->isEnumerate())
4616 for (
const auto &fmd : md->enumFieldList())
4618 int groupId=fmd->getMemberGroupId();
4624 const auto &info = it->second;
4625 auto mg_it = std::find_if(pMemberGroups->begin(),
4626 pMemberGroups->end(),
4627 [&groupId](
const auto &g)
4628 { return g->groupId()==groupId; }
4631 if (mg_it==pMemberGroups->end())
4633 auto mg = std::make_unique<MemberGroup>(
4642 pMemberGroups->push_back(std::move(mg));
4646 mg_ptr = (*mg_it).get();
4658 int groupId=md->getMemberGroupId();
4664 const auto &info = it->second;
4665 auto mg_it = std::find_if(pMemberGroups->begin(),
4666 pMemberGroups->end(),
4667 [&groupId](
const auto &g)
4668 { return g->groupId()==groupId; }
4671 if (mg_it==pMemberGroups->end())
4673 auto mg = std::make_unique<MemberGroup>(
4682 pMemberGroups->push_back(std::move(mg));
4686 mg_ptr = (*mg_it).get();
4688 movedMembers.emplace_back(md,mg_ptr,info->m_sli);
4694 for (
const auto &mmi : movedMembers)
4696 ml->
remove(mmi.memberDef);
4697 mmi.memberGroup->insertMember(mmi.memberDef->resolveAlias());
4698 mmi.memberGroup->setRefItems(mmi.sli);
4714 static const reg::Ex re_norm(R
"(\a[\w:]*)");
4715 static const reg::Ex re_fortran(R
"(\a[\w:()=]*)");
4720 if (type.
isEmpty())
return -1;
4721 size_t typeLen=type.
length();
4726 if (type[pos]==
',')
return -1;
4732 std::string s = type.
str();
4738 const auto &match = *it;
4739 size_t i = match.position();
4740 size_t l = match.length();
4745 while (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
' ') ts++,tl++;
4746 if (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
'<')
4751 while (te<typeLen && brCount!=0)
4753 if (type[
static_cast<uint32_t
>(te)]==
'<')
4755 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'<') te++;
else brCount++;
4757 if (type[
static_cast<uint32_t
>(te)]==
'>')
4759 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'>') te++;
else brCount--;
4769 pos=
static_cast<int>(i+l+tl);
4773 pos=
static_cast<int>(i+l);
4777 return static_cast<int>(i);
4780 pos =
static_cast<int>(typeLen);
4792 int p=name.
find(
'<');
4793 if (p==-1)
return name;
4797 std::string s = name.
mid(p).
str();
4798 static const reg::Ex re(R
"([\a:][\w:]*)");
4803 for (; it!=
end ; ++it)
4805 const auto &match = *it;
4806 size_t i = match.position();
4807 size_t l = match.length();
4808 result += s.substr(pi,i-pi);
4811 for (
const Argument &formArg : formalArgs)
4813 if (formArg.name == n)
4839 result+=s.substr(pi);
4857 if (formalArgs.
empty())
return nm;
4860 static const reg::Ex re(R
"(\a\w*)");
4861 std::string name = nm.str();
4866 for (; it!=
end ; ++it)
4868 const auto &match = *it;
4869 size_t i = match.position();
4870 size_t l = match.length();
4871 if (i>p) result += name.substr(p,i-p);
4876 actIt = actualArgs->
begin();
4883 for (
auto formIt = formalArgs.
begin();
4884 formIt!=formalArgs.
end() && !
found;
4890 if (actualArgs && actIt!=actualArgs->
end())
4897 formArg.
type =
"class";
4902 formArg.
type =
"typename";
4906 formArg.
name +=
"...";
4911 formArg.
name +=
"...";
4918 if (formArg.
name==n && actualArgs && actIt!=actualArgs->
end() && !actArg.
type.
isEmpty())
4925 ii = subst.find(
'<');
4927 if (ii!=-1 &&
static_cast<int>(
prefix.length())>=ii+2 &&
prefix.mid(
prefix.length()-ii-2,ii+1)==subst.left(ii+1))
4932 while ((ii=subst.find(nameArg,pp))!=-1)
4934 bool beforeNonWord = ii==0 || !
isId(subst.at(ii-1));
4935 bool afterNonWord = subst.length()==ii+nameArg.length() || !
isId(subst.at(ii+nameArg.length()));
4936 if (beforeNonWord && afterNonWord)
4940 pp=ii+
static_cast<int>(nameArg.length());
4945 AUTO_TRACE_ADD(
"result={} n={} type={} hasRecursion={}",result,n,actArg.
type,hasRecursion(result,n,actArg.
type));
4946 if (!hasRecursion(result,n,actArg.
type))
4958 result += actArg.
type;
4964 result += actArg.
type+
" "+actArg.
name;
4969 else if (formArg.
name==n &&
4970 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4979 else if (formArg.
name==n &&
4980 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4988 if (actualArgs && actIt!=actualArgs->
end())
4999 result+=name.substr(p);
5017 bool allowArtificial)
5020 int i=fullName.
find(
'<');
5021 if (i==-1)
return fullName;
5024 int l=
static_cast<int>(fullName.
length());
5031 while (e<l && count>0)
5033 char c=fullName.
at(e++);
5036 case '(': round++;
break;
5037 case ')':
if (round>0) round--;
break;
5038 case '<':
if (round==0) count++;
break;
5039 case '>':
if (round==0) count--;
break;
5044 int si= fullName.
find(
"::",e);
5046 if (parentOnly && si==-1)
break;
5049 result+=fullName.
mid(p,i-p);
5052 if (cd!=
nullptr && (allowArtificial || !cd->
isArtificial()))
5054 result+=fullName.
mid(i,e-i);
5057 else if (pLastScopeStripped)
5060 *pLastScopeStripped=fullName.
mid(i,e-i);
5063 i=fullName.
find(
'<',p);
5065 result+=fullName.
right(l-p);
5082 AUTO_TRACE(
"leftScope='{}' rightScope='{}'",leftScope,rightScope);
5090 int i=0,p=
static_cast<int>(leftScope.
length());
5095 while ((i=leftScope.
findRev(
"::",p))>0)
5099 result = leftScope.
left(i+2)+rightScope;
5127 int sl=
static_cast<int>(s.
length());
5131 if (sp>=sl)
return -1;
5135 if (c==
':') sp++,p++;
else break;
5147 while (sp<sl && !done)
5153 case '<': count++;
break;
5154 case '>': count--;
if (count==0) done=
true;
break;
5187 bool newPage =
true;
5192 warn(fileName,startLine,
"multiple use of page label '{}' with different titles, (other occurrence: {}, line: {})",
5276 else if (si->
lineNr() != -1)
5278 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {}, line {})",pd->
name(),si->
fileName(),si->
lineNr());
5282 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {})",pd->
name(),si->
fileName());
5307 if (!key.
isEmpty() && key[0]!=
'@')
5312 item->setScope(scope);
5313 item->setName(name);
5314 item->setTitle(title);
5315 item->setArgs(args);
5316 item->setGroup(key);
5364 if (!first) { ol.
writeString(
" | "); }
else first=
false;
5376 if (!first) { ol.
writeString(
" | "); }
else first=
false;
5402 int i_fs = fName.
findRev(
'/');
5403 int i_bs = fName.
findRev(
'\\');
5404 int i = fName.
find(
'.',std::max({ i_fs, i_bs ,0}));
5429 printf(
"replaceNamespaceAliases(%s,%zu)\n",
qPrint(scope),i);
5442 if (i>0 && ns==scope.
left(i))
break;
5444 printf(
"result=%s\n",
qPrint(scope));
5454 result=result.
mid(i+1);
5459 result=result.
mid(i+1);
5468 static const reg::Ex re(R
"(\a+)");
5469 std::string s = str.str();
5472 if (it->
str()==
word)
return true;
5483 static reg::Ex re(R
"(\s*(<\a+>)\s*)");
5484 std::string s = sentence.str();
5490 for ( ; it!=
end ; ++it)
5492 const auto match = *it;
5493 std::string part = match[1].str();
5496 size_t i = match.position();
5497 size_t l = match.length();
5498 result+=s.substr(p,i-p);
5499 result+=match.str();
5505 size_t i = match[1].position();
5506 size_t l = match[1].length();
5507 result+=s.substr(p,i-p);
5511 result+=s.substr(p);
5527 const char *p = s.
data();
5530 int i=0,li=-1,l=
static_cast<int>(s.
length());
5534 if (c==
' ' || c==
'\t' || c==
'\r') i++,p++;
5535 else if (c==
'\\' &&
literal_at(p,
"\\ilinebr")) i+=8,li=i,p+=8;
5536 else if (c==
'\n') i++,li=i,docLine++,p++;
5546 if (c==
' ' || c==
'\t' || c==
'\r') b--,p--;
5547 else if (c==
'r' && b>=7 &&
literal_at(p-7,
"\\ilinebr")) bi=b-7,b-=8,p-=8;
5548 else if (c==
'>' && b>=11 &&
literal_at(p-11,
"\\ilinebr<br>")) bi=b-11,b-=12,p-=12;
5549 else if (c==
'\n') bi=b,b--,p--;
5554 if (li==-1 && bi==-1)
return s;
5561 return s.
mid(li,bi-li);
5604 [&langName](
const auto &info) { return info.langName==langName; });
5611 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5621 err(
"Failed to assign extension {} to parser {} for language {}\n",
5622 extName.
data(),it1->parserName,language);
5710 if (extName.
isEmpty()) extName=
".no_extension";
5711 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5731 if (langName.
at(0)==
'.') langName = langName.
mid(1);
5733 [&langName](
const auto &info) { return info.langName==langName; });
5736 lang = it->parserId;
5737 fileName = it->defExt;
5750 int lastDot = fn.
findRev(
'.');
5751 if (lastDot!=-1)
return fn.
mid(lastDot);
5760 if (scope==
nullptr ||
5780 if (qualifierIndex!=-1)
5782 explicitScopePart = name.
left(qualifierIndex);
5784 name = name.
mid(qualifierIndex+2);
5788 int minDistance = 10000;
5797 if (distance!=-1 && distance<minDistance)
5799 minDistance = distance;
5813 if (bestMatch && bestMatch->
isTypedef())
5821 if (startPos>=len)
return len;
5822 uint8_t c =
static_cast<uint8_t
>(utf8Str[startPos]);
5827 int (*matcher)(int) =
nullptr;
5828 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5832 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5836 matcher = std::isxdigit;
5840 matcher = std::isdigit;
5843 else if (std::isalnum(c))
5846 matcher = std::isalnum;
5850 while ((c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]))!=0 && matcher(c))
5860 return startPos+bytes;
5874 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast.get());
5878 std::visit(visitor,astImpl->root);
5883 int l=
static_cast<int>(result.
length());
5887 if (charCnt>=80)
break;
5894 if (result.
at(i)==
',' ||
5895 result.
at(i)==
'.' ||
5896 result.
at(i)==
'!' ||
5897 result.
at(i)==
'?' ||
5905 if ( i < l) result=result.
left(i)+
"...";
5906 return result.
data();
5913 if (al.
empty())
return;
5935#ifdef TRACINGSUPPORT
5936 void *backtraceFrames[128];
5937 int frameCount = backtrace(backtraceFrames, 128);
5938 const size_t cmdLen = 40960;
5939 static char cmd[cmdLen];
5941 p +=
qsnprintf(p,cmdLen,
"/usr/bin/atos -p %d ", (
int)getpid());
5942 for (
int x = 0; x < frameCount; x++)
5944 p +=
qsnprintf(p,cmdLen,
"%p ", backtraceFrames[x]);
5946 fprintf(stderr,
"========== STACKTRACE START ==============\n");
5950 while (
size_t len = fread(resBuf, 1,
sizeof(resBuf), fp))
5952 fwrite(resBuf, 1, len, stderr);
5956 fprintf(stderr,
"============ STACKTRACE END ==============\n");
5965 if (
qstricmp(inputEncoding,outputEncoding)==0)
return;
5967 if (cd==
reinterpret_cast<void *
>(-1))
5969 term(
"unsupported character conversion: '{}'->'{}': {}\n"
5970 "Check the INPUT_ENCODING setting in the config file!\n",
5971 inputEncoding,outputEncoding,strerror(errno));
5973 size_t iLeft = contents.size();
5974 const char *srcPtr = contents.data();
5975 size_t tmpBufSize = contents.size()*4+1;
5976 size_t oLeft = tmpBufSize;
5978 tmpBuf.resize(tmpBufSize);
5979 char *dstPtr = tmpBuf.data();
5983 newSize = tmpBufSize-oLeft;
5984 tmpBuf.resize(newSize);
5985 std::swap(contents,tmpBuf);
5990 term(
"{}: failed to translate characters from {} to {}: check INPUT_ENCODING\n",
5991 fileName,inputEncoding,outputEncoding);
6003 if (filterName.
isEmpty() || !filter)
6008 err(
"could not open file {}\n",fileName);
6012 auto fileSize = fi.
size();
6013 contents.resize(fileSize);
6014 f.read(contents.data(),fileSize);
6017 err(
"problems while reading file {}\n",fileName);
6023 QCString cmd=filterName+
" \""+fileName+
"\"";
6028 err(
"could not execute filter {}\n",filterName);
6031 const int bufSize=4096;
6034 while ((numRead=
static_cast<int>(fread(buf,1,bufSize,f)))>0)
6037 contents.append(buf,numRead);
6044 if (contents.size()>=2 &&
6045 static_cast<uint8_t
>(contents[0])==0xFF &&
6046 static_cast<uint8_t
>(contents[1])==0xFE
6051 else if (contents.size()>=2 &&
6052 static_cast<uint8_t
>(contents[0])==0xFE &&
6053 static_cast<uint8_t
>(contents[1])==0xFF
6058 else if (contents.size()>=3 &&
6059 static_cast<uint8_t
>(contents[0])==0xEF &&
6060 static_cast<uint8_t
>(contents[1])==0xBB &&
6061 static_cast<uint8_t
>(contents[2])==0xBF
6064 contents.erase(0,3);
6080 std::string t = title.
str();
6081 static const reg::Ex re(R
"(%[a-z_A-Z]+)");
6085 for (; it!=
end ; ++it)
6087 const auto &match = *it;
6088 size_t i = match.position();
6089 size_t l = match.length();
6090 if (i>p) tf+=t.substr(p,i-p);
6091 tf+=match.str().substr(1);
6100template<
class PatternList,
class PatternElem,
typename PatternGet = QCString(*)(const PatternElem &)>
6102 const PatternList &patList,
6112 caseSenseNames =
FALSE;
6115 if (!patList.empty())
6121 for (
const auto &li : patList)
6123 std::string pattern = getter(li).str();
6124 if (!pattern.empty())
6126 size_t i=pattern.find(
'=');
6127 if (i!=std::string::npos) pattern=pattern.substr(0,i);
6129 if (!caseSenseNames)
6160 auto getter = [](std::string s) {
return QCString(s); };
6181 if (extLinksInWindow)
6182 return "target=\"_blank\" ";
6184 return "target=\"_parent\" ";
6201 if (!targetFileName.
isEmpty())
6206 if (!anchor.
isEmpty() && isLocalFile)
6217 if (!anchor.
isEmpty()) url+=
"#"+anchor;
6230 result = it->second;
6231 size_t l = result.
length();
6232 if (!relPath.
isEmpty() && l>0 && result.
at(0)==
'.')
6237 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
6238 if (!href) result.
append(
"\" ");
6261 if (!img.
save(fileName))
6263 fprintf(stderr,
"Warning: Cannot open file %s for writing\n",data->
name);
6279 std::string s=str.
str();
6280 static const reg::Ex re(R
"(##[0-9A-Fa-f][0-9A-Fa-f])");
6286 size_t sl=s.length();
6288 for (; it!=
end ; ++it)
6290 const auto &match = *it;
6291 size_t i = match.position();
6292 size_t l = match.length();
6293 if (i>p) result+=s.substr(p,i-p);
6294 std::string lumStr = match.str().substr(2);
6295#define HEXTONUM(x) (((x)>='0' && (x)<='9') ? ((x)-'0') : \
6296 ((x)>='a' && (x)<='f') ? ((x)-'a'+10) : \
6297 ((x)>='A' && (x)<='F') ? ((x)-'A'+10) : 0)
6299 double r = 0,g = 0,b = 0;
6302 pow(level/255.0,gamma/100.0),&r,&g,&b);
6303 int red =
static_cast<int>(r*255.0);
6304 int green =
static_cast<int>(g*255.0);
6305 int blue =
static_cast<int>(b*255.0);
6308 colStr[1]=
hex[red>>4];
6309 colStr[2]=
hex[red&0xf];
6310 colStr[3]=
hex[green>>4];
6311 colStr[4]=
hex[green&0xf];
6312 colStr[5]=
hex[blue>>4];
6313 colStr[6]=
hex[blue&0xf];
6319 if (p<sl) result+=s.substr(p);
6330 err(
"could not copy file {} to {}\n",src,dest);
6344 int m1 = text.
find(marker);
6345 if (m1==-1)
return result;
6350 while (!
found && (i=text.
find(
'\n',p))!=-1)
6352 found = (p<=m1 && m1<i);
6404 static const std::unordered_set<std::string> schemes = {
6405 "http",
"https",
"ftp",
"ftps",
"sftp",
"file",
"news",
"irc",
"ircs"
6408 int colonPos = loc_url.
find(
':');
6409 return colonPos!=-1 && schemes.find(loc_url.
left(colonPos).
str())!=schemes.end();
6444 const char *p=s.
data();
6447 int minIndent=1000000;
6448 bool searchIndent=
true;
6450 bool skipFirst = skipFirstLine;
6453 if (c==
'\t') indent+=tabSize - (indent%tabSize);
6454 else if (c==
'\n') indent=0,searchIndent=
true,skipFirst=
false;
6455 else if (c==
' ') indent++;
6456 else if (searchIndent && !skipFirst)
6459 if (indent<minIndent) minIndent=indent;
6464 if (minIndent==0)
return substitute(s,
"@ilinebr",
"\\ilinebr");
6470 skipFirst=skipFirstLine;
6479 else if (indent<minIndent && !skipFirst)
6483 int newIndent = indent+tabSize-(indent%tabSize);
6497 else if (c==
'\\' &&
literal_at(p,
"ilinebr "))
6500 result <<
"\\ilinebr ";
6503 for (
int j=0;j<minIndent;j++)
if (*(p+j)==
' ') skipAmount++;
6504 if (skipAmount==minIndent)
6511 result <<
"\\ilinebr";
6522 return result.
str();
6529 if (indentationLevel <= 0 || doc.
isEmpty())
return;
6534 const char *src = doc.
data();
6536 bool insideIndent =
false;
6545 insideIndent =
true;
6546 cnt = indentationLevel;
6557 insideIndent =
false;
6567 insideIndent =
false;
6572 doc.
resize(
static_cast<uint32_t
>(dst-doc.
data()));
6581 return ( ((allExternals && fd->
isLinkable()) ||
6599uint32_t getUtf8Code(
const QCString& s,
int idx )
6601 const int length = s.
length();
6602 if (idx >= length) {
return 0; }
6603 const uint32_t c0 = (uint8_t)s.
at(idx);
6604 if ( c0 < 0xC2 || c0 >= 0xF8 )
6608 if (idx+1 >= length) {
return 0; }
6609 const uint32_t c1 = ((uint8_t)s.
at(idx+1)) & 0x3f;
6612 return ((c0 & 0x1f) << 6) | c1;
6614 if (idx+2 >= length) {
return 0; }
6615 const uint32_t c2 = ((uint8_t)s.
at(idx+2)) & 0x3f;
6618 return ((c0 & 0x0f) << 12) | (c1 << 6) | c2;
6620 if (idx+3 >= length) {
return 0; }
6622 const uint32_t c3 = ((uint8_t)s.
at(idx+3)) & 0x3f;
6623 return ((c0 & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
6635uint32_t getUtf8CodeToLower(
const QCString& s,
int idx )
6637 const uint32_t v = getUtf8Code( s, idx );
6638 return v < 0x7f ? tolower( v ) : v;
6650uint32_t getUtf8CodeToUpper(
const QCString& s,
int idx )
6652 const uint32_t v = getUtf8Code( s, idx );
6653 return v < 0x7f ? toupper( v ) : v;
6667 std::string s = docs.
str();
6668 static const reg::Ex re(R
"(\[([ inout,]+)\])");
6673 const auto &match = *it;
6674 size_t p = match.position();
6675 size_t l = match.length();
6679 std::string dir = match[1].str();
6681 dir.erase(std::remove_if(dir.begin(),dir.end(),
6682 [](
const char c) { return c==
' ' || c==
','; }
6684 unsigned char ioMask=0;
6685 size_t inIndex = dir.find(
"in");
6686 if ( inIndex!=std::string::npos) dir.erase( inIndex,2),ioMask|=(1<<0);
6687 size_t outIndex = dir.find(
"out");
6688 if (outIndex!=std::string::npos) dir.erase(outIndex,3),ioMask|=(1<<1);
6689 if (dir.empty() && ioMask!=0)
6692 if (ioMask==((1<<0)|(1<<1)))
return "[in,out]";
6693 else if (ioMask==(1<<0))
return "[in]";
6694 else if (ioMask==(1<<1))
return "[out]";
6726 *outListType1=inListType;
6744 *outListType2=inListType.
toPublic();
6757 *outListType1=inListType.
toPublic();
6779 int i= imgExt.
find(
':');
6780 return i==-1 ? imgExt : imgExt.
left(i);
6785 assert(!f.is_open());
6786 bool fileOpened=
FALSE;
6787 bool writeToStdout=outFile==
"-";
6790 f.basic_ios<char>::rdbuf(std::cout.rdbuf());
6805 fileOpened = f.is_open();
6812 static const std::unordered_set<std::string> fortran_C_keywords = {
6813 "character",
"call",
"close",
"common",
"continue",
6814 "case",
"contains",
"cycle",
"class",
"codimension",
6815 "concurrent",
"contiguous",
"critical"
6818 if (*contents !=
'c' && *contents !=
'C')
return false;
6820 const char *c = contents;
6822 while (*c && *c !=
' ') {keyword += *c; c++;}
6823 keyword = keyword.
lower();
6825 return (fortran_C_keywords.find(keyword.
str()) != fortran_C_keywords.end());
6833 bool skipLine=
FALSE;
6839 size_t sizCont = contents.
length();
6840 for (
size_t i=0;i<sizCont;i++)
6844 switch(contents.
at(i))
6851 column += tabSize-1;
6868 if (column==1)
return TRUE;
6869 if (skipLine)
break;
6872 if (column!=6) skipLine=
TRUE;
6875 if (skipLine)
break;
6876 if (column>=7)
return TRUE;
6901 auto skipBlock = [&markerInfo](
const char *p,
const SelectionBlock &blk)
6908 size_t len = markerInfo.
endLen;
6909 bool negate = *(p+markerInfo.
endLen)==
'!';
6911 size_t blkNameLen =
qstrlen(blk.name);
6912 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6916 return p+len+blkNameLen+markerInfo.
closeLen;
6933 const char *p = s.
data();
6943 bool negate = *(p+len)==
'!';
6945 for (
const auto &blk : blockList)
6947 size_t blkNameLen =
qstrlen(blk.name);
6948 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6951 bool blockEnabled = blk.enabled!=negate;
6953 p+=len+blkNameLen+markerInfo.
closeLen;
6972 size_t len = markerInfo.
endLen;
6973 bool negate = *(p+len)==
'!';
6975 for (
const auto &blk : blockList)
6977 size_t blkNameLen =
qstrlen(blk.name);
6978 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6982 p+=len+blkNameLen+markerInfo.
closeLen;
7013 const char *p = s.
data();
7022 bool negate = *(p+len)==
'!';
7028 if (markerInfo.
closeLen==0 && *p==
'\n')
7030 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
7036 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
7045 size_t len = markerInfo.
endLen;
7046 bool negate = *(p+len)==
'!';
7052 if (markerInfo.
closeLen==0 && *p==
'\n')
7054 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
7060 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
7077 const char *p=s.
data();
7086 while (*e==
' ' || *e==
'\t') e++;
7108 size_t prev = 0, pos = 0, len = s.length();
7111 pos = s.find(delimiter, prev);
7112 if (pos == std::string::npos) pos = len;
7113 if (pos>prev) result.push_back(s.substr(prev,pos-prev));
7114 prev = pos + delimiter.length();
7116 while (pos<len && prev<len);
7128 for ( ; iter !=
end; ++iter)
7130 const auto &match = *iter;
7131 size_t i=match.position();
7132 size_t l=match.length();
7133 if (i>p) result.push_back(s.substr(p,i-p));
7136 if (p<s.length()) result.push_back(s.substr(p));
7143 auto it = std::find(sv.begin(),sv.end(),s);
7144 return it!=sv.end() ?
static_cast<int>(it-sv.begin()) : -1;
7152 return reg::search(s,match,re) ?
static_cast<int>(match.position()) : -1;
7160 for (
const auto &s : sv)
7162 if (!first) result+=delimiter;
7176 while (residual > 0)
7178 modVal[0] = (upper ?
'A':
'a') + (residual-1)%26;
7179 result = modVal + result;
7180 residual = (residual-1) / 26;
7187 static const char *str_romans_upper[] = {
"M",
"CM",
"D",
"CD",
"C",
"XC",
"L",
"XL",
"X",
"IX",
"V",
"IV",
"I" };
7188 static const char *str_romans_lower[] = {
"m",
"cm",
"d",
"cd",
"c",
"xc",
"l",
"xl",
"x",
"ix",
"v",
"iv",
"i" };
7189 static const int values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
7190 static const char **str_romans = upper ? str_romans_upper : str_romans_lower;
7195 for (
int i = 0; i < 13; ++i)
7197 while (residual - values[i] >= 0)
7199 result += str_romans[i];
7200 residual -= values[i];
7210 size_t size = s.
length();
7212 const char *data = s.
data();
7215 constexpr auto doxy_nbsp =
"&_doxy_nbsp;";
7216 const int maxIndent=1000000;
7217 int minIndent=maxIndent;
7226 int stop = tabSize - (col%tabSize);
7229 while (stop--) out.
addChar(
' ');
7233 if (data[i] ==
'\\')
7239 else if (i+5<size &&
literal_at(data+i,
"iskip"))
7244 else if (i+8<size &&
literal_at(data+i,
"endiskip"))
7276 for (
int j=0;j<bytes-1 && c;j++)
7288 if (!skip && col<minIndent) minIndent=col;
7292 if (minIndent!=maxIndent) refIndent=minIndent;
else refIndent=0;
7302 uint8_t md5_sig[16];
7304 MD5Buffer(projectCookie.
data(),
static_cast<unsigned int>(projectCookie.
length()),md5_sig);
7305 MD5SigToString(md5_sig,sigStr);
7306 sigStr[32]=
'_'; sigStr[33]=0;
7313 int l =
static_cast<int>(name.
length());
7314 int lastSepPos = -1;
7315 const char *p = name.
data();
7324 if (sharpCount==0 && p[i+1]==
':' && p[i+2]==
':')
7338 if (ts==-1) ts=0;
else p+=++ts;
7339 for (i=ts;i<l-1;i++)
7342 if (c==
':' && *p==
':') lastSepPos=i;
7377 case '\t': col+=tabSize - (col%tabSize);
7386 for (
int i=0;i<numBytes-1 && (c=*s++);i++) {}
7387 if (c==0)
return col;
7402 int idx = name.
find(
'<');
7415 int idx = result.
find(
'-');
7416 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 hasTemplateDocumentation() 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)
bool literal_at(const char *data, const char(&str)[N])
returns TRUE iff data points to a substring that matches string literal str
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)
bool matchTemplateArguments(const ArgumentList &srcAl, const ArgumentList &dstAl)
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)
QCString stripIndentation(const QCString &s, bool skipFirstLine)
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)
QCString inlineTemplateArgListToDoc(const ArgumentList &al)
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()
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