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();
3327 else if (lang==SrcLangExt::Java &&
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;
3568 const char *p = s.
data();
3572 substRes.reserve(s.
length()+1024);
3579 for (
const auto &kw : keywords)
3581 size_t keyLen =
qstrlen(kw.keyword);
3582 if (
qstrncmp(p,kw.keyword,keyLen)==0)
3584 const char *startArg = p+keyLen;
3585 bool expectParam = std::holds_alternative<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3587 if (expectParam && *startArg==
'(')
3590 const char *endArg =
nullptr;
3591 while ((c=*(startArg+j)) && c!=
')' && c!=
'\n' && c!=0) j++;
3592 if (c==
')') endArg=startArg+j;
3596 auto &&getValue = std::get<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3597 substRes+=getValue(value).str();
3604 warn(file,line,
"Missing argument for '{}'",kw.keyword);
3608 else if (!expectParam)
3610 auto &&getValue = std::get<KeywordSubstitution::GetValue>(kw.getValueVariant);
3611 substRes+=getValue().str();
3618 warn(file,line,
"Expected arguments for '{}' but none were specified",kw.keyword);
3628 if (c==
'\n') line++;
3656 int wi = projectLogo.
find(
" width=");
3659 projectLogo = projectLogo.
left(wi);
3661 int hi = projectLogo.
find(
" height=");
3664 projectLogo = projectLogo.
left(hi);
3677 auto extractDimension = [&projectLogo](
const char *startMarker,
size_t startPos,
size_t endPos) ->
QCString
3680 if (result.
length()>=2 && result.
at(0)!=
'"' && result.
at(result.
length()-1)!=
'"')
3682 result=
"\""+result+
"\"";
3688 int wi = projectLogo.
find(
" width=");
3689 int hi = projectLogo.
find(
" height=");
3690 if (wi!=-1 && hi!=-1)
3694 sizeVal = extractDimension(
" width=", wi+7, hi) +
" "
3695 + extractDimension(
" height=", hi+8, projectLogo.
length());
3699 sizeVal = extractDimension(
" height=", hi+8, wi) +
" "
3700 + extractDimension(
" width=", wi+7, projectLogo.
length());
3705 sizeVal = extractDimension(
" width=", wi+7, projectLogo.
length());
3709 sizeVal = extractDimension(
" height=", hi+8, projectLogo.
length());
3722 {
"$title", [&]() {
return !title.
isEmpty() ? title : projName; } },
3727 {
"$doxygenversion", [&]() {
return getDoxygenVersion(); } },
3728 {
"$projectname", [&]() {
return projName; } },
3729 {
"$projectnumber", [&]() {
return projNum; } },
3730 {
"$projectbrief", [&]() {
return projBrief; } },
3734 {
"$langISO", [&]() {
return theTranslator->trISOLang(); } },
3749 for (
const auto &s : sl)
3751 const char *ps=s.c_str();
3752 const char *pd=name.
data();
3754 while (*ps!=0 && *pd!=0 && *ps==*pd) ps++,pd++,i++;
3755 if (*ps==0 && *pd!=0)
3771int getUtf8Char(
const char *input,
char ids[MAX_UTF8_CHAR_SIZE],CaseModifier modifier)
3774 const unsigned char uc = (
unsigned char)*input;
3775 bool validUTF8Char =
false;
3778 const char* pt = input+1;
3780 if ((uc&0x80)==0x00)
3784 case CaseModifier::None: ids[0]=*input;
break;
3785 case CaseModifier::ToUpper: ids[0]=(char)toupper(*input);
break;
3786 case CaseModifier::ToLower: ids[0]=(char)tolower(*input);
break;
3793 if ((uc&0xE0)==0xC0)
3797 if ((uc&0xF0)==0xE0)
3801 if ((uc&0xF8)==0xF0)
3806 validUTF8Char = l>0;
3807 for (
int m=1; m<l && validUTF8Char; ++m)
3809 unsigned char ct = (
unsigned char)*pt;
3810 if (ct==0 || (ct&0xC0)!=0x80)
3812 validUTF8Char=
false;
3833 if (caseSenseNames == CASE_SENSE_NAMES_t::YES)
return true;
3834 else if (caseSenseNames == CASE_SENSE_NAMES_t::NO)
return false;
3841 if (name.
isEmpty())
return name;
3846 const char *p=name.
data();
3851 case '_':
if (allowUnderscore) growBuf.
addChar(
'_');
else growBuf.
addStr(
"__");
break;
3852 case '-': growBuf.
addChar(
'-');
break;
3853 case ':': growBuf.
addStr(
"_1");
break;
3854 case '/': growBuf.
addStr(
"_2");
break;
3855 case '<': growBuf.
addStr(
"_3");
break;
3856 case '>': growBuf.
addStr(
"_4");
break;
3857 case '*': growBuf.
addStr(
"_5");
break;
3858 case '&': growBuf.
addStr(
"_6");
break;
3859 case '|': growBuf.
addStr(
"_7");
break;
3860 case '.':
if (allowDots) growBuf.
addChar(
'.');
else growBuf.
addStr(
"_8");
break;
3861 case '!': growBuf.
addStr(
"_9");
break;
3862 case ',': growBuf.
addStr(
"_00");
break;
3863 case ' ': growBuf.
addStr(
"_01");
break;
3864 case '{': growBuf.
addStr(
"_02");
break;
3865 case '}': growBuf.
addStr(
"_03");
break;
3866 case '?': growBuf.
addStr(
"_04");
break;
3867 case '^': growBuf.
addStr(
"_05");
break;
3868 case '%': growBuf.
addStr(
"_06");
break;
3869 case '(': growBuf.
addStr(
"_07");
break;
3870 case ')': growBuf.
addStr(
"_08");
break;
3871 case '+': growBuf.
addStr(
"_09");
break;
3872 case '=': growBuf.
addStr(
"_0a");
break;
3873 case '$': growBuf.
addStr(
"_0b");
break;
3874 case '\\': growBuf.
addStr(
"_0c");
break;
3875 case '@': growBuf.
addStr(
"_0d");
break;
3876 case ']': growBuf.
addStr(
"_0e");
break;
3877 case '[': growBuf.
addStr(
"_0f");
break;
3878 case '#': growBuf.
addStr(
"_0g");
break;
3879 case '"': growBuf.
addStr(
"_0h");
break;
3880 case '~': growBuf.
addStr(
"_0i");
break;
3881 case '\'': growBuf.
addStr(
"_0j");
break;
3882 case ';': growBuf.
addStr(
"_0k");
break;
3883 case '`': growBuf.
addStr(
"_0l");
break;
3887 bool doEscape =
true;
3888 if (allowUnicodeNames)
3893 growBuf.
addStr(p-1,charLen);
3901 unsigned char id =
static_cast<unsigned char>(c);
3910 else if (caseSenseNames || !isupper(c))
3917 growBuf.
addChar(
static_cast<char>(tolower(c)));
3923 return growBuf.
get();
3931 const char *p = s.
data();
3941 case '_': result+=c; p++;
break;
3942 case '1': result+=
':'; p++;
break;
3943 case '2': result+=
'/'; p++;
break;
3944 case '3': result+=
'<'; p++;
break;
3945 case '4': result+=
'>'; p++;
break;
3946 case '5': result+=
'*'; p++;
break;
3947 case '6': result+=
'&'; p++;
break;
3948 case '7': result+=
'|'; p++;
break;
3949 case '8': result+=
'.'; p++;
break;
3950 case '9': result+=
'!'; p++;
break;
3954 case '0': result+=
','; p+=2;
break;
3955 case '1': result+=
' '; p+=2;
break;
3956 case '2': result+=
'{'; p+=2;
break;
3957 case '3': result+=
'}'; p+=2;
break;
3958 case '4': result+=
'?'; p+=2;
break;
3959 case '5': result+=
'^'; p+=2;
break;
3960 case '6': result+=
'%'; p+=2;
break;
3961 case '7': result+=
'('; p+=2;
break;
3962 case '8': result+=
')'; p+=2;
break;
3963 case '9': result+=
'+'; p+=2;
break;
3964 case 'a': result+=
'='; p+=2;
break;
3965 case 'b': result+=
'$'; p+=2;
break;
3966 case 'c': result+=
'\\'; p+=2;
break;
3967 case 'd': result+=
'@'; p+=2;
break;
3968 case 'e': result+=
']'; p+=2;
break;
3969 case 'f': result+=
'['; p+=2;
break;
3970 case 'g': result+=
'#'; p+=2;
break;
3971 case 'h': result+=
'"'; p+=2;
break;
3972 case 'i': result+=
'~'; p+=2;
break;
3973 case 'j': result+=
'\''; p+=2;
break;
3974 case 'k': result+=
';'; p+=2;
break;
3975 case 'l': result+=
'`'; p+=2;
break;
3982 if (!caseSenseNames && c>=
'a' && c<=
'z')
3984 result+=
static_cast<char>(toupper(*p));
4015 if (name.
isEmpty())
return name;
4038 size_t resultLen = result.
length();
4042 uint8_t md5_sig[16];
4044 MD5Buffer(result.
data(),
static_cast<unsigned int>(resultLen),md5_sig);
4045 MD5SigToString(md5_sig,sigStr);
4046 result=result.
left(128-32)+sigStr;
4051 int l1Dir=0,l2Dir=0;
4052 int createSubdirsLevel =
Config_getInt(CREATE_SUBDIRS_LEVEL);
4053 int createSubdirsBitmaskL2 = (1<<createSubdirsLevel)-1;
4056 uint8_t md5_sig[16];
4057 MD5Buffer(result.
data(),
static_cast<unsigned int>(result.
length()),md5_sig);
4058 l1Dir = md5_sig[14] & 0xf;
4059 l2Dir = md5_sig[15] & createSubdirsBitmaskL2;
4070 const int sig_size=16;
4071 uint8_t md5_sig[sig_size];
4072 MD5Buffer(fn.
data(),
static_cast<unsigned int>(fn.
length()),md5_sig);
4073 char result[sig_size*3+2];
4076 for (
int i=0;i<sig_size;i++)
4078 static const char oct[]=
"01234567";
4079 uint8_t
byte = md5_sig[i];
4080 *p++=oct[(
byte>>6)&7];
4081 *p++=oct[(
byte>>3)&7];
4082 *p++=oct[(
byte>>0)&7];
4112 QCString absIncFileName = incFileName;
4122 else if (searchIncludes)
4125 for (
const auto &incPath : includePath)
4144 return absIncFileName;
4154 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
4155 for (
int l1=0; l1<16; l1++)
4161 term(
"Failed to create output directory '{}'\n",subdir);
4163 for (
int l2=0; l2<createSubdirsLevelPow2; l2++)
4166 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
4169 term(
"Failed to create output directory '{}'\n",subsubdir);
4181 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
4182 for (
int l1=0;l1<16;l1++)
4186 for (
int l2=0; l2 < createSubdirsLevelPow2; l2++)
4189 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
4208 bool allowEmptyClass)
4215 namespaceName=nd->
name();
4219 p=
static_cast<int>(clName.
length())-2;
4220 while (p>=0 && (i=clName.
findRev(
"::",p))!=-1)
4227 namespaceName=nd->
name();
4236 className=scopeName;
4237 namespaceName.
clear();
4240 if (className.
isEmpty() && !namespaceName.
isEmpty() && !allowEmptyClass)
4243 className=namespaceName;
4244 namespaceName.
clear();
4250 className = className.
left(className.
length()-2);
4291 int l =
static_cast<int>(result.
length());
4294 bool skipBracket=
FALSE;
4301 while (p>=0 && count>=0)
4303 char c=result.
at(p);
4309 if (p>0 && result.
at(p-1)==
':' && (count==0 || skipBracket))
4311 return result.
right(l-p-1);
4322 if (p>0 && result.
at(p-1)==
'>')
4330 bool foundMatch=
false;
4331 while (p>=0 && !foundMatch)
4343 if (round==0) count++;
4350 if (result.
at(p-1) ==
'<')
4357 foundMatch = count==0;
4372 done = count==0 || skipBracket;
4385 const char *p = s.
data();
4391 if ((c>=
'0' && c<=
'9') || (c>=
'a' && c<=
'z') || (c>=
'A' && c<=
'Z') || c==
'-' || c==
':' || c==
'.')
4393 if (first && c>=
'0' && c<=
'9') growBuf.
addChar(
'a');
4399 encChar[1]=
hex[
static_cast<unsigned char>(c)>>4];
4400 encChar[2]=
hex[
static_cast<unsigned char>(c)&0xF];
4407 return growBuf.
get();
4425 const char *p = s.
data();
4431 case '<': growBuf.
addStr(
"<");
break;
4432 case '>': growBuf.
addStr(
">");
break;
4433 case '&':
if (keepEntities)
4439 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
4445 while (p<e) growBuf.
addChar(*p++);
4457 case '\'': growBuf.
addStr(
"'");
break;
4458 case '"': growBuf.
addStr(
""");
break;
4459 case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
4460 case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
4461 case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
4462 case 27:
case 28:
case 29:
case 30:
case 31:
4464 default: growBuf.
addChar(c);
break;
4468 return growBuf.
get();
4476 const char *p=s.
data();
4482 case '<': growBuf.
addStr(
"<");
break;
4483 case '>': growBuf.
addStr(
">");
break;
4484 case '&':
if (keepEntities)
4490 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
4496 while (p<e) growBuf.
addChar(*p++);
4508 case '\'': growBuf.
addStr(
"'");
break;
4509 case '"': growBuf.
addStr(
""");
break;
4512 uint8_t uc =
static_cast<uint8_t
>(c);
4513 if (uc<32 && !isspace(c))
4529 return growBuf.
get();
4536 const char *p=s.
data();
4542 case '"': growBuf.
addStr(
"\\\"");
break;
4543 case '\\':
if (*p==
'u' && *(p+1)==
'{') growBuf.
addStr(
"\\");
4544 else growBuf.
addStr(
"\\\\");
4546 default: growBuf.
addChar(c);
break;
4557 std::string s = str.
data();
4558 static const reg::Ex re(R
"(&\a\w*;)");
4563 size_t p=0, i=0, l=0;
4564 for (; it!=
end ; ++it)
4566 const auto &match = *it;
4567 p = match.position();
4571 growBuf.
addStr(s.substr(i,p-i));
4575 const char *code=
nullptr;
4586 growBuf.
addStr(s.substr(i));
4589 return growBuf.
get();
4607 ASSERT(context!=
nullptr);
4609 if (ml==
nullptr)
return;
4611 struct MoveMemberInfo
4614 : memberDef(md), memberGroup(mg), sli(rv) {}
4619 std::vector<MoveMemberInfo> movedMembers;
4621 for (
const auto &md : *ml)
4623 if (md->isEnumerate())
4625 for (
const auto &fmd : md->enumFieldList())
4627 int groupId=fmd->getMemberGroupId();
4633 const auto &info = it->second;
4634 auto mg_it = std::find_if(pMemberGroups->begin(),
4635 pMemberGroups->end(),
4636 [&groupId](
const auto &g)
4637 { return g->groupId()==groupId; }
4640 if (mg_it==pMemberGroups->end())
4642 auto mg = std::make_unique<MemberGroup>(
4651 pMemberGroups->push_back(std::move(mg));
4655 mg_ptr = (*mg_it).get();
4667 int groupId=md->getMemberGroupId();
4673 const auto &info = it->second;
4674 auto mg_it = std::find_if(pMemberGroups->begin(),
4675 pMemberGroups->end(),
4676 [&groupId](
const auto &g)
4677 { return g->groupId()==groupId; }
4680 if (mg_it==pMemberGroups->end())
4682 auto mg = std::make_unique<MemberGroup>(
4691 pMemberGroups->push_back(std::move(mg));
4695 mg_ptr = (*mg_it).get();
4697 movedMembers.emplace_back(md,mg_ptr,info->m_sli);
4703 for (
const auto &mmi : movedMembers)
4705 ml->
remove(mmi.memberDef);
4706 mmi.memberGroup->insertMember(mmi.memberDef->resolveAlias());
4707 mmi.memberGroup->setRefItems(mmi.sli);
4723 static const reg::Ex re_norm(R
"(\a[\w:]*)");
4724 static const reg::Ex re_fortran(R
"(\a[\w:()=]*)");
4729 if (type.
isEmpty())
return -1;
4730 size_t typeLen=type.
length();
4733 if (lang == SrcLangExt::Fortran)
4735 if (type[pos]==
',')
return -1;
4741 std::string s = type.
str();
4747 const auto &match = *it;
4748 size_t i = match.position();
4749 size_t l = match.length();
4754 while (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
' ') ts++,tl++;
4755 if (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
'<')
4760 while (te<typeLen && brCount!=0)
4762 if (type[
static_cast<uint32_t
>(te)]==
'<')
4764 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'<') te++;
else brCount++;
4766 if (type[
static_cast<uint32_t
>(te)]==
'>')
4768 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'>') te++;
else brCount--;
4778 pos=
static_cast<int>(i+l+tl);
4782 pos=
static_cast<int>(i+l);
4786 return static_cast<int>(i);
4789 pos =
static_cast<int>(typeLen);
4801 int p=name.
find(
'<');
4802 if (p==-1)
return name;
4806 std::string s = name.
mid(p).
str();
4807 static const reg::Ex re(R
"([\a:][\w:]*)");
4812 for (; it!=
end ; ++it)
4814 const auto &match = *it;
4815 size_t i = match.position();
4816 size_t l = match.length();
4817 result += s.substr(pi,i-pi);
4820 for (
const Argument &formArg : formalArgs)
4822 if (formArg.name == n)
4848 result+=s.substr(pi);
4866 if (formalArgs.
empty())
return nm;
4869 static const reg::Ex re(R
"(\a\w*)");
4870 std::string name = nm.str();
4875 for (; it!=
end ; ++it)
4877 const auto &match = *it;
4878 size_t i = match.position();
4879 size_t l = match.length();
4880 if (i>p) result += name.substr(p,i-p);
4885 actIt = actualArgs->
begin();
4892 for (
auto formIt = formalArgs.
begin();
4893 formIt!=formalArgs.
end() && !
found;
4899 if (actualArgs && actIt!=actualArgs->
end())
4906 formArg.
type =
"class";
4911 formArg.
type =
"typename";
4915 formArg.
name +=
"...";
4920 formArg.
name +=
"...";
4927 if (formArg.
name==n && actualArgs && actIt!=actualArgs->
end() && !actArg.
type.
isEmpty())
4934 ii = subst.find(
'<');
4936 if (ii!=-1 &&
static_cast<int>(
prefix.length())>=ii+2 &&
prefix.mid(
prefix.length()-ii-2,ii+1)==subst.left(ii+1))
4941 while ((ii=subst.find(nameArg,pp))!=-1)
4943 bool beforeNonWord = ii==0 || !
isId(subst.at(ii-1));
4944 bool afterNonWord = subst.length()==ii+nameArg.length() || !
isId(subst.at(ii+nameArg.length()));
4945 if (beforeNonWord && afterNonWord)
4949 pp=ii+
static_cast<int>(nameArg.length());
4954 AUTO_TRACE_ADD(
"result={} n={} type={} hasRecursion={}",result,n,actArg.
type,hasRecursion(result,n,actArg.
type));
4955 if (!hasRecursion(result,n,actArg.
type))
4967 result += actArg.
type;
4973 result += actArg.
type+
" "+actArg.
name;
4978 else if (formArg.
name==n &&
4979 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4988 else if (formArg.
name==n &&
4989 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4997 if (actualArgs && actIt!=actualArgs->
end())
5008 result+=name.substr(p);
5026 bool allowArtificial)
5029 int i=fullName.
find(
'<');
5030 if (i==-1)
return fullName;
5033 int l=
static_cast<int>(fullName.
length());
5040 while (e<l && count>0)
5042 char c=fullName.
at(e++);
5045 case '(': round++;
break;
5046 case ')':
if (round>0) round--;
break;
5047 case '<':
if (round==0) count++;
break;
5048 case '>':
if (round==0) count--;
break;
5053 int si= fullName.
find(
"::",e);
5055 if (parentOnly && si==-1)
break;
5058 result+=fullName.
mid(p,i-p);
5061 if (cd!=
nullptr && (allowArtificial || !cd->
isArtificial()))
5063 result+=fullName.
mid(i,e-i);
5066 else if (pLastScopeStripped)
5069 *pLastScopeStripped=fullName.
mid(i,e-i);
5072 i=fullName.
find(
'<',p);
5074 result+=fullName.
right(l-p);
5091 AUTO_TRACE(
"leftScope='{}' rightScope='{}'",leftScope,rightScope);
5099 int i=0,p=
static_cast<int>(leftScope.
length());
5104 while ((i=leftScope.
findRev(
"::",p))>0)
5108 result = leftScope.
left(i+2)+rightScope;
5136 int sl=
static_cast<int>(s.
length());
5140 if (sp>=sl)
return -1;
5144 if (c==
':') sp++,p++;
else break;
5156 while (sp<sl && !done)
5162 case '<': count++;
break;
5163 case '>': count--;
if (count==0) done=
true;
break;
5196 bool newPage =
true;
5201 warn(fileName,startLine,
"multiple use of page label '{}' with different titles, (other occurrence: {}, line: {})",
5285 else if (si->
lineNr() != -1)
5287 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {}, line {})",pd->
name(),si->
fileName(),si->
lineNr());
5291 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {})",pd->
name(),si->
fileName());
5316 if (!key.
isEmpty() && key[0]!=
'@')
5321 item->setScope(scope);
5322 item->setName(name);
5323 item->setTitle(title);
5324 item->setArgs(args);
5325 item->setGroup(key);
5373 if (!first) { ol.
writeString(
" | "); }
else first=
false;
5385 if (!first) { ol.
writeString(
" | "); }
else first=
false;
5411 int i_fs = fName.
findRev(
'/');
5412 int i_bs = fName.
findRev(
'\\');
5413 int i = fName.
find(
'.',std::max({ i_fs, i_bs ,0}));
5438 printf(
"replaceNamespaceAliases(%s,%zu)\n",
qPrint(scope),i);
5451 if (i>0 && ns==scope.
left(i))
break;
5453 printf(
"result=%s\n",
qPrint(scope));
5463 result=result.
mid(i+1);
5468 result=result.
mid(i+1);
5477 static const reg::Ex re(R
"(\a+)");
5478 std::string s = str.str();
5481 if (it->
str()==
word)
return true;
5492 static reg::Ex re(R
"(\s*(<\a+>)\s*)");
5493 std::string s = sentence.str();
5499 for ( ; it!=
end ; ++it)
5501 const auto match = *it;
5502 std::string part = match[1].str();
5505 size_t i = match.position();
5506 size_t l = match.length();
5507 result+=s.substr(p,i-p);
5508 result+=match.str();
5514 size_t i = match[1].position();
5515 size_t l = match[1].length();
5516 result+=s.substr(p,i-p);
5520 result+=s.substr(p);
5536 const char *p = s.
data();
5539 int i=0,li=-1,l=
static_cast<int>(s.
length());
5543 if (c==
' ' || c==
'\t' || c==
'\r') i++,p++;
5544 else if (c==
'\\' &&
literal_at(p,
"\\ilinebr")) i+=8,li=i,p+=8;
5545 else if (c==
'\n') i++,li=i,docLine++,p++;
5555 if (c==
' ' || c==
'\t' || c==
'\r') b--,p--;
5556 else if (c==
'r' && b>=7 &&
literal_at(p-7,
"\\ilinebr")) bi=b-7,b-=8,p-=8;
5557 else if (c==
'>' && b>=11 &&
literal_at(p-11,
"\\ilinebr<br>")) bi=b-11,b-=12,p-=12;
5558 else if (c==
'\n') bi=b,b--,p--;
5563 if (li==-1 && bi==-1)
return s;
5570 return s.
mid(li,bi-li);
5588 {
"idl",
"c", SrcLangExt::IDL,
".idl" },
5589 {
"java",
"c", SrcLangExt::Java,
".java"},
5590 {
"javascript",
"c", SrcLangExt::JS,
".js" },
5591 {
"csharp",
"c", SrcLangExt::CSharp,
".cs" },
5592 {
"d",
"c", SrcLangExt::D,
".d" },
5593 {
"php",
"c", SrcLangExt::PHP,
".php" },
5594 {
"objective-c",
"c", SrcLangExt::ObjC,
".m" },
5595 {
"c",
"c", SrcLangExt::Cpp,
".c" },
5596 {
"c++",
"c", SrcLangExt::Cpp,
".cpp" },
5597 {
"slice",
"c", SrcLangExt::Slice,
".ice" },
5598 {
"python",
"python", SrcLangExt::Python,
".py" },
5599 {
"fortran",
"fortran", SrcLangExt::Fortran,
".f" },
5600 {
"fortranfree",
"fortranfree", SrcLangExt::Fortran,
".f90" },
5601 {
"fortranfixed",
"fortranfixed", SrcLangExt::Fortran,
".f" },
5602 {
"vhdl",
"vhdl", SrcLangExt::VHDL,
".vhdl"},
5603 {
"xml",
"xml", SrcLangExt::XML,
".xml" },
5604 {
"sql",
"sql", SrcLangExt::SQL,
".sql" },
5605 {
"md",
"md", SrcLangExt::Markdown,
".md" },
5606 {
"lex",
"lex", SrcLangExt::Lex,
".l" },
5613 [&langName](
const auto &info) { return info.langName==langName; });
5620 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5630 err(
"Failed to assign extension {} to parser {} for language {}\n",
5631 extName.
data(),it1->parserName,language);
5719 if (extName.
isEmpty()) extName=
".no_extension";
5720 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5736 if (lang == SrcLangExt::Unknown)
5740 if (langName.
at(0)==
'.') langName = langName.
mid(1);
5742 [&langName](
const auto &info) { return info.langName==langName; });
5745 lang = it->parserId;
5746 fileName = it->defExt;
5750 return SrcLangExt::Cpp;
5759 int lastDot = fn.
findRev(
'.');
5760 if (lastDot!=-1)
return fn.
mid(lastDot);
5769 if (scope==
nullptr ||
5789 if (qualifierIndex!=-1)
5791 explicitScopePart = name.
left(qualifierIndex);
5793 name = name.
mid(qualifierIndex+2);
5797 int minDistance = 10000;
5806 if (distance!=-1 && distance<minDistance)
5808 minDistance = distance;
5822 if (bestMatch && bestMatch->
isTypedef())
5830 if (startPos>=len)
return len;
5831 uint8_t c =
static_cast<uint8_t
>(utf8Str[startPos]);
5836 int (*matcher)(int) =
nullptr;
5837 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5841 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5845 matcher = std::isxdigit;
5849 matcher = std::isdigit;
5852 else if (std::isalnum(c))
5855 matcher = std::isalnum;
5859 while ((c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]))!=0 && matcher(c))
5869 return startPos+bytes;
5883 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast.get());
5887 std::visit(visitor,astImpl->root);
5892 int l=
static_cast<int>(result.
length());
5896 if (charCnt>=80)
break;
5903 if (result.
at(i)==
',' ||
5904 result.
at(i)==
'.' ||
5905 result.
at(i)==
'!' ||
5906 result.
at(i)==
'?' ||
5914 if ( i < l) result=result.
left(i)+
"...";
5915 return result.
data();
5922 if (al.
empty())
return;
5944#ifdef TRACINGSUPPORT
5945 void *backtraceFrames[128];
5946 int frameCount = backtrace(backtraceFrames, 128);
5947 const size_t cmdLen = 40960;
5948 static char cmd[cmdLen];
5950 p +=
qsnprintf(p,cmdLen,
"/usr/bin/atos -p %d ", (
int)getpid());
5951 for (
int x = 0; x < frameCount; x++)
5953 p +=
qsnprintf(p,cmdLen,
"%p ", backtraceFrames[x]);
5955 fprintf(stderr,
"========== STACKTRACE START ==============\n");
5959 while (
size_t len = fread(resBuf, 1,
sizeof(resBuf), fp))
5961 fwrite(resBuf, 1, len, stderr);
5965 fprintf(stderr,
"============ STACKTRACE END ==============\n");
5974 if (
qstricmp(inputEncoding,outputEncoding)==0)
return;
5976 if (cd==
reinterpret_cast<void *
>(-1))
5978 term(
"unsupported character conversion: '{}'->'{}': {}\n"
5979 "Check the INPUT_ENCODING setting in the config file!\n",
5980 inputEncoding,outputEncoding,strerror(errno));
5982 size_t iLeft = contents.size();
5983 const char *srcPtr = contents.data();
5984 size_t tmpBufSize = contents.size()*4+1;
5985 size_t oLeft = tmpBufSize;
5987 tmpBuf.resize(tmpBufSize);
5988 char *dstPtr = tmpBuf.data();
5992 newSize = tmpBufSize-oLeft;
5993 tmpBuf.resize(newSize);
5994 std::swap(contents,tmpBuf);
5999 term(
"{}: failed to translate characters from {} to {}: check INPUT_ENCODING\n",
6000 fileName,inputEncoding,outputEncoding);
6012 if (filterName.
isEmpty() || !filter)
6017 err(
"could not open file {}\n",fileName);
6021 auto fileSize = fi.
size();
6022 contents.resize(fileSize);
6023 f.read(contents.data(),fileSize);
6026 err(
"problems while reading file {}\n",fileName);
6032 QCString cmd=filterName+
" \""+fileName+
"\"";
6037 err(
"could not execute filter {}\n",filterName);
6040 const int bufSize=4096;
6043 while ((numRead=
static_cast<int>(fread(buf,1,bufSize,f)))>0)
6046 contents.append(buf,numRead);
6053 if (contents.size()>=2 &&
6054 static_cast<uint8_t
>(contents[0])==0xFF &&
6055 static_cast<uint8_t
>(contents[1])==0xFE
6060 else if (contents.size()>=2 &&
6061 static_cast<uint8_t
>(contents[0])==0xFE &&
6062 static_cast<uint8_t
>(contents[1])==0xFF
6067 else if (contents.size()>=3 &&
6068 static_cast<uint8_t
>(contents[0])==0xEF &&
6069 static_cast<uint8_t
>(contents[1])==0xBB &&
6070 static_cast<uint8_t
>(contents[2])==0xBF
6073 contents.erase(0,3);
6089 std::string t = title.
str();
6090 static const reg::Ex re(R
"(%[a-z_A-Z]+)");
6094 for (; it!=
end ; ++it)
6096 const auto &match = *it;
6097 size_t i = match.position();
6098 size_t l = match.length();
6099 if (i>p) tf+=t.substr(p,i-p);
6100 tf+=match.str().substr(1);
6109template<
class PatternList,
class PatternElem,
typename PatternGet = QCString(*)(const PatternElem &)>
6111 const PatternList &patList,
6121 caseSenseNames =
FALSE;
6124 if (!patList.empty())
6130 for (
const auto &li : patList)
6132 std::string pattern = getter(li).str();
6133 if (!pattern.empty())
6135 size_t i=pattern.find(
'=');
6136 if (i!=std::string::npos) pattern=pattern.substr(0,i);
6138 if (!caseSenseNames)
6169 auto getter = [](std::string s) {
return QCString(s); };
6190 if (extLinksInWindow)
6191 return "target=\"_blank\" ";
6193 return "target=\"_parent\" ";
6210 if (!targetFileName.
isEmpty())
6215 if (!anchor.
isEmpty() && isLocalFile)
6226 if (!anchor.
isEmpty()) url+=
"#"+anchor;
6239 result = it->second;
6240 size_t l = result.
length();
6241 if (!relPath.
isEmpty() && l>0 && result.
at(0)==
'.')
6246 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
6247 if (!href) result.
append(
"\" ");
6270 if (!img.
save(fileName))
6272 fprintf(stderr,
"Warning: Cannot open file %s for writing\n",data->
name);
6288 std::string s=str.
str();
6289 static const reg::Ex re(R
"(##[0-9A-Fa-f][0-9A-Fa-f])");
6295 size_t sl=s.length();
6297 for (; it!=
end ; ++it)
6299 const auto &match = *it;
6300 size_t i = match.position();
6301 size_t l = match.length();
6302 if (i>p) result+=s.substr(p,i-p);
6303 std::string lumStr = match.str().substr(2);
6304#define HEXTONUM(x) (((x)>='0' && (x)<='9') ? ((x)-'0') : \
6305 ((x)>='a' && (x)<='f') ? ((x)-'a'+10) : \
6306 ((x)>='A' && (x)<='F') ? ((x)-'A'+10) : 0)
6308 double r = 0,g = 0,b = 0;
6311 pow(level/255.0,gamma/100.0),&r,&g,&b);
6312 int red =
static_cast<int>(r*255.0);
6313 int green =
static_cast<int>(g*255.0);
6314 int blue =
static_cast<int>(b*255.0);
6317 colStr[1]=
hex[red>>4];
6318 colStr[2]=
hex[red&0xf];
6319 colStr[3]=
hex[green>>4];
6320 colStr[4]=
hex[green&0xf];
6321 colStr[5]=
hex[blue>>4];
6322 colStr[6]=
hex[blue&0xf];
6328 if (p<sl) result+=s.substr(p);
6339 err(
"could not copy file {} to {}\n",src,dest);
6353 int m1 = text.
find(marker);
6354 if (m1==-1)
return result;
6359 while (!
found && (i=text.
find(
'\n',p))!=-1)
6361 found = (p<=m1 && m1<i);
6377 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp || lang==SrcLangExt::VHDL || lang==SrcLangExt::Python)
6381 else if (lang==SrcLangExt::PHP && !classScope)
6393 static const std::unordered_set<std::string> schemes = {
6394 "http",
"https",
"ftp",
"ftps",
"sftp",
"file",
"news",
"irc",
"ircs"
6397 int colonPos = loc_url.
find(
':');
6398 return colonPos!=-1 && schemes.find(loc_url.
left(colonPos).
str())!=schemes.end();
6420 return (prot!=Protection::Private && prot!=Protection::Package) ||
6421 (prot==Protection::Private && extractPrivate) ||
6422 (prot==Protection::Package && extractPackage);
6433 const char *p=s.
data();
6436 int minIndent=1000000;
6437 bool searchIndent=
true;
6439 bool skipFirst = skipFirstLine;
6442 if (c==
'\t') indent+=tabSize - (indent%tabSize);
6443 else if (c==
'\n') indent=0,searchIndent=
true,skipFirst=
false;
6444 else if (c==
' ') indent++;
6445 else if (searchIndent && !skipFirst)
6448 if (indent<minIndent) minIndent=indent;
6453 if (minIndent==0)
return substitute(s,
"@ilinebr",
"\\ilinebr");
6459 skipFirst=skipFirstLine;
6468 else if (indent<minIndent && !skipFirst)
6472 int newIndent = indent+tabSize-(indent%tabSize);
6486 else if (c==
'\\' &&
literal_at(p,
"ilinebr "))
6489 result <<
"\\ilinebr ";
6492 for (
int j=0;j<minIndent;j++)
if (*(p+j)==
' ') skipAmount++;
6493 if (skipAmount==minIndent)
6500 result <<
"\\ilinebr";
6511 return result.
str();
6518 if (indentationLevel <= 0 || doc.
isEmpty())
return;
6523 const char *src = doc.
data();
6525 bool insideIndent =
false;
6534 insideIndent =
true;
6535 cnt = indentationLevel;
6546 insideIndent =
false;
6556 insideIndent =
false;
6561 doc.
resize(
static_cast<uint32_t
>(dst-doc.
data()));
6570 return ( ((allExternals && fd->
isLinkable()) ||
6588uint32_t getUtf8Code(
const QCString& s,
int idx )
6590 const int length = s.
length();
6591 if (idx >= length) {
return 0; }
6592 const uint32_t c0 = (uint8_t)s.
at(idx);
6593 if ( c0 < 0xC2 || c0 >= 0xF8 )
6597 if (idx+1 >= length) {
return 0; }
6598 const uint32_t c1 = ((uint8_t)s.
at(idx+1)) & 0x3f;
6601 return ((c0 & 0x1f) << 6) | c1;
6603 if (idx+2 >= length) {
return 0; }
6604 const uint32_t c2 = ((uint8_t)s.
at(idx+2)) & 0x3f;
6607 return ((c0 & 0x0f) << 12) | (c1 << 6) | c2;
6609 if (idx+3 >= length) {
return 0; }
6611 const uint32_t c3 = ((uint8_t)s.
at(idx+3)) & 0x3f;
6612 return ((c0 & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
6624uint32_t getUtf8CodeToLower(
const QCString& s,
int idx )
6626 const uint32_t v = getUtf8Code( s, idx );
6627 return v < 0x7f ? tolower( v ) : v;
6639uint32_t getUtf8CodeToUpper(
const QCString& s,
int idx )
6641 const uint32_t v = getUtf8Code( s, idx );
6642 return v < 0x7f ? toupper( v ) : v;
6656 std::string s = docs.
str();
6657 static const reg::Ex re(R
"(\[([ inout,]+)\])");
6662 const auto &match = *it;
6663 size_t p = match.position();
6664 size_t l = match.length();
6668 std::string dir = match[1].str();
6670 dir.erase(std::remove_if(dir.begin(),dir.end(),
6671 [](
const char c) { return c==
' ' || c==
','; }
6673 unsigned char ioMask=0;
6674 size_t inIndex = dir.find(
"in");
6675 if ( inIndex!=std::string::npos) dir.erase( inIndex,2),ioMask|=(1<<0);
6676 size_t outIndex = dir.find(
"out");
6677 if (outIndex!=std::string::npos) dir.erase(outIndex,3),ioMask|=(1<<1);
6678 if (dir.empty() && ioMask!=0)
6681 if (ioMask==((1<<0)|(1<<1)))
return "[in,out]";
6682 else if (ioMask==(1<<0))
return "[in]";
6683 else if (ioMask==(1<<1))
return "[out]";
6715 *outListType1=inListType;
6718 if (inProt==Protection::Public)
6725 else if (inProt==Protection::Protected)
6733 *outListType2=inListType.
toPublic();
6736 else if (inProt==Protection::Private)
6746 *outListType1=inListType.
toPublic();
6768 int i= imgExt.
find(
':');
6769 return i==-1 ? imgExt : imgExt.
left(i);
6774 assert(!f.is_open());
6775 bool fileOpened=
FALSE;
6776 bool writeToStdout=outFile==
"-";
6779 f.basic_ios<char>::rdbuf(std::cout.rdbuf());
6794 fileOpened = f.is_open();
6801 static const std::unordered_set<std::string> fortran_C_keywords = {
6802 "character",
"call",
"close",
"common",
"continue",
6803 "case",
"contains",
"cycle",
"class",
"codimension",
6804 "concurrent",
"contiguous",
"critical"
6807 if (*contents !=
'c' && *contents !=
'C')
return false;
6809 const char *c = contents;
6811 while (*c && *c !=
' ') {keyword += *c; c++;}
6812 keyword = keyword.
lower();
6814 return (fortran_C_keywords.find(keyword.
str()) != fortran_C_keywords.end());
6822 bool skipLine=
FALSE;
6828 size_t sizCont = contents.
length();
6829 for (
size_t i=0;i<sizCont;i++)
6833 switch(contents.
at(i))
6840 column += tabSize-1;
6857 if (column==1)
return TRUE;
6858 if (skipLine)
break;
6861 if (column!=6) skipLine=
TRUE;
6864 if (skipLine)
break;
6865 if (column>=7)
return TRUE;
6890 auto skipBlock = [&markerInfo](
const char *p,
const SelectionBlock &blk)
6897 size_t len = markerInfo.
endLen;
6898 bool negate = *(p+markerInfo.
endLen)==
'!';
6900 size_t blkNameLen =
qstrlen(blk.name);
6901 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6905 return p+len+blkNameLen+markerInfo.
closeLen;
6922 const char *p = s.
data();
6932 bool negate = *(p+len)==
'!';
6934 for (
const auto &blk : blockList)
6936 size_t blkNameLen =
qstrlen(blk.name);
6937 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6940 bool blockEnabled = blk.enabled!=negate;
6942 p+=len+blkNameLen+markerInfo.
closeLen;
6961 size_t len = markerInfo.
endLen;
6962 bool negate = *(p+len)==
'!';
6964 for (
const auto &blk : blockList)
6966 size_t blkNameLen =
qstrlen(blk.name);
6967 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6971 p+=len+blkNameLen+markerInfo.
closeLen;
7002 const char *p = s.
data();
7011 bool negate = *(p+len)==
'!';
7017 if (markerInfo.
closeLen==0 && *p==
'\n')
7019 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
7025 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
7034 size_t len = markerInfo.
endLen;
7035 bool negate = *(p+len)==
'!';
7041 if (markerInfo.
closeLen==0 && *p==
'\n')
7043 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
7049 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
7066 const char *p=s.
data();
7075 while (*e==
' ' || *e==
'\t') e++;
7097 size_t prev = 0, pos = 0, len = s.length();
7100 pos = s.find(delimiter, prev);
7101 if (pos == std::string::npos) pos = len;
7102 if (pos>prev) result.push_back(s.substr(prev,pos-prev));
7103 prev = pos + delimiter.length();
7105 while (pos<len && prev<len);
7117 for ( ; iter !=
end; ++iter)
7119 const auto &match = *iter;
7120 size_t i=match.position();
7121 size_t l=match.length();
7122 if (i>p) result.push_back(s.substr(p,i-p));
7125 if (p<s.length()) result.push_back(s.substr(p));
7132 auto it = std::find(sv.begin(),sv.end(),s);
7133 return it!=sv.end() ?
static_cast<int>(it-sv.begin()) : -1;
7141 return reg::search(s,match,re) ?
static_cast<int>(match.position()) : -1;
7149 for (
const auto &s : sv)
7151 if (!first) result+=delimiter;
7165 while (residual > 0)
7167 modVal[0] = (upper ?
'A':
'a') + (residual-1)%26;
7168 result = modVal + result;
7169 residual = (residual-1) / 26;
7176 static const char *str_romans_upper[] = {
"M",
"CM",
"D",
"CD",
"C",
"XC",
"L",
"XL",
"X",
"IX",
"V",
"IV",
"I" };
7177 static const char *str_romans_lower[] = {
"m",
"cm",
"d",
"cd",
"c",
"xc",
"l",
"xl",
"x",
"ix",
"v",
"iv",
"i" };
7178 static const int values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
7179 static const char **str_romans = upper ? str_romans_upper : str_romans_lower;
7184 for (
int i = 0; i < 13; ++i)
7186 while (residual - values[i] >= 0)
7188 result += str_romans[i];
7189 residual -= values[i];
7199 size_t size = s.
length();
7201 const char *data = s.
data();
7204 constexpr auto doxy_nbsp =
"&_doxy_nbsp;";
7205 const int maxIndent=1000000;
7206 int minIndent=maxIndent;
7215 int stop = tabSize - (col%tabSize);
7218 while (stop--) out.
addChar(
' ');
7222 if (data[i] ==
'\\')
7228 else if (i+5<size &&
literal_at(data+i,
"iskip"))
7233 else if (i+8<size &&
literal_at(data+i,
"endiskip"))
7265 for (
int j=0;j<bytes-1 && c;j++)
7277 if (!skip && col<minIndent) minIndent=col;
7281 if (minIndent!=maxIndent) refIndent=minIndent;
else refIndent=0;
7291 uint8_t md5_sig[16];
7293 MD5Buffer(projectCookie.
data(),
static_cast<unsigned int>(projectCookie.
length()),md5_sig);
7294 MD5SigToString(md5_sig,sigStr);
7295 sigStr[32]=
'_'; sigStr[33]=0;
7302 int l =
static_cast<int>(name.
length());
7303 int lastSepPos = -1;
7304 const char *p = name.
data();
7313 if (sharpCount==0 && p[i+1]==
':' && p[i+2]==
':')
7327 if (ts==-1) ts=0;
else p+=++ts;
7328 for (i=ts;i<l-1;i++)
7331 if (c==
':' && *p==
':') lastSepPos=i;
7366 case '\t': col+=tabSize - (col%tabSize);
7375 for (
int i=0;i<numBytes-1 && (c=*s++);i++) {}
7376 if (c==0)
return col;
7391 int idx = name.
find(
'<');
7404 int idx = result.
find(
'-');
7405 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.
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