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())
1259 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
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)
1282 if (!a.typeConstraint.isEmpty() && lang==SrcLangExt::Java)
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)
2990 if (lang==SrcLangExt::CSharp && (templStartPos=fullName.
find(
'<'))!=-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;
3257 if (lang==SrcLangExt::CSharp)
3262 AUTO_TRACE(
"scName='{}',ref='{}'",scName,lr);
3267 const DirDef *dir =
nullptr;
3285 if (si) resAnchor = si->
label();
3297 resAnchor = si->
label();
3304 resAnchor = si->
label();
3334 else if (lang==SrcLangExt::Java &&
3335 (cd=
getClass(linkRefWithoutTemplates)))
3342 else if ((cd=
getClass(linkRef+
"-p")))
3359 resAnchor=modd->
anchor();
3380 if (md) resAnchor=md->
anchor();
3418 if (n.
isEmpty())
return nullptr;
3421 const int maxAddrSize = 20;
3422 char addr[maxAddrSize];
3423 qsnprintf(addr,maxAddrSize,
"%p:",
reinterpret_cast<const void*
>(fnMap));
3432 ambig = cachedResult->
isAmbig;
3443 if (name.
isEmpty())
return nullptr;
3450 if (name.
isEmpty())
return nullptr;
3457 const std::unique_ptr<FileDef> &fd = fn->front();
3459 fd->getPath().right(path.
length())==path :
3461 if (path.
isEmpty() || isSamePath)
3463 cachedResult->
fileDef = fd.get();
3472 for (
const auto &fd_p : *fn)
3484 cachedResult->
isAmbig = ambig;
3485 cachedResult->
fileDef = lastMatch;
3515 for (
const auto &s : examplePathList)
3549 path=name.
left(slashPos+1);
3556 for (
const auto &fd : *fn)
3558 if (path.
isEmpty() || fd->getPath().right(path.
length())==path)
3560 if (!first) result +=
"\n";
3562 result+=
" "+fd->absFilePath();
3573 std::string substRes;
3575 const char *p = s.
data();
3579 substRes.reserve(s.
length()+1024);
3586 for (
const auto &kw : keywords)
3588 size_t keyLen =
qstrlen(kw.keyword);
3589 if (
qstrncmp(p,kw.keyword,keyLen)==0)
3591 const char *startArg = p+keyLen;
3592 bool expectParam = std::holds_alternative<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3594 if (expectParam && *startArg==
'(')
3597 const char *endArg =
nullptr;
3598 while ((c=*(startArg+j)) && c!=
')' && c!=
'\n' && c!=0) j++;
3599 if (c==
')') endArg=startArg+j;
3603 auto &&getValue = std::get<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3604 substRes+=getValue(value).str();
3611 warn(file,line,
"Missing argument for '{}'",kw.keyword);
3615 else if (!expectParam)
3617 auto &&getValue = std::get<KeywordSubstitution::GetValue>(kw.getValueVariant);
3618 substRes+=getValue().str();
3625 warn(file,line,
"Expected arguments for '{}' but none were specified",kw.keyword);
3635 if (c==
'\n') line++;
3663 int wi = projectLogo.
find(
" width=");
3666 projectLogo = projectLogo.
left(wi);
3668 int hi = projectLogo.
find(
" height=");
3671 projectLogo = projectLogo.
left(hi);
3684 auto extractDimension = [&projectLogo](
const char *startMarker,
size_t startPos,
size_t endPos) ->
QCString
3687 if (result.
length()>=2 && result.
at(0)!=
'"' && result.
at(result.
length()-1)!=
'"')
3689 result=
"\""+result+
"\"";
3695 int wi = projectLogo.
find(
" width=");
3696 int hi = projectLogo.
find(
" height=");
3697 if (wi!=-1 && hi!=-1)
3701 sizeVal = extractDimension(
" width=", wi+7, hi) +
" "
3702 + extractDimension(
" height=", hi+8, projectLogo.
length());
3706 sizeVal = extractDimension(
" height=", hi+8, wi) +
" "
3707 + extractDimension(
" width=", wi+7, projectLogo.
length());
3712 sizeVal = extractDimension(
" width=", wi+7, projectLogo.
length());
3716 sizeVal = extractDimension(
" height=", hi+8, projectLogo.
length());
3729 {
"$title", [&]() {
return !title.
isEmpty() ? title : projName; } },
3734 {
"$doxygenversion", [&]() {
return getDoxygenVersion(); } },
3735 {
"$projectname", [&]() {
return projName; } },
3736 {
"$projectnumber", [&]() {
return projNum; } },
3737 {
"$projectbrief", [&]() {
return projBrief; } },
3741 {
"$langISO", [&]() {
return theTranslator->trISOLang(); } },
3756 for (
const auto &s : sl)
3758 const char *ps=s.c_str();
3759 const char *pd=name.
data();
3761 while (*ps!=0 && *pd!=0 && *ps==*pd) ps++,pd++,i++;
3762 if (*ps==0 && *pd!=0)
3778int getUtf8Char(
const char *input,
char ids[MAX_UTF8_CHAR_SIZE],CaseModifier modifier)
3781 const unsigned char uc = (
unsigned char)*input;
3782 bool validUTF8Char =
false;
3785 const char* pt = input+1;
3787 if ((uc&0x80)==0x00)
3791 case CaseModifier::None: ids[0]=*input;
break;
3792 case CaseModifier::ToUpper: ids[0]=(char)toupper(*input);
break;
3793 case CaseModifier::ToLower: ids[0]=(char)tolower(*input);
break;
3800 if ((uc&0xE0)==0xC0)
3804 if ((uc&0xF0)==0xE0)
3808 if ((uc&0xF8)==0xF0)
3813 validUTF8Char = l>0;
3814 for (
int m=1; m<l && validUTF8Char; ++m)
3816 unsigned char ct = (
unsigned char)*pt;
3817 if (ct==0 || (ct&0xC0)!=0x80)
3819 validUTF8Char=
false;
3840 if (caseSenseNames == CASE_SENSE_NAMES_t::YES)
return true;
3841 else if (caseSenseNames == CASE_SENSE_NAMES_t::NO)
return false;
3848 if (name.
isEmpty())
return name;
3853 const char *p=name.
data();
3858 case '_':
if (allowUnderscore) growBuf.
addChar(
'_');
else growBuf.
addStr(
"__");
break;
3859 case '-': growBuf.
addChar(
'-');
break;
3860 case ':': growBuf.
addStr(
"_1");
break;
3861 case '/': growBuf.
addStr(
"_2");
break;
3862 case '<': growBuf.
addStr(
"_3");
break;
3863 case '>': growBuf.
addStr(
"_4");
break;
3864 case '*': growBuf.
addStr(
"_5");
break;
3865 case '&': growBuf.
addStr(
"_6");
break;
3866 case '|': growBuf.
addStr(
"_7");
break;
3867 case '.':
if (allowDots) growBuf.
addChar(
'.');
else growBuf.
addStr(
"_8");
break;
3868 case '!': growBuf.
addStr(
"_9");
break;
3869 case ',': growBuf.
addStr(
"_00");
break;
3870 case ' ': growBuf.
addStr(
"_01");
break;
3871 case '{': growBuf.
addStr(
"_02");
break;
3872 case '}': growBuf.
addStr(
"_03");
break;
3873 case '?': growBuf.
addStr(
"_04");
break;
3874 case '^': growBuf.
addStr(
"_05");
break;
3875 case '%': growBuf.
addStr(
"_06");
break;
3876 case '(': growBuf.
addStr(
"_07");
break;
3877 case ')': growBuf.
addStr(
"_08");
break;
3878 case '+': growBuf.
addStr(
"_09");
break;
3879 case '=': growBuf.
addStr(
"_0a");
break;
3880 case '$': growBuf.
addStr(
"_0b");
break;
3881 case '\\': growBuf.
addStr(
"_0c");
break;
3882 case '@': growBuf.
addStr(
"_0d");
break;
3883 case ']': growBuf.
addStr(
"_0e");
break;
3884 case '[': growBuf.
addStr(
"_0f");
break;
3885 case '#': growBuf.
addStr(
"_0g");
break;
3886 case '"': growBuf.
addStr(
"_0h");
break;
3887 case '~': growBuf.
addStr(
"_0i");
break;
3888 case '\'': growBuf.
addStr(
"_0j");
break;
3889 case ';': growBuf.
addStr(
"_0k");
break;
3890 case '`': growBuf.
addStr(
"_0l");
break;
3894 bool doEscape =
true;
3895 if (allowUnicodeNames)
3900 growBuf.
addStr(p-1,charLen);
3908 unsigned char id =
static_cast<unsigned char>(c);
3917 else if (caseSenseNames || !isupper(c))
3924 growBuf.
addChar(
static_cast<char>(tolower(c)));
3930 return growBuf.
get();
3938 const char *p = s.
data();
3948 case '_': result+=c; p++;
break;
3949 case '1': result+=
':'; p++;
break;
3950 case '2': result+=
'/'; p++;
break;
3951 case '3': result+=
'<'; p++;
break;
3952 case '4': result+=
'>'; p++;
break;
3953 case '5': result+=
'*'; p++;
break;
3954 case '6': result+=
'&'; p++;
break;
3955 case '7': result+=
'|'; p++;
break;
3956 case '8': result+=
'.'; p++;
break;
3957 case '9': result+=
'!'; p++;
break;
3961 case '0': result+=
','; p+=2;
break;
3962 case '1': result+=
' '; p+=2;
break;
3963 case '2': result+=
'{'; p+=2;
break;
3964 case '3': result+=
'}'; p+=2;
break;
3965 case '4': result+=
'?'; p+=2;
break;
3966 case '5': result+=
'^'; p+=2;
break;
3967 case '6': result+=
'%'; p+=2;
break;
3968 case '7': result+=
'('; p+=2;
break;
3969 case '8': result+=
')'; p+=2;
break;
3970 case '9': result+=
'+'; p+=2;
break;
3971 case 'a': result+=
'='; p+=2;
break;
3972 case 'b': result+=
'$'; p+=2;
break;
3973 case 'c': result+=
'\\'; p+=2;
break;
3974 case 'd': result+=
'@'; p+=2;
break;
3975 case 'e': result+=
']'; p+=2;
break;
3976 case 'f': result+=
'['; p+=2;
break;
3977 case 'g': result+=
'#'; p+=2;
break;
3978 case 'h': result+=
'"'; p+=2;
break;
3979 case 'i': result+=
'~'; p+=2;
break;
3980 case 'j': result+=
'\''; p+=2;
break;
3981 case 'k': result+=
';'; p+=2;
break;
3982 case 'l': result+=
'`'; p+=2;
break;
3989 if (!caseSenseNames && c>=
'a' && c<=
'z')
3991 result+=
static_cast<char>(toupper(*p));
4022 if (name.
isEmpty())
return name;
4045 size_t resultLen = result.
length();
4049 uint8_t md5_sig[16];
4051 MD5Buffer(result.
data(),
static_cast<unsigned int>(resultLen),md5_sig);
4052 MD5SigToString(md5_sig,sigStr);
4053 result=result.
left(128-32)+sigStr;
4058 int l1Dir=0,l2Dir=0;
4059 int createSubdirsLevel =
Config_getInt(CREATE_SUBDIRS_LEVEL);
4060 int createSubdirsBitmaskL2 = (1<<createSubdirsLevel)-1;
4063 uint8_t md5_sig[16];
4064 MD5Buffer(result.
data(),
static_cast<unsigned int>(result.
length()),md5_sig);
4065 l1Dir = md5_sig[14] & 0xf;
4066 l2Dir = md5_sig[15] & createSubdirsBitmaskL2;
4077 const int sig_size=16;
4078 uint8_t md5_sig[sig_size];
4079 MD5Buffer(fn.
data(),
static_cast<unsigned int>(fn.
length()),md5_sig);
4080 char result[sig_size*3+2];
4083 for (
int i=0;i<sig_size;i++)
4085 static const char oct[]=
"01234567";
4086 uint8_t
byte = md5_sig[i];
4087 *p++=oct[(
byte>>6)&7];
4088 *p++=oct[(
byte>>3)&7];
4089 *p++=oct[(
byte>>0)&7];
4119 QCString absIncFileName = incFileName;
4129 else if (searchIncludes)
4132 for (
const auto &incPath : includePath)
4151 return absIncFileName;
4161 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
4162 for (
int l1=0; l1<16; l1++)
4168 term(
"Failed to create output directory '{}'\n",subdir);
4170 for (
int l2=0; l2<createSubdirsLevelPow2; l2++)
4173 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
4176 term(
"Failed to create output directory '{}'\n",subsubdir);
4188 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
4189 for (
int l1=0;l1<16;l1++)
4193 for (
int l2=0; l2 < createSubdirsLevelPow2; l2++)
4196 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
4215 bool allowEmptyClass)
4222 namespaceName=nd->
name();
4226 p=
static_cast<int>(clName.
length())-2;
4227 while (p>=0 && (i=clName.
findRev(
"::",p))!=-1)
4234 namespaceName=nd->
name();
4243 className=scopeName;
4244 namespaceName.
clear();
4247 if (className.
isEmpty() && !namespaceName.
isEmpty() && !allowEmptyClass)
4250 className=namespaceName;
4251 namespaceName.
clear();
4257 className = className.
left(className.
length()-2);
4298 int l =
static_cast<int>(result.
length());
4301 bool skipBracket=
FALSE;
4308 while (p>=0 && count>=0)
4310 char c=result.
at(p);
4316 if (p>0 && result.
at(p-1)==
':' && (count==0 || skipBracket))
4318 return result.
right(l-p-1);
4329 if (p>0 && result.
at(p-1)==
'>')
4337 bool foundMatch=
false;
4338 while (p>=0 && !foundMatch)
4350 if (round==0) count++;
4357 if (result.
at(p-1) ==
'<')
4364 foundMatch = count==0;
4379 done = count==0 || skipBracket;
4392 const char *p = s.
data();
4398 if ((c>=
'0' && c<=
'9') || (c>=
'a' && c<=
'z') || (c>=
'A' && c<=
'Z') || c==
'-' || c==
':' )
4400 if (first && c>=
'0' && c<=
'9') growBuf.
addChar(
'a');
4406 encChar[1]=
hex[
static_cast<unsigned char>(c)>>4];
4407 encChar[2]=
hex[
static_cast<unsigned char>(c)&0xF];
4414 return growBuf.
get();
4432 const char *p = s.
data();
4438 case '<': growBuf.
addStr(
"<");
break;
4439 case '>': growBuf.
addStr(
">");
break;
4440 case '&':
if (keepEntities)
4446 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
4452 while (p<e) growBuf.
addChar(*p++);
4464 case '\'': growBuf.
addStr(
"'");
break;
4465 case '"': growBuf.
addStr(
""");
break;
4466 case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
4467 case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
4468 case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
4469 case 27:
case 28:
case 29:
case 30:
case 31:
4471 default: growBuf.
addChar(c);
break;
4475 return growBuf.
get();
4483 const char *p=s.
data();
4489 case '<': growBuf.
addStr(
"<");
break;
4490 case '>': growBuf.
addStr(
">");
break;
4491 case '&':
if (keepEntities)
4497 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
4503 while (p<e) growBuf.
addChar(*p++);
4515 case '\'': growBuf.
addStr(
"'");
break;
4516 case '"': growBuf.
addStr(
""");
break;
4519 uint8_t uc =
static_cast<uint8_t
>(c);
4520 if (uc<32 && !isspace(c))
4536 return growBuf.
get();
4543 const char *p=s.
data();
4549 case '"': growBuf.
addStr(
"\\\"");
break;
4550 case '\\':
if (*p==
'u' && *(p+1)==
'{') growBuf.
addStr(
"\\");
4551 else growBuf.
addStr(
"\\\\");
4553 default: growBuf.
addChar(c);
break;
4564 std::string s = str.
data();
4565 static const reg::Ex re(R
"(&\a\w*;)");
4570 size_t p=0, i=0, l=0;
4571 for (; it!=
end ; ++it)
4573 const auto &match = *it;
4574 p = match.position();
4578 growBuf.
addStr(s.substr(i,p-i));
4582 const char *code=
nullptr;
4593 growBuf.
addStr(s.substr(i));
4596 return growBuf.
get();
4614 ASSERT(context!=
nullptr);
4616 if (ml==
nullptr)
return;
4618 struct MoveMemberInfo
4621 : memberDef(md), memberGroup(mg), sli(rv) {}
4626 std::vector<MoveMemberInfo> movedMembers;
4628 for (
const auto &md : *ml)
4630 if (md->isEnumerate())
4632 for (
const auto &fmd : md->enumFieldList())
4634 int groupId=fmd->getMemberGroupId();
4640 const auto &info = it->second;
4641 auto mg_it = std::find_if(pMemberGroups->begin(),
4642 pMemberGroups->end(),
4643 [&groupId](
const auto &g)
4644 { return g->groupId()==groupId; }
4647 if (mg_it==pMemberGroups->end())
4649 auto mg = std::make_unique<MemberGroup>(
4658 pMemberGroups->push_back(std::move(mg));
4662 mg_ptr = (*mg_it).get();
4674 int groupId=md->getMemberGroupId();
4680 const auto &info = it->second;
4681 auto mg_it = std::find_if(pMemberGroups->begin(),
4682 pMemberGroups->end(),
4683 [&groupId](
const auto &g)
4684 { return g->groupId()==groupId; }
4687 if (mg_it==pMemberGroups->end())
4689 auto mg = std::make_unique<MemberGroup>(
4698 pMemberGroups->push_back(std::move(mg));
4702 mg_ptr = (*mg_it).get();
4704 movedMembers.emplace_back(md,mg_ptr,info->m_sli);
4710 for (
const auto &mmi : movedMembers)
4712 ml->
remove(mmi.memberDef);
4713 mmi.memberGroup->insertMember(mmi.memberDef->resolveAlias());
4714 mmi.memberGroup->setRefItems(mmi.sli);
4730 static const reg::Ex re_norm(R
"(\a[\w:]*)");
4731 static const reg::Ex re_fortran(R
"(\a[\w:()=]*)");
4736 if (type.
isEmpty())
return -1;
4737 size_t typeLen=type.
length();
4740 if (lang == SrcLangExt::Fortran)
4742 if (type[pos]==
',')
return -1;
4748 std::string s = type.
str();
4754 const auto &match = *it;
4755 size_t i = match.position();
4756 size_t l = match.length();
4761 while (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
' ') ts++,tl++;
4762 if (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
'<')
4767 while (te<typeLen && brCount!=0)
4769 if (type[
static_cast<uint32_t
>(te)]==
'<')
4771 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'<') te++;
else brCount++;
4773 if (type[
static_cast<uint32_t
>(te)]==
'>')
4775 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'>') te++;
else brCount--;
4785 pos=
static_cast<int>(i+l+tl);
4789 pos=
static_cast<int>(i+l);
4793 return static_cast<int>(i);
4796 pos =
static_cast<int>(typeLen);
4808 int p=name.
find(
'<');
4809 if (p==-1)
return name;
4813 std::string s = name.
mid(p).
str();
4814 static const reg::Ex re(R
"([\a:][\w:]*)");
4819 for (; it!=
end ; ++it)
4821 const auto &match = *it;
4822 size_t i = match.position();
4823 size_t l = match.length();
4824 result += s.substr(pi,i-pi);
4827 for (
const Argument &formArg : formalArgs)
4829 if (formArg.name == n)
4855 result+=s.substr(pi);
4873 if (formalArgs.
empty())
return nm;
4876 static const reg::Ex re(R
"(\a\w*)");
4877 std::string name = nm.str();
4882 for (; it!=
end ; ++it)
4884 const auto &match = *it;
4885 size_t i = match.position();
4886 size_t l = match.length();
4887 if (i>p) result += name.substr(p,i-p);
4892 actIt = actualArgs->
begin();
4899 for (
auto formIt = formalArgs.
begin();
4900 formIt!=formalArgs.
end() && !
found;
4906 if (actualArgs && actIt!=actualArgs->
end())
4913 formArg.
type =
"class";
4918 formArg.
type =
"typename";
4922 formArg.
name +=
"...";
4927 formArg.
name +=
"...";
4934 if (formArg.
name==n && actualArgs && actIt!=actualArgs->
end() && !actArg.
type.
isEmpty())
4941 ii = subst.find(
'<');
4943 if (ii!=-1 &&
static_cast<int>(
prefix.length())>=ii+2 &&
prefix.mid(
prefix.length()-ii-2,ii+1)==subst.left(ii+1))
4948 while ((ii=subst.find(nameArg,pp))!=-1)
4950 bool beforeNonWord = ii==0 || !
isId(subst.at(ii-1));
4951 bool afterNonWord = subst.length()==ii+nameArg.length() || !
isId(subst.at(ii+nameArg.length()));
4952 if (beforeNonWord && afterNonWord)
4956 pp=ii+
static_cast<int>(nameArg.length());
4961 AUTO_TRACE_ADD(
"result={} n={} type={} hasRecursion={}",result,n,actArg.
type,hasRecursion(result,n,actArg.
type));
4962 if (!hasRecursion(result,n,actArg.
type))
4974 result += actArg.
type;
4980 result += actArg.
type+
" "+actArg.
name;
4985 else if (formArg.
name==n &&
4986 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4995 else if (formArg.
name==n &&
4996 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
5004 if (actualArgs && actIt!=actualArgs->
end())
5015 result+=name.substr(p);
5033 bool allowArtificial)
5036 int i=fullName.
find(
'<');
5037 if (i==-1)
return fullName;
5040 int l=
static_cast<int>(fullName.
length());
5047 while (e<l && count>0)
5049 char c=fullName.
at(e++);
5052 case '(': round++;
break;
5053 case ')':
if (round>0) round--;
break;
5054 case '<':
if (round==0) count++;
break;
5055 case '>':
if (round==0) count--;
break;
5060 int si= fullName.
find(
"::",e);
5062 if (parentOnly && si==-1)
break;
5065 result+=fullName.
mid(p,i-p);
5068 if (cd!=
nullptr && (allowArtificial || !cd->
isArtificial()))
5070 result+=fullName.
mid(i,e-i);
5073 else if (pLastScopeStripped)
5076 *pLastScopeStripped=fullName.
mid(i,e-i);
5079 i=fullName.
find(
'<',p);
5081 result+=fullName.
right(l-p);
5098 AUTO_TRACE(
"leftScope='{}' rightScope='{}'",leftScope,rightScope);
5106 int i=0,p=
static_cast<int>(leftScope.
length());
5111 while ((i=leftScope.
findRev(
"::",p))>0)
5115 result = leftScope.
left(i+2)+rightScope;
5143 int sl=
static_cast<int>(s.
length());
5147 if (sp>=sl)
return -1;
5151 if (c==
':') sp++,p++;
else break;
5163 while (sp<sl && !done)
5169 case '<': count++;
break;
5170 case '>': count--;
if (count==0) done=
true;
break;
5203 bool newPage =
true;
5208 warn(fileName,startLine,
"multiple use of page label '{}' with different titles, (other occurrence: {}, line: {})",
5292 else if (si->
lineNr() != -1)
5294 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {}, line {})",pd->
name(),si->
fileName(),si->
lineNr());
5298 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {})",pd->
name(),si->
fileName());
5323 if (!key.
isEmpty() && key[0]!=
'@')
5328 item->setScope(scope);
5329 item->setName(name);
5330 item->setTitle(title);
5331 item->setArgs(args);
5332 item->setGroup(key);
5380 if (!first) { ol.
writeString(
" | "); }
else first=
false;
5392 if (!first) { ol.
writeString(
" | "); }
else first=
false;
5418 int i_fs = fName.
findRev(
'/');
5419 int i_bs = fName.
findRev(
'\\');
5420 int i = fName.
find(
'.',std::max({ i_fs, i_bs ,0}));
5445 printf(
"replaceNamespaceAliases(%s,%zu)\n",
qPrint(scope),i);
5458 if (i>0 && ns==scope.
left(i))
break;
5460 printf(
"result=%s\n",
qPrint(scope));
5470 result=result.
mid(i+1);
5475 result=result.
mid(i+1);
5484 static const reg::Ex re(R
"(\a+)");
5485 std::string s = str.str();
5488 if (it->
str()==
word)
return true;
5499 static reg::Ex re(R
"(\s*(<\a+>)\s*)");
5500 std::string s = sentence.str();
5506 for ( ; it!=
end ; ++it)
5508 const auto match = *it;
5509 std::string part = match[1].str();
5512 size_t i = match.position();
5513 size_t l = match.length();
5514 result+=s.substr(p,i-p);
5515 result+=match.str();
5521 size_t i = match[1].position();
5522 size_t l = match[1].length();
5523 result+=s.substr(p,i-p);
5527 result+=s.substr(p);
5543 const char *p = s.
data();
5546 int i=0,li=-1,l=
static_cast<int>(s.
length());
5550 if (c==
' ' || c==
'\t' || c==
'\r') i++,p++;
5551 else if (c==
'\\' &&
literal_at(p,
"\\ilinebr")) i+=8,li=i,p+=8;
5552 else if (c==
'\n') i++,li=i,docLine++,p++;
5562 if (c==
' ' || c==
'\t' || c==
'\r') b--,p--;
5563 else if (c==
'r' && b>=7 &&
literal_at(p-7,
"\\ilinebr")) bi=b-7,b-=8,p-=8;
5564 else if (c==
'>' && b>=11 &&
literal_at(p-11,
"\\ilinebr<br>")) bi=b-11,b-=12,p-=12;
5565 else if (c==
'\n') bi=b,b--,p--;
5570 if (li==-1 && bi==-1)
return s;
5577 return s.
mid(li,bi-li);
5595 {
"idl",
"c", SrcLangExt::IDL,
".idl" },
5596 {
"java",
"c", SrcLangExt::Java,
".java"},
5597 {
"javascript",
"c", SrcLangExt::JS,
".js" },
5598 {
"csharp",
"c", SrcLangExt::CSharp,
".cs" },
5599 {
"d",
"c", SrcLangExt::D,
".d" },
5600 {
"php",
"c", SrcLangExt::PHP,
".php" },
5601 {
"objective-c",
"c", SrcLangExt::ObjC,
".m" },
5602 {
"c",
"c", SrcLangExt::Cpp,
".c" },
5603 {
"c++",
"c", SrcLangExt::Cpp,
".cpp" },
5604 {
"slice",
"c", SrcLangExt::Slice,
".ice" },
5605 {
"python",
"python", SrcLangExt::Python,
".py" },
5606 {
"fortran",
"fortran", SrcLangExt::Fortran,
".f" },
5607 {
"fortranfree",
"fortranfree", SrcLangExt::Fortran,
".f90" },
5608 {
"fortranfixed",
"fortranfixed", SrcLangExt::Fortran,
".f" },
5609 {
"vhdl",
"vhdl", SrcLangExt::VHDL,
".vhdl"},
5610 {
"xml",
"xml", SrcLangExt::XML,
".xml" },
5611 {
"sql",
"sql", SrcLangExt::SQL,
".sql" },
5612 {
"md",
"md", SrcLangExt::Markdown,
".md" },
5613 {
"lex",
"lex", SrcLangExt::Lex,
".l" },
5620 [&langName](
const auto &info) { return info.langName==langName; });
5627 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5637 err(
"Failed to assign extension {} to parser {} for language {}\n",
5638 extName.
data(),it1->parserName,language);
5726 if (extName.
isEmpty()) extName=
".no_extension";
5727 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5743 if (lang == SrcLangExt::Unknown)
5747 if (langName.
at(0)==
'.') langName = langName.
mid(1);
5749 [&langName](
const auto &info) { return info.langName==langName; });
5752 lang = it->parserId;
5753 fileName = it->defExt;
5757 return SrcLangExt::Cpp;
5766 int lastDot = fn.
findRev(
'.');
5767 if (lastDot!=-1)
return fn.
mid(lastDot);
5776 if (scope==
nullptr ||
5796 if (qualifierIndex!=-1)
5798 explicitScopePart = name.
left(qualifierIndex);
5800 name = name.
mid(qualifierIndex+2);
5804 int minDistance = 10000;
5813 if (distance!=-1 && distance<minDistance)
5815 minDistance = distance;
5829 if (bestMatch && bestMatch->
isTypedef())
5837 if (startPos>=len)
return len;
5838 uint8_t c =
static_cast<uint8_t
>(utf8Str[startPos]);
5843 int (*matcher)(int) =
nullptr;
5844 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5848 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5852 matcher = std::isxdigit;
5856 matcher = std::isdigit;
5859 else if (std::isalnum(c))
5862 matcher = std::isalnum;
5866 while ((c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]))!=0 && matcher(c))
5876 return startPos+bytes;
5890 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast.get());
5894 std::visit(visitor,astImpl->root);
5899 int l=
static_cast<int>(result.
length());
5903 if (charCnt>=80)
break;
5910 if (result.
at(i)==
',' ||
5911 result.
at(i)==
'.' ||
5912 result.
at(i)==
'!' ||
5913 result.
at(i)==
'?' ||
5921 if ( i < l) result=result.
left(i)+
"...";
5922 return result.
data();
5929 if (al.
empty())
return;
5951#ifdef TRACINGSUPPORT
5952 void *backtraceFrames[128];
5953 int frameCount = backtrace(backtraceFrames, 128);
5954 const size_t cmdLen = 40960;
5955 static char cmd[cmdLen];
5957 p +=
qsnprintf(p,cmdLen,
"/usr/bin/atos -p %d ", (
int)getpid());
5958 for (
int x = 0; x < frameCount; x++)
5960 p +=
qsnprintf(p,cmdLen,
"%p ", backtraceFrames[x]);
5962 fprintf(stderr,
"========== STACKTRACE START ==============\n");
5966 while (
size_t len = fread(resBuf, 1,
sizeof(resBuf), fp))
5968 fwrite(resBuf, 1, len, stderr);
5972 fprintf(stderr,
"============ STACKTRACE END ==============\n");
5981 if (
qstricmp(inputEncoding,outputEncoding)==0)
return;
5983 if (cd==
reinterpret_cast<void *
>(-1))
5985 term(
"unsupported character conversion: '{}'->'{}': {}\n"
5986 "Check the INPUT_ENCODING setting in the config file!\n",
5987 inputEncoding,outputEncoding,strerror(errno));
5989 size_t iLeft = contents.size();
5990 const char *srcPtr = contents.data();
5991 size_t tmpBufSize = contents.size()*4+1;
5992 size_t oLeft = tmpBufSize;
5994 tmpBuf.resize(tmpBufSize);
5995 char *dstPtr = tmpBuf.data();
5999 newSize = tmpBufSize-oLeft;
6000 tmpBuf.resize(newSize);
6001 std::swap(contents,tmpBuf);
6006 term(
"{}: failed to translate characters from {} to {}: check INPUT_ENCODING\n",
6007 fileName,inputEncoding,outputEncoding);
6019 if (filterName.
isEmpty() || !filter)
6024 err(
"could not open file {}\n",fileName);
6028 auto fileSize = fi.
size();
6029 contents.resize(fileSize);
6030 f.read(contents.data(),fileSize);
6033 err(
"problems while reading file {}\n",fileName);
6039 QCString cmd=filterName+
" \""+fileName+
"\"";
6044 err(
"could not execute filter {}\n",filterName);
6047 const int bufSize=4096;
6050 while ((numRead=
static_cast<int>(fread(buf,1,bufSize,f)))>0)
6053 contents.append(buf,numRead);
6060 if (contents.size()>=2 &&
6061 static_cast<uint8_t
>(contents[0])==0xFF &&
6062 static_cast<uint8_t
>(contents[1])==0xFE
6067 else if (contents.size()>=2 &&
6068 static_cast<uint8_t
>(contents[0])==0xFE &&
6069 static_cast<uint8_t
>(contents[1])==0xFF
6074 else if (contents.size()>=3 &&
6075 static_cast<uint8_t
>(contents[0])==0xEF &&
6076 static_cast<uint8_t
>(contents[1])==0xBB &&
6077 static_cast<uint8_t
>(contents[2])==0xBF
6080 contents.erase(0,3);
6096 std::string t = title.
str();
6097 static const reg::Ex re(R
"(%[a-z_A-Z]+)");
6101 for (; it!=
end ; ++it)
6103 const auto &match = *it;
6104 size_t i = match.position();
6105 size_t l = match.length();
6106 if (i>p) tf+=t.substr(p,i-p);
6107 tf+=match.str().substr(1);
6116template<
class PatternList,
class PatternElem,
typename PatternGet = QCString(*)(const PatternElem &)>
6118 const PatternList &patList,
6125 if (!patList.empty())
6131 for (
const auto &li : patList)
6133 std::string pattern = getter(li).str();
6134 if (!pattern.empty())
6136 size_t i=pattern.find(
'=');
6137 if (i!=std::string::npos) pattern=pattern.substr(0,i);
6139 if (!caseSenseNames)
6170 auto getter = [](std::string s) {
return QCString(s); };
6191 if (extLinksInWindow)
6192 return "target=\"_blank\" ";
6194 return "target=\"_parent\" ";
6211 if (!targetFileName.
isEmpty())
6216 if (!anchor.
isEmpty() && isLocalFile)
6227 if (!anchor.
isEmpty()) url+=
"#"+anchor;
6240 result = it->second;
6241 size_t l = result.
length();
6242 if (!relPath.
isEmpty() && l>0 && result.
at(0)==
'.')
6247 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
6248 if (!href) result.
append(
"\" ");
6271 if (!img.
save(fileName))
6273 fprintf(stderr,
"Warning: Cannot open file %s for writing\n",data->
name);
6289 std::string s=str.
str();
6290 static const reg::Ex re(R
"(##[0-9A-Fa-f][0-9A-Fa-f])");
6296 size_t sl=s.length();
6298 for (; it!=
end ; ++it)
6300 const auto &match = *it;
6301 size_t i = match.position();
6302 size_t l = match.length();
6303 if (i>p) result+=s.substr(p,i-p);
6304 std::string lumStr = match.str().substr(2);
6305#define HEXTONUM(x) (((x)>='0' && (x)<='9') ? ((x)-'0') : \
6306 ((x)>='a' && (x)<='f') ? ((x)-'a'+10) : \
6307 ((x)>='A' && (x)<='F') ? ((x)-'A'+10) : 0)
6309 double r = 0,g = 0,b = 0;
6312 pow(level/255.0,gamma/100.0),&r,&g,&b);
6313 int red =
static_cast<int>(r*255.0);
6314 int green =
static_cast<int>(g*255.0);
6315 int blue =
static_cast<int>(b*255.0);
6318 colStr[1]=
hex[red>>4];
6319 colStr[2]=
hex[red&0xf];
6320 colStr[3]=
hex[green>>4];
6321 colStr[4]=
hex[green&0xf];
6322 colStr[5]=
hex[blue>>4];
6323 colStr[6]=
hex[blue&0xf];
6329 if (p<sl) result+=s.substr(p);
6340 err(
"could not copy file {} to {}\n",src,dest);
6354 int m1 = text.
find(marker);
6355 if (m1==-1)
return result;
6360 while (!
found && (i=text.
find(
'\n',p))!=-1)
6362 found = (p<=m1 && m1<i);
6378 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp || lang==SrcLangExt::VHDL || lang==SrcLangExt::Python)
6382 else if (lang==SrcLangExt::PHP && !classScope)
6394 static const std::unordered_set<std::string> schemes = {
6395 "http",
"https",
"ftp",
"ftps",
"sftp",
"file",
"news",
"irc",
"ircs"
6398 int colonPos = loc_url.
find(
':');
6399 return colonPos!=-1 && schemes.find(loc_url.
left(colonPos).
str())!=schemes.end();
6421 return (prot!=Protection::Private && prot!=Protection::Package) ||
6422 (prot==Protection::Private && extractPrivate) ||
6423 (prot==Protection::Package && extractPackage);
6434 const char *p=s.
data();
6437 int minIndent=1000000;
6438 bool searchIndent=
true;
6440 bool skipFirst = skipFirstLine;
6443 if (c==
'\t') indent+=tabSize - (indent%tabSize);
6444 else if (c==
'\n') indent=0,searchIndent=
true,skipFirst=
false;
6445 else if (c==
' ') indent++;
6446 else if (searchIndent && !skipFirst)
6449 if (indent<minIndent) minIndent=indent;
6454 if (minIndent==0)
return substitute(s,
"@ilinebr",
"\\ilinebr");
6460 skipFirst=skipFirstLine;
6469 else if (indent<minIndent && !skipFirst)
6473 int newIndent = indent+tabSize-(indent%tabSize);
6487 else if (c==
'\\' &&
literal_at(p,
"ilinebr "))
6490 result <<
"\\ilinebr ";
6493 for (
int j=0;j<minIndent;j++)
if (*(p+j)==
' ') skipAmount++;
6494 if (skipAmount==minIndent)
6501 result <<
"\\ilinebr";
6512 return result.
str();
6519 if (indentationLevel <= 0 || doc.
isEmpty())
return;
6524 const char *src = doc.
data();
6526 bool insideIndent =
false;
6535 insideIndent =
true;
6536 cnt = indentationLevel;
6547 insideIndent =
false;
6557 insideIndent =
false;
6562 doc.
resize(
static_cast<uint32_t
>(dst-doc.
data()));
6571 return ( ((allExternals && fd->
isLinkable()) ||
6589uint32_t getUtf8Code(
const QCString& s,
int idx )
6591 const int length = s.
length();
6592 if (idx >= length) {
return 0; }
6593 const uint32_t c0 = (uint8_t)s.
at(idx);
6594 if ( c0 < 0xC2 || c0 >= 0xF8 )
6598 if (idx+1 >= length) {
return 0; }
6599 const uint32_t c1 = ((uint8_t)s.
at(idx+1)) & 0x3f;
6602 return ((c0 & 0x1f) << 6) | c1;
6604 if (idx+2 >= length) {
return 0; }
6605 const uint32_t c2 = ((uint8_t)s.
at(idx+2)) & 0x3f;
6608 return ((c0 & 0x0f) << 12) | (c1 << 6) | c2;
6610 if (idx+3 >= length) {
return 0; }
6612 const uint32_t c3 = ((uint8_t)s.
at(idx+3)) & 0x3f;
6613 return ((c0 & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
6625uint32_t getUtf8CodeToLower(
const QCString& s,
int idx )
6627 const uint32_t v = getUtf8Code( s, idx );
6628 return v < 0x7f ? tolower( v ) : v;
6640uint32_t getUtf8CodeToUpper(
const QCString& s,
int idx )
6642 const uint32_t v = getUtf8Code( s, idx );
6643 return v < 0x7f ? toupper( v ) : v;
6657 std::string s = docs.
str();
6658 static const reg::Ex re(R
"(\[([ inout,]+)\])");
6663 const auto &match = *it;
6664 size_t p = match.position();
6665 size_t l = match.length();
6669 std::string dir = match[1].str();
6671 dir.erase(std::remove_if(dir.begin(),dir.end(),
6672 [](
const char c) { return c==
' ' || c==
','; }
6674 unsigned char ioMask=0;
6675 size_t inIndex = dir.find(
"in");
6676 if ( inIndex!=std::string::npos) dir.erase( inIndex,2),ioMask|=(1<<0);
6677 size_t outIndex = dir.find(
"out");
6678 if (outIndex!=std::string::npos) dir.erase(outIndex,3),ioMask|=(1<<1);
6679 if (dir.empty() && ioMask!=0)
6682 if (ioMask==((1<<0)|(1<<1)))
return "[in,out]";
6683 else if (ioMask==(1<<0))
return "[in]";
6684 else if (ioMask==(1<<1))
return "[out]";
6716 *outListType1=inListType;
6719 if (inProt==Protection::Public)
6726 else if (inProt==Protection::Protected)
6734 *outListType2=inListType.
toPublic();
6737 else if (inProt==Protection::Private)
6747 *outListType1=inListType.
toPublic();
6769 int i= imgExt.
find(
':');
6770 return i==-1 ? imgExt : imgExt.
left(i);
6775 assert(!f.is_open());
6776 bool fileOpened=
FALSE;
6777 bool writeToStdout=outFile==
"-";
6780 f.basic_ios<char>::rdbuf(std::cout.rdbuf());
6795 fileOpened = f.is_open();
6802 static const std::unordered_set<std::string> fortran_C_keywords = {
6803 "character",
"call",
"close",
"common",
"continue",
6804 "case",
"contains",
"cycle",
"class",
"codimension",
6805 "concurrent",
"contiguous",
"critical"
6808 if (*contents !=
'c' && *contents !=
'C')
return false;
6810 const char *c = contents;
6812 while (*c && *c !=
' ') {keyword += *c; c++;}
6813 keyword = keyword.
lower();
6815 return (fortran_C_keywords.find(keyword.
str()) != fortran_C_keywords.end());
6823 bool skipLine=
FALSE;
6829 size_t sizCont = contents.
length();
6830 for (
size_t i=0;i<sizCont;i++)
6834 switch(contents.
at(i))
6841 column += tabSize-1;
6858 if (column==1)
return TRUE;
6859 if (skipLine)
break;
6862 if (column!=6) skipLine=
TRUE;
6865 if (skipLine)
break;
6866 if (column>=7)
return TRUE;
6891 auto skipBlock = [&markerInfo](
const char *p,
const SelectionBlock &blk)
6898 size_t len = markerInfo.
endLen;
6899 bool negate = *(p+markerInfo.
endLen)==
'!';
6901 size_t blkNameLen =
qstrlen(blk.name);
6902 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6906 return p+len+blkNameLen+markerInfo.
closeLen;
6923 const char *p = s.
data();
6933 bool negate = *(p+len)==
'!';
6935 for (
const auto &blk : blockList)
6937 size_t blkNameLen =
qstrlen(blk.name);
6938 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6941 bool blockEnabled = blk.enabled!=negate;
6943 p+=len+blkNameLen+markerInfo.
closeLen;
6962 size_t len = markerInfo.
endLen;
6963 bool negate = *(p+len)==
'!';
6965 for (
const auto &blk : blockList)
6967 size_t blkNameLen =
qstrlen(blk.name);
6968 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6972 p+=len+blkNameLen+markerInfo.
closeLen;
7003 const char *p = s.
data();
7012 bool negate = *(p+len)==
'!';
7018 if (markerInfo.
closeLen==0 && *p==
'\n')
7020 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
7026 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
7035 size_t len = markerInfo.
endLen;
7036 bool negate = *(p+len)==
'!';
7042 if (markerInfo.
closeLen==0 && *p==
'\n')
7044 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
7050 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
7067 const char *p=s.
data();
7076 while (*e==
' ' || *e==
'\t') e++;
7098 size_t prev = 0, pos = 0, len = s.length();
7101 pos = s.find(delimiter, prev);
7102 if (pos == std::string::npos) pos = len;
7103 if (pos>prev) result.push_back(s.substr(prev,pos-prev));
7104 prev = pos + delimiter.length();
7106 while (pos<len && prev<len);
7118 for ( ; iter !=
end; ++iter)
7120 const auto &match = *iter;
7121 size_t i=match.position();
7122 size_t l=match.length();
7123 if (i>p) result.push_back(s.substr(p,i-p));
7126 if (p<s.length()) result.push_back(s.substr(p));
7133 auto it = std::find(sv.begin(),sv.end(),s);
7134 return it!=sv.end() ?
static_cast<int>(it-sv.begin()) : -1;
7142 return reg::search(s,match,re) ?
static_cast<int>(match.position()) : -1;
7150 for (
const auto &s : sv)
7152 if (!first) result+=delimiter;
7166 while (residual > 0)
7168 modVal[0] = (upper ?
'A':
'a') + (residual-1)%26;
7169 result = modVal + result;
7170 residual = (residual-1) / 26;
7177 static const char *str_romans_upper[] = {
"M",
"CM",
"D",
"CD",
"C",
"XC",
"L",
"XL",
"X",
"IX",
"V",
"IV",
"I" };
7178 static const char *str_romans_lower[] = {
"m",
"cm",
"d",
"cd",
"c",
"xc",
"l",
"xl",
"x",
"ix",
"v",
"iv",
"i" };
7179 static const int values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
7180 static const char **str_romans = upper ? str_romans_upper : str_romans_lower;
7185 for (
int i = 0; i < 13; ++i)
7187 while (residual - values[i] >= 0)
7189 result += str_romans[i];
7190 residual -= values[i];
7200 size_t size = s.
length();
7202 const char *data = s.
data();
7205 constexpr auto doxy_nbsp =
"&_doxy_nbsp;";
7206 const int maxIndent=1000000;
7207 int minIndent=maxIndent;
7216 int stop = tabSize - (col%tabSize);
7219 while (stop--) out.
addChar(
' ');
7223 if (data[i] ==
'\\')
7229 else if (i+5<size &&
literal_at(data+i,
"iskip"))
7234 else if (i+8<size &&
literal_at(data+i,
"endiskip"))
7266 for (
int j=0;j<bytes-1 && c;j++)
7278 if (!skip && col<minIndent) minIndent=col;
7282 if (minIndent!=maxIndent) refIndent=minIndent;
else refIndent=0;
7292 uint8_t md5_sig[16];
7294 MD5Buffer(projectCookie.
data(),
static_cast<unsigned int>(projectCookie.
length()),md5_sig);
7295 MD5SigToString(md5_sig,sigStr);
7296 sigStr[32]=
'_'; sigStr[33]=0;
7303 int l =
static_cast<int>(name.
length());
7304 int lastSepPos = -1;
7305 const char *p = name.
data();
7314 if (sharpCount==0 && p[i+1]==
':' && p[i+2]==
':')
7328 if (ts==-1) ts=0;
else p+=++ts;
7329 for (i=ts;i<l-1;i++)
7332 if (c==
':' && *p==
':') lastSepPos=i;
7367 case '\t': col+=tabSize - (col%tabSize);
7376 for (
int i=0;i<numBytes-1 && (c=*s++);i++) {}
7377 if (c==0)
return col;
7392 int idx = name.
find(
'<');
7405 int idx = result.
find(
'-');
7406 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
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 Definition * resolveSymbol(const Definition *scope, const QCString &name, const QCString &args=QCString(), bool checkCV=false, bool insideCode=false, bool onlyLinkable=false)
Find the symbool definition matching name within the scope set.
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.
Class to iterate 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.
static const char * to_string(Protection prot)
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)
QCString substituteKeywords(const QCString &file, const QCString &s, const KeywordSubstitutionList &keywords)
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 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