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;
117 m_ol.writeNonBreakableSpace(1);
121 m_ol.docify(std::string_view(&c, 1));
133 m_ol.lineBreak(
"typebreak");
134 for (
int i = 0; i < indent; ++i)
m_ol.writeNonBreakableSpace(3);
138 const QCString &anchor,std::string_view text
142 m_ol.writeObjectLink(extRef,file,anchor,text);
165 if (str.
isEmpty())
return result;
168 auto startsWithColon = [](
const std::string &del)
170 for (
size_t i=0;i<del.size();i++)
172 if (del[i]==
'@')
return false;
173 else if (del[i]==
':')
return true;
179 auto endsWithColon = [](
const std::string &del)
181 for (
int i=
static_cast<int>(del.size())-1;i>=0;i--)
183 if (del[i]==
'@')
return false;
184 else if (del[i]==
':')
return true;
189 static const reg::Ex re(R
"([\s:]*@\d+[\s:]*)");
190 std::string s = str.str();
194 size_t sl=s.length();
195 bool needsSeparator=
false;
196 for ( ; iter!=
end ; ++iter)
198 const auto &match = *iter;
199 size_t i = match.position();
202 if (needsSeparator) result+=
"::";
203 needsSeparator=
false;
204 result+=s.substr(p,i-p);
206 std::string delim = match.str();
207 needsSeparator = needsSeparator || (startsWithColon(delim) && endsWithColon(delim));
208 p = match.position()+match.length();
212 if (needsSeparator) result+=
"::";
222 static const reg::Ex marker(R
"(@\d+)");
224 !replacement.isEmpty() ? replacement.data() : "__anonymous__");
235 int sl =
static_cast<int>(s.
length());
243 if (!newScope.
isEmpty()) newScope+=
"::";
244 newScope+=s.
mid(i,l);
249 if (!newScope.
isEmpty()) newScope+=
"::";
250 newScope+=s.
right(sl-i);
282 const int maxMarkerStrLen = 20;
283 char result[maxMarkerStrLen];
284 qsnprintf(result,maxMarkerStrLen,
"@%d",
id);
305 for (
const auto &s : l)
308 if (
prefix.length() > length &&
315 if (length>0)
return potential;
342 static const std::unordered_set<std::string> sourceExt = {
343 "c",
"cc",
"cxx",
"cpp",
"c++",
"cppm",
"ccm",
"cxxm",
"c++m",
347 "ii",
"ixx",
"ipp",
"i++",
"inl",
350 static const std::unordered_set<std::string> headerExt = {
351 "h",
"hh",
"hxx",
"hpp",
"h++",
"ixx",
352 "idl",
"ddl",
"pidl",
"ice"
358 if (sourceExt.find(extension.
str())!=sourceExt.end())
360 return EntryType::makeSource();
362 if (headerExt.find(extension.
str())!=headerExt.end())
364 return EntryType::makeHeader();
371 return EntryType::makeEmpty();
377 AUTO_TRACE(
"context='{}' qualifiedName='{}'",context?context->
name():
"",qualifiedName);
386 if (typedefContext) *typedefContext=context;
389 if (qualifiedName.
find(
'<')!=-1)
394 int scopeIndex = qualifiedName.
findRev(
"::");
398 resName=qualifiedName.
right(qualifiedName.
length()-scopeIndex-2);
406 while (mContext && md==
nullptr)
422 if (!tmp.
isEmpty()) qualScopePart=tmp;
425 if (resScope==
nullptr)
break;
437 bool searchRelated=
false;
438 bool mustBeRelated=
false;
449 if (mn==0 && searchRelated)
457 for (
const auto &tmd_p : *mn)
460 AUTO_TRACE_ADD(
"found candidate member '{}' isTypeDef={}' isRelated={} mustBeRelated={}",
475 if (dist!=-1 && (md==
nullptr || dist<minDist))
497 if (args.
find(
")(")!=-1)
501 else if (args.
find(
'[')!=-1)
521static const char constScope[] = {
'c',
'o',
'n',
's',
't',
':' };
522static const char volatileScope[] = {
'v',
'o',
'l',
'a',
't',
'i',
'l',
'e',
':' };
523static const char virtualScope[] = {
'v',
'i',
'r',
't',
'u',
'a',
'l',
':' };
524static const char operatorScope[] = {
'o',
'p',
'e',
'r',
'a',
't',
'o',
'r',
'?',
'?',
'?' };
580 if (s.
length()*3>growBufLen)
582 growBufLen = s.
length()*3;
583 growBuf =
static_cast<char *
>(realloc(growBuf,growBufLen+1));
585 if (growBuf==
nullptr)
return s;
587 const char *src=s.
data();
598 while (i<l && isspace(
static_cast<uint8_t
>(src[i])))
605 char nc=i+1<l ? src[i+1] :
' ';
607 auto searchForKeyword = [&](
const char *kw,
size_t &matchLen,
size_t totalLen)
609 if (matchLen<=totalLen && c==kw[matchLen] &&
644 if (c==
'\\' && i+1<l)
668 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
669 (
isId(pc) || pc==
'*' || pc==
'&' || pc==
'.' || pc==
'>') &&
670 (osp<8 || (osp==8 && pc!=
'-'))
676 if (i+1<l && (nc==
'-' || nc==
'&'))
683 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
684 ((i+1<l && (
isId(nc) || nc==
'[')) ||
685 (i+2<l && nc==
'$' &&
isId(src[i+2])) ||
686 (i+3<l && nc==
'&' && src[i+2]==
'$' &&
isId(src[i+3]))
696 if (cliSupport && i+1<l && (
isId(nc) || nc==
'-'))
703 if (i+1<l && (
isId(nc) || nc==
'-'))
709 if (i>0 && pc!=
' ' && pc!=
'\t' && pc!=
':' &&
710 pc!=
'*' && pc!=
'&' && pc!=
'(' && pc!=
'/' &&
720 if (i>0 &&
isId(pc) && osp<9)
740 if (i>0 && i+1<l && pc!=
'=' && pc!=
':' && !isspace(
static_cast<uint8_t
>(pc)) &&
771 !(pc==
',' && nc==
'.') &&
772 (osp<8 || (osp>=8 &&
isId(pc) &&
isId(nc)))
780 else if ((pc==
'*' || pc==
'&' || pc==
'.') && nc==
'>')
788 auto correctKeywordAllowedInsideScope = [&](
char cc,
size_t &matchLen,
size_t totalLen) {
789 if (c==cc && matchLen==totalLen)
791 if ((i+2<l && src[i+1] ==
':' && src[i+2] ==
':') ||
792 ((i>matchLen && src[i-matchLen] ==
':' && src[i-matchLen-1] ==
':'))
796 correctKeywordAllowedInsideScope(
't',csp, 5);
797 correctKeywordAllowedInsideScope(
'e',vosp,8);
798 correctKeywordAllowedInsideScope(
'l',vsp, 7);
800 auto correctKeywordNotPartOfScope = [&](
char cc,
size_t &matchLen,
size_t totalLen)
802 if (c==cc && matchLen==totalLen && i+1<l &&
810 correctKeywordNotPartOfScope(
't',csp, 5);
811 correctKeywordNotPartOfScope(
'e',vosp,8);
812 correctKeywordNotPartOfScope(
'l',vsp, 7);
832 if (templateDepth > 0)
834 int nextOpenPos=name.
findRev(
'>', pos);
835 int nextClosePos=name.
findRev(
'<', pos);
836 if (nextOpenPos!=-1 && nextOpenPos>nextClosePos)
841 else if (nextClosePos!=-1)
853 int lastAnglePos=name.
findRev(
'>', pos);
854 int bracePos=name.
findRev(
'(', pos);
855 if (lastAnglePos!=-1 && lastAnglePos>bracePos)
862 int bp = bracePos>0 ? name.
findRev(
'(',bracePos-1) : -1;
864 return bp==-1 || (bp>=8 && name.
mid(bp-8,10)==
"operator()") ? bracePos : bp;
875 return (name==scope ||
876 (scope.
right(nl)==name &&
877 sl>1+nl && scope.
at(sl-nl-1)==
':' && scope.
at(sl-nl-2)==
':'
886 return (name==scope ||
887 (name.
left(sl)==scope &&
888 nl>sl+1 && name.
at(sl)==
':' && name.
at(sl+1)==
':'
896 const QCString &text,
bool autoBreak,
bool external,
897 bool keepSpaces,
int indentLevel)
899 AUTO_TRACE(
"scope={} fileScope={} text={} autoBreak={} external={} keepSpaces={} indentLevel={}",
900 scope?scope->
name():
"",fileScope?fileScope->
name():
"",
901 text,autoBreak,external,keepSpaces,indentLevel);
904 std::string_view txtStr=text.
view();
905 size_t strLen = txtStr.length();
906 if (strLen==0)
return;
908 static const reg::Ex regExp(R
"((::)?\a[\w~!\\.:$"]*)");
918 size_t floatingIndex=0;
919 for (; it!=
end ; ++it)
921 const auto &match = *it;
922 size_t newIndex = match.position();
923 size_t matchLen = match.length();
924 floatingIndex+=newIndex-skipIndex+matchLen;
925 if (newIndex>0 && txtStr.at(newIndex-1)==
'0')
927 std::string_view part = txtStr.substr(skipIndex,newIndex+matchLen-skipIndex);
929 skipIndex=index=newIndex+matchLen;
934 bool insideString=
FALSE;
935 for (
size_t i=index;i<newIndex;i++)
937 if (txtStr.at(i)==
'"') insideString=!insideString;
938 if (txtStr.at(i)==
'\\') i++;
942 if (strLen>35 && floatingIndex>30 && autoBreak)
944 std::string_view splitText = txtStr.substr(skipIndex,newIndex-skipIndex);
945 size_t splitLength = splitText.length();
947 size_t i = splitText.find(
',');
948 if (i==std::string::npos) { i=splitText.find(
'<');
if (i!=std::string::npos) offset=0; }
949 if (i==std::string::npos) i=splitText.find(
'>');
950 if (i==std::string::npos) i=splitText.find(
' ');
952 if (i!=std::string::npos)
954 std::string_view part1 = splitText.substr(0,i+offset);
956 out.
writeBreak(indentLevel==0 ? 0 : indentLevel+1);
957 std::string_view part2 = splitText.substr(i+offset);
959 floatingIndex=splitLength-i-offset+matchLen;
969 std::string_view part = txtStr.substr(skipIndex,newIndex-skipIndex);
973 std::string_view word=txtStr.substr(newIndex,matchLen);
1003 auto writeCompoundName = [&](
const auto *cd_) {
1004 if (external ? cd_->isLinkable() : cd_->isLinkableInProject())
1009 out.
writeLink(cd_->getReference(),cd_->getOutputFileBase(),cd_->anchor(),word);
1021 writeCompoundName(cd);
1023 else if ((cd=
getClass(matchWord+
"-p")))
1025 writeCompoundName(cd);
1029 writeCompoundName(cnd);
1033 writeCompoundName(d);
1040 int m = matchWord.
findRev(
"::");
1048 scopeName=scope->
name();
1052 scopeName = matchWord.
left(m);
1053 matchWord = matchWord.
mid(m+2);
1062 if (result.
found && result.
md &&
1069 if (result.
md!=self && (self==
nullptr || result.
md->
name()!=self->
name()))
1098 skipIndex=index=newIndex+matchLen;
1102 std::string_view lastPart = txtStr.substr(skipIndex);
1107 std::function<
void(
size_t)> replaceFunc)
1109 static const reg::Ex marker(R
"(@(\d+))");
1113 for ( ; it!=
end ; ++it)
1115 const auto &match = *it;
1116 size_t newIndex = match.position();
1117 size_t matchLen = match.length();
1118 ol.
parseText(markerText.substr(index,newIndex-index));
1119 unsigned long entryIndex = std::stoul(match[1].str());
1120 if (entryIndex<
static_cast<unsigned long>(numMarkers))
1122 replaceFunc(entryIndex);
1124 index=newIndex+matchLen;
1130 std::function<
QCString(
size_t)> replaceFunc)
1133 static const reg::Ex marker(R
"(@(\d+))");
1137 for ( ; it!=
end ; ++it)
1139 const auto &match = *it;
1140 size_t newIndex = match.position();
1141 size_t matchLen = match.length();
1142 result += markerText.substr(index,newIndex-index);
1143 unsigned long entryIndex = std::stoul(match[1].str());
1144 if (entryIndex<
static_cast<unsigned long>(numMarkers))
1146 result+=replaceFunc(entryIndex);
1148 index=newIndex+matchLen;
1150 if (index<markerText.size())
1152 result += markerText.substr(index);
1159 auto replaceFunc = [&list,&ol](
size_t entryIndex)
1161 const auto &e = list[entryIndex];
1193 if (a.hasDocumentation())
1197 paramDocs+=
" \\ilinebr @param"+direction+
" "+a.name+
" "+docsWithoutDir;
1211 if (!a.docs.isEmpty())
1213 if (!a.name.isEmpty())
1215 paramDocs+=
" \\ilinebr @tparam "+a.name+
" "+a.docs;
1217 else if (!a.type.isEmpty())
1223 paramDocs+=
" \\ilinebr @tparam "+type+
" "+a.docs;
1236 for (
auto it = al.
begin() ; it!=al.
end() ;)
1241 int i=type1.
find(
")(");
1245 type1=type1.
left(i);
1253 result+= type1+
" "+a.
name+type2+a.
array;
1257 result+= type1+type2;
1264 if (it!=al.
end()) result+=
", ";
1279 if (al.
empty())
return result;
1282 for (
const auto &a : al)
1284 if (a.defval.isEmpty() || includeDefault)
1286 if (!first) result+=
", ";
1287 if (!a.name.isEmpty())
1289 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
1297 int i =
static_cast<int>(a.type.length())-1;
1298 while (i>=0 &&
isId(a.type.at(i))) i--;
1301 result+=a.type.
right(a.type.length()-i-1);
1302 if (a.type.find(
"...")!=-1)
1312 if (!a.typeConstraint.isEmpty() && lang==SrcLangExt::Java)
1314 result+=
" extends ";
1315 result+=a.typeConstraint;
1336 size_t len = contents.length();
1340 char c = contents[src++];
1344 if (src<len && contents[src] ==
'\n')
1349 else if ( c ==
'\0' && src<len-1)
1353 contents[dest++] = c;
1355 contents.resize(dest);
1362 for (
const auto &filterStr : filterList)
1365 int i_equals=fs.
find(
'=');
1372 filterPattern = filterPattern.
lower();
1373 input = input.
lower();
1380 if (filterName.
find(
' ')!=-1)
1382 filterName=
"\""+filterName+
"\"";
1402 if (name.
isEmpty())
return "";
1409 if (isSourceCode && !filterSrcList.empty())
1413 if (!found && filterName.
isEmpty())
1424 if (filterName.
length()>=2 && filterName[0]==
'"' && filterName[
static_cast<int>(filterName.
length())-1]==
'"')
1426 filterName = filterName.
mid(1,filterName.
length()-2);
1435 const char *outputEncoding =
"UTF-8";
1436 if (inputEncoding==
nullptr ||
qstricmp(inputEncoding,outputEncoding)==0)
return true;
1437 size_t inputSize=input.length();
1438 size_t outputSize=inputSize*4;
1441 if (cd==
reinterpret_cast<void *
>(-1))
1446 size_t iLeft=inputSize;
1447 size_t oLeft=outputSize;
1448 const char *inputPtr = input.data();
1449 char *outputPtr = output.
rawData();
1452 outputSize-=
static_cast<int>(oLeft);
1453 output.
resize(outputSize);
1454 output.
at(outputSize)=
'\0';
1474 bool fileOpened=
false;
1475 if (name[0]==
'-' && name[1]==0)
1477 std::string contents;
1479 while (getline(std::cin,line))
1481 contents+=line+
'\n';
1490 err(
"file '{}' not found\n",name);
1503 err(
"cannot open file '{}' for reading\n",name);
1511 for (
const auto &bcd : bcl)
1532 AUTO_TRACE(
"target='{}' str='{}'",target,str);
1533 if (target==str) { target.
clear();
return; }
1535 int l=
static_cast<int>(str.
length());
1538 while ((i=target.
find(str,p))!=-1)
1540 for (
int q=p;q<i;q++)
1542 if (target[q]==
'<') sharpCount++;
1543 else if (target[q]==
'>' && sharpCount>0) sharpCount--;
1545 bool isMatch = (i==0 || !
isId(target.
at(i-1))) &&
1546 (i+l==
static_cast<int>(target.
length()) || !
isId(target.
at(i+l))) &&
1547 !insideTemplate && sharpCount==0;
1550 int i1=target.
find(
'*',i+l);
1551 int i2=target.
find(
'&',i+l);
1552 if (i1==-1 && i2==-1)
1559 else if ((i1!=-1 && i<i1) || (i2!=-1 && i<i2))
1602 int i=s.
find(
" class ");
1603 if (i!=-1)
return s.
left(i)+s.
mid(i+6);
1604 i=s.
find(
" typename ");
1605 if (i!=-1)
return s.
left(i)+s.
mid(i+9);
1606 i=s.
find(
" union ");
1607 if (i!=-1)
return s.
left(i)+s.
mid(i+6);
1608 i=s.
find(
" struct ");
1609 if (i!=-1)
return s.
left(i)+s.
mid(i+7);
1622 if (!templSpec.
isEmpty() && templSpec.
at(0) ==
'<')
1629 templSpec = resolvedType;
1641 if (count>10)
return word;
1643 QCString symName,result,templSpec,tmpName;
1644 if (tSpec && !tSpec->
isEmpty())
1647 AUTO_TRACE(
"d='{}' fs='{}' word='{}' templSpec='{}'",d?d->
name():
"",fs?fs->
name():
"",word,templSpec);
1665 bool isTemplInst = cd && !templSpec.
isEmpty();
1666 if (!cd && !templSpec.
isEmpty())
1677 cd?cd->
name():
"",mType?mType->
name():
"",ts,resolvedType);
1700 if (cd==d && tSpec) *tSpec=
"";
1704 result = resolvedType+ts;
1712 if (tSpec) *tSpec=
"";
1726 result=cd->
name()+templSpec;
1776 resolvedType = lang==SrcLangExt::Java ? word :
resolveTypeDef(d,word);
1784 result = resolvedType;
1817 if (i>pp) canType += type.
mid(pp,i-pp);
1838 std::string ts = templSpec.
str();
1839 static const reg::Ex re(R
"(\a\w*)");
1846 for (; it!=
end ; ++it)
1848 const auto &match = *it;
1849 size_t ti = match.position();
1850 size_t tl = match.length();
1851 std::string matchStr = match.str();
1852 canType += ts.substr(tp,ti-tp);
1856 canType+=ts.substr(tp);
1872 if ((type==
"const" || type==
"volatile") && !name.
isEmpty())
1877 if (name==
"const" || name==
"volatile")
1879 if (!type.
isEmpty()) type+=
" ";
1897#define MATCH AUTO_TRACE_EXIT("match at line {}",__LINE__);
1898#define NOMATCH AUTO_TRACE_EXIT("no match at line {}",__LINE__);
1905 AUTO_TRACE(
"srcType='{}' dstType='{}'",srcType,dstType);
1906 if (srcType==dstType)
return true;
1909 int i1=srcType.
find(
")(");
1910 if (i1==-1)
return false;
1911 int i2=dstType.
find(
")(");
1912 if (i1!=i2)
return false;
1915 int j1=srcType.
find(
"(");
1916 if (j1==-1 || j1>i1)
return false;
1917 int j2=dstType.
find(
"(");
1918 if (j2!=j1)
return false;
1919 if (srcType.
left(j1)!=dstType.
left(j2))
return false;
1928 dstScope,dstFileScope,dstType.
left(j2),dstAl.get(),
1938 AUTO_TRACE(
"src: scope={} type={} name={} canType={}, dst: scope={} type={} name={} canType={}",
1957 srcA.
type+=sSrcName;
1961 else if (sDstName==srcType.
right(sDstName.
length()))
1963 dstA.
type+=sDstName;
1979 dstScope,dstFileScope,dstA.
canType,
2002 ASSERT(srcScope!=
nullptr && dstScope!=
nullptr);
2004 AUTO_TRACE(
"srcScope='{}' dstScope='{}' srcArgs='{}' dstArgs='{}' checkCV={} lang={}",
2007 if (srcAl==
nullptr || dstAl==
nullptr)
2009 bool match = srcAl==dstAl;
2040 if (srcAl->
size() != dstAl->
size())
2074 auto srcIt = srcAl->
begin();
2075 auto dstIt = dstAl->
begin();
2076 for (;srcIt!=srcAl->
end() && dstIt!=dstAl->
end();++srcIt,++dstIt)
2081 dstScope,dstFileScope,dstA,
2100 AUTO_TRACE(
"srcAl='{}',dstAl='{}',forceNameOverwrite={}",
2108 auto srcIt=srcAl.
begin();
2109 auto dstIt=dstAl.
begin();
2110 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
2115 AUTO_TRACE_ADD(
"before merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
2131 if (srcA.
name==
"const" || srcA.
name==
"volatile")
2136 if (dstA.
name==
"const" || dstA.
name==
"volatile")
2162 if (forceNameOverwrite)
2205 j1=
static_cast<int>(srcA.
type.
length())-i1-2,
2206 j2=
static_cast<int>(dstA.
type.
length())-i2-2;
2214 else if (i1==-1 && i2!=-1 && dstA.
type.
right(j2)==srcA.
type)
2234 AUTO_TRACE_ADD(
"after merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
2250 auto isUnconstraintTemplate = [](
const QCString &type)
2252 return type==
"typename" || type==
"class" || type.startsWith(
"typename ") || type.startsWith(
"class ");
2254 auto srcIt = srcAl.
begin();
2255 auto dstIt = dstAl.
begin();
2256 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
2260 if ((!isUnconstraintTemplate(srcA.
type) || !isUnconstraintTemplate(dstA.
type)) && srcA.
type!=dstA.
type)
2279 AUTO_TRACE(
"scopeName={},memberName={},forceEmptyScope={}",
2305 result.
found =
true;
2310 result.
found =
true;
2315 result.
found =
true;
2320 result.
found =
true;
2325 result.
found =
true;
2357 bool explicitGlobalScope=
FALSE;
2358 if (scopeName.
at(0)==
':' && scopeName.
at(1)==
':')
2361 explicitGlobalScope=
TRUE;
2369 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(docScopeName.
length());
2374 if (scopeOffset>0) fullName.
prepend(docScopeName.
left(scopeOffset)+
"::");
2398 else if ((scopeOffset=docScopeName.
findRev(
"::",scopeOffset-1))==-1)
2402 }
while (scopeOffset>=0);
2410 const char *p=s.
data();
2412 while ((c=
static_cast<uint8_t
>(*p++)))
if (!islower(c))
return false;
2425 bool lookForSpecialization,
2430 AUTO_TRACE(
"scope={} name={} inSeeBlock={} lang={} lookForSpecialization={} currentFile={} checkScope={}",
2431 scName,name,inSeeBlock,lang,lookForSpecialization,currentFile ? currentFile->
name() :
"", checkScope);
2436 if (fullName.
find(
"anonymous_namespace{")==-1)
2446 if (lang==SrcLangExt::CSharp && (templStartPos=fullName.
find(
'<'))!=-1)
2448 int templEndPos = fullName.
findRev(
'>');
2449 if (templEndPos!=-1)
2457 int endNamePos=bracePos!=-1 ? bracePos :
static_cast<int>(fullName.
length());
2458 int scopePos=fullName.
findRev(
"::",endNamePos);
2459 bool explicitScope = fullName.
startsWith(
"::") &&
2464 bool allowTypeOnly=
false;
2467 *resContext=
nullptr;
2474 if (!inSeeBlock && scopePos==-1 &&
isLowerCase(tsName))
2488 if (scName!=fullName &&
getScopeDefs(scName,fullName,cd,cnd,nd,modd))
2511 else if (scName==fullName || (!inSeeBlock && scopePos==-1))
2530 if (explicitScope) nameStr=nameStr.
mid(2);
2535 if (bracePos!=-1) argsStr=fullName.
right(fullName.
length()-bracePos);
2539 int templPos=nameStr.
find(
'<');
2540 bool tryUnspecializedVersion =
FALSE;
2541 if (templPos!=-1 && nameStr.
find(
"operator")==-1)
2543 int endTemplPos=nameStr.
findRev(
'>');
2544 if (endTemplPos!=-1)
2546 if (!lookForSpecialization)
2548 nameStr=nameStr.
left(templPos)+nameStr.
right(nameStr.
length()-endTemplPos-1);
2552 tryUnspecializedVersion =
TRUE;
2560 nameStr=nameStr.
mid(scopeStr.
length()+2);
2586 *resContext=
nullptr;
2596 *resMember=result.
md;
2597 *resContext=result.
md;
2601 *resContext=
nullptr;
2607 else if (result.
cd) *resContext=result.
cd;
2608 else if (result.
nd) *resContext=result.
nd;
2609 else if (result.
fd) *resContext=result.
fd;
2610 else if (result.
gd) *resContext=result.
gd;
2611 else if (result.
cnd) *resContext=result.
cnd;
2612 else if (result.
modd) *resContext=result.
modd;
2615 *resContext=
nullptr; *resMember=
nullptr;
2642 else if (tsName.
find(
'.')!=-1)
2654 if (tryUnspecializedVersion)
2656 bool b =
resolveRef(scName,name,inSeeBlock,resContext,resMember,lang,
FALSE,
nullptr,checkScope);
2684 if (!isFileName && result.
find(
'<')==-1) result=
substitute(result,
".",
"::",3);
2686 if (result.
at(0)==
':' && result.
at(1)==
':')
2710 *resContext=
nullptr;
2713 if (lang==SrcLangExt::CSharp)
2718 AUTO_TRACE(
"scName='{}',ref='{}'",scName,lr);
2723 const DirDef *dir =
nullptr;
2741 if (si) resAnchor = si->
label();
2753 resAnchor = si->
label();
2760 resAnchor = si->
label();
2790 else if (lang==SrcLangExt::Java &&
2791 (cd=
getClass(linkRefWithoutTemplates)))
2798 else if ((cd=
getClass(linkRef+
"-p")))
2815 resAnchor=modd->
anchor();
2836 if (md) resAnchor=md->
anchor();
2874 if (n.
isEmpty())
return nullptr;
2877 const int maxAddrSize = 20;
2878 char addr[maxAddrSize];
2879 qsnprintf(addr,maxAddrSize,
"%p:",
reinterpret_cast<const void*
>(fnMap));
2888 ambig = cachedResult->
isAmbig;
2899 if (name.
isEmpty())
return nullptr;
2906 if (name.
isEmpty())
return nullptr;
2913 const std::unique_ptr<FileDef> &fd = fn->front();
2915 fd->getPath().right(path.
length())==path :
2917 if (path.
isEmpty() || isSamePath)
2919 cachedResult->
fileDef = fd.get();
2928 for (
const auto &fd_p : *fn)
2942 cachedResult->
isAmbig = ambig;
2943 cachedResult->
fileDef = lastMatch;
2973 for (
const auto &s : examplePathList)
3015 for (
const auto &fd_p : *fn)
3023 if (!first) result +=
"\n";
3037 std::string substRes;
3039 const char *p = s.
data();
3043 substRes.reserve(s.
length()+1024);
3050 for (
const auto &kw : keywords)
3052 size_t keyLen =
qstrlen(kw.keyword);
3053 if (
qstrncmp(p,kw.keyword,keyLen)==0)
3055 const char *startArg = p+keyLen;
3056 bool expectParam = std::holds_alternative<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3058 if (expectParam && *startArg==
'(')
3061 const char *endArg =
nullptr;
3062 while ((c=*(startArg+j)) && c!=
')' && c!=
'\n' && c!=0) j++;
3063 if (c==
')') endArg=startArg+j;
3067 auto &&getValue = std::get<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3068 substRes+=getValue(value).str();
3075 warn(file,line,
"Missing argument for '{}'",kw.keyword);
3079 else if (!expectParam)
3081 auto &&getValue = std::get<KeywordSubstitution::GetValue>(kw.getValueVariant);
3082 substRes+=getValue().str();
3089 warn(file,line,
"Expected arguments for '{}' but none were specified",kw.keyword);
3099 if (c==
'\n') line++;
3127 int wi = projectLogo.
find(
" width=");
3130 projectLogo = projectLogo.
left(wi);
3132 int hi = projectLogo.
find(
" height=");
3135 projectLogo = projectLogo.
left(hi);
3148 auto extractDimension = [&projectLogo](
const char *startMarker,
size_t startPos,
size_t endPos) ->
QCString
3151 if (result.
length()>=2 && result.
at(0)!=
'"' && result.
at(result.
length()-1)!=
'"')
3153 result=
"\""+result+
"\"";
3159 int wi = projectLogo.
find(
" width=");
3160 int hi = projectLogo.
find(
" height=");
3161 if (wi!=-1 && hi!=-1)
3165 sizeVal = extractDimension(
" width=", wi+7, hi) +
" "
3166 + extractDimension(
" height=", hi+8, projectLogo.
length());
3170 sizeVal = extractDimension(
" height=", hi+8, wi) +
" "
3171 + extractDimension(
" width=", wi+7, projectLogo.
length());
3176 sizeVal = extractDimension(
" width=", wi+7, projectLogo.
length());
3180 sizeVal = extractDimension(
" height=", hi+8, projectLogo.
length());
3193 {
"$title", [&]() {
return !title.
isEmpty() ? title : projName; } },
3194 {
"$doxygenversion", [&]() {
return getDoxygenVersion(); } },
3195 {
"$projectname", [&]() {
return projName; } },
3196 {
"$projectnumber", [&]() {
return projNum; } },
3197 {
"$projectbrief", [&]() {
return projBrief; } },
3201 {
"$langISO", [&]() {
return theTranslator->trISOLang(); } },
3216 for (
const auto &s : sl)
3218 const char *ps=s.c_str();
3219 const char *pd=name.
data();
3221 while (*ps!=0 && *pd!=0 && *ps==*pd)
3227 if (*ps==0 && *pd!=0)
3243int getUtf8Char(
const char *input,
char ids[MAX_UTF8_CHAR_SIZE],CaseModifier modifier)
3246 const unsigned char uc = (
unsigned char)*input;
3247 bool validUTF8Char =
false;
3250 const char* pt = input+1;
3252 if ((uc&0x80)==0x00)
3256 case CaseModifier::None: ids[0]=*input;
break;
3257 case CaseModifier::ToUpper: ids[0]=(char)toupper(*input);
break;
3258 case CaseModifier::ToLower: ids[0]=(char)tolower(*input);
break;
3265 if ((uc&0xE0)==0xC0)
3269 if ((uc&0xF0)==0xE0)
3273 if ((uc&0xF8)==0xF0)
3278 validUTF8Char = l>0;
3279 for (
int m=1; m<l && validUTF8Char; ++m)
3281 unsigned char ct = (
unsigned char)*pt;
3282 if (ct==0 || (ct&0xC0)!=0x80)
3284 validUTF8Char=
false;
3305 if (caseSenseNames == CASE_SENSE_NAMES_t::YES)
return true;
3306 else if (caseSenseNames == CASE_SENSE_NAMES_t::NO)
return false;
3312 if (name.
isEmpty())
return name;
3318 const char *p=name.
data();
3323 case '_':
if (allowUnderscore) result+=
'_';
else result+=
"__";
break;
3324 case '-': result+=
'-';
break;
3325 case ':': result+=
"_1";
break;
3326 case '/': result+=
"_2";
break;
3327 case '<': result+=
"_3";
break;
3328 case '>': result+=
"_4";
break;
3329 case '*': result+=
"_5";
break;
3330 case '&': result+=
"_6";
break;
3331 case '|': result+=
"_7";
break;
3332 case '.':
if (allowDots) result+=
'.';
else result+=
"_8";
break;
3333 case '!': result+=
"_9";
break;
3334 case ',': result+=
"_00";
break;
3335 case ' ': result+=
"_01";
break;
3336 case '{': result+=
"_02";
break;
3337 case '}': result+=
"_03";
break;
3338 case '?': result+=
"_04";
break;
3339 case '^': result+=
"_05";
break;
3340 case '%': result+=
"_06";
break;
3341 case '(': result+=
"_07";
break;
3342 case ')': result+=
"_08";
break;
3343 case '+': result+=
"_09";
break;
3344 case '=': result+=
"_0a";
break;
3345 case '$': result+=
"_0b";
break;
3346 case '\\': result+=
"_0c";
break;
3347 case '@': result+=
"_0d";
break;
3348 case ']': result+=
"_0e";
break;
3349 case '[': result+=
"_0f";
break;
3350 case '#': result+=
"_0g";
break;
3351 case '"': result+=
"_0h";
break;
3352 case '~': result+=
"_0i";
break;
3353 case '\'': result+=
"_0j";
break;
3354 case ';': result+=
"_0k";
break;
3355 case '`': result+=
"_0l";
break;
3359 bool doEscape =
true;
3360 if (allowUnicodeNames)
3373 unsigned char id =
static_cast<unsigned char>(c);
3382 else if (caseSenseNames || !isupper(c))
3389 result+=
static_cast<char>(tolower(c));
3403 const char *p = s.
data();
3413 case '_': result+=c; p++;
break;
3414 case '1': result+=
':'; p++;
break;
3415 case '2': result+=
'/'; p++;
break;
3416 case '3': result+=
'<'; p++;
break;
3417 case '4': result+=
'>'; p++;
break;
3418 case '5': result+=
'*'; p++;
break;
3419 case '6': result+=
'&'; p++;
break;
3420 case '7': result+=
'|'; p++;
break;
3421 case '8': result+=
'.'; p++;
break;
3422 case '9': result+=
'!'; p++;
break;
3426 case '0': result+=
','; p+=2;
break;
3427 case '1': result+=
' '; p+=2;
break;
3428 case '2': result+=
'{'; p+=2;
break;
3429 case '3': result+=
'}'; p+=2;
break;
3430 case '4': result+=
'?'; p+=2;
break;
3431 case '5': result+=
'^'; p+=2;
break;
3432 case '6': result+=
'%'; p+=2;
break;
3433 case '7': result+=
'('; p+=2;
break;
3434 case '8': result+=
')'; p+=2;
break;
3435 case '9': result+=
'+'; p+=2;
break;
3436 case 'a': result+=
'='; p+=2;
break;
3437 case 'b': result+=
'$'; p+=2;
break;
3438 case 'c': result+=
'\\'; p+=2;
break;
3439 case 'd': result+=
'@'; p+=2;
break;
3440 case 'e': result+=
']'; p+=2;
break;
3441 case 'f': result+=
'['; p+=2;
break;
3442 case 'g': result+=
'#'; p+=2;
break;
3443 case 'h': result+=
'"'; p+=2;
break;
3444 case 'i': result+=
'~'; p+=2;
break;
3445 case 'j': result+=
'\''; p+=2;
break;
3446 case 'k': result+=
';'; p+=2;
break;
3447 case 'l': result+=
'`'; p+=2;
break;
3454 if (!caseSenseNames && c>=
'a' && c<=
'z')
3456 result+=
static_cast<char>(toupper(*p));
3487 if (name.
isEmpty())
return name;
3510 size_t resultLen = result.
length();
3514 uint8_t md5_sig[16];
3516 MD5Buffer(result.
data(),
static_cast<unsigned int>(resultLen),md5_sig);
3517 MD5SigToString(md5_sig,sigStr);
3518 result=result.
left(128-32)+sigStr;
3523 int l1Dir=0,l2Dir=0;
3524 int createSubdirsLevel =
Config_getInt(CREATE_SUBDIRS_LEVEL);
3525 int createSubdirsBitmaskL2 = (1<<createSubdirsLevel)-1;
3528 uint8_t md5_sig[16];
3529 MD5Buffer(result.
data(),
static_cast<unsigned int>(result.
length()),md5_sig);
3530 l1Dir = md5_sig[14] & 0xf;
3531 l2Dir = md5_sig[15] & createSubdirsBitmaskL2;
3542 const int sig_size=16;
3543 uint8_t md5_sig[sig_size];
3544 MD5Buffer(fn.
data(),
static_cast<unsigned int>(fn.
length()),md5_sig);
3545 char result[sig_size*3+2];
3548 for (
int i=0;i<sig_size;i++)
3550 static const char oct[]=
"01234567";
3551 uint8_t
byte = md5_sig[i];
3552 *p++=oct[(
byte>>6)&7];
3553 *p++=oct[(
byte>>3)&7];
3554 *p++=oct[(
byte>>0)&7];
3584 QCString absIncFileName = incFileName;
3594 else if (searchIncludes)
3597 for (
const auto &incPath : includePath)
3616 return absIncFileName;
3626 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
3627 for (
int l1=0; l1<16; l1++)
3633 term(
"Failed to create output directory '{}'\n",subdir);
3635 for (
int l2=0; l2<createSubdirsLevelPow2; l2++)
3638 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
3641 term(
"Failed to create output directory '{}'\n",subsubdir);
3653 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
3654 for (
int l1=0;l1<16;l1++)
3658 for (
int l2=0; l2 < createSubdirsLevelPow2; l2++)
3661 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
3680 bool allowEmptyClass)
3687 namespaceName=nd->
name();
3691 p=
static_cast<int>(clName.
length())-2;
3692 while (p>=0 && (i=clName.
findRev(
"::",p))!=-1)
3699 namespaceName=nd->
name();
3708 className=scopeName;
3709 namespaceName.
clear();
3712 if (className.
isEmpty() && !namespaceName.
isEmpty() && !allowEmptyClass)
3715 className=namespaceName;
3716 namespaceName.
clear();
3722 className = className.
left(className.
length()-2);
3763 int l =
static_cast<int>(result.
length());
3766 bool skipBracket=
FALSE;
3773 while (p>=0 && count>=0)
3775 char c=result.
at(p);
3781 if (p>0 && result.
at(p-1)==
':' && (count==0 || skipBracket))
3783 return result.
right(l-p-1);
3794 if (p>0 && result.
at(p-1)==
'>')
3802 bool foundMatch=
false;
3803 while (p>=0 && !foundMatch)
3815 if (round==0) count++;
3822 if (result.
at(p-1) ==
'<')
3829 foundMatch = count==0;
3844 done = count==0 || skipBracket;
3858 const char *p = s.
data();
3864 if ((c>=
'0' && c<=
'9') || (c>=
'a' && c<=
'z') || (c>=
'A' && c<=
'Z') || c==
'-')
3866 if (first && c>=
'0' && c<=
'9') result+=
'a';
3872 encChar[1]=
hex[
static_cast<unsigned char>(c)>>4];
3873 encChar[2]=
hex[
static_cast<unsigned char>(c)&0xF];
3898 const char *p = s.
data();
3904 case '<': result+=
"<";
break;
3905 case '>': result+=
">";
break;
3906 case '&':
if (keepEntities)
3912 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
3918 while (p<e) result+=*p++;
3930 case '\'': result+=
"'";
break;
3931 case '"': result+=
""";
break;
3932 case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
3933 case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
3934 case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
3935 case 27:
case 28:
case 29:
case 30:
case 31:
3937 default: result+=c;
break;
3949 const char *p=s.
data();
3955 case '<': result+=
"<";
break;
3956 case '>': result+=
">";
break;
3957 case '&':
if (keepEntities)
3963 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
3969 while (p<e) result+=*p++;
3981 case '\'': result+=
"'";
break;
3982 case '"': result+=
""";
break;
3985 uint8_t uc =
static_cast<uint8_t
>(c);
3986 if (uc<32 && !isspace(c))
3990 result+=
hex[uc&0xF];
4009 const char *p=s.
data();
4015 case '"':
if (!singleQuotes) result+=
"\\\"";
else result+=c;
4017 case '\'':
if (singleQuotes) result+=
"\\\'";
else result+=c;
4019 case '\\':
if (*p==
'u' && *(p+1)==
'{') result+=
"\\";
4020 else result+=
"\\\\";
4022 default: result+=c;
break;
4032 std::string s = str.
data();
4033 static const reg::Ex re(R
"(&\a\w*;)");
4039 size_t p=0, i=0, l=0;
4040 for (; it!=
end ; ++it)
4042 const auto &match = *it;
4043 p = match.position();
4047 result+=s.substr(i,p-i);
4051 const char *code=
nullptr;
4062 result+=s.substr(i);
4082 ASSERT(context!=
nullptr);
4084 if (ml==
nullptr)
return;
4086 struct MoveMemberInfo
4089 : memberDef(md), memberGroup(mg), sli(rv) {}
4094 std::vector<MoveMemberInfo> movedMembers;
4096 for (
const auto &md : *ml)
4098 if (md->isEnumerate())
4100 for (
const auto &fmd : md->enumFieldList())
4102 int groupId=fmd->getMemberGroupId();
4108 const auto &info = it->second;
4109 auto mg_it = std::find_if(pMemberGroups->begin(),
4110 pMemberGroups->end(),
4111 [&groupId](
const auto &g)
4112 { return g->groupId()==groupId; }
4115 if (mg_it==pMemberGroups->end())
4117 auto mg = std::make_unique<MemberGroup>(
4126 pMemberGroups->push_back(std::move(mg));
4130 mg_ptr = (*mg_it).get();
4142 int groupId=md->getMemberGroupId();
4148 const auto &info = it->second;
4149 auto mg_it = std::find_if(pMemberGroups->begin(),
4150 pMemberGroups->end(),
4151 [&groupId](
const auto &g)
4152 { return g->groupId()==groupId; }
4155 if (mg_it==pMemberGroups->end())
4157 auto mg = std::make_unique<MemberGroup>(
4166 pMemberGroups->push_back(std::move(mg));
4170 mg_ptr = (*mg_it).get();
4172 movedMembers.emplace_back(md,mg_ptr,info->m_sli);
4178 for (
const auto &mmi : movedMembers)
4180 ml->
remove(mmi.memberDef);
4181 mmi.memberGroup->insertMember(mmi.memberDef->resolveAlias());
4182 mmi.memberGroup->setRefItems(mmi.sli);
4198 AUTO_TRACE(
"type='{}' name='{}' lang={}",type,name,lang);
4199 static const reg::Ex re_norm(R
"(\a[\w:]*)");
4200 static const reg::Ex re_fortran(R
"(\a[\w:()=]*)");
4210 size_t typeLen=type.
length();
4213 if (lang == SrcLangExt::Fortran)
4225 std::string s = type.
str();
4231 const auto &match = *it;
4232 size_t i = match.position();
4233 size_t l = match.length();
4238 while (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
' ') { ts++; tl++; }
4239 if (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
'<')
4244 while (te<typeLen && brCount!=0)
4246 if (type[
static_cast<uint32_t
>(te)]==
'<')
4248 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'<') te++;
else brCount++;
4250 if (type[
static_cast<uint32_t
>(te)]==
'>')
4252 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'>') te++;
else brCount--;
4262 pos=
static_cast<int>(i+l+tl);
4266 pos=
static_cast<int>(i+l);
4271 return static_cast<int>(i);
4274 pos =
static_cast<int>(typeLen);
4287 int p=name.
find(
'<');
4288 if (p==-1)
return name;
4292 std::string s = name.
mid(p).
str();
4293 static const reg::Ex re(R
"([\a:][\w:]*)");
4298 for (; it!=
end ; ++it)
4300 const auto &match = *it;
4301 size_t i = match.position();
4302 size_t l = match.length();
4303 result += s.substr(pi,i-pi);
4306 for (
const Argument &formArg : formalArgs)
4308 if (formArg.name == n)
4334 result+=s.substr(pi);
4352 if (formalArgs.
empty())
return nm;
4355 static const reg::Ex re(R
"(\a\w*)");
4356 std::string name = nm.str();
4361 for (; it!=
end ; ++it)
4363 const auto &match = *it;
4364 size_t i = match.position();
4365 size_t l = match.length();
4366 if (i>p) result += name.substr(p,i-p);
4371 actIt = actualArgs->
begin();
4378 for (
auto formIt = formalArgs.
begin();
4379 formIt!=formalArgs.
end() && !found;
4385 if (actualArgs && actIt!=actualArgs->
end())
4392 formArg.
type =
"class";
4397 formArg.
type =
"typename";
4401 formArg.
name +=
"...";
4406 formArg.
name +=
"...";
4413 if (formArg.
name==n && actualArgs && actIt!=actualArgs->
end() && !actArg.
type.
isEmpty())
4420 ii = subst.find(
'<');
4422 if (ii!=-1 &&
static_cast<int>(
prefix.length())>=ii+2 &&
prefix.mid(
prefix.length()-ii-2,ii+1)==subst.left(ii+1))
4427 while ((ii=subst.find(nameArg,pp))!=-1)
4429 bool beforeNonWord = ii==0 || !
isId(subst.at(ii-1));
4430 bool afterNonWord = subst.length()==ii+nameArg.length() || !
isId(subst.at(ii+nameArg.length()));
4431 if (beforeNonWord && afterNonWord)
4435 pp=ii+
static_cast<int>(nameArg.length());
4440 AUTO_TRACE_ADD(
"result={} n={} type={} hasRecursion={}",result,n,actArg.
type,hasRecursion(result,n,actArg.
type));
4441 if (!hasRecursion(result,n,actArg.
type))
4453 result += actArg.
type;
4459 result += actArg.
type+
" "+actArg.
name;
4464 else if (formArg.
name==n &&
4465 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4474 else if (formArg.
name==n &&
4475 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4483 if (actualArgs && actIt!=actualArgs->
end())
4494 result+=name.substr(p);
4512 bool allowArtificial)
4515 int i=fullName.
find(
'<');
4516 if (i==-1)
return fullName;
4519 int l=
static_cast<int>(fullName.
length());
4526 while (e<l && count>0)
4528 char c=fullName.
at(e++);
4531 case '(': round++;
break;
4532 case ')':
if (round>0) round--;
break;
4533 case '<':
if (round==0) count++;
break;
4534 case '>':
if (round==0) count--;
break;
4539 int si= fullName.
find(
"::",e);
4541 if (parentOnly && si==-1)
break;
4544 result+=fullName.
mid(p,i-p);
4547 if (cd!=
nullptr && (allowArtificial || !cd->
isArtificial()))
4549 result+=fullName.
mid(i,e-i);
4552 else if (pLastScopeStripped)
4555 *pLastScopeStripped=fullName.
mid(i,e-i);
4558 i=fullName.
find(
'<',p);
4560 result+=fullName.
right(l-p);
4577 AUTO_TRACE(
"leftScope='{}' rightScope='{}'",leftScope,rightScope);
4585 int i=0,p=
static_cast<int>(leftScope.
length());
4590 while ((i=leftScope.
findRev(
"::",p))>0)
4594 result = leftScope.
left(i+2)+rightScope;
4622 int sl=
static_cast<int>(s.
length());
4626 if (sp>=sl)
return -1;
4650 while (sp<sl && !done)
4656 case '<': count++;
break;
4657 case '>': count--;
if (count==0) done=
true;
break;
4690 bool newPage =
true;
4695 warn(fileName,startLine,
"multiple use of page label '{}' with different titles, (other occurrence: {}, line: {})",
4779 else if (si->
lineNr() != -1)
4781 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {}, line {})",pd->
name(),si->
fileName(),si->
lineNr());
4785 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {})",pd->
name(),si->
fileName());
4810 if (!key.
isEmpty() && key[0]!=
'@')
4815 item->setScope(scope);
4816 item->setName(name);
4817 item->setTitle(title);
4818 item->setArgs(args);
4819 item->setGroup(key);
4867 if (!first) { ol.
writeString(
" | "); }
else first=
false;
4879 if (!first) { ol.
writeString(
" | "); }
else first=
false;
4905 int i_fs = fName.
findRev(
'/');
4906 int i_bs = fName.
findRev(
'\\');
4907 int i = fName.
find(
'.',std::max({ i_fs, i_bs ,0}));
4935 result=result.
mid(i+1);
4940 result=result.
mid(i+1);
4953 if (str.
isEmpty() || word==
nullptr)
return false;
4954 static const reg::Ex re(R
"(\a+)");
4955 std::string s = str.str();
4958 if (it->str()==word)
return true;
4969 static reg::Ex re(R
"(\s*(<\a+>)\s*)");
4970 std::string s = sentence.str();
4976 for ( ; it!=
end ; ++it)
4978 const auto match = *it;
4979 std::string part = match[1].str();
4982 size_t i = match.position();
4983 size_t l = match.length();
4984 result+=s.substr(p,i-p);
4985 result+=match.str();
4991 size_t i = match[1].position();
4992 size_t l = match[1].length();
4993 result+=s.substr(p,i-p);
4997 result+=s.substr(p);
5013 const char *p = s.
data();
5016 int i=0,li=-1,l=
static_cast<int>(s.
length());
5020 if (c==
' ' || c==
'\t' || c==
'\r') { i++; p++; }
5021 else if (c==
'\\' &&
literal_at(p,
"\\ilinebr")) { i+=8; li=i; p+=8; }
5022 else if (c==
'\n') { i++; li=i; docLine++; p++; }
5032 if (c==
' ' || c==
'\t' || c==
'\r') { b--; p--; }
5033 else if (c==
'r' && b>=7 &&
literal_at(p-7,
"\\ilinebr")) { bi=b-7; b-=8; p-=8; }
5034 else if (c==
'>' && b>=11 &&
literal_at(p-11,
"\\ilinebr<br>")) { bi=b-11; b-=12; p-=12; }
5035 else if (c==
'\n') { bi=b; b--; p--; }
5040 if (li==-1 && bi==-1)
return s;
5047 return s.
mid(li,bi-li);
5065 {
"idl",
"c", SrcLangExt::IDL,
".idl" },
5066 {
"java",
"c", SrcLangExt::Java,
".java"},
5067 {
"javascript",
"c", SrcLangExt::JS,
".js" },
5068 {
"csharp",
"c", SrcLangExt::CSharp,
".cs" },
5069 {
"d",
"c", SrcLangExt::D,
".d" },
5070 {
"php",
"c", SrcLangExt::PHP,
".php" },
5071 {
"objective-c",
"c", SrcLangExt::ObjC,
".m" },
5072 {
"c",
"c", SrcLangExt::Cpp,
".c" },
5073 {
"c++",
"c", SrcLangExt::Cpp,
".cpp" },
5074 {
"slice",
"c", SrcLangExt::Slice,
".ice" },
5075 {
"python",
"python", SrcLangExt::Python,
".py" },
5076 {
"fortran",
"fortran", SrcLangExt::Fortran,
".f" },
5077 {
"fortranfree",
"fortranfree", SrcLangExt::Fortran,
".f90" },
5078 {
"fortranfixed",
"fortranfixed", SrcLangExt::Fortran,
".f" },
5079 {
"vhdl",
"vhdl", SrcLangExt::VHDL,
".vhdl"},
5080 {
"xml",
"xml", SrcLangExt::XML,
".xml" },
5081 {
"sql",
"sql", SrcLangExt::SQL,
".sql" },
5082 {
"md",
"md", SrcLangExt::Markdown,
".md" },
5083 {
"lex",
"lex", SrcLangExt::Lex,
".l" },
5090 [&langName](
const auto &info) { return info.langName==langName; });
5097 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5107 err(
"Failed to assign extension {} to parser {} for language {}\n",
5108 extName.
data(),it1->parserName,language);
5196 if (extName.
isEmpty()) extName=
".no_extension";
5197 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5213 if (lang == SrcLangExt::Unknown)
5217 if (langName.
at(0)==
'.') langName = langName.
mid(1);
5219 [&langName](
const auto &info) { return info.langName==langName; });
5222 lang = it->parserId;
5223 fileName = it->defExt;
5227 return SrcLangExt::Cpp;
5236 int lastDot = fn.
findRev(
'.');
5237 if (lastDot!=-1)
return fn.
mid(lastDot);
5246 if (scope==
nullptr ||
5266 if (qualifierIndex!=-1)
5268 explicitScopePart = name.
left(qualifierIndex);
5270 name = name.
mid(qualifierIndex+2);
5274 int minDistance = 10000;
5283 if (distance!=-1 && distance<minDistance)
5285 minDistance = distance;
5299 if (bestMatch && bestMatch->
isTypedef())
5307 if (startPos>=len)
return len;
5308 uint8_t c =
static_cast<uint8_t
>(utf8Str[startPos]);
5313 int (*matcher)(int) =
nullptr;
5314 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5318 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5322 matcher = std::isxdigit;
5326 matcher = std::isdigit;
5329 else if (std::isalnum(c))
5332 matcher = std::isalnum;
5336 while ((c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]))!=0 && matcher(c))
5346 return startPos+bytes;
5363 .setAutolinkSupport(
false))
5365 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast.get());
5369 std::visit(visitor,astImpl->root);
5374 int l=
static_cast<int>(result.
length());
5378 if (charCnt>=80)
break;
5385 if (result.
at(i)==
',' ||
5386 result.
at(i)==
'.' ||
5387 result.
at(i)==
'!' ||
5388 result.
at(i)==
'?' ||
5396 if ( i < l) result=result.
left(i)+
"...";
5397 return result.
data();
5416 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast.get());
5424 std::visit(visitor,astImpl->root);
5441 if (al.
empty())
return;
5458 .setIndexWords(
true));
5468#ifdef TRACINGSUPPORT
5469 void *backtraceFrames[128];
5470 int frameCount = backtrace(backtraceFrames, 128);
5471 const size_t cmdLen = 40960;
5472 static char cmd[cmdLen];
5474 p +=
qsnprintf(p,cmdLen,
"/usr/bin/atos -p %d ", (
int)getpid());
5475 for (
int x = 0; x < frameCount; x++)
5477 p +=
qsnprintf(p,cmdLen,
"%p ", backtraceFrames[x]);
5479 fprintf(stderr,
"========== STACKTRACE START ==============\n");
5483 while (
size_t len = fread(resBuf, 1,
sizeof(resBuf), fp))
5485 fwrite(resBuf, 1, len, stderr);
5489 fprintf(stderr,
"============ STACKTRACE END ==============\n");
5498 if (
qstricmp(inputEncoding,outputEncoding)==0)
return;
5500 if (cd==
reinterpret_cast<void *
>(-1))
5502 term(
"unsupported character conversion: '{}'->'{}': {}\n"
5503 "Check the INPUT_ENCODING setting in the config file!\n",
5504 inputEncoding,outputEncoding,strerror(errno));
5506 size_t iLeft = contents.size();
5507 const char *srcPtr = contents.data();
5508 size_t tmpBufSize = contents.size()*4+1;
5509 size_t oLeft = tmpBufSize;
5511 tmpBuf.resize(tmpBufSize);
5512 char *dstPtr = tmpBuf.data();
5516 newSize = tmpBufSize-oLeft;
5517 tmpBuf.resize(newSize);
5518 std::swap(contents,tmpBuf);
5523 term(
"{}: failed to translate characters from {} to {}: check INPUT_ENCODING\n",
5524 fileName,inputEncoding,outputEncoding);
5536 if (filterName.
isEmpty() || !filter)
5541 err(
"could not open file {}\n",fileName);
5545 auto fileSize = fi.
size();
5546 contents.resize(fileSize);
5547 f.read(contents.data(),fileSize);
5550 err(
"problems while reading file {}\n",fileName);
5556 QCString cmd=filterName+
" \""+fileName+
"\"";
5561 err(
"could not execute filter {}\n",filterName);
5564 const int bufSize=4096;
5567 while ((numRead=
static_cast<int>(fread(buf,1,bufSize,f)))>0)
5570 contents.append(buf,numRead);
5577 if (contents.size()>=2 &&
5578 static_cast<uint8_t
>(contents[0])==0xFF &&
5579 static_cast<uint8_t
>(contents[1])==0xFE
5584 else if (contents.size()>=2 &&
5585 static_cast<uint8_t
>(contents[0])==0xFE &&
5586 static_cast<uint8_t
>(contents[1])==0xFF
5591 else if (contents.size()>=3 &&
5592 static_cast<uint8_t
>(contents[0])==0xEF &&
5593 static_cast<uint8_t
>(contents[1])==0xBB &&
5594 static_cast<uint8_t
>(contents[2])==0xBF
5597 contents.erase(0,3);
5613 std::string t = title.
str();
5614 static const reg::Ex re(R
"(%[a-z_A-Z]+)");
5618 for (; it!=
end ; ++it)
5620 const auto &match = *it;
5621 size_t i = match.position();
5622 size_t l = match.length();
5623 if (i>p) tf+=t.substr(p,i-p);
5624 tf+=match.str().substr(1);
5633template<
class PatternList,
class PatternElem,
typename PatternGet = QCString(*)(const PatternElem &)>
5635 const PatternList &patList,
5642 if (!patList.empty())
5648 for (
const auto &li : patList)
5650 std::string pattern = getter(li).str();
5651 if (!pattern.empty())
5653 size_t i=pattern.find(
'=');
5654 if (i!=std::string::npos) pattern=pattern.substr(0,i);
5656 if (!caseSenseNames)
5687 auto getter = [](std::string s) ->
QCString {
return s; };
5708 if (extLinksInWindow)
5709 return "target=\"_blank\" ";
5711 return "target=\"_parent\" ";
5728 if (!targetFileName.
isEmpty())
5733 if (!anchor.
isEmpty() && isLocalFile)
5761 result = it->second;
5762 size_t l = result.
length();
5763 if (!relPath.
isEmpty() && l>0 && result.
at(0)==
'.')
5768 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
5769 if (!href) result.
append(
"\" ");
5792 if (!img.
save(fileName))
5794 fprintf(stderr,
"Warning: Cannot open file %s for writing\n",data->
name);
5810 std::string s=str.
str();
5811 static const reg::Ex re(R
"(##[0-9A-Fa-f][0-9A-Fa-f])");
5817 size_t sl=s.length();
5819 for (; it!=
end ; ++it)
5821 const auto &match = *it;
5822 size_t i = match.position();
5823 size_t l = match.length();
5824 if (i>p) result+=s.substr(p,i-p);
5825 std::string lumStr = match.str().substr(2);
5826#define HEXTONUM(x) (((x)>='0' && (x)<='9') ? ((x)-'0') : \
5827 ((x)>='a' && (x)<='f') ? ((x)-'a'+10) : \
5828 ((x)>='A' && (x)<='F') ? ((x)-'A'+10) : 0)
5830 double r = 0,g = 0,b = 0;
5833 pow(level/255.0,gamma/100.0),&r,&g,&b);
5834 int red =
static_cast<int>(r*255.0);
5835 int green =
static_cast<int>(g*255.0);
5836 int blue =
static_cast<int>(b*255.0);
5839 colStr[1]=
hex[red>>4];
5840 colStr[2]=
hex[red&0xf];
5841 colStr[3]=
hex[green>>4];
5842 colStr[4]=
hex[green&0xf];
5843 colStr[5]=
hex[blue>>4];
5844 colStr[6]=
hex[blue&0xf];
5850 if (p<sl) result+=s.substr(p);
5861 err(
"could not copy file {} to {}\n",src,dest);
5875 int m1 = text.
find(marker);
5876 if (m1==-1)
return result;
5881 while (!found && (i=text.
find(
'\n',p))!=-1)
5883 found = (p<=m1 && m1<i);
5899 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp || lang==SrcLangExt::VHDL || lang==SrcLangExt::Python)
5903 else if (lang==SrcLangExt::PHP && !classScope)
5915 static const std::unordered_set<std::string> schemes = {
5916 "http",
"https",
"ftp",
"ftps",
"sftp",
"file",
"news",
"irc",
"ircs"
5919 int colonPos = loc_url.
find(
':');
5920 return colonPos!=-1 && schemes.find(loc_url.
left(colonPos).
str())!=schemes.end();
5942 return (prot!=Protection::Private && prot!=Protection::Package) ||
5943 (prot==Protection::Private && extractPrivate) ||
5944 (prot==Protection::Package && extractPackage);
5955 const char *p=s.
data();
5958 int minIndent=1000000;
5959 bool searchIndent=
true;
5961 bool skipFirst = skipFirstLine;
5964 if (c==
'\t') { indent+=tabSize - (indent%tabSize); }
5965 else if (c==
'\n') { indent=0; searchIndent=
true; skipFirst=
false; }
5966 else if (c==
' ') { indent++; }
5967 else if (searchIndent && !skipFirst)
5970 if (indent<minIndent) minIndent=indent;
5975 if (minIndent==0)
return substitute(s,
"@ilinebr",
"\\ilinebr");
5981 skipFirst=skipFirstLine;
5990 else if (indent<minIndent && !skipFirst)
5994 int newIndent = indent+tabSize-(indent%tabSize);
6008 else if (c==
'\\' &&
literal_at(p,
"ilinebr "))
6011 result <<
"\\ilinebr ";
6014 for (
int j=0;j<minIndent;j++)
if (*(p+j)==
' ') skipAmount++;
6015 if (skipAmount==minIndent)
6022 result <<
"\\ilinebr";
6033 return result.
str();
6041 if (indentationLevel <= 0 || doc.
isEmpty())
return;
6046 const char *src = doc.
data();
6048 bool insideIndent = !skipFirstLine;
6050 if (!skipFirstLine) cnt = indentationLevel;
6058 insideIndent =
true;
6059 cnt = indentationLevel;
6070 insideIndent =
false;
6080 insideIndent =
false;
6085 doc.
resize(
static_cast<uint32_t
>(dst-doc.
data()));
6094 return ( ((allExternals && fd->
isLinkable()) ||
6112uint32_t getUtf8Code(
const QCString& s,
int idx )
6114 const int length = s.
length();
6115 if (idx >= length) {
return 0; }
6116 const uint32_t c0 = (uint8_t)s.
at(idx);
6117 if ( c0 < 0xC2 || c0 >= 0xF8 )
6121 if (idx+1 >= length) {
return 0; }
6122 const uint32_t c1 = ((uint8_t)s.
at(idx+1)) & 0x3f;
6125 return ((c0 & 0x1f) << 6) | c1;
6127 if (idx+2 >= length) {
return 0; }
6128 const uint32_t c2 = ((uint8_t)s.
at(idx+2)) & 0x3f;
6131 return ((c0 & 0x0f) << 12) | (c1 << 6) | c2;
6133 if (idx+3 >= length) {
return 0; }
6135 const uint32_t c3 = ((uint8_t)s.
at(idx+3)) & 0x3f;
6136 return ((c0 & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
6148uint32_t getUtf8CodeToLower(
const QCString& s,
int idx )
6150 const uint32_t v = getUtf8Code( s, idx );
6151 return v < 0x7f ? tolower( v ) : v;
6163uint32_t getUtf8CodeToUpper(
const QCString& s,
int idx )
6165 const uint32_t v = getUtf8Code( s, idx );
6166 return v < 0x7f ? toupper( v ) : v;
6180 std::string s = docs.
str();
6181 static const reg::Ex re(R
"(\[([ inout,]+)\])");
6186 const auto &match = *it;
6187 size_t p = match.position();
6188 size_t l = match.length();
6192 std::string dir = match[1].str();
6194 dir.erase(std::remove_if(dir.begin(),dir.end(),
6195 [](
const char c) { return c==
' ' || c==
','; }
6197 unsigned char ioMask=0;
6198 size_t inIndex = dir.find(
"in");
6199 if ( inIndex!=std::string::npos) { dir.erase( inIndex,2); ioMask|=(1<<0); }
6200 size_t outIndex = dir.find(
"out");
6201 if (outIndex!=std::string::npos) { dir.erase(outIndex,3); ioMask|=(1<<1); }
6202 if (dir.empty() && ioMask!=0)
6205 if (ioMask==((1<<0)|(1<<1)))
return "[in,out]";
6206 else if (ioMask==(1<<0))
return "[in]";
6207 else if (ioMask==(1<<1))
return "[out]";
6239 *outListType1=inListType;
6242 if (inProt==Protection::Public)
6249 else if (inProt==Protection::Protected)
6257 *outListType2=inListType.
toPublic();
6260 else if (inProt==Protection::Private)
6270 *outListType1=inListType.
toPublic();
6292 int i= imgExt.
find(
':');
6293 return i==-1 ? imgExt : imgExt.
left(i);
6298 assert(!f.is_open());
6299 bool fileOpened=
FALSE;
6300 bool writeToStdout=outFile==
"-";
6303 f.basic_ios<char>::rdbuf(std::cout.rdbuf());
6318 fileOpened = f.is_open();
6325 static const std::unordered_set<std::string> fortran_C_keywords = {
6326 "character",
"call",
"close",
"common",
"continue",
6327 "case",
"contains",
"cycle",
"class",
"codimension",
6328 "concurrent",
"contiguous",
"critical"
6331 if (*contents !=
'c' && *contents !=
'C')
return false;
6333 const char *c = contents;
6335 while (*c && *c !=
' ') {keyword += *c; c++;}
6336 keyword = keyword.
lower();
6338 return (fortran_C_keywords.find(keyword.
str()) != fortran_C_keywords.end());
6346 bool skipLine=
FALSE;
6352 size_t sizCont = contents.
length();
6353 for (
size_t i=0;i<sizCont;i++)
6357 switch(contents.
at(i))
6364 column += tabSize-1;
6381 if (column==1)
return TRUE;
6382 if (skipLine)
break;
6385 if (column!=6) skipLine=
TRUE;
6388 if (skipLine)
break;
6389 if (column>=7)
return TRUE;
6414 auto skipBlock = [&markerInfo](
const char *p,
const SelectionBlock &blk)
6421 size_t len = markerInfo.
endLen;
6422 bool negate = *(p+markerInfo.
endLen)==
'!';
6424 size_t blkNameLen =
qstrlen(blk.name);
6425 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6429 return p+len+blkNameLen+markerInfo.
closeLen;
6446 const char *p = s.
data();
6456 bool negate = *(p+len)==
'!';
6458 for (
const auto &blk : blockList)
6460 size_t blkNameLen =
qstrlen(blk.name);
6461 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6464 bool blockEnabled = blk.enabled!=negate;
6466 p+=len+blkNameLen+markerInfo.
closeLen;
6485 size_t len = markerInfo.
endLen;
6486 bool negate = *(p+len)==
'!';
6488 for (
const auto &blk : blockList)
6490 size_t blkNameLen =
qstrlen(blk.name);
6491 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6495 p+=len+blkNameLen+markerInfo.
closeLen;
6526 const char *p = s.
data();
6535 bool negate = *(p+len)==
'!';
6541 if (markerInfo.
closeLen==0 && *p==
'\n')
6543 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
6549 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
6558 size_t len = markerInfo.
endLen;
6559 bool negate = *(p+len)==
'!';
6565 if (markerInfo.
closeLen==0 && *p==
'\n')
6567 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
6573 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
6590 const char *p=s.
data();
6599 while (*e==
' ' || *e==
'\t') e++;
6621 size_t prev = 0, pos = 0, len = s.length();
6624 pos = s.find(delimiter, prev);
6625 if (pos == std::string::npos) pos = len;
6626 if (pos>prev) result.push_back(s.substr(prev,pos-prev));
6627 prev = pos + delimiter.length();
6629 while (pos<len && prev<len);
6641 for ( ; iter !=
end; ++iter)
6643 const auto &match = *iter;
6644 size_t i=match.position();
6645 size_t l=match.length();
6646 if (i>p) result.push_back(s.substr(p,i-p));
6649 if (p<s.length()) result.push_back(s.substr(p));
6656 auto it = std::find(sv.begin(),sv.end(),s);
6657 return it!=sv.end() ?
static_cast<int>(it-sv.begin()) : -1;
6665 return reg::search(s,match,re) ?
static_cast<int>(match.position()) : -1;
6673 for (
const auto &s : sv)
6675 if (!first) result+=delimiter;
6689 while (residual > 0)
6691 modVal[0] = (upper ?
'A':
'a') + (residual-1)%26;
6692 result = modVal + result;
6693 residual = (residual-1) / 26;
6700 static const char *str_romans_upper[] = {
"M",
"CM",
"D",
"CD",
"C",
"XC",
"L",
"XL",
"X",
"IX",
"V",
"IV",
"I" };
6701 static const char *str_romans_lower[] = {
"m",
"cm",
"d",
"cd",
"c",
"xc",
"l",
"xl",
"x",
"ix",
"v",
"iv",
"i" };
6702 static const int values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
6703 static const char **str_romans = upper ? str_romans_upper : str_romans_lower;
6708 for (
int i = 0; i < 13; ++i)
6710 while (residual - values[i] >= 0)
6712 result += str_romans[i];
6713 residual -= values[i];
6723 size_t size = s.
length();
6726 const char *data = s.
data();
6729 constexpr auto doxy_nbsp =
"&_doxy_nbsp;";
6730 const int maxIndent=1000000;
6731 int minIndent=maxIndent;
6740 int stop = tabSize - (col%tabSize);
6743 while (stop--) result+=
' ';
6747 if (data[i] ==
'\\')
6753 else if (i+5<size &&
literal_at(data+i,
"iskip"))
6758 else if (i+8<size &&
literal_at(data+i,
"endiskip"))
6790 for (
int j=0;j<bytes-1 && c;j++)
6802 if (!skip && col<minIndent) minIndent=col;
6806 if (minIndent!=maxIndent) refIndent=minIndent;
else refIndent=0;
6815 uint8_t md5_sig[16];
6817 MD5Buffer(projectCookie.
data(),
static_cast<unsigned int>(projectCookie.
length()),md5_sig);
6818 MD5SigToString(md5_sig,sigStr);
6819 sigStr[32]=
'_'; sigStr[33]=0;
6826 int l =
static_cast<int>(name.
length());
6827 int lastSepPos = -1;
6828 const char *p = name.
data();
6837 if (sharpCount==0 && p[i+1]==
':' && p[i+2]==
':')
6851 if (ts==-1) ts=0;
else p+=++ts;
6852 for (i=ts;i<l-1;i++)
6855 if (c==
':' && *p==
':') lastSepPos=i;
6890 case '\t': col+=tabSize - (col%tabSize);
6899 for (
int i=0;i<numBytes-1 && (c=*s++);i++) {}
6900 if (c==0)
return col;
6915 int idx = name.
find(
'<');
6928 int idx = result.
find(
'-');
6929 result = result.
left(idx)+templArgs;
6937 int i = text.
find(
'"');
6961 uint8_t md5_sig[16];
6963 MD5Buffer(content.
data(),
static_cast<unsigned int>(content.
length()),md5_sig);
6964 MD5SigToString(md5_sig,sigStr);
6966 QCString fileName = baseName + sigStr + extension;
6976 file.write( content.
data(), content.
length() );
6981 err(
"Could not open file {} for writing\n",fileName);
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 mkdir(const std::string &path, bool acceptsAbsPath=true) const
bool remove(const std::string &path, bool acceptsAbsPath=true) const
bool isEmpty(const std::string &subdir) 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
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 isPrivate() const noexcept
constexpr MemberListType toPublic() const noexcept
static constexpr MemberListType Invalid() noexcept
constexpr MemberListType toProtected() const noexcept
constexpr bool isProtected() const noexcept
ML_TYPES constexpr bool isPublic() const noexcept
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::unordered_set< std::string > StringUnorderedSet
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 constexpr const char * to_string(Protection prot) noexcept
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 writeFileContents(const QCString &baseName, const QCString &extension, const QCString &content, bool &exists)
Thread-safe function to write a string to a file.
QCString externalRef(const QCString &relPath, const QCString &ref, bool href)
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const QCString &srcReturnType, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const QCString &dstReturnType, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
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)
static std::mutex writeFileContents_lock
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
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 stripIndentationVerbatim(QCString &doc, const int indentationLevel, bool skipFirstLine)
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 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 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)
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)
static StringUnorderedSet writeFileContents_set
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 stripIrrelevantString(QCString &target, const QCString &str, bool insideTemplate)
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 extractCanonicalType(const Definition *d, const FileDef *fs, QCString type, SrcLangExt lang, bool insideTemplate)
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 makeBaseName(const QCString &name, const QCString &ext)
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)
void stripIrrelevantConstVolatile(QCString &s, bool insideTemplate)
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()
void cleanupInlineGraph()
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