25#include <unordered_set>
82#define ENABLE_TRACINGSUPPORT 0
84#if defined(__APPLE__) && ENABLE_TRACINGSUPPORT
96#define REL_PATH_TO_ROOT "../../"
98static const char *
hex =
"0123456789ABCDEF";
110 if (s.empty())
return;
116 for (
size_t i=0;i<s.length();i++)
121 m_ol.writeNonBreakableSpace(1);
138 m_ol.lineBreak(
"typebreak");
139 for (
int i=0;i<indent;i++)
141 m_ol.writeNonBreakableSpace(3);
146 const QCString &anchor,std::string_view text
150 m_ol.writeObjectLink(extRef,file,anchor,text);
173 if (str.
isEmpty())
return result;
176 auto startsWithColon = [](
const std::string &del)
178 for (
size_t i=0;i<del.size();i++)
180 if (del[i]==
'@')
return false;
181 else if (del[i]==
':')
return true;
187 auto endsWithColon = [](
const std::string &del)
189 for (
int i=
static_cast<int>(del.size())-1;i>=0;i--)
191 if (del[i]==
'@')
return false;
192 else if (del[i]==
':')
return true;
197 static const reg::Ex re(R
"([\s:]*@\d+[\s:]*)");
198 std::string s = str.str();
202 size_t sl=s.length();
203 bool needsSeparator=
false;
204 for ( ; iter!=
end ; ++iter)
206 const auto &match = *iter;
207 size_t i = match.position();
210 if (needsSeparator) result+=
"::";
211 needsSeparator=
false;
212 result+=s.substr(p,i-p);
214 std::string delim = match.str();
215 needsSeparator = needsSeparator || (startsWithColon(delim) && endsWithColon(delim));
216 p = match.position()+match.length();
220 if (needsSeparator) result+=
"::";
230 static const reg::Ex marker(R
"(@\d+)");
232 !replacement.isEmpty() ? replacement.data() : "__anonymous__");
243 int sl =
static_cast<int>(s.
length());
251 if (!newScope.
isEmpty()) newScope+=
"::";
252 newScope+=s.
mid(i,l);
257 if (!newScope.
isEmpty()) newScope+=
"::";
258 newScope+=s.
right(sl-i);
290 const int maxMarkerStrLen = 20;
291 char result[maxMarkerStrLen];
292 qsnprintf(result,maxMarkerStrLen,
"@%d",
id);
313 for (
const auto &s : l)
316 if (
prefix.length() > length &&
323 if (length>0)
return potential;
350 static const std::unordered_set<std::string> sourceExt = {
351 "c",
"cc",
"cxx",
"cpp",
"c++",
"cppm",
"ccm",
"cxxm",
"c++m",
355 "ii",
"ixx",
"ipp",
"i++",
"inl",
358 static const std::unordered_set<std::string> headerExt = {
359 "h",
"hh",
"hxx",
"hpp",
"h++",
"ixx",
360 "idl",
"ddl",
"pidl",
"ice"
366 if (sourceExt.find(extension.
str())!=sourceExt.end())
368 return EntryType::makeSource();
370 if (headerExt.find(extension.
str())!=headerExt.end())
372 return EntryType::makeHeader();
379 return EntryType::makeEmpty();
385 AUTO_TRACE(
"context='{}' qualifiedName='{}'",context?context->
name():
"",qualifiedName);
394 if (typedefContext) *typedefContext=context;
397 if (qualifiedName.
find(
'<')!=-1)
402 int scopeIndex = qualifiedName.
findRev(
"::");
406 resName=qualifiedName.
right(qualifiedName.
length()-scopeIndex-2);
414 while (mContext && md==
nullptr)
430 if (!tmp.
isEmpty()) qualScopePart=tmp;
433 if (resScope==
nullptr)
break;
445 bool searchRelated=
false;
446 bool mustBeRelated=
false;
457 if (mn==0 && searchRelated)
465 for (
const auto &tmd_p : *mn)
468 AUTO_TRACE_ADD(
"found candidate member '{}' isTypeDef={}' isRelated={} mustBeRelated={}",
483 if (dist!=-1 && (md==
nullptr || dist<minDist))
505 if (args.
find(
")(")!=-1)
509 else if (args.
find(
'[')!=-1)
529static const char constScope[] = {
'c',
'o',
'n',
's',
't',
':' };
530static const char volatileScope[] = {
'v',
'o',
'l',
'a',
't',
'i',
'l',
'e',
':' };
531static const char virtualScope[] = {
'v',
'i',
'r',
't',
'u',
'a',
'l',
':' };
532static const char operatorScope[] = {
'o',
'p',
'e',
'r',
'a',
't',
'o',
'r',
'?',
'?',
'?' };
588 if (s.
length()*3>growBufLen)
590 growBufLen = s.
length()*3;
591 growBuf =
static_cast<char *
>(realloc(growBuf,growBufLen+1));
593 if (growBuf==
nullptr)
return s;
595 const char *src=s.
data();
606 while (i<l && isspace(
static_cast<uint8_t
>(src[i])))
613 char nc=i+1<l ? src[i+1] :
' ';
615 auto searchForKeyword = [&](
const char *kw,
size_t &matchLen,
size_t totalLen)
617 if (matchLen<=totalLen && c==kw[matchLen] &&
652 if (c==
'\\' && i+1<l)
676 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
677 (
isId(pc) || pc==
'*' || pc==
'&' || pc==
'.' || pc==
'>') &&
678 (osp<8 || (osp==8 && pc!=
'-'))
684 if (i+1<l && (nc==
'-' || nc==
'&'))
691 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
692 ((i+1<l && (
isId(nc) || nc==
'[')) ||
693 (i+2<l && nc==
'$' &&
isId(src[i+2])) ||
694 (i+3<l && nc==
'&' && src[i+2]==
'$' &&
isId(src[i+3]))
704 if (cliSupport && i+1<l && (
isId(nc) || nc==
'-'))
711 if (i+1<l && (
isId(nc) || nc==
'-'))
717 if (i>0 && pc!=
' ' && pc!=
'\t' && pc!=
':' &&
718 pc!=
'*' && pc!=
'&' && pc!=
'(' && pc!=
'/' &&
728 if (i>0 &&
isId(pc) && osp<9)
748 if (i>0 && i+1<l && pc!=
'=' && pc!=
':' && !isspace(
static_cast<uint8_t
>(pc)) &&
779 !(pc==
',' && nc==
'.') &&
780 (osp<8 || (osp>=8 &&
isId(pc) &&
isId(nc)))
788 else if ((pc==
'*' || pc==
'&' || pc==
'.') && nc==
'>')
796 auto correctKeywordAllowedInsideScope = [&](
char cc,
size_t &matchLen,
size_t totalLen) {
797 if (c==cc && matchLen==totalLen)
799 if ((i+2<l && src[i+1] ==
':' && src[i+2] ==
':') ||
800 ((i>matchLen && src[i-matchLen] ==
':' && src[i-matchLen-1] ==
':'))
804 correctKeywordAllowedInsideScope(
't',csp, 5);
805 correctKeywordAllowedInsideScope(
'e',vosp,8);
806 correctKeywordAllowedInsideScope(
'l',vsp, 7);
808 auto correctKeywordNotPartOfScope = [&](
char cc,
size_t &matchLen,
size_t totalLen)
810 if (c==cc && matchLen==totalLen && i+1<l &&
818 correctKeywordNotPartOfScope(
't',csp, 5);
819 correctKeywordNotPartOfScope(
'e',vosp,8);
820 correctKeywordNotPartOfScope(
'l',vsp, 7);
840 if (templateDepth > 0)
842 int nextOpenPos=name.
findRev(
'>', pos);
843 int nextClosePos=name.
findRev(
'<', pos);
844 if (nextOpenPos!=-1 && nextOpenPos>nextClosePos)
849 else if (nextClosePos!=-1)
861 int lastAnglePos=name.
findRev(
'>', pos);
862 int bracePos=name.
findRev(
'(', pos);
863 if (lastAnglePos!=-1 && lastAnglePos>bracePos)
870 int bp = bracePos>0 ? name.
findRev(
'(',bracePos-1) : -1;
872 return bp==-1 || (bp>=8 && name.
mid(bp-8,10)==
"operator()") ? bracePos : bp;
883 return (name==scope ||
884 (scope.
right(nl)==name &&
885 sl>1+nl && scope.
at(sl-nl-1)==
':' && scope.
at(sl-nl-2)==
':'
894 return (name==scope ||
895 (name.
left(sl)==scope &&
896 nl>sl+1 && name.
at(sl)==
':' && name.
at(sl+1)==
':'
904 const QCString &text,
bool autoBreak,
bool external,
905 bool keepSpaces,
int indentLevel)
909 std::string_view txtStr=text.
view();
910 size_t strLen = txtStr.length();
911 if (strLen==0)
return;
913 static const reg::Ex regExp(R
"((::)?\a[\w~!\\.:$"]*)");
923 size_t floatingIndex=0;
924 for (; it!=
end ; ++it)
926 const auto &match = *it;
927 size_t newIndex = match.position();
928 size_t matchLen = match.length();
929 floatingIndex+=newIndex-skipIndex+matchLen;
930 if (newIndex>0 && txtStr.at(newIndex-1)==
'0')
932 std::string_view part = txtStr.substr(skipIndex,newIndex+matchLen-skipIndex);
934 skipIndex=index=newIndex+matchLen;
939 bool insideString=
FALSE;
940 for (
size_t i=index;i<newIndex;i++)
942 if (txtStr.at(i)==
'"') insideString=!insideString;
943 if (txtStr.at(i)==
'\\') i++;
947 if (strLen>35 && floatingIndex>30 && autoBreak)
949 std::string_view splitText = txtStr.substr(skipIndex,newIndex-skipIndex);
950 size_t splitLength = splitText.length();
952 size_t i = splitText.find(
',');
953 if (i==std::string::npos) { i=splitText.find(
'<');
if (i!=std::string::npos) offset=0; }
954 if (i==std::string::npos) i=splitText.find(
'>');
955 if (i==std::string::npos) i=splitText.find(
' ');
957 if (i!=std::string::npos)
959 std::string_view part1 = splitText.substr(0,i+offset);
961 out.
writeBreak(indentLevel==0 ? 0 : indentLevel+1);
962 std::string_view part2 = splitText.substr(i+offset);
964 floatingIndex=splitLength-i-offset+matchLen;
974 std::string_view part = txtStr.substr(skipIndex,newIndex-skipIndex);
978 std::string_view word=txtStr.substr(newIndex,matchLen);
1007 auto writeCompoundName = [&](
const auto *cd_) {
1008 if (external ? cd_->isLinkable() : cd_->isLinkableInProject())
1013 out.
writeLink(cd_->getReference(),cd_->getOutputFileBase(),cd_->anchor(),word);
1018 if (!found && (cd || (cd=
getClass(matchWord))))
1020 writeCompoundName(cd);
1022 else if ((cd=
getClass(matchWord+
"-p")))
1024 writeCompoundName(cd);
1028 writeCompoundName(cnd);
1035 int m = matchWord.
findRev(
"::");
1043 scopeName=scope->
name();
1047 scopeName = matchWord.
left(m);
1048 matchWord = matchWord.
mid(m+2);
1057 if (result.
found && result.
md &&
1064 if (result.
md!=self && (self==
nullptr || result.
md->
name()!=self->
name()))
1093 skipIndex=index=newIndex+matchLen;
1097 std::string_view lastPart = txtStr.substr(skipIndex);
1102 std::function<
void(
size_t)> replaceFunc)
1104 static const reg::Ex marker(R
"(@(\d+))");
1109 for ( ; it!=
end ; ++it)
1111 const auto &match = *it;
1112 size_t newIndex = match.position();
1113 size_t matchLen = match.length();
1114 ol.
parseText(markerText.substr(index,newIndex-index));
1115 unsigned long entryIndex = std::stoul(match[1].str());
1116 if (entryIndex<
static_cast<unsigned long>(numMarkers))
1118 replaceFunc(entryIndex);
1120 index=newIndex+matchLen;
1127 auto replaceFunc = [&list,&ol](
size_t entryIndex)
1129 const auto &e = list[entryIndex];
1161 if (a.hasDocumentation())
1165 paramDocs+=
" \\ilinebr @param"+direction+
" "+a.name+
" "+docsWithoutDir;
1179 if (!a.docs.isEmpty())
1181 if (!a.name.isEmpty())
1183 paramDocs+=
" \\ilinebr @tparam "+a.name+
" "+a.docs;
1185 else if (!a.type.isEmpty())
1191 paramDocs+=
" \\ilinebr @tparam "+type+
" "+a.docs;
1204 for (
auto it = al.
begin() ; it!=al.
end() ;)
1209 int i=type1.
find(
")(");
1213 type1=type1.
left(i);
1221 result+= type1+
" "+a.
name+type2+a.
array;
1225 result+= type1+type2;
1232 if (it!=al.
end()) result+=
", ";
1247 if (al.
empty())
return result;
1250 for (
const auto &a : al)
1252 if (a.defval.isEmpty() || includeDefault)
1254 if (!first) result+=
", ";
1255 if (!a.name.isEmpty())
1257 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
1265 int i =
static_cast<int>(a.type.length())-1;
1266 while (i>=0 &&
isId(a.type.at(i))) i--;
1269 result+=a.type.
right(a.type.length()-i-1);
1270 if (a.type.find(
"...")!=-1)
1280 if (!a.typeConstraint.isEmpty() && lang==SrcLangExt::Java)
1282 result+=
" extends ";
1283 result+=a.typeConstraint;
1304 size_t len = contents.length();
1308 char c = contents[src++];
1312 if (src<len && contents[src] ==
'\n')
1317 else if ( c ==
'\0' && src<len-1)
1321 contents[dest++] = c;
1323 contents.resize(dest);
1330 for (
const auto &filterStr : filterList)
1333 int i_equals=fs.
find(
'=');
1340 filterPattern = filterPattern.
lower();
1341 input = input.
lower();
1348 if (filterName.
find(
' ')!=-1)
1350 filterName=
"\""+filterName+
"\"";
1370 if (name.
isEmpty())
return "";
1377 if (isSourceCode && !filterSrcList.empty())
1381 if (!found && filterName.
isEmpty())
1392 if (filterName.
length()>=2 && filterName[0]==
'"' && filterName[
static_cast<int>(filterName.
length())-1]==
'"')
1394 filterName = filterName.
mid(1,filterName.
length()-2);
1403 const char *outputEncoding =
"UTF-8";
1404 if (inputEncoding==
nullptr ||
qstricmp(inputEncoding,outputEncoding)==0)
return true;
1405 size_t inputSize=input.length();
1406 size_t outputSize=inputSize*4;
1409 if (cd==
reinterpret_cast<void *
>(-1))
1414 size_t iLeft=inputSize;
1415 size_t oLeft=outputSize;
1416 const char *inputPtr = input.data();
1417 char *outputPtr = output.
rawData();
1420 outputSize-=
static_cast<int>(oLeft);
1421 output.
resize(outputSize);
1422 output.
at(outputSize)=
'\0';
1442 bool fileOpened=
false;
1443 if (name[0]==
'-' && name[1]==0)
1445 std::string contents;
1447 while (getline(std::cin,line))
1449 contents+=line+
'\n';
1458 err(
"file '{}' not found\n",name);
1471 err(
"cannot open file '{}' for reading\n",name);
1479 for (
const auto &bcd : bcl)
1500 if (target==str) { target.
clear();
return; }
1502 int l=
static_cast<int>(str.
length());
1504 while ((i=target.
find(str,p))!=-1)
1506 bool isMatch = (i==0 || !
isId(target.
at(i-1))) &&
1507 (i+l==
static_cast<int>(target.
length()) || !
isId(target.
at(i+l)));
1510 int i1=target.
find(
'*',i+l);
1511 int i2=target.
find(
'&',i+l);
1512 if (i1==-1 && i2==-1)
1519 else if ((i1!=-1 && i<i1) || (i2!=-1 && i<i2))
1561 int i=s.
find(
" class ");
1562 if (i!=-1)
return s.
left(i)+s.
mid(i+6);
1563 i=s.
find(
" typename ");
1564 if (i!=-1)
return s.
left(i)+s.
mid(i+9);
1565 i=s.
find(
" union ");
1566 if (i!=-1)
return s.
left(i)+s.
mid(i+6);
1567 i=s.
find(
" struct ");
1568 if (i!=-1)
return s.
left(i)+s.
mid(i+7);
1581 if (!templSpec.
isEmpty() && templSpec.
at(0) ==
'<')
1588 templSpec = resolvedType;
1599 if (count>10)
return word;
1601 QCString symName,result,templSpec,tmpName;
1602 if (tSpec && !tSpec->
isEmpty())
1605 AUTO_TRACE(
"d='{}' fs='{}' word='{}' templSpec='{}'",d?d->
name():
"",fs?fs->
name():
"",word,templSpec);
1623 bool isTemplInst = cd && !templSpec.
isEmpty();
1624 if (!cd && !templSpec.
isEmpty())
1635 cd?cd->
name():
"",mType?mType->
name():
"",ts,resolvedType);
1658 if (cd==d && tSpec) *tSpec=
"";
1662 result = resolvedType+ts;
1670 if (tSpec) *tSpec=
"";
1684 result=cd->
name()+templSpec;
1734 resolvedType = lang==SrcLangExt::Java ? word :
resolveTypeDef(d,word);
1742 result = resolvedType;
1775 if (i>pp) canType += type.
mid(pp,i-pp);
1796 std::string ts = templSpec.
str();
1797 static const reg::Ex re(R
"(\a\w*)");
1804 for (; it!=
end ; ++it)
1806 const auto &match = *it;
1807 size_t ti = match.position();
1808 size_t tl = match.length();
1809 std::string matchStr = match.str();
1810 canType += ts.substr(tp,ti-tp);
1814 canType+=ts.substr(tp);
1830 if ((type==
"const" || type==
"volatile") && !name.
isEmpty())
1835 if (name==
"const" || name==
"volatile")
1837 if (!type.
isEmpty()) type+=
" ";
1863 AUTO_TRACE(
"srcType='{}' dstType='{}'",srcType,dstType);
1864 if (srcType==dstType)
return true;
1867 int i1=srcType.
find(
")(");
1868 if (i1==-1)
return false;
1869 int i2=dstType.
find(
")(");
1870 if (i1!=i2)
return false;
1873 int j1=srcType.
find(
"(");
1874 if (j1==-1 || j1>i1)
return false;
1875 int j2=dstType.
find(
"(");
1876 if (j2!=j1)
return false;
1877 if (srcType.
left(j1)!=dstType.
left(j2))
return false;
1886 dstScope,dstFileScope,dstAl.get(),
1896 AUTO_TRACE(
"src: scope={} type={} name={} canType={}, dst: scope={} type={} name={} canType={}",
1915 srcA.
type+=sSrcName;
1919 else if (sDstName==srcType.
right(sDstName.
length()))
1921 dstA.
type+=sDstName;
1937 dstScope,dstFileScope,dstA.
canType,
1960 ASSERT(srcScope!=
nullptr && dstScope!=
nullptr);
1962 AUTO_TRACE(
"srcScope='{}' dstScope='{}' srcArgs='{}' dstArgs='{}' checkCV={} lang={}",
1965 if (srcAl==
nullptr || dstAl==
nullptr)
1967 bool match = srcAl==dstAl;
1998 if (srcAl->
size() != dstAl->
size())
2026 auto srcIt = srcAl->
begin();
2027 auto dstIt = dstAl->
begin();
2028 for (;srcIt!=srcAl->
end() && dstIt!=dstAl->
end();++srcIt,++dstIt)
2033 dstScope,dstFileScope,dstA,
2052 AUTO_TRACE(
"srcAl='{}',dstAl='{}',forceNameOverwrite={}",
2060 auto srcIt=srcAl.
begin();
2061 auto dstIt=dstAl.
begin();
2062 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
2067 AUTO_TRACE_ADD(
"before merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
2083 if (srcA.
name==
"const" || srcA.
name==
"volatile")
2088 if (dstA.
name==
"const" || dstA.
name==
"volatile")
2114 if (forceNameOverwrite)
2157 j1=
static_cast<int>(srcA.
type.
length())-i1-2,
2158 j2=
static_cast<int>(dstA.
type.
length())-i2-2;
2166 else if (i1==-1 && i2!=-1 && dstA.
type.
right(j2)==srcA.
type)
2186 AUTO_TRACE_ADD(
"after merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
2202 auto isUnconstraintTemplate = [](
const QCString &type)
2204 return type==
"typename" || type==
"class" || type.startsWith(
"typename ") || type.startsWith(
"class ");
2206 auto srcIt = srcAl.
begin();
2207 auto dstIt = dstAl.
begin();
2208 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
2212 if ((!isUnconstraintTemplate(srcA.
type) || !isUnconstraintTemplate(dstA.
type)) && srcA.
type!=dstA.
type)
2231 AUTO_TRACE(
"getDefsNew(scopeName={},memberName={},forceEmptyScope={})",
2257 result.
found =
true;
2262 result.
found =
true;
2267 result.
found =
true;
2272 result.
found =
true;
2277 result.
found =
true;
2309 bool explicitGlobalScope=
FALSE;
2310 if (scopeName.
at(0)==
':' && scopeName.
at(1)==
':')
2313 explicitGlobalScope=
TRUE;
2321 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(docScopeName.
length());
2326 if (scopeOffset>0) fullName.
prepend(docScopeName.
left(scopeOffset)+
"::");
2350 else if ((scopeOffset=docScopeName.
findRev(
"::",scopeOffset-1))==-1)
2354 }
while (scopeOffset>=0);
2362 const char *p=s.
data();
2364 while ((c=
static_cast<uint8_t
>(*p++)))
if (!islower(c))
return false;
2377 bool lookForSpecialization,
2382 AUTO_TRACE(
"scope={} name={} inSeeBlock={} lang={} lookForSpecialization={} currentFile={} checkScope={}",
2383 scName,name,inSeeBlock,lang,lookForSpecialization,currentFile ? currentFile->
name() :
"", checkScope);
2388 if (fullName.
find(
"anonymous_namespace{")==-1)
2398 if (lang==SrcLangExt::CSharp && (templStartPos=fullName.
find(
'<'))!=-1)
2400 int templEndPos = fullName.
findRev(
'>');
2401 if (templEndPos!=-1)
2409 int endNamePos=bracePos!=-1 ? bracePos :
static_cast<int>(fullName.
length());
2410 int scopePos=fullName.
findRev(
"::",endNamePos);
2411 bool explicitScope = fullName.
startsWith(
"::") &&
2416 bool allowTypeOnly=
false;
2419 *resContext=
nullptr;
2426 if (!inSeeBlock && scopePos==-1 &&
isLowerCase(tsName))
2440 if (scName!=fullName &&
getScopeDefs(scName,fullName,cd,cnd,nd,modd))
2463 else if (scName==fullName || (!inSeeBlock && scopePos==-1))
2482 if (explicitScope) nameStr=nameStr.
mid(2);
2487 if (bracePos!=-1) argsStr=fullName.
right(fullName.
length()-bracePos);
2491 int templPos=nameStr.
find(
'<');
2492 bool tryUnspecializedVersion =
FALSE;
2493 if (templPos!=-1 && nameStr.
find(
"operator")==-1)
2495 int endTemplPos=nameStr.
findRev(
'>');
2496 if (endTemplPos!=-1)
2498 if (!lookForSpecialization)
2500 nameStr=nameStr.
left(templPos)+nameStr.
right(nameStr.
length()-endTemplPos-1);
2504 tryUnspecializedVersion =
TRUE;
2512 nameStr=nameStr.
mid(scopeStr.
length()+2);
2538 *resContext=
nullptr;
2548 *resMember=result.
md;
2549 *resContext=result.
md;
2553 *resContext=
nullptr;
2559 else if (result.
cd) *resContext=result.
cd;
2560 else if (result.
nd) *resContext=result.
nd;
2561 else if (result.
fd) *resContext=result.
fd;
2562 else if (result.
gd) *resContext=result.
gd;
2563 else if (result.
cnd) *resContext=result.
cnd;
2564 else if (result.
modd) *resContext=result.
modd;
2567 *resContext=
nullptr; *resMember=
nullptr;
2594 else if (tsName.
find(
'.')!=-1)
2606 if (tryUnspecializedVersion)
2608 bool b =
resolveRef(scName,name,inSeeBlock,resContext,resMember,lang,
FALSE,
nullptr,checkScope);
2636 if (!isFileName && result.
find(
'<')==-1) result=
substitute(result,
".",
"::",3);
2638 if (result.
at(0)==
':' && result.
at(1)==
':')
2662 *resContext=
nullptr;
2665 if (lang==SrcLangExt::CSharp)
2670 AUTO_TRACE(
"scName='{}',ref='{}'",scName,lr);
2675 const DirDef *dir =
nullptr;
2693 if (si) resAnchor = si->
label();
2705 resAnchor = si->
label();
2712 resAnchor = si->
label();
2742 else if (lang==SrcLangExt::Java &&
2743 (cd=
getClass(linkRefWithoutTemplates)))
2750 else if ((cd=
getClass(linkRef+
"-p")))
2767 resAnchor=modd->
anchor();
2788 if (md) resAnchor=md->
anchor();
2826 if (n.
isEmpty())
return nullptr;
2829 const int maxAddrSize = 20;
2830 char addr[maxAddrSize];
2831 qsnprintf(addr,maxAddrSize,
"%p:",
reinterpret_cast<const void*
>(fnMap));
2840 ambig = cachedResult->
isAmbig;
2851 if (name.
isEmpty())
return nullptr;
2858 if (name.
isEmpty())
return nullptr;
2865 const std::unique_ptr<FileDef> &fd = fn->front();
2867 fd->getPath().right(path.
length())==path :
2869 if (path.
isEmpty() || isSamePath)
2871 cachedResult->
fileDef = fd.get();
2880 for (
const auto &fd_p : *fn)
2894 cachedResult->
isAmbig = ambig;
2895 cachedResult->
fileDef = lastMatch;
2925 for (
const auto &s : examplePathList)
2959 path=name.
left(slashPos+1);
2966 for (
const auto &fd : *fn)
2968 if (path.
isEmpty() || fd->getPath().right(path.
length())==path)
2970 if (!first) result +=
"\n";
2972 result+=
" "+fd->absFilePath();
2983 std::string substRes;
2985 const char *p = s.
data();
2989 substRes.reserve(s.
length()+1024);
2996 for (
const auto &kw : keywords)
2998 size_t keyLen =
qstrlen(kw.keyword);
2999 if (
qstrncmp(p,kw.keyword,keyLen)==0)
3001 const char *startArg = p+keyLen;
3002 bool expectParam = std::holds_alternative<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3004 if (expectParam && *startArg==
'(')
3007 const char *endArg =
nullptr;
3008 while ((c=*(startArg+j)) && c!=
')' && c!=
'\n' && c!=0) j++;
3009 if (c==
')') endArg=startArg+j;
3013 auto &&getValue = std::get<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3014 substRes+=getValue(value).str();
3021 warn(file,line,
"Missing argument for '{}'",kw.keyword);
3025 else if (!expectParam)
3027 auto &&getValue = std::get<KeywordSubstitution::GetValue>(kw.getValueVariant);
3028 substRes+=getValue().str();
3035 warn(file,line,
"Expected arguments for '{}' but none were specified",kw.keyword);
3045 if (c==
'\n') line++;
3073 int wi = projectLogo.
find(
" width=");
3076 projectLogo = projectLogo.
left(wi);
3078 int hi = projectLogo.
find(
" height=");
3081 projectLogo = projectLogo.
left(hi);
3094 auto extractDimension = [&projectLogo](
const char *startMarker,
size_t startPos,
size_t endPos) ->
QCString
3097 if (result.
length()>=2 && result.
at(0)!=
'"' && result.
at(result.
length()-1)!=
'"')
3099 result=
"\""+result+
"\"";
3105 int wi = projectLogo.
find(
" width=");
3106 int hi = projectLogo.
find(
" height=");
3107 if (wi!=-1 && hi!=-1)
3111 sizeVal = extractDimension(
" width=", wi+7, hi) +
" "
3112 + extractDimension(
" height=", hi+8, projectLogo.
length());
3116 sizeVal = extractDimension(
" height=", hi+8, wi) +
" "
3117 + extractDimension(
" width=", wi+7, projectLogo.
length());
3122 sizeVal = extractDimension(
" width=", wi+7, projectLogo.
length());
3126 sizeVal = extractDimension(
" height=", hi+8, projectLogo.
length());
3139 {
"$title", [&]() {
return !title.
isEmpty() ? title : projName; } },
3140 {
"$doxygenversion", [&]() {
return getDoxygenVersion(); } },
3141 {
"$projectname", [&]() {
return projName; } },
3142 {
"$projectnumber", [&]() {
return projNum; } },
3143 {
"$projectbrief", [&]() {
return projBrief; } },
3147 {
"$langISO", [&]() {
return theTranslator->trISOLang(); } },
3162 for (
const auto &s : sl)
3164 const char *ps=s.c_str();
3165 const char *pd=name.
data();
3167 while (*ps!=0 && *pd!=0 && *ps==*pd) ps++,pd++,i++;
3168 if (*ps==0 && *pd!=0)
3184int getUtf8Char(
const char *input,
char ids[MAX_UTF8_CHAR_SIZE],CaseModifier modifier)
3187 const unsigned char uc = (
unsigned char)*input;
3188 bool validUTF8Char =
false;
3191 const char* pt = input+1;
3193 if ((uc&0x80)==0x00)
3197 case CaseModifier::None: ids[0]=*input;
break;
3198 case CaseModifier::ToUpper: ids[0]=(char)toupper(*input);
break;
3199 case CaseModifier::ToLower: ids[0]=(char)tolower(*input);
break;
3206 if ((uc&0xE0)==0xC0)
3210 if ((uc&0xF0)==0xE0)
3214 if ((uc&0xF8)==0xF0)
3219 validUTF8Char = l>0;
3220 for (
int m=1; m<l && validUTF8Char; ++m)
3222 unsigned char ct = (
unsigned char)*pt;
3223 if (ct==0 || (ct&0xC0)!=0x80)
3225 validUTF8Char=
false;
3246 if (caseSenseNames == CASE_SENSE_NAMES_t::YES)
return true;
3247 else if (caseSenseNames == CASE_SENSE_NAMES_t::NO)
return false;
3253 if (name.
isEmpty())
return name;
3258 const char *p=name.
data();
3263 case '_':
if (allowUnderscore) growBuf.
addChar(
'_');
else growBuf.
addStr(
"__");
break;
3264 case '-': growBuf.
addChar(
'-');
break;
3265 case ':': growBuf.
addStr(
"_1");
break;
3266 case '/': growBuf.
addStr(
"_2");
break;
3267 case '<': growBuf.
addStr(
"_3");
break;
3268 case '>': growBuf.
addStr(
"_4");
break;
3269 case '*': growBuf.
addStr(
"_5");
break;
3270 case '&': growBuf.
addStr(
"_6");
break;
3271 case '|': growBuf.
addStr(
"_7");
break;
3272 case '.':
if (allowDots) growBuf.
addChar(
'.');
else growBuf.
addStr(
"_8");
break;
3273 case '!': growBuf.
addStr(
"_9");
break;
3274 case ',': growBuf.
addStr(
"_00");
break;
3275 case ' ': growBuf.
addStr(
"_01");
break;
3276 case '{': growBuf.
addStr(
"_02");
break;
3277 case '}': growBuf.
addStr(
"_03");
break;
3278 case '?': growBuf.
addStr(
"_04");
break;
3279 case '^': growBuf.
addStr(
"_05");
break;
3280 case '%': growBuf.
addStr(
"_06");
break;
3281 case '(': growBuf.
addStr(
"_07");
break;
3282 case ')': growBuf.
addStr(
"_08");
break;
3283 case '+': growBuf.
addStr(
"_09");
break;
3284 case '=': growBuf.
addStr(
"_0a");
break;
3285 case '$': growBuf.
addStr(
"_0b");
break;
3286 case '\\': growBuf.
addStr(
"_0c");
break;
3287 case '@': growBuf.
addStr(
"_0d");
break;
3288 case ']': growBuf.
addStr(
"_0e");
break;
3289 case '[': growBuf.
addStr(
"_0f");
break;
3290 case '#': growBuf.
addStr(
"_0g");
break;
3291 case '"': growBuf.
addStr(
"_0h");
break;
3292 case '~': growBuf.
addStr(
"_0i");
break;
3293 case '\'': growBuf.
addStr(
"_0j");
break;
3294 case ';': growBuf.
addStr(
"_0k");
break;
3295 case '`': growBuf.
addStr(
"_0l");
break;
3299 bool doEscape =
true;
3300 if (allowUnicodeNames)
3305 growBuf.
addStr(p-1,charLen);
3313 unsigned char id =
static_cast<unsigned char>(c);
3322 else if (caseSenseNames || !isupper(c))
3329 growBuf.
addChar(
static_cast<char>(tolower(c)));
3335 return growBuf.
get();
3343 const char *p = s.
data();
3353 case '_': result+=c; p++;
break;
3354 case '1': result+=
':'; p++;
break;
3355 case '2': result+=
'/'; p++;
break;
3356 case '3': result+=
'<'; p++;
break;
3357 case '4': result+=
'>'; p++;
break;
3358 case '5': result+=
'*'; p++;
break;
3359 case '6': result+=
'&'; p++;
break;
3360 case '7': result+=
'|'; p++;
break;
3361 case '8': result+=
'.'; p++;
break;
3362 case '9': result+=
'!'; p++;
break;
3366 case '0': result+=
','; p+=2;
break;
3367 case '1': result+=
' '; p+=2;
break;
3368 case '2': result+=
'{'; p+=2;
break;
3369 case '3': result+=
'}'; p+=2;
break;
3370 case '4': result+=
'?'; p+=2;
break;
3371 case '5': result+=
'^'; p+=2;
break;
3372 case '6': result+=
'%'; p+=2;
break;
3373 case '7': result+=
'('; p+=2;
break;
3374 case '8': result+=
')'; p+=2;
break;
3375 case '9': result+=
'+'; p+=2;
break;
3376 case 'a': result+=
'='; p+=2;
break;
3377 case 'b': result+=
'$'; p+=2;
break;
3378 case 'c': result+=
'\\'; p+=2;
break;
3379 case 'd': result+=
'@'; p+=2;
break;
3380 case 'e': result+=
']'; p+=2;
break;
3381 case 'f': result+=
'['; p+=2;
break;
3382 case 'g': result+=
'#'; p+=2;
break;
3383 case 'h': result+=
'"'; p+=2;
break;
3384 case 'i': result+=
'~'; p+=2;
break;
3385 case 'j': result+=
'\''; p+=2;
break;
3386 case 'k': result+=
';'; p+=2;
break;
3387 case 'l': result+=
'`'; p+=2;
break;
3394 if (!caseSenseNames && c>=
'a' && c<=
'z')
3396 result+=
static_cast<char>(toupper(*p));
3427 if (name.
isEmpty())
return name;
3450 size_t resultLen = result.
length();
3454 uint8_t md5_sig[16];
3456 MD5Buffer(result.
data(),
static_cast<unsigned int>(resultLen),md5_sig);
3457 MD5SigToString(md5_sig,sigStr);
3458 result=result.
left(128-32)+sigStr;
3463 int l1Dir=0,l2Dir=0;
3464 int createSubdirsLevel =
Config_getInt(CREATE_SUBDIRS_LEVEL);
3465 int createSubdirsBitmaskL2 = (1<<createSubdirsLevel)-1;
3468 uint8_t md5_sig[16];
3469 MD5Buffer(result.
data(),
static_cast<unsigned int>(result.
length()),md5_sig);
3470 l1Dir = md5_sig[14] & 0xf;
3471 l2Dir = md5_sig[15] & createSubdirsBitmaskL2;
3482 const int sig_size=16;
3483 uint8_t md5_sig[sig_size];
3484 MD5Buffer(fn.
data(),
static_cast<unsigned int>(fn.
length()),md5_sig);
3485 char result[sig_size*3+2];
3488 for (
int i=0;i<sig_size;i++)
3490 static const char oct[]=
"01234567";
3491 uint8_t
byte = md5_sig[i];
3492 *p++=oct[(
byte>>6)&7];
3493 *p++=oct[(
byte>>3)&7];
3494 *p++=oct[(
byte>>0)&7];
3524 QCString absIncFileName = incFileName;
3534 else if (searchIncludes)
3537 for (
const auto &incPath : includePath)
3556 return absIncFileName;
3566 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
3567 for (
int l1=0; l1<16; l1++)
3573 term(
"Failed to create output directory '{}'\n",subdir);
3575 for (
int l2=0; l2<createSubdirsLevelPow2; l2++)
3578 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
3581 term(
"Failed to create output directory '{}'\n",subsubdir);
3593 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
3594 for (
int l1=0;l1<16;l1++)
3598 for (
int l2=0; l2 < createSubdirsLevelPow2; l2++)
3601 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
3620 bool allowEmptyClass)
3627 namespaceName=nd->
name();
3631 p=
static_cast<int>(clName.
length())-2;
3632 while (p>=0 && (i=clName.
findRev(
"::",p))!=-1)
3639 namespaceName=nd->
name();
3648 className=scopeName;
3649 namespaceName.
clear();
3652 if (className.
isEmpty() && !namespaceName.
isEmpty() && !allowEmptyClass)
3655 className=namespaceName;
3656 namespaceName.
clear();
3662 className = className.
left(className.
length()-2);
3703 int l =
static_cast<int>(result.
length());
3706 bool skipBracket=
FALSE;
3713 while (p>=0 && count>=0)
3715 char c=result.
at(p);
3721 if (p>0 && result.
at(p-1)==
':' && (count==0 || skipBracket))
3723 return result.
right(l-p-1);
3734 if (p>0 && result.
at(p-1)==
'>')
3742 bool foundMatch=
false;
3743 while (p>=0 && !foundMatch)
3755 if (round==0) count++;
3762 if (result.
at(p-1) ==
'<')
3769 foundMatch = count==0;
3784 done = count==0 || skipBracket;
3797 const char *p = s.
data();
3803 if ((c>=
'0' && c<=
'9') || (c>=
'a' && c<=
'z') || (c>=
'A' && c<=
'Z') || c==
'-')
3805 if (first && c>=
'0' && c<=
'9') growBuf.
addChar(
'a');
3811 encChar[1]=
hex[
static_cast<unsigned char>(c)>>4];
3812 encChar[2]=
hex[
static_cast<unsigned char>(c)&0xF];
3819 return growBuf.
get();
3837 const char *p = s.
data();
3843 case '<': growBuf.
addStr(
"<");
break;
3844 case '>': growBuf.
addStr(
">");
break;
3845 case '&':
if (keepEntities)
3851 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
3857 while (p<e) growBuf.
addChar(*p++);
3869 case '\'': growBuf.
addStr(
"'");
break;
3870 case '"': growBuf.
addStr(
""");
break;
3871 case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
3872 case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
3873 case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
3874 case 27:
case 28:
case 29:
case 30:
case 31:
3876 default: growBuf.
addChar(c);
break;
3880 return growBuf.
get();
3888 const char *p=s.
data();
3894 case '<': growBuf.
addStr(
"<");
break;
3895 case '>': growBuf.
addStr(
">");
break;
3896 case '&':
if (keepEntities)
3902 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
3908 while (p<e) growBuf.
addChar(*p++);
3920 case '\'': growBuf.
addStr(
"'");
break;
3921 case '"': growBuf.
addStr(
""");
break;
3924 uint8_t uc =
static_cast<uint8_t
>(c);
3925 if (uc<32 && !isspace(c))
3941 return growBuf.
get();
3948 const char *p=s.
data();
3954 case '"':
if (!singleQuotes) growBuf.
addStr(
"\\\"");
else growBuf.
addChar(c);
3956 case '\'':
if (singleQuotes) growBuf.
addStr(
"\\\'");
else growBuf.
addChar(c);
3958 case '\\':
if (*p==
'u' && *(p+1)==
'{') growBuf.
addStr(
"\\");
3959 else growBuf.
addStr(
"\\\\");
3961 default: growBuf.
addChar(c);
break;
3972 std::string s = str.
data();
3973 static const reg::Ex re(R
"(&\a\w*;)");
3978 size_t p=0, i=0, l=0;
3979 for (; it!=
end ; ++it)
3981 const auto &match = *it;
3982 p = match.position();
3986 growBuf.
addStr(s.substr(i,p-i));
3990 const char *code=
nullptr;
4001 growBuf.
addStr(s.substr(i));
4004 return growBuf.
get();
4022 ASSERT(context!=
nullptr);
4024 if (ml==
nullptr)
return;
4026 struct MoveMemberInfo
4029 : memberDef(md), memberGroup(mg), sli(rv) {}
4034 std::vector<MoveMemberInfo> movedMembers;
4036 for (
const auto &md : *ml)
4038 if (md->isEnumerate())
4040 for (
const auto &fmd : md->enumFieldList())
4042 int groupId=fmd->getMemberGroupId();
4048 const auto &info = it->second;
4049 auto mg_it = std::find_if(pMemberGroups->begin(),
4050 pMemberGroups->end(),
4051 [&groupId](
const auto &g)
4052 { return g->groupId()==groupId; }
4055 if (mg_it==pMemberGroups->end())
4057 auto mg = std::make_unique<MemberGroup>(
4066 pMemberGroups->push_back(std::move(mg));
4070 mg_ptr = (*mg_it).get();
4082 int groupId=md->getMemberGroupId();
4088 const auto &info = it->second;
4089 auto mg_it = std::find_if(pMemberGroups->begin(),
4090 pMemberGroups->end(),
4091 [&groupId](
const auto &g)
4092 { return g->groupId()==groupId; }
4095 if (mg_it==pMemberGroups->end())
4097 auto mg = std::make_unique<MemberGroup>(
4106 pMemberGroups->push_back(std::move(mg));
4110 mg_ptr = (*mg_it).get();
4112 movedMembers.emplace_back(md,mg_ptr,info->m_sli);
4118 for (
const auto &mmi : movedMembers)
4120 ml->
remove(mmi.memberDef);
4121 mmi.memberGroup->insertMember(mmi.memberDef->resolveAlias());
4122 mmi.memberGroup->setRefItems(mmi.sli);
4138 static const reg::Ex re_norm(R
"(\a[\w:]*)");
4139 static const reg::Ex re_fortran(R
"(\a[\w:()=]*)");
4144 if (type.
isEmpty())
return -1;
4145 size_t typeLen=type.
length();
4148 if (lang == SrcLangExt::Fortran)
4150 if (type[pos]==
',')
return -1;
4156 std::string s = type.
str();
4162 const auto &match = *it;
4163 size_t i = match.position();
4164 size_t l = match.length();
4169 while (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
' ') ts++,tl++;
4170 if (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
'<')
4175 while (te<typeLen && brCount!=0)
4177 if (type[
static_cast<uint32_t
>(te)]==
'<')
4179 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'<') te++;
else brCount++;
4181 if (type[
static_cast<uint32_t
>(te)]==
'>')
4183 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'>') te++;
else brCount--;
4193 pos=
static_cast<int>(i+l+tl);
4197 pos=
static_cast<int>(i+l);
4201 return static_cast<int>(i);
4204 pos =
static_cast<int>(typeLen);
4216 int p=name.
find(
'<');
4217 if (p==-1)
return name;
4221 std::string s = name.
mid(p).
str();
4222 static const reg::Ex re(R
"([\a:][\w:]*)");
4227 for (; it!=
end ; ++it)
4229 const auto &match = *it;
4230 size_t i = match.position();
4231 size_t l = match.length();
4232 result += s.substr(pi,i-pi);
4235 for (
const Argument &formArg : formalArgs)
4237 if (formArg.name == n)
4263 result+=s.substr(pi);
4281 if (formalArgs.
empty())
return nm;
4284 static const reg::Ex re(R
"(\a\w*)");
4285 std::string name = nm.str();
4290 for (; it!=
end ; ++it)
4292 const auto &match = *it;
4293 size_t i = match.position();
4294 size_t l = match.length();
4295 if (i>p) result += name.substr(p,i-p);
4300 actIt = actualArgs->
begin();
4307 for (
auto formIt = formalArgs.
begin();
4308 formIt!=formalArgs.
end() && !found;
4314 if (actualArgs && actIt!=actualArgs->
end())
4321 formArg.
type =
"class";
4326 formArg.
type =
"typename";
4330 formArg.
name +=
"...";
4335 formArg.
name +=
"...";
4342 if (formArg.
name==n && actualArgs && actIt!=actualArgs->
end() && !actArg.
type.
isEmpty())
4349 ii = subst.find(
'<');
4351 if (ii!=-1 &&
static_cast<int>(
prefix.length())>=ii+2 &&
prefix.mid(
prefix.length()-ii-2,ii+1)==subst.left(ii+1))
4356 while ((ii=subst.find(nameArg,pp))!=-1)
4358 bool beforeNonWord = ii==0 || !
isId(subst.at(ii-1));
4359 bool afterNonWord = subst.length()==ii+nameArg.length() || !
isId(subst.at(ii+nameArg.length()));
4360 if (beforeNonWord && afterNonWord)
4364 pp=ii+
static_cast<int>(nameArg.length());
4369 AUTO_TRACE_ADD(
"result={} n={} type={} hasRecursion={}",result,n,actArg.
type,hasRecursion(result,n,actArg.
type));
4370 if (!hasRecursion(result,n,actArg.
type))
4382 result += actArg.
type;
4388 result += actArg.
type+
" "+actArg.
name;
4393 else if (formArg.
name==n &&
4394 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4403 else if (formArg.
name==n &&
4404 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4412 if (actualArgs && actIt!=actualArgs->
end())
4423 result+=name.substr(p);
4441 bool allowArtificial)
4444 int i=fullName.
find(
'<');
4445 if (i==-1)
return fullName;
4448 int l=
static_cast<int>(fullName.
length());
4455 while (e<l && count>0)
4457 char c=fullName.
at(e++);
4460 case '(': round++;
break;
4461 case ')':
if (round>0) round--;
break;
4462 case '<':
if (round==0) count++;
break;
4463 case '>':
if (round==0) count--;
break;
4468 int si= fullName.
find(
"::",e);
4470 if (parentOnly && si==-1)
break;
4473 result+=fullName.
mid(p,i-p);
4476 if (cd!=
nullptr && (allowArtificial || !cd->
isArtificial()))
4478 result+=fullName.
mid(i,e-i);
4481 else if (pLastScopeStripped)
4484 *pLastScopeStripped=fullName.
mid(i,e-i);
4487 i=fullName.
find(
'<',p);
4489 result+=fullName.
right(l-p);
4506 AUTO_TRACE(
"leftScope='{}' rightScope='{}'",leftScope,rightScope);
4514 int i=0,p=
static_cast<int>(leftScope.
length());
4519 while ((i=leftScope.
findRev(
"::",p))>0)
4523 result = leftScope.
left(i+2)+rightScope;
4551 int sl=
static_cast<int>(s.
length());
4555 if (sp>=sl)
return -1;
4559 if (c==
':') sp++,p++;
else break;
4571 while (sp<sl && !done)
4577 case '<': count++;
break;
4578 case '>': count--;
if (count==0) done=
true;
break;
4611 bool newPage =
true;
4616 warn(fileName,startLine,
"multiple use of page label '{}' with different titles, (other occurrence: {}, line: {})",
4700 else if (si->
lineNr() != -1)
4702 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {}, line {})",pd->
name(),si->
fileName(),si->
lineNr());
4706 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {})",pd->
name(),si->
fileName());
4731 if (!key.
isEmpty() && key[0]!=
'@')
4736 item->setScope(scope);
4737 item->setName(name);
4738 item->setTitle(title);
4739 item->setArgs(args);
4740 item->setGroup(key);
4788 if (!first) { ol.
writeString(
" | "); }
else first=
false;
4800 if (!first) { ol.
writeString(
" | "); }
else first=
false;
4826 int i_fs = fName.
findRev(
'/');
4827 int i_bs = fName.
findRev(
'\\');
4828 int i = fName.
find(
'.',std::max({ i_fs, i_bs ,0}));
4856 result=result.
mid(i+1);
4861 result=result.
mid(i+1);
4869 if (str.
isEmpty() || word==
nullptr)
return false;
4870 static const reg::Ex re(R
"(\a+)");
4871 std::string s = str.str();
4874 if (it->str()==word)
return true;
4885 static reg::Ex re(R
"(\s*(<\a+>)\s*)");
4886 std::string s = sentence.str();
4892 for ( ; it!=
end ; ++it)
4894 const auto match = *it;
4895 std::string part = match[1].str();
4898 size_t i = match.position();
4899 size_t l = match.length();
4900 result+=s.substr(p,i-p);
4901 result+=match.str();
4907 size_t i = match[1].position();
4908 size_t l = match[1].length();
4909 result+=s.substr(p,i-p);
4913 result+=s.substr(p);
4929 const char *p = s.
data();
4932 int i=0,li=-1,l=
static_cast<int>(s.
length());
4936 if (c==
' ' || c==
'\t' || c==
'\r') i++,p++;
4937 else if (c==
'\\' &&
literal_at(p,
"\\ilinebr")) i+=8,li=i,p+=8;
4938 else if (c==
'\n') i++,li=i,docLine++,p++;
4948 if (c==
' ' || c==
'\t' || c==
'\r') b--,p--;
4949 else if (c==
'r' && b>=7 &&
literal_at(p-7,
"\\ilinebr")) bi=b-7,b-=8,p-=8;
4950 else if (c==
'>' && b>=11 &&
literal_at(p-11,
"\\ilinebr<br>")) bi=b-11,b-=12,p-=12;
4951 else if (c==
'\n') bi=b,b--,p--;
4956 if (li==-1 && bi==-1)
return s;
4963 return s.
mid(li,bi-li);
4981 {
"idl",
"c", SrcLangExt::IDL,
".idl" },
4982 {
"java",
"c", SrcLangExt::Java,
".java"},
4983 {
"javascript",
"c", SrcLangExt::JS,
".js" },
4984 {
"csharp",
"c", SrcLangExt::CSharp,
".cs" },
4985 {
"d",
"c", SrcLangExt::D,
".d" },
4986 {
"php",
"c", SrcLangExt::PHP,
".php" },
4987 {
"objective-c",
"c", SrcLangExt::ObjC,
".m" },
4988 {
"c",
"c", SrcLangExt::Cpp,
".c" },
4989 {
"c++",
"c", SrcLangExt::Cpp,
".cpp" },
4990 {
"slice",
"c", SrcLangExt::Slice,
".ice" },
4991 {
"python",
"python", SrcLangExt::Python,
".py" },
4992 {
"fortran",
"fortran", SrcLangExt::Fortran,
".f" },
4993 {
"fortranfree",
"fortranfree", SrcLangExt::Fortran,
".f90" },
4994 {
"fortranfixed",
"fortranfixed", SrcLangExt::Fortran,
".f" },
4995 {
"vhdl",
"vhdl", SrcLangExt::VHDL,
".vhdl"},
4996 {
"xml",
"xml", SrcLangExt::XML,
".xml" },
4997 {
"sql",
"sql", SrcLangExt::SQL,
".sql" },
4998 {
"md",
"md", SrcLangExt::Markdown,
".md" },
4999 {
"lex",
"lex", SrcLangExt::Lex,
".l" },
5006 [&langName](
const auto &info) { return info.langName==langName; });
5013 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5023 err(
"Failed to assign extension {} to parser {} for language {}\n",
5024 extName.
data(),it1->parserName,language);
5112 if (extName.
isEmpty()) extName=
".no_extension";
5113 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5129 if (lang == SrcLangExt::Unknown)
5133 if (langName.
at(0)==
'.') langName = langName.
mid(1);
5135 [&langName](
const auto &info) { return info.langName==langName; });
5138 lang = it->parserId;
5139 fileName = it->defExt;
5143 return SrcLangExt::Cpp;
5152 int lastDot = fn.
findRev(
'.');
5153 if (lastDot!=-1)
return fn.
mid(lastDot);
5162 if (scope==
nullptr ||
5182 if (qualifierIndex!=-1)
5184 explicitScopePart = name.
left(qualifierIndex);
5186 name = name.
mid(qualifierIndex+2);
5190 int minDistance = 10000;
5199 if (distance!=-1 && distance<minDistance)
5201 minDistance = distance;
5215 if (bestMatch && bestMatch->
isTypedef())
5223 if (startPos>=len)
return len;
5224 uint8_t c =
static_cast<uint8_t
>(utf8Str[startPos]);
5229 int (*matcher)(int) =
nullptr;
5230 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5234 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5238 matcher = std::isxdigit;
5242 matcher = std::isdigit;
5245 else if (std::isalnum(c))
5248 matcher = std::isalnum;
5252 while ((c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]))!=0 && matcher(c))
5262 return startPos+bytes;
5279 .setAutolinkSupport(
false))
5281 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast.get());
5285 std::visit(visitor,astImpl->root);
5290 int l=
static_cast<int>(result.
length());
5294 if (charCnt>=80)
break;
5301 if (result.
at(i)==
',' ||
5302 result.
at(i)==
'.' ||
5303 result.
at(i)==
'!' ||
5304 result.
at(i)==
'?' ||
5312 if ( i < l) result=result.
left(i)+
"...";
5313 return result.
data();
5332 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast.get());
5340 std::visit(visitor,astImpl->root);
5357 if (al.
empty())
return;
5374 .setIndexWords(
true));
5384#ifdef TRACINGSUPPORT
5385 void *backtraceFrames[128];
5386 int frameCount = backtrace(backtraceFrames, 128);
5387 const size_t cmdLen = 40960;
5388 static char cmd[cmdLen];
5390 p +=
qsnprintf(p,cmdLen,
"/usr/bin/atos -p %d ", (
int)getpid());
5391 for (
int x = 0; x < frameCount; x++)
5393 p +=
qsnprintf(p,cmdLen,
"%p ", backtraceFrames[x]);
5395 fprintf(stderr,
"========== STACKTRACE START ==============\n");
5399 while (
size_t len = fread(resBuf, 1,
sizeof(resBuf), fp))
5401 fwrite(resBuf, 1, len, stderr);
5405 fprintf(stderr,
"============ STACKTRACE END ==============\n");
5414 if (
qstricmp(inputEncoding,outputEncoding)==0)
return;
5416 if (cd==
reinterpret_cast<void *
>(-1))
5418 term(
"unsupported character conversion: '{}'->'{}': {}\n"
5419 "Check the INPUT_ENCODING setting in the config file!\n",
5420 inputEncoding,outputEncoding,strerror(errno));
5422 size_t iLeft = contents.size();
5423 const char *srcPtr = contents.data();
5424 size_t tmpBufSize = contents.size()*4+1;
5425 size_t oLeft = tmpBufSize;
5427 tmpBuf.resize(tmpBufSize);
5428 char *dstPtr = tmpBuf.data();
5432 newSize = tmpBufSize-oLeft;
5433 tmpBuf.resize(newSize);
5434 std::swap(contents,tmpBuf);
5439 term(
"{}: failed to translate characters from {} to {}: check INPUT_ENCODING\n",
5440 fileName,inputEncoding,outputEncoding);
5452 if (filterName.
isEmpty() || !filter)
5457 err(
"could not open file {}\n",fileName);
5461 auto fileSize = fi.
size();
5462 contents.resize(fileSize);
5463 f.read(contents.data(),fileSize);
5466 err(
"problems while reading file {}\n",fileName);
5472 QCString cmd=filterName+
" \""+fileName+
"\"";
5477 err(
"could not execute filter {}\n",filterName);
5480 const int bufSize=4096;
5483 while ((numRead=
static_cast<int>(fread(buf,1,bufSize,f)))>0)
5486 contents.append(buf,numRead);
5493 if (contents.size()>=2 &&
5494 static_cast<uint8_t
>(contents[0])==0xFF &&
5495 static_cast<uint8_t
>(contents[1])==0xFE
5500 else if (contents.size()>=2 &&
5501 static_cast<uint8_t
>(contents[0])==0xFE &&
5502 static_cast<uint8_t
>(contents[1])==0xFF
5507 else if (contents.size()>=3 &&
5508 static_cast<uint8_t
>(contents[0])==0xEF &&
5509 static_cast<uint8_t
>(contents[1])==0xBB &&
5510 static_cast<uint8_t
>(contents[2])==0xBF
5513 contents.erase(0,3);
5529 std::string t = title.
str();
5530 static const reg::Ex re(R
"(%[a-z_A-Z]+)");
5534 for (; it!=
end ; ++it)
5536 const auto &match = *it;
5537 size_t i = match.position();
5538 size_t l = match.length();
5539 if (i>p) tf+=t.substr(p,i-p);
5540 tf+=match.str().substr(1);
5549template<
class PatternList,
class PatternElem,
typename PatternGet = QCString(*)(const PatternElem &)>
5551 const PatternList &patList,
5558 if (!patList.empty())
5564 for (
const auto &li : patList)
5566 std::string pattern = getter(li).str();
5567 if (!pattern.empty())
5569 size_t i=pattern.find(
'=');
5570 if (i!=std::string::npos) pattern=pattern.substr(0,i);
5572 if (!caseSenseNames)
5603 auto getter = [](std::string s) ->
QCString {
return s; };
5624 if (extLinksInWindow)
5625 return "target=\"_blank\" ";
5627 return "target=\"_parent\" ";
5644 if (!targetFileName.
isEmpty())
5649 if (!anchor.
isEmpty() && isLocalFile)
5660 if (!anchor.
isEmpty()) url+=
"#"+anchor;
5673 result = it->second;
5674 size_t l = result.
length();
5675 if (!relPath.
isEmpty() && l>0 && result.
at(0)==
'.')
5680 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
5681 if (!href) result.
append(
"\" ");
5704 if (!img.
save(fileName))
5706 fprintf(stderr,
"Warning: Cannot open file %s for writing\n",data->
name);
5722 std::string s=str.
str();
5723 static const reg::Ex re(R
"(##[0-9A-Fa-f][0-9A-Fa-f])");
5729 size_t sl=s.length();
5731 for (; it!=
end ; ++it)
5733 const auto &match = *it;
5734 size_t i = match.position();
5735 size_t l = match.length();
5736 if (i>p) result+=s.substr(p,i-p);
5737 std::string lumStr = match.str().substr(2);
5738#define HEXTONUM(x) (((x)>='0' && (x)<='9') ? ((x)-'0') : \
5739 ((x)>='a' && (x)<='f') ? ((x)-'a'+10) : \
5740 ((x)>='A' && (x)<='F') ? ((x)-'A'+10) : 0)
5742 double r = 0,g = 0,b = 0;
5745 pow(level/255.0,gamma/100.0),&r,&g,&b);
5746 int red =
static_cast<int>(r*255.0);
5747 int green =
static_cast<int>(g*255.0);
5748 int blue =
static_cast<int>(b*255.0);
5751 colStr[1]=
hex[red>>4];
5752 colStr[2]=
hex[red&0xf];
5753 colStr[3]=
hex[green>>4];
5754 colStr[4]=
hex[green&0xf];
5755 colStr[5]=
hex[blue>>4];
5756 colStr[6]=
hex[blue&0xf];
5762 if (p<sl) result+=s.substr(p);
5773 err(
"could not copy file {} to {}\n",src,dest);
5787 int m1 = text.
find(marker);
5788 if (m1==-1)
return result;
5793 while (!found && (i=text.
find(
'\n',p))!=-1)
5795 found = (p<=m1 && m1<i);
5811 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp || lang==SrcLangExt::VHDL || lang==SrcLangExt::Python)
5815 else if (lang==SrcLangExt::PHP && !classScope)
5827 static const std::unordered_set<std::string> schemes = {
5828 "http",
"https",
"ftp",
"ftps",
"sftp",
"file",
"news",
"irc",
"ircs"
5831 int colonPos = loc_url.
find(
':');
5832 return colonPos!=-1 && schemes.find(loc_url.
left(colonPos).
str())!=schemes.end();
5854 return (prot!=Protection::Private && prot!=Protection::Package) ||
5855 (prot==Protection::Private && extractPrivate) ||
5856 (prot==Protection::Package && extractPackage);
5867 const char *p=s.
data();
5870 int minIndent=1000000;
5871 bool searchIndent=
true;
5873 bool skipFirst = skipFirstLine;
5876 if (c==
'\t') indent+=tabSize - (indent%tabSize);
5877 else if (c==
'\n') indent=0,searchIndent=
true,skipFirst=
false;
5878 else if (c==
' ') indent++;
5879 else if (searchIndent && !skipFirst)
5882 if (indent<minIndent) minIndent=indent;
5887 if (minIndent==0)
return substitute(s,
"@ilinebr",
"\\ilinebr");
5893 skipFirst=skipFirstLine;
5902 else if (indent<minIndent && !skipFirst)
5906 int newIndent = indent+tabSize-(indent%tabSize);
5920 else if (c==
'\\' &&
literal_at(p,
"ilinebr "))
5923 result <<
"\\ilinebr ";
5926 for (
int j=0;j<minIndent;j++)
if (*(p+j)==
' ') skipAmount++;
5927 if (skipAmount==minIndent)
5934 result <<
"\\ilinebr";
5945 return result.
str();
5952 if (indentationLevel <= 0 || doc.
isEmpty())
return;
5957 const char *src = doc.
data();
5959 bool insideIndent =
false;
5968 insideIndent =
true;
5969 cnt = indentationLevel;
5980 insideIndent =
false;
5990 insideIndent =
false;
5995 doc.
resize(
static_cast<uint32_t
>(dst-doc.
data()));
6004 return ( ((allExternals && fd->
isLinkable()) ||
6022uint32_t getUtf8Code(
const QCString& s,
int idx )
6024 const int length = s.
length();
6025 if (idx >= length) {
return 0; }
6026 const uint32_t c0 = (uint8_t)s.
at(idx);
6027 if ( c0 < 0xC2 || c0 >= 0xF8 )
6031 if (idx+1 >= length) {
return 0; }
6032 const uint32_t c1 = ((uint8_t)s.
at(idx+1)) & 0x3f;
6035 return ((c0 & 0x1f) << 6) | c1;
6037 if (idx+2 >= length) {
return 0; }
6038 const uint32_t c2 = ((uint8_t)s.
at(idx+2)) & 0x3f;
6041 return ((c0 & 0x0f) << 12) | (c1 << 6) | c2;
6043 if (idx+3 >= length) {
return 0; }
6045 const uint32_t c3 = ((uint8_t)s.
at(idx+3)) & 0x3f;
6046 return ((c0 & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
6058uint32_t getUtf8CodeToLower(
const QCString& s,
int idx )
6060 const uint32_t v = getUtf8Code( s, idx );
6061 return v < 0x7f ? tolower( v ) : v;
6073uint32_t getUtf8CodeToUpper(
const QCString& s,
int idx )
6075 const uint32_t v = getUtf8Code( s, idx );
6076 return v < 0x7f ? toupper( v ) : v;
6090 std::string s = docs.
str();
6091 static const reg::Ex re(R
"(\[([ inout,]+)\])");
6096 const auto &match = *it;
6097 size_t p = match.position();
6098 size_t l = match.length();
6102 std::string dir = match[1].str();
6104 dir.erase(std::remove_if(dir.begin(),dir.end(),
6105 [](
const char c) { return c==
' ' || c==
','; }
6107 unsigned char ioMask=0;
6108 size_t inIndex = dir.find(
"in");
6109 if ( inIndex!=std::string::npos) dir.erase( inIndex,2),ioMask|=(1<<0);
6110 size_t outIndex = dir.find(
"out");
6111 if (outIndex!=std::string::npos) dir.erase(outIndex,3),ioMask|=(1<<1);
6112 if (dir.empty() && ioMask!=0)
6115 if (ioMask==((1<<0)|(1<<1)))
return "[in,out]";
6116 else if (ioMask==(1<<0))
return "[in]";
6117 else if (ioMask==(1<<1))
return "[out]";
6149 *outListType1=inListType;
6152 if (inProt==Protection::Public)
6159 else if (inProt==Protection::Protected)
6167 *outListType2=inListType.
toPublic();
6170 else if (inProt==Protection::Private)
6180 *outListType1=inListType.
toPublic();
6202 int i= imgExt.
find(
':');
6203 return i==-1 ? imgExt : imgExt.
left(i);
6208 assert(!f.is_open());
6209 bool fileOpened=
FALSE;
6210 bool writeToStdout=outFile==
"-";
6213 f.basic_ios<char>::rdbuf(std::cout.rdbuf());
6228 fileOpened = f.is_open();
6235 static const std::unordered_set<std::string> fortran_C_keywords = {
6236 "character",
"call",
"close",
"common",
"continue",
6237 "case",
"contains",
"cycle",
"class",
"codimension",
6238 "concurrent",
"contiguous",
"critical"
6241 if (*contents !=
'c' && *contents !=
'C')
return false;
6243 const char *c = contents;
6245 while (*c && *c !=
' ') {keyword += *c; c++;}
6246 keyword = keyword.
lower();
6248 return (fortran_C_keywords.find(keyword.
str()) != fortran_C_keywords.end());
6256 bool skipLine=
FALSE;
6262 size_t sizCont = contents.
length();
6263 for (
size_t i=0;i<sizCont;i++)
6267 switch(contents.
at(i))
6274 column += tabSize-1;
6291 if (column==1)
return TRUE;
6292 if (skipLine)
break;
6295 if (column!=6) skipLine=
TRUE;
6298 if (skipLine)
break;
6299 if (column>=7)
return TRUE;
6324 auto skipBlock = [&markerInfo](
const char *p,
const SelectionBlock &blk)
6331 size_t len = markerInfo.
endLen;
6332 bool negate = *(p+markerInfo.
endLen)==
'!';
6334 size_t blkNameLen =
qstrlen(blk.name);
6335 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6339 return p+len+blkNameLen+markerInfo.
closeLen;
6356 const char *p = s.
data();
6366 bool negate = *(p+len)==
'!';
6368 for (
const auto &blk : blockList)
6370 size_t blkNameLen =
qstrlen(blk.name);
6371 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6374 bool blockEnabled = blk.enabled!=negate;
6376 p+=len+blkNameLen+markerInfo.
closeLen;
6395 size_t len = markerInfo.
endLen;
6396 bool negate = *(p+len)==
'!';
6398 for (
const auto &blk : blockList)
6400 size_t blkNameLen =
qstrlen(blk.name);
6401 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6405 p+=len+blkNameLen+markerInfo.
closeLen;
6436 const char *p = s.
data();
6445 bool negate = *(p+len)==
'!';
6451 if (markerInfo.
closeLen==0 && *p==
'\n')
6453 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
6459 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
6468 size_t len = markerInfo.
endLen;
6469 bool negate = *(p+len)==
'!';
6475 if (markerInfo.
closeLen==0 && *p==
'\n')
6477 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
6483 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
6500 const char *p=s.
data();
6509 while (*e==
' ' || *e==
'\t') e++;
6531 size_t prev = 0, pos = 0, len = s.length();
6534 pos = s.find(delimiter, prev);
6535 if (pos == std::string::npos) pos = len;
6536 if (pos>prev) result.push_back(s.substr(prev,pos-prev));
6537 prev = pos + delimiter.length();
6539 while (pos<len && prev<len);
6551 for ( ; iter !=
end; ++iter)
6553 const auto &match = *iter;
6554 size_t i=match.position();
6555 size_t l=match.length();
6556 if (i>p) result.push_back(s.substr(p,i-p));
6559 if (p<s.length()) result.push_back(s.substr(p));
6566 auto it = std::find(sv.begin(),sv.end(),s);
6567 return it!=sv.end() ?
static_cast<int>(it-sv.begin()) : -1;
6575 return reg::search(s,match,re) ?
static_cast<int>(match.position()) : -1;
6583 for (
const auto &s : sv)
6585 if (!first) result+=delimiter;
6599 while (residual > 0)
6601 modVal[0] = (upper ?
'A':
'a') + (residual-1)%26;
6602 result = modVal + result;
6603 residual = (residual-1) / 26;
6610 static const char *str_romans_upper[] = {
"M",
"CM",
"D",
"CD",
"C",
"XC",
"L",
"XL",
"X",
"IX",
"V",
"IV",
"I" };
6611 static const char *str_romans_lower[] = {
"m",
"cm",
"d",
"cd",
"c",
"xc",
"l",
"xl",
"x",
"ix",
"v",
"iv",
"i" };
6612 static const int values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
6613 static const char **str_romans = upper ? str_romans_upper : str_romans_lower;
6618 for (
int i = 0; i < 13; ++i)
6620 while (residual - values[i] >= 0)
6622 result += str_romans[i];
6623 residual -= values[i];
6633 size_t size = s.
length();
6635 const char *data = s.
data();
6638 constexpr auto doxy_nbsp =
"&_doxy_nbsp;";
6639 const int maxIndent=1000000;
6640 int minIndent=maxIndent;
6649 int stop = tabSize - (col%tabSize);
6652 while (stop--) out.
addChar(
' ');
6656 if (data[i] ==
'\\')
6662 else if (i+5<size &&
literal_at(data+i,
"iskip"))
6667 else if (i+8<size &&
literal_at(data+i,
"endiskip"))
6699 for (
int j=0;j<bytes-1 && c;j++)
6711 if (!skip && col<minIndent) minIndent=col;
6715 if (minIndent!=maxIndent) refIndent=minIndent;
else refIndent=0;
6725 uint8_t md5_sig[16];
6727 MD5Buffer(projectCookie.
data(),
static_cast<unsigned int>(projectCookie.
length()),md5_sig);
6728 MD5SigToString(md5_sig,sigStr);
6729 sigStr[32]=
'_'; sigStr[33]=0;
6736 int l =
static_cast<int>(name.
length());
6737 int lastSepPos = -1;
6738 const char *p = name.
data();
6747 if (sharpCount==0 && p[i+1]==
':' && p[i+2]==
':')
6761 if (ts==-1) ts=0;
else p+=++ts;
6762 for (i=ts;i<l-1;i++)
6765 if (c==
':' && *p==
':') lastSepPos=i;
6800 case '\t': col+=tabSize - (col%tabSize);
6809 for (
int i=0;i<numBytes-1 && (c=*s++);i++) {}
6810 if (c==0)
return col;
6825 int idx = name.
find(
'<');
6838 int idx = result.
find(
'-');
6839 result = result.
left(idx)+templArgs;
6847 int i = text.
find(
'"');
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 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 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)
Generator for HTML code fragments.
Concrete visitor implementation for HTML output.
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 isRelated() const =0
virtual const ClassDef * getClassDef() const =0
virtual bool hasReferencesRelation() const =0
virtual GroupDef * getGroupDef()=0
virtual bool isTypedef() const =0
virtual bool hasCallGraph() const =0
virtual const FileDef * getFileDef() const =0
virtual bool isStrongEnumValue() const =0
virtual bool hasInlineSource() const =0
virtual bool hasEnumValues() 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 QCString argsString() 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
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 different code generators.
void add(OutputCodeIntfPtr &&p)
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 generateDoc(const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &docStr, const DocOptions &options)
void startConstraintDocs()
void startConstraintType()
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.
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.
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 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.
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &input, const DocOptions &options)
IDocParserPtr createDocParser()
factory function to create a parser
IDocNodeASTPtr validatingParseTitle(IDocParser &parserIntf, const QCString &fileName, int lineNr, const QCString &input)
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)
QCString convertToJSString(const QCString &s, bool keepEntities, bool singleQuotes)
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)
static std::unordered_map< std::string, QCString > g_docCache
QCString parseCommentAsHtml(const Definition *scope, const MemberDef *member, const QCString &doc, const QCString &fileName, int lineNr)
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)
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)
QCString extractEndRawStringDelimiter(const char *rawEnd)
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)
static const char virtualScope[]
QCString convertToXML(const QCString &s, bool keepEntities)
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
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 std::mutex g_docCacheMutex
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 extractBeginRawStringDelimiter(const char *rawStart)
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