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;
118 m_ol.writeNonBreakableSpace(1);
122 m_ol.docify(std::string_view(&c, 1));
134 m_ol.lineBreak(
"typebreak");
135 for (
int i = 0; i < indent; ++i)
m_ol.writeNonBreakableSpace(3);
139 const QCString &anchor,std::string_view text
143 m_ol.writeObjectLink(extRef,file,anchor,text);
166 if (str.
isEmpty())
return result;
169 auto startsWithColon = [](
const std::string &del)
171 for (
size_t i=0;i<del.size();i++)
173 if (del[i]==
'@')
return false;
174 else if (del[i]==
':')
return true;
180 auto endsWithColon = [](
const std::string &del)
182 for (
int i=
static_cast<int>(del.size())-1;i>=0;i--)
184 if (del[i]==
'@')
return false;
185 else if (del[i]==
':')
return true;
190 static const reg::Ex re(R
"([\s:]*@\d+[\s:]*)");
191 std::string s = str.str();
195 size_t sl=s.length();
196 bool needsSeparator=
false;
197 for ( ; iter!=
end ; ++iter)
199 const auto &match = *iter;
200 size_t i = match.position();
203 if (needsSeparator) result+=
"::";
204 needsSeparator=
false;
205 result+=s.substr(p,i-p);
207 std::string delim = match.str();
208 needsSeparator = needsSeparator || (startsWithColon(delim) && endsWithColon(delim));
209 p = match.position()+match.length();
213 if (needsSeparator) result+=
"::";
223 static const reg::Ex marker(R
"(@\d+)");
225 !replacement.isEmpty() ? replacement.data() : "__anonymous__");
236 int sl =
static_cast<int>(s.
length());
244 if (!newScope.
isEmpty()) newScope+=
"::";
245 newScope+=s.
mid(i,l);
250 if (!newScope.
isEmpty()) newScope+=
"::";
251 newScope+=s.
right(sl-i);
283 const int maxMarkerStrLen = 20;
284 char result[maxMarkerStrLen];
285 qsnprintf(result,maxMarkerStrLen,
"@%d",
id);
306 for (
const auto &s : l)
309 if (
prefix.length() > length &&
316 if (length>0)
return potential;
343 static const std::unordered_set<std::string> sourceExt = {
344 "c",
"cc",
"cxx",
"cpp",
"c++",
"cppm",
"ccm",
"cxxm",
"c++m",
348 "ii",
"ixx",
"ipp",
"i++",
"inl",
351 static const std::unordered_set<std::string> headerExt = {
352 "h",
"hh",
"hxx",
"hpp",
"h++",
"ixx",
353 "idl",
"ddl",
"pidl",
"ice"
359 if (sourceExt.find(extension.
str())!=sourceExt.end())
361 return EntryType::makeSource();
363 if (headerExt.find(extension.
str())!=headerExt.end())
365 return EntryType::makeHeader();
372 return EntryType::makeEmpty();
378 AUTO_TRACE(
"context='{}' qualifiedName='{}'",context?context->
name():
"",qualifiedName);
387 if (typedefContext) *typedefContext=context;
390 if (qualifiedName.
find(
'<')!=-1)
395 int scopeIndex = qualifiedName.
findRev(
"::");
399 resName=qualifiedName.
right(qualifiedName.
length()-scopeIndex-2);
407 while (mContext && md==
nullptr)
423 if (!tmp.
isEmpty()) qualScopePart=tmp;
426 if (resScope==
nullptr)
break;
438 bool searchRelated=
false;
439 bool mustBeRelated=
false;
450 if (mn==0 && searchRelated)
458 for (
const auto &tmd_p : *mn)
461 AUTO_TRACE_ADD(
"found candidate member '{}' isTypeDef={}' isRelated={} mustBeRelated={}",
476 if (dist!=-1 && (md==
nullptr || dist<minDist))
498 if (args.
find(
")(")!=-1)
502 else if (args.
find(
'[')!=-1)
522static const char constScope[] = {
'c',
'o',
'n',
's',
't',
':' };
523static const char volatileScope[] = {
'v',
'o',
'l',
'a',
't',
'i',
'l',
'e',
':' };
524static const char virtualScope[] = {
'v',
'i',
'r',
't',
'u',
'a',
'l',
':' };
525static const char operatorScope[] = {
'o',
'p',
'e',
'r',
'a',
't',
'o',
'r',
'?',
'?',
'?' };
581 if (s.
length()*3>growBufLen)
583 growBufLen = s.
length()*3;
584 growBuf =
static_cast<char *
>(realloc(growBuf,growBufLen+1));
586 if (growBuf==
nullptr)
return s;
588 const char *src=s.
data();
599 while (i<l && isspace(
static_cast<uint8_t
>(src[i])))
606 char nc=i+1<l ? src[i+1] :
' ';
608 auto searchForKeyword = [&](
const char *kw,
size_t &matchLen,
size_t totalLen)
610 if (matchLen<=totalLen && c==kw[matchLen] &&
645 if (c==
'\\' && i+1<l)
669 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
670 (
isId(pc) || pc==
'*' || pc==
'&' || pc==
'.' || pc==
'>') &&
671 (osp<8 || (osp==8 && pc!=
'-'))
677 if (i+1<l && (nc==
'-' || nc==
'&'))
684 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
685 ((i+1<l && (
isId(nc) || nc==
'[')) ||
686 (i+2<l && nc==
'$' &&
isId(src[i+2])) ||
687 (i+3<l && nc==
'&' && src[i+2]==
'$' &&
isId(src[i+3]))
697 if (cliSupport && i+1<l && (
isId(nc) || nc==
'-'))
704 if (i+1<l && (
isId(nc) || nc==
'-'))
710 if (i>0 && pc!=
' ' && pc!=
'\t' && pc!=
':' &&
711 pc!=
'*' && pc!=
'&' && pc!=
'(' && pc!=
'/' &&
721 if (i>0 &&
isId(pc) && osp<9)
741 if (i>0 && i+1<l && pc!=
'=' && pc!=
':' && !isspace(
static_cast<uint8_t
>(pc)) &&
772 !(pc==
',' && nc==
'.') &&
773 (osp<8 || (osp>=8 &&
isId(pc) &&
isId(nc)))
781 else if ((pc==
'*' || pc==
'&' || pc==
'.') && nc==
'>')
789 auto correctKeywordAllowedInsideScope = [&](
char cc,
size_t &matchLen,
size_t totalLen) {
790 if (c==cc && matchLen==totalLen)
792 if ((i+2<l && src[i+1] ==
':' && src[i+2] ==
':') ||
793 ((i>matchLen && src[i-matchLen] ==
':' && src[i-matchLen-1] ==
':'))
797 correctKeywordAllowedInsideScope(
't',csp, 5);
798 correctKeywordAllowedInsideScope(
'e',vosp,8);
799 correctKeywordAllowedInsideScope(
'l',vsp, 7);
801 auto correctKeywordNotPartOfScope = [&](
char cc,
size_t &matchLen,
size_t totalLen)
803 if (c==cc && matchLen==totalLen && i+1<l &&
811 correctKeywordNotPartOfScope(
't',csp, 5);
812 correctKeywordNotPartOfScope(
'e',vosp,8);
813 correctKeywordNotPartOfScope(
'l',vsp, 7);
833 if (templateDepth > 0)
835 int nextOpenPos=name.
findRev(
'>', pos);
836 int nextClosePos=name.
findRev(
'<', pos);
837 if (nextOpenPos!=-1 && nextOpenPos>nextClosePos)
842 else if (nextClosePos!=-1)
854 int lastAnglePos=name.
findRev(
'>', pos);
855 int bracePos=name.
findRev(
'(', pos);
856 if (lastAnglePos!=-1 && lastAnglePos>bracePos)
863 int bp = bracePos>0 ? name.
findRev(
'(',bracePos-1) : -1;
865 return bp==-1 || (bp>=8 && name.
mid(bp-8,10)==
"operator()") ? bracePos : bp;
876 return (name==scope ||
877 (scope.
right(nl)==name &&
878 sl>1+nl && scope.
at(sl-nl-1)==
':' && scope.
at(sl-nl-2)==
':'
887 return (name==scope ||
888 (name.
left(sl)==scope &&
889 nl>sl+1 && name.
at(sl)==
':' && name.
at(sl+1)==
':'
897 const QCString &text,
bool autoBreak,
bool external,
898 bool keepSpaces,
int indentLevel)
902 std::string_view txtStr=text.
view();
903 size_t strLen = txtStr.length();
904 if (strLen==0)
return;
906 static const reg::Ex regExp(R
"((::)?\a[\w~!\\.:$"]*)");
916 size_t floatingIndex=0;
917 for (; it!=
end ; ++it)
919 const auto &match = *it;
920 size_t newIndex = match.position();
921 size_t matchLen = match.length();
922 floatingIndex+=newIndex-skipIndex+matchLen;
923 if (newIndex>0 && txtStr.at(newIndex-1)==
'0')
925 std::string_view part = txtStr.substr(skipIndex,newIndex+matchLen-skipIndex);
927 skipIndex=index=newIndex+matchLen;
932 bool insideString=
FALSE;
933 for (
size_t i=index;i<newIndex;i++)
935 if (txtStr.at(i)==
'"') insideString=!insideString;
936 if (txtStr.at(i)==
'\\') i++;
940 if (strLen>35 && floatingIndex>30 && autoBreak)
942 std::string_view splitText = txtStr.substr(skipIndex,newIndex-skipIndex);
943 size_t splitLength = splitText.length();
945 size_t i = splitText.find(
',');
946 if (i==std::string::npos) { i=splitText.find(
'<');
if (i!=std::string::npos) offset=0; }
947 if (i==std::string::npos) i=splitText.find(
'>');
948 if (i==std::string::npos) i=splitText.find(
' ');
950 if (i!=std::string::npos)
952 std::string_view part1 = splitText.substr(0,i+offset);
954 out.
writeBreak(indentLevel==0 ? 0 : indentLevel+1);
955 std::string_view part2 = splitText.substr(i+offset);
957 floatingIndex=splitLength-i-offset+matchLen;
967 std::string_view part = txtStr.substr(skipIndex,newIndex-skipIndex);
971 std::string_view word=txtStr.substr(newIndex,matchLen);
1000 auto writeCompoundName = [&](
const auto *cd_) {
1001 if (external ? cd_->isLinkable() : cd_->isLinkableInProject())
1006 out.
writeLink(cd_->getReference(),cd_->getOutputFileBase(),cd_->anchor(),word);
1011 if (!found && (cd || (cd=
getClass(matchWord))))
1013 writeCompoundName(cd);
1015 else if ((cd=
getClass(matchWord+
"-p")))
1017 writeCompoundName(cd);
1021 writeCompoundName(cnd);
1028 int m = matchWord.
findRev(
"::");
1036 scopeName=scope->
name();
1040 scopeName = matchWord.
left(m);
1041 matchWord = matchWord.
mid(m+2);
1050 if (result.
found && result.
md &&
1057 if (result.
md!=self && (self==
nullptr || result.
md->
name()!=self->
name()))
1086 skipIndex=index=newIndex+matchLen;
1090 std::string_view lastPart = txtStr.substr(skipIndex);
1095 std::function<
void(
size_t)> replaceFunc)
1097 static const reg::Ex marker(R
"(@(\d+))");
1102 for ( ; it!=
end ; ++it)
1104 const auto &match = *it;
1105 size_t newIndex = match.position();
1106 size_t matchLen = match.length();
1107 ol.
parseText(markerText.substr(index,newIndex-index));
1108 unsigned long entryIndex = std::stoul(match[1].str());
1109 if (entryIndex<
static_cast<unsigned long>(numMarkers))
1111 replaceFunc(entryIndex);
1113 index=newIndex+matchLen;
1120 auto replaceFunc = [&list,&ol](
size_t entryIndex)
1122 const auto &e = list[entryIndex];
1154 if (a.hasDocumentation())
1158 paramDocs+=
" \\ilinebr @param"+direction+
" "+a.name+
" "+docsWithoutDir;
1172 if (!a.docs.isEmpty())
1174 if (!a.name.isEmpty())
1176 paramDocs+=
" \\ilinebr @tparam "+a.name+
" "+a.docs;
1178 else if (!a.type.isEmpty())
1184 paramDocs+=
" \\ilinebr @tparam "+type+
" "+a.docs;
1197 for (
auto it = al.
begin() ; it!=al.
end() ;)
1202 int i=type1.
find(
")(");
1206 type1=type1.
left(i);
1214 result+= type1+
" "+a.
name+type2+a.
array;
1218 result+= type1+type2;
1225 if (it!=al.
end()) result+=
", ";
1240 if (al.
empty())
return result;
1243 for (
const auto &a : al)
1245 if (a.defval.isEmpty() || includeDefault)
1247 if (!first) result+=
", ";
1248 if (!a.name.isEmpty())
1250 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
1258 int i =
static_cast<int>(a.type.length())-1;
1259 while (i>=0 &&
isId(a.type.at(i))) i--;
1262 result+=a.type.
right(a.type.length()-i-1);
1263 if (a.type.find(
"...")!=-1)
1273 if (!a.typeConstraint.isEmpty() && lang==SrcLangExt::Java)
1275 result+=
" extends ";
1276 result+=a.typeConstraint;
1297 size_t len = contents.length();
1301 char c = contents[src++];
1305 if (src<len && contents[src] ==
'\n')
1310 else if ( c ==
'\0' && src<len-1)
1314 contents[dest++] = c;
1316 contents.resize(dest);
1323 for (
const auto &filterStr : filterList)
1326 int i_equals=fs.
find(
'=');
1333 filterPattern = filterPattern.
lower();
1334 input = input.
lower();
1341 if (filterName.
find(
' ')!=-1)
1343 filterName=
"\""+filterName+
"\"";
1363 if (name.
isEmpty())
return "";
1370 if (isSourceCode && !filterSrcList.empty())
1374 if (!found && filterName.
isEmpty())
1385 if (filterName.
length()>=2 && filterName[0]==
'"' && filterName[
static_cast<int>(filterName.
length())-1]==
'"')
1387 filterName = filterName.
mid(1,filterName.
length()-2);
1396 const char *outputEncoding =
"UTF-8";
1397 if (inputEncoding==
nullptr ||
qstricmp(inputEncoding,outputEncoding)==0)
return true;
1398 size_t inputSize=input.length();
1399 size_t outputSize=inputSize*4;
1402 if (cd==
reinterpret_cast<void *
>(-1))
1407 size_t iLeft=inputSize;
1408 size_t oLeft=outputSize;
1409 const char *inputPtr = input.data();
1410 char *outputPtr = output.
rawData();
1413 outputSize-=
static_cast<int>(oLeft);
1414 output.
resize(outputSize);
1415 output.
at(outputSize)=
'\0';
1435 bool fileOpened=
false;
1436 if (name[0]==
'-' && name[1]==0)
1438 std::string contents;
1440 while (getline(std::cin,line))
1442 contents+=line+
'\n';
1451 err(
"file '{}' not found\n",name);
1464 err(
"cannot open file '{}' for reading\n",name);
1472 for (
const auto &bcd : bcl)
1493 AUTO_TRACE(
"target='{}' str='{}'",target,str);
1494 if (target==str) { target.
clear();
return; }
1496 int l=
static_cast<int>(str.
length());
1499 while ((i=target.
find(str,p))!=-1)
1501 for (
int q=p;q<i;q++)
1503 if (target[q]==
'<') sharpCount++;
1504 else if (target[q]==
'>' && sharpCount>0) sharpCount--;
1506 bool isMatch = (i==0 || !
isId(target.
at(i-1))) &&
1507 (i+l==
static_cast<int>(target.
length()) || !
isId(target.
at(i+l))) &&
1508 !insideTemplate && sharpCount==0;
1511 int i1=target.
find(
'*',i+l);
1512 int i2=target.
find(
'&',i+l);
1513 if (i1==-1 && i2==-1)
1520 else if ((i1!=-1 && i<i1) || (i2!=-1 && i<i2))
1563 int i=s.
find(
" class ");
1564 if (i!=-1)
return s.
left(i)+s.
mid(i+6);
1565 i=s.
find(
" typename ");
1566 if (i!=-1)
return s.
left(i)+s.
mid(i+9);
1567 i=s.
find(
" union ");
1568 if (i!=-1)
return s.
left(i)+s.
mid(i+6);
1569 i=s.
find(
" struct ");
1570 if (i!=-1)
return s.
left(i)+s.
mid(i+7);
1583 if (!templSpec.
isEmpty() && templSpec.
at(0) ==
'<')
1590 templSpec = resolvedType;
1602 if (count>10)
return word;
1604 QCString symName,result,templSpec,tmpName;
1605 if (tSpec && !tSpec->
isEmpty())
1608 AUTO_TRACE(
"d='{}' fs='{}' word='{}' templSpec='{}'",d?d->
name():
"",fs?fs->
name():
"",word,templSpec);
1626 bool isTemplInst = cd && !templSpec.
isEmpty();
1627 if (!cd && !templSpec.
isEmpty())
1638 cd?cd->
name():
"",mType?mType->
name():
"",ts,resolvedType);
1661 if (cd==d && tSpec) *tSpec=
"";
1665 result = resolvedType+ts;
1673 if (tSpec) *tSpec=
"";
1687 result=cd->
name()+templSpec;
1737 resolvedType = lang==SrcLangExt::Java ? word :
resolveTypeDef(d,word);
1745 result = resolvedType;
1778 if (i>pp) canType += type.
mid(pp,i-pp);
1799 std::string ts = templSpec.
str();
1800 static const reg::Ex re(R
"(\a\w*)");
1807 for (; it!=
end ; ++it)
1809 const auto &match = *it;
1810 size_t ti = match.position();
1811 size_t tl = match.length();
1812 std::string matchStr = match.str();
1813 canType += ts.substr(tp,ti-tp);
1817 canType+=ts.substr(tp);
1833 if ((type==
"const" || type==
"volatile") && !name.
isEmpty())
1838 if (name==
"const" || name==
"volatile")
1840 if (!type.
isEmpty()) type+=
" ";
1866 AUTO_TRACE(
"srcType='{}' dstType='{}'",srcType,dstType);
1867 if (srcType==dstType)
return true;
1870 int i1=srcType.
find(
")(");
1871 if (i1==-1)
return false;
1872 int i2=dstType.
find(
")(");
1873 if (i1!=i2)
return false;
1876 int j1=srcType.
find(
"(");
1877 if (j1==-1 || j1>i1)
return false;
1878 int j2=dstType.
find(
"(");
1879 if (j2!=j1)
return false;
1880 if (srcType.
left(j1)!=dstType.
left(j2))
return false;
1889 dstScope,dstFileScope,dstAl.get(),
1899 AUTO_TRACE(
"src: scope={} type={} name={} canType={}, dst: scope={} type={} name={} canType={}",
1918 srcA.
type+=sSrcName;
1922 else if (sDstName==srcType.
right(sDstName.
length()))
1924 dstA.
type+=sDstName;
1940 dstScope,dstFileScope,dstA.
canType,
1963 ASSERT(srcScope!=
nullptr && dstScope!=
nullptr);
1965 AUTO_TRACE(
"srcScope='{}' dstScope='{}' srcArgs='{}' dstArgs='{}' checkCV={} lang={}",
1968 if (srcAl==
nullptr || dstAl==
nullptr)
1970 bool match = srcAl==dstAl;
2001 if (srcAl->
size() != dstAl->
size())
2035 auto srcIt = srcAl->
begin();
2036 auto dstIt = dstAl->
begin();
2037 for (;srcIt!=srcAl->
end() && dstIt!=dstAl->
end();++srcIt,++dstIt)
2042 dstScope,dstFileScope,dstA,
2061 AUTO_TRACE(
"srcAl='{}',dstAl='{}',forceNameOverwrite={}",
2069 auto srcIt=srcAl.
begin();
2070 auto dstIt=dstAl.
begin();
2071 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
2076 AUTO_TRACE_ADD(
"before merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
2092 if (srcA.
name==
"const" || srcA.
name==
"volatile")
2097 if (dstA.
name==
"const" || dstA.
name==
"volatile")
2123 if (forceNameOverwrite)
2166 j1=
static_cast<int>(srcA.
type.
length())-i1-2,
2167 j2=
static_cast<int>(dstA.
type.
length())-i2-2;
2175 else if (i1==-1 && i2!=-1 && dstA.
type.
right(j2)==srcA.
type)
2195 AUTO_TRACE_ADD(
"after merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
2211 auto isUnconstraintTemplate = [](
const QCString &type)
2213 return type==
"typename" || type==
"class" || type.startsWith(
"typename ") || type.startsWith(
"class ");
2215 auto srcIt = srcAl.
begin();
2216 auto dstIt = dstAl.
begin();
2217 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
2221 if ((!isUnconstraintTemplate(srcA.
type) || !isUnconstraintTemplate(dstA.
type)) && srcA.
type!=dstA.
type)
2240 AUTO_TRACE(
"scopeName={},memberName={},forceEmptyScope={}",
2266 result.
found =
true;
2271 result.
found =
true;
2276 result.
found =
true;
2281 result.
found =
true;
2286 result.
found =
true;
2318 bool explicitGlobalScope=
FALSE;
2319 if (scopeName.
at(0)==
':' && scopeName.
at(1)==
':')
2322 explicitGlobalScope=
TRUE;
2330 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(docScopeName.
length());
2335 if (scopeOffset>0) fullName.
prepend(docScopeName.
left(scopeOffset)+
"::");
2359 else if ((scopeOffset=docScopeName.
findRev(
"::",scopeOffset-1))==-1)
2363 }
while (scopeOffset>=0);
2371 const char *p=s.
data();
2373 while ((c=
static_cast<uint8_t
>(*p++)))
if (!islower(c))
return false;
2386 bool lookForSpecialization,
2391 AUTO_TRACE(
"scope={} name={} inSeeBlock={} lang={} lookForSpecialization={} currentFile={} checkScope={}",
2392 scName,name,inSeeBlock,lang,lookForSpecialization,currentFile ? currentFile->
name() :
"", checkScope);
2397 if (fullName.
find(
"anonymous_namespace{")==-1)
2407 if (lang==SrcLangExt::CSharp && (templStartPos=fullName.
find(
'<'))!=-1)
2409 int templEndPos = fullName.
findRev(
'>');
2410 if (templEndPos!=-1)
2418 int endNamePos=bracePos!=-1 ? bracePos :
static_cast<int>(fullName.
length());
2419 int scopePos=fullName.
findRev(
"::",endNamePos);
2420 bool explicitScope = fullName.
startsWith(
"::") &&
2425 bool allowTypeOnly=
false;
2428 *resContext=
nullptr;
2435 if (!inSeeBlock && scopePos==-1 &&
isLowerCase(tsName))
2449 if (scName!=fullName &&
getScopeDefs(scName,fullName,cd,cnd,nd,modd))
2472 else if (scName==fullName || (!inSeeBlock && scopePos==-1))
2491 if (explicitScope) nameStr=nameStr.
mid(2);
2496 if (bracePos!=-1) argsStr=fullName.
right(fullName.
length()-bracePos);
2500 int templPos=nameStr.
find(
'<');
2501 bool tryUnspecializedVersion =
FALSE;
2502 if (templPos!=-1 && nameStr.
find(
"operator")==-1)
2504 int endTemplPos=nameStr.
findRev(
'>');
2505 if (endTemplPos!=-1)
2507 if (!lookForSpecialization)
2509 nameStr=nameStr.
left(templPos)+nameStr.
right(nameStr.
length()-endTemplPos-1);
2513 tryUnspecializedVersion =
TRUE;
2521 nameStr=nameStr.
mid(scopeStr.
length()+2);
2547 *resContext=
nullptr;
2557 *resMember=result.
md;
2558 *resContext=result.
md;
2562 *resContext=
nullptr;
2568 else if (result.
cd) *resContext=result.
cd;
2569 else if (result.
nd) *resContext=result.
nd;
2570 else if (result.
fd) *resContext=result.
fd;
2571 else if (result.
gd) *resContext=result.
gd;
2572 else if (result.
cnd) *resContext=result.
cnd;
2573 else if (result.
modd) *resContext=result.
modd;
2576 *resContext=
nullptr; *resMember=
nullptr;
2603 else if (tsName.
find(
'.')!=-1)
2615 if (tryUnspecializedVersion)
2617 bool b =
resolveRef(scName,name,inSeeBlock,resContext,resMember,lang,
FALSE,
nullptr,checkScope);
2645 if (!isFileName && result.
find(
'<')==-1) result=
substitute(result,
".",
"::",3);
2647 if (result.
at(0)==
':' && result.
at(1)==
':')
2671 *resContext=
nullptr;
2674 if (lang==SrcLangExt::CSharp)
2679 AUTO_TRACE(
"scName='{}',ref='{}'",scName,lr);
2684 const DirDef *dir =
nullptr;
2702 if (si) resAnchor = si->
label();
2714 resAnchor = si->
label();
2721 resAnchor = si->
label();
2751 else if (lang==SrcLangExt::Java &&
2752 (cd=
getClass(linkRefWithoutTemplates)))
2759 else if ((cd=
getClass(linkRef+
"-p")))
2776 resAnchor=modd->
anchor();
2797 if (md) resAnchor=md->
anchor();
2835 if (n.
isEmpty())
return nullptr;
2838 const int maxAddrSize = 20;
2839 char addr[maxAddrSize];
2840 qsnprintf(addr,maxAddrSize,
"%p:",
reinterpret_cast<const void*
>(fnMap));
2849 ambig = cachedResult->
isAmbig;
2860 if (name.
isEmpty())
return nullptr;
2867 if (name.
isEmpty())
return nullptr;
2874 const std::unique_ptr<FileDef> &fd = fn->front();
2876 fd->getPath().right(path.
length())==path :
2878 if (path.
isEmpty() || isSamePath)
2880 cachedResult->
fileDef = fd.get();
2889 for (
const auto &fd_p : *fn)
2903 cachedResult->
isAmbig = ambig;
2904 cachedResult->
fileDef = lastMatch;
2934 for (
const auto &s : examplePathList)
2968 path=name.
left(slashPos+1);
2975 for (
const auto &fd : *fn)
2977 if (path.
isEmpty() || fd->getPath().right(path.
length())==path)
2979 if (!first) result +=
"\n";
2981 result+=
" "+fd->absFilePath();
2992 std::string substRes;
2994 const char *p = s.
data();
2998 substRes.reserve(s.
length()+1024);
3005 for (
const auto &kw : keywords)
3007 size_t keyLen =
qstrlen(kw.keyword);
3008 if (
qstrncmp(p,kw.keyword,keyLen)==0)
3010 const char *startArg = p+keyLen;
3011 bool expectParam = std::holds_alternative<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3013 if (expectParam && *startArg==
'(')
3016 const char *endArg =
nullptr;
3017 while ((c=*(startArg+j)) && c!=
')' && c!=
'\n' && c!=0) j++;
3018 if (c==
')') endArg=startArg+j;
3022 auto &&getValue = std::get<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3023 substRes+=getValue(value).str();
3030 warn(file,line,
"Missing argument for '{}'",kw.keyword);
3034 else if (!expectParam)
3036 auto &&getValue = std::get<KeywordSubstitution::GetValue>(kw.getValueVariant);
3037 substRes+=getValue().str();
3044 warn(file,line,
"Expected arguments for '{}' but none were specified",kw.keyword);
3054 if (c==
'\n') line++;
3082 int wi = projectLogo.
find(
" width=");
3085 projectLogo = projectLogo.
left(wi);
3087 int hi = projectLogo.
find(
" height=");
3090 projectLogo = projectLogo.
left(hi);
3103 auto extractDimension = [&projectLogo](
const char *startMarker,
size_t startPos,
size_t endPos) ->
QCString
3106 if (result.
length()>=2 && result.
at(0)!=
'"' && result.
at(result.
length()-1)!=
'"')
3108 result=
"\""+result+
"\"";
3114 int wi = projectLogo.
find(
" width=");
3115 int hi = projectLogo.
find(
" height=");
3116 if (wi!=-1 && hi!=-1)
3120 sizeVal = extractDimension(
" width=", wi+7, hi) +
" "
3121 + extractDimension(
" height=", hi+8, projectLogo.
length());
3125 sizeVal = extractDimension(
" height=", hi+8, wi) +
" "
3126 + extractDimension(
" width=", wi+7, projectLogo.
length());
3131 sizeVal = extractDimension(
" width=", wi+7, projectLogo.
length());
3135 sizeVal = extractDimension(
" height=", hi+8, projectLogo.
length());
3148 {
"$title", [&]() {
return !title.
isEmpty() ? title : projName; } },
3149 {
"$doxygenversion", [&]() {
return getDoxygenVersion(); } },
3150 {
"$projectname", [&]() {
return projName; } },
3151 {
"$projectnumber", [&]() {
return projNum; } },
3152 {
"$projectbrief", [&]() {
return projBrief; } },
3156 {
"$langISO", [&]() {
return theTranslator->trISOLang(); } },
3171 for (
const auto &s : sl)
3173 const char *ps=s.c_str();
3174 const char *pd=name.
data();
3176 while (*ps!=0 && *pd!=0 && *ps==*pd) ps++,pd++,i++;
3177 if (*ps==0 && *pd!=0)
3193int getUtf8Char(
const char *input,
char ids[MAX_UTF8_CHAR_SIZE],CaseModifier modifier)
3196 const unsigned char uc = (
unsigned char)*input;
3197 bool validUTF8Char =
false;
3200 const char* pt = input+1;
3202 if ((uc&0x80)==0x00)
3206 case CaseModifier::None: ids[0]=*input;
break;
3207 case CaseModifier::ToUpper: ids[0]=(char)toupper(*input);
break;
3208 case CaseModifier::ToLower: ids[0]=(char)tolower(*input);
break;
3215 if ((uc&0xE0)==0xC0)
3219 if ((uc&0xF0)==0xE0)
3223 if ((uc&0xF8)==0xF0)
3228 validUTF8Char = l>0;
3229 for (
int m=1; m<l && validUTF8Char; ++m)
3231 unsigned char ct = (
unsigned char)*pt;
3232 if (ct==0 || (ct&0xC0)!=0x80)
3234 validUTF8Char=
false;
3255 if (caseSenseNames == CASE_SENSE_NAMES_t::YES)
return true;
3256 else if (caseSenseNames == CASE_SENSE_NAMES_t::NO)
return false;
3262 if (name.
isEmpty())
return name;
3267 const char *p=name.
data();
3272 case '_':
if (allowUnderscore) growBuf.
addChar(
'_');
else growBuf.
addStr(
"__");
break;
3273 case '-': growBuf.
addChar(
'-');
break;
3274 case ':': growBuf.
addStr(
"_1");
break;
3275 case '/': growBuf.
addStr(
"_2");
break;
3276 case '<': growBuf.
addStr(
"_3");
break;
3277 case '>': growBuf.
addStr(
"_4");
break;
3278 case '*': growBuf.
addStr(
"_5");
break;
3279 case '&': growBuf.
addStr(
"_6");
break;
3280 case '|': growBuf.
addStr(
"_7");
break;
3281 case '.':
if (allowDots) growBuf.
addChar(
'.');
else growBuf.
addStr(
"_8");
break;
3282 case '!': growBuf.
addStr(
"_9");
break;
3283 case ',': growBuf.
addStr(
"_00");
break;
3284 case ' ': growBuf.
addStr(
"_01");
break;
3285 case '{': growBuf.
addStr(
"_02");
break;
3286 case '}': growBuf.
addStr(
"_03");
break;
3287 case '?': growBuf.
addStr(
"_04");
break;
3288 case '^': growBuf.
addStr(
"_05");
break;
3289 case '%': growBuf.
addStr(
"_06");
break;
3290 case '(': growBuf.
addStr(
"_07");
break;
3291 case ')': growBuf.
addStr(
"_08");
break;
3292 case '+': growBuf.
addStr(
"_09");
break;
3293 case '=': growBuf.
addStr(
"_0a");
break;
3294 case '$': growBuf.
addStr(
"_0b");
break;
3295 case '\\': growBuf.
addStr(
"_0c");
break;
3296 case '@': growBuf.
addStr(
"_0d");
break;
3297 case ']': growBuf.
addStr(
"_0e");
break;
3298 case '[': growBuf.
addStr(
"_0f");
break;
3299 case '#': growBuf.
addStr(
"_0g");
break;
3300 case '"': growBuf.
addStr(
"_0h");
break;
3301 case '~': growBuf.
addStr(
"_0i");
break;
3302 case '\'': growBuf.
addStr(
"_0j");
break;
3303 case ';': growBuf.
addStr(
"_0k");
break;
3304 case '`': growBuf.
addStr(
"_0l");
break;
3308 bool doEscape =
true;
3309 if (allowUnicodeNames)
3314 growBuf.
addStr(p-1,charLen);
3322 unsigned char id =
static_cast<unsigned char>(c);
3331 else if (caseSenseNames || !isupper(c))
3338 growBuf.
addChar(
static_cast<char>(tolower(c)));
3344 return growBuf.
get();
3352 const char *p = s.
data();
3362 case '_': result+=c; p++;
break;
3363 case '1': result+=
':'; p++;
break;
3364 case '2': result+=
'/'; p++;
break;
3365 case '3': result+=
'<'; p++;
break;
3366 case '4': result+=
'>'; p++;
break;
3367 case '5': result+=
'*'; p++;
break;
3368 case '6': result+=
'&'; p++;
break;
3369 case '7': result+=
'|'; p++;
break;
3370 case '8': result+=
'.'; p++;
break;
3371 case '9': result+=
'!'; p++;
break;
3375 case '0': result+=
','; p+=2;
break;
3376 case '1': result+=
' '; p+=2;
break;
3377 case '2': result+=
'{'; p+=2;
break;
3378 case '3': result+=
'}'; p+=2;
break;
3379 case '4': result+=
'?'; p+=2;
break;
3380 case '5': result+=
'^'; p+=2;
break;
3381 case '6': result+=
'%'; p+=2;
break;
3382 case '7': result+=
'('; p+=2;
break;
3383 case '8': result+=
')'; p+=2;
break;
3384 case '9': result+=
'+'; p+=2;
break;
3385 case 'a': result+=
'='; p+=2;
break;
3386 case 'b': result+=
'$'; p+=2;
break;
3387 case 'c': result+=
'\\'; p+=2;
break;
3388 case 'd': result+=
'@'; p+=2;
break;
3389 case 'e': result+=
']'; p+=2;
break;
3390 case 'f': result+=
'['; p+=2;
break;
3391 case 'g': result+=
'#'; p+=2;
break;
3392 case 'h': result+=
'"'; p+=2;
break;
3393 case 'i': result+=
'~'; p+=2;
break;
3394 case 'j': result+=
'\''; p+=2;
break;
3395 case 'k': result+=
';'; p+=2;
break;
3396 case 'l': result+=
'`'; p+=2;
break;
3403 if (!caseSenseNames && c>=
'a' && c<=
'z')
3405 result+=
static_cast<char>(toupper(*p));
3436 if (name.
isEmpty())
return name;
3459 size_t resultLen = result.
length();
3463 uint8_t md5_sig[16];
3465 MD5Buffer(result.
data(),
static_cast<unsigned int>(resultLen),md5_sig);
3466 MD5SigToString(md5_sig,sigStr);
3467 result=result.
left(128-32)+sigStr;
3472 int l1Dir=0,l2Dir=0;
3473 int createSubdirsLevel =
Config_getInt(CREATE_SUBDIRS_LEVEL);
3474 int createSubdirsBitmaskL2 = (1<<createSubdirsLevel)-1;
3477 uint8_t md5_sig[16];
3478 MD5Buffer(result.
data(),
static_cast<unsigned int>(result.
length()),md5_sig);
3479 l1Dir = md5_sig[14] & 0xf;
3480 l2Dir = md5_sig[15] & createSubdirsBitmaskL2;
3491 const int sig_size=16;
3492 uint8_t md5_sig[sig_size];
3493 MD5Buffer(fn.
data(),
static_cast<unsigned int>(fn.
length()),md5_sig);
3494 char result[sig_size*3+2];
3497 for (
int i=0;i<sig_size;i++)
3499 static const char oct[]=
"01234567";
3500 uint8_t
byte = md5_sig[i];
3501 *p++=oct[(
byte>>6)&7];
3502 *p++=oct[(
byte>>3)&7];
3503 *p++=oct[(
byte>>0)&7];
3533 QCString absIncFileName = incFileName;
3543 else if (searchIncludes)
3546 for (
const auto &incPath : includePath)
3565 return absIncFileName;
3575 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
3576 for (
int l1=0; l1<16; l1++)
3582 term(
"Failed to create output directory '{}'\n",subdir);
3584 for (
int l2=0; l2<createSubdirsLevelPow2; l2++)
3587 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
3590 term(
"Failed to create output directory '{}'\n",subsubdir);
3602 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
3603 for (
int l1=0;l1<16;l1++)
3607 for (
int l2=0; l2 < createSubdirsLevelPow2; l2++)
3610 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
3629 bool allowEmptyClass)
3636 namespaceName=nd->
name();
3640 p=
static_cast<int>(clName.
length())-2;
3641 while (p>=0 && (i=clName.
findRev(
"::",p))!=-1)
3648 namespaceName=nd->
name();
3657 className=scopeName;
3658 namespaceName.
clear();
3661 if (className.
isEmpty() && !namespaceName.
isEmpty() && !allowEmptyClass)
3664 className=namespaceName;
3665 namespaceName.
clear();
3671 className = className.
left(className.
length()-2);
3712 int l =
static_cast<int>(result.
length());
3715 bool skipBracket=
FALSE;
3722 while (p>=0 && count>=0)
3724 char c=result.
at(p);
3730 if (p>0 && result.
at(p-1)==
':' && (count==0 || skipBracket))
3732 return result.
right(l-p-1);
3743 if (p>0 && result.
at(p-1)==
'>')
3751 bool foundMatch=
false;
3752 while (p>=0 && !foundMatch)
3764 if (round==0) count++;
3771 if (result.
at(p-1) ==
'<')
3778 foundMatch = count==0;
3793 done = count==0 || skipBracket;
3806 const char *p = s.
data();
3812 if ((c>=
'0' && c<=
'9') || (c>=
'a' && c<=
'z') || (c>=
'A' && c<=
'Z') || c==
'-')
3814 if (first && c>=
'0' && c<=
'9') growBuf.
addChar(
'a');
3820 encChar[1]=
hex[
static_cast<unsigned char>(c)>>4];
3821 encChar[2]=
hex[
static_cast<unsigned char>(c)&0xF];
3828 return growBuf.
get();
3846 const char *p = s.
data();
3852 case '<': growBuf.
addStr(
"<");
break;
3853 case '>': growBuf.
addStr(
">");
break;
3854 case '&':
if (keepEntities)
3860 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
3866 while (p<e) growBuf.
addChar(*p++);
3878 case '\'': growBuf.
addStr(
"'");
break;
3879 case '"': growBuf.
addStr(
""");
break;
3880 case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
3881 case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
3882 case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
3883 case 27:
case 28:
case 29:
case 30:
case 31:
3885 default: growBuf.
addChar(c);
break;
3889 return growBuf.
get();
3897 const char *p=s.
data();
3903 case '<': growBuf.
addStr(
"<");
break;
3904 case '>': growBuf.
addStr(
">");
break;
3905 case '&':
if (keepEntities)
3911 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
3917 while (p<e) growBuf.
addChar(*p++);
3929 case '\'': growBuf.
addStr(
"'");
break;
3930 case '"': growBuf.
addStr(
""");
break;
3933 uint8_t uc =
static_cast<uint8_t
>(c);
3934 if (uc<32 && !isspace(c))
3950 return growBuf.
get();
3957 const char *p=s.
data();
3963 case '"':
if (!singleQuotes) growBuf.
addStr(
"\\\"");
else growBuf.
addChar(c);
3965 case '\'':
if (singleQuotes) growBuf.
addStr(
"\\\'");
else growBuf.
addChar(c);
3967 case '\\':
if (*p==
'u' && *(p+1)==
'{') growBuf.
addStr(
"\\");
3968 else growBuf.
addStr(
"\\\\");
3970 default: growBuf.
addChar(c);
break;
3981 std::string s = str.
data();
3982 static const reg::Ex re(R
"(&\a\w*;)");
3987 size_t p=0, i=0, l=0;
3988 for (; it!=
end ; ++it)
3990 const auto &match = *it;
3991 p = match.position();
3995 growBuf.
addStr(s.substr(i,p-i));
3999 const char *code=
nullptr;
4010 growBuf.
addStr(s.substr(i));
4013 return growBuf.
get();
4031 ASSERT(context!=
nullptr);
4033 if (ml==
nullptr)
return;
4035 struct MoveMemberInfo
4038 : memberDef(md), memberGroup(mg), sli(rv) {}
4043 std::vector<MoveMemberInfo> movedMembers;
4045 for (
const auto &md : *ml)
4047 if (md->isEnumerate())
4049 for (
const auto &fmd : md->enumFieldList())
4051 int groupId=fmd->getMemberGroupId();
4057 const auto &info = it->second;
4058 auto mg_it = std::find_if(pMemberGroups->begin(),
4059 pMemberGroups->end(),
4060 [&groupId](
const auto &g)
4061 { return g->groupId()==groupId; }
4064 if (mg_it==pMemberGroups->end())
4066 auto mg = std::make_unique<MemberGroup>(
4075 pMemberGroups->push_back(std::move(mg));
4079 mg_ptr = (*mg_it).get();
4091 int groupId=md->getMemberGroupId();
4097 const auto &info = it->second;
4098 auto mg_it = std::find_if(pMemberGroups->begin(),
4099 pMemberGroups->end(),
4100 [&groupId](
const auto &g)
4101 { return g->groupId()==groupId; }
4104 if (mg_it==pMemberGroups->end())
4106 auto mg = std::make_unique<MemberGroup>(
4115 pMemberGroups->push_back(std::move(mg));
4119 mg_ptr = (*mg_it).get();
4121 movedMembers.emplace_back(md,mg_ptr,info->m_sli);
4127 for (
const auto &mmi : movedMembers)
4129 ml->
remove(mmi.memberDef);
4130 mmi.memberGroup->insertMember(mmi.memberDef->resolveAlias());
4131 mmi.memberGroup->setRefItems(mmi.sli);
4147 AUTO_TRACE(
"type='{}' name='{}' lang={}",type,name,lang);
4148 static const reg::Ex re_norm(R
"(\a[\w:]*)");
4149 static const reg::Ex re_fortran(R
"(\a[\w:()=]*)");
4159 size_t typeLen=type.
length();
4162 if (lang == SrcLangExt::Fortran)
4174 std::string s = type.
str();
4180 const auto &match = *it;
4181 size_t i = match.position();
4182 size_t l = match.length();
4187 while (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
' ') ts++,tl++;
4188 if (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
'<')
4193 while (te<typeLen && brCount!=0)
4195 if (type[
static_cast<uint32_t
>(te)]==
'<')
4197 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'<') te++;
else brCount++;
4199 if (type[
static_cast<uint32_t
>(te)]==
'>')
4201 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'>') te++;
else brCount--;
4211 pos=
static_cast<int>(i+l+tl);
4215 pos=
static_cast<int>(i+l);
4220 return static_cast<int>(i);
4223 pos =
static_cast<int>(typeLen);
4236 int p=name.
find(
'<');
4237 if (p==-1)
return name;
4241 std::string s = name.
mid(p).
str();
4242 static const reg::Ex re(R
"([\a:][\w:]*)");
4247 for (; it!=
end ; ++it)
4249 const auto &match = *it;
4250 size_t i = match.position();
4251 size_t l = match.length();
4252 result += s.substr(pi,i-pi);
4255 for (
const Argument &formArg : formalArgs)
4257 if (formArg.name == n)
4283 result+=s.substr(pi);
4301 if (formalArgs.
empty())
return nm;
4304 static const reg::Ex re(R
"(\a\w*)");
4305 std::string name = nm.str();
4310 for (; it!=
end ; ++it)
4312 const auto &match = *it;
4313 size_t i = match.position();
4314 size_t l = match.length();
4315 if (i>p) result += name.substr(p,i-p);
4320 actIt = actualArgs->
begin();
4327 for (
auto formIt = formalArgs.
begin();
4328 formIt!=formalArgs.
end() && !found;
4334 if (actualArgs && actIt!=actualArgs->
end())
4341 formArg.
type =
"class";
4346 formArg.
type =
"typename";
4350 formArg.
name +=
"...";
4355 formArg.
name +=
"...";
4362 if (formArg.
name==n && actualArgs && actIt!=actualArgs->
end() && !actArg.
type.
isEmpty())
4369 ii = subst.find(
'<');
4371 if (ii!=-1 &&
static_cast<int>(
prefix.length())>=ii+2 &&
prefix.mid(
prefix.length()-ii-2,ii+1)==subst.left(ii+1))
4376 while ((ii=subst.find(nameArg,pp))!=-1)
4378 bool beforeNonWord = ii==0 || !
isId(subst.at(ii-1));
4379 bool afterNonWord = subst.length()==ii+nameArg.length() || !
isId(subst.at(ii+nameArg.length()));
4380 if (beforeNonWord && afterNonWord)
4384 pp=ii+
static_cast<int>(nameArg.length());
4389 AUTO_TRACE_ADD(
"result={} n={} type={} hasRecursion={}",result,n,actArg.
type,hasRecursion(result,n,actArg.
type));
4390 if (!hasRecursion(result,n,actArg.
type))
4402 result += actArg.
type;
4408 result += actArg.
type+
" "+actArg.
name;
4413 else if (formArg.
name==n &&
4414 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4423 else if (formArg.
name==n &&
4424 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4432 if (actualArgs && actIt!=actualArgs->
end())
4443 result+=name.substr(p);
4461 bool allowArtificial)
4464 int i=fullName.
find(
'<');
4465 if (i==-1)
return fullName;
4468 int l=
static_cast<int>(fullName.
length());
4475 while (e<l && count>0)
4477 char c=fullName.
at(e++);
4480 case '(': round++;
break;
4481 case ')':
if (round>0) round--;
break;
4482 case '<':
if (round==0) count++;
break;
4483 case '>':
if (round==0) count--;
break;
4488 int si= fullName.
find(
"::",e);
4490 if (parentOnly && si==-1)
break;
4493 result+=fullName.
mid(p,i-p);
4496 if (cd!=
nullptr && (allowArtificial || !cd->
isArtificial()))
4498 result+=fullName.
mid(i,e-i);
4501 else if (pLastScopeStripped)
4504 *pLastScopeStripped=fullName.
mid(i,e-i);
4507 i=fullName.
find(
'<',p);
4509 result+=fullName.
right(l-p);
4526 AUTO_TRACE(
"leftScope='{}' rightScope='{}'",leftScope,rightScope);
4534 int i=0,p=
static_cast<int>(leftScope.
length());
4539 while ((i=leftScope.
findRev(
"::",p))>0)
4543 result = leftScope.
left(i+2)+rightScope;
4571 int sl=
static_cast<int>(s.
length());
4575 if (sp>=sl)
return -1;
4579 if (c==
':') sp++,p++;
else break;
4591 while (sp<sl && !done)
4597 case '<': count++;
break;
4598 case '>': count--;
if (count==0) done=
true;
break;
4631 bool newPage =
true;
4636 warn(fileName,startLine,
"multiple use of page label '{}' with different titles, (other occurrence: {}, line: {})",
4720 else if (si->
lineNr() != -1)
4722 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {}, line {})",pd->
name(),si->
fileName(),si->
lineNr());
4726 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {})",pd->
name(),si->
fileName());
4751 if (!key.
isEmpty() && key[0]!=
'@')
4756 item->setScope(scope);
4757 item->setName(name);
4758 item->setTitle(title);
4759 item->setArgs(args);
4760 item->setGroup(key);
4808 if (!first) { ol.
writeString(
" | "); }
else first=
false;
4820 if (!first) { ol.
writeString(
" | "); }
else first=
false;
4846 int i_fs = fName.
findRev(
'/');
4847 int i_bs = fName.
findRev(
'\\');
4848 int i = fName.
find(
'.',std::max({ i_fs, i_bs ,0}));
4876 result=result.
mid(i+1);
4881 result=result.
mid(i+1);
4889 if (str.
isEmpty() || word==
nullptr)
return false;
4890 static const reg::Ex re(R
"(\a+)");
4891 std::string s = str.str();
4894 if (it->str()==word)
return true;
4905 static reg::Ex re(R
"(\s*(<\a+>)\s*)");
4906 std::string s = sentence.str();
4912 for ( ; it!=
end ; ++it)
4914 const auto match = *it;
4915 std::string part = match[1].str();
4918 size_t i = match.position();
4919 size_t l = match.length();
4920 result+=s.substr(p,i-p);
4921 result+=match.str();
4927 size_t i = match[1].position();
4928 size_t l = match[1].length();
4929 result+=s.substr(p,i-p);
4933 result+=s.substr(p);
4949 const char *p = s.
data();
4952 int i=0,li=-1,l=
static_cast<int>(s.
length());
4956 if (c==
' ' || c==
'\t' || c==
'\r') i++,p++;
4957 else if (c==
'\\' &&
literal_at(p,
"\\ilinebr")) i+=8,li=i,p+=8;
4958 else if (c==
'\n') i++,li=i,docLine++,p++;
4968 if (c==
' ' || c==
'\t' || c==
'\r') b--,p--;
4969 else if (c==
'r' && b>=7 &&
literal_at(p-7,
"\\ilinebr")) bi=b-7,b-=8,p-=8;
4970 else if (c==
'>' && b>=11 &&
literal_at(p-11,
"\\ilinebr<br>")) bi=b-11,b-=12,p-=12;
4971 else if (c==
'\n') bi=b,b--,p--;
4976 if (li==-1 && bi==-1)
return s;
4983 return s.
mid(li,bi-li);
5001 {
"idl",
"c", SrcLangExt::IDL,
".idl" },
5002 {
"java",
"c", SrcLangExt::Java,
".java"},
5003 {
"javascript",
"c", SrcLangExt::JS,
".js" },
5004 {
"csharp",
"c", SrcLangExt::CSharp,
".cs" },
5005 {
"d",
"c", SrcLangExt::D,
".d" },
5006 {
"php",
"c", SrcLangExt::PHP,
".php" },
5007 {
"objective-c",
"c", SrcLangExt::ObjC,
".m" },
5008 {
"c",
"c", SrcLangExt::Cpp,
".c" },
5009 {
"c++",
"c", SrcLangExt::Cpp,
".cpp" },
5010 {
"slice",
"c", SrcLangExt::Slice,
".ice" },
5011 {
"python",
"python", SrcLangExt::Python,
".py" },
5012 {
"fortran",
"fortran", SrcLangExt::Fortran,
".f" },
5013 {
"fortranfree",
"fortranfree", SrcLangExt::Fortran,
".f90" },
5014 {
"fortranfixed",
"fortranfixed", SrcLangExt::Fortran,
".f" },
5015 {
"vhdl",
"vhdl", SrcLangExt::VHDL,
".vhdl"},
5016 {
"xml",
"xml", SrcLangExt::XML,
".xml" },
5017 {
"sql",
"sql", SrcLangExt::SQL,
".sql" },
5018 {
"md",
"md", SrcLangExt::Markdown,
".md" },
5019 {
"lex",
"lex", SrcLangExt::Lex,
".l" },
5026 [&langName](
const auto &info) { return info.langName==langName; });
5033 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5043 err(
"Failed to assign extension {} to parser {} for language {}\n",
5044 extName.
data(),it1->parserName,language);
5132 if (extName.
isEmpty()) extName=
".no_extension";
5133 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5149 if (lang == SrcLangExt::Unknown)
5153 if (langName.
at(0)==
'.') langName = langName.
mid(1);
5155 [&langName](
const auto &info) { return info.langName==langName; });
5158 lang = it->parserId;
5159 fileName = it->defExt;
5163 return SrcLangExt::Cpp;
5172 int lastDot = fn.
findRev(
'.');
5173 if (lastDot!=-1)
return fn.
mid(lastDot);
5182 if (scope==
nullptr ||
5202 if (qualifierIndex!=-1)
5204 explicitScopePart = name.
left(qualifierIndex);
5206 name = name.
mid(qualifierIndex+2);
5210 int minDistance = 10000;
5219 if (distance!=-1 && distance<minDistance)
5221 minDistance = distance;
5235 if (bestMatch && bestMatch->
isTypedef())
5243 if (startPos>=len)
return len;
5244 uint8_t c =
static_cast<uint8_t
>(utf8Str[startPos]);
5249 int (*matcher)(int) =
nullptr;
5250 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5254 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5258 matcher = std::isxdigit;
5262 matcher = std::isdigit;
5265 else if (std::isalnum(c))
5268 matcher = std::isalnum;
5272 while ((c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]))!=0 && matcher(c))
5282 return startPos+bytes;
5299 .setAutolinkSupport(
false))
5301 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast.get());
5305 std::visit(visitor,astImpl->root);
5310 int l=
static_cast<int>(result.
length());
5314 if (charCnt>=80)
break;
5321 if (result.
at(i)==
',' ||
5322 result.
at(i)==
'.' ||
5323 result.
at(i)==
'!' ||
5324 result.
at(i)==
'?' ||
5332 if ( i < l) result=result.
left(i)+
"...";
5333 return result.
data();
5352 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast.get());
5360 std::visit(visitor,astImpl->root);
5377 if (al.
empty())
return;
5394 .setIndexWords(
true));
5404#ifdef TRACINGSUPPORT
5405 void *backtraceFrames[128];
5406 int frameCount = backtrace(backtraceFrames, 128);
5407 const size_t cmdLen = 40960;
5408 static char cmd[cmdLen];
5410 p +=
qsnprintf(p,cmdLen,
"/usr/bin/atos -p %d ", (
int)getpid());
5411 for (
int x = 0; x < frameCount; x++)
5413 p +=
qsnprintf(p,cmdLen,
"%p ", backtraceFrames[x]);
5415 fprintf(stderr,
"========== STACKTRACE START ==============\n");
5419 while (
size_t len = fread(resBuf, 1,
sizeof(resBuf), fp))
5421 fwrite(resBuf, 1, len, stderr);
5425 fprintf(stderr,
"============ STACKTRACE END ==============\n");
5434 if (
qstricmp(inputEncoding,outputEncoding)==0)
return;
5436 if (cd==
reinterpret_cast<void *
>(-1))
5438 term(
"unsupported character conversion: '{}'->'{}': {}\n"
5439 "Check the INPUT_ENCODING setting in the config file!\n",
5440 inputEncoding,outputEncoding,strerror(errno));
5442 size_t iLeft = contents.size();
5443 const char *srcPtr = contents.data();
5444 size_t tmpBufSize = contents.size()*4+1;
5445 size_t oLeft = tmpBufSize;
5447 tmpBuf.resize(tmpBufSize);
5448 char *dstPtr = tmpBuf.data();
5452 newSize = tmpBufSize-oLeft;
5453 tmpBuf.resize(newSize);
5454 std::swap(contents,tmpBuf);
5459 term(
"{}: failed to translate characters from {} to {}: check INPUT_ENCODING\n",
5460 fileName,inputEncoding,outputEncoding);
5472 if (filterName.
isEmpty() || !filter)
5477 err(
"could not open file {}\n",fileName);
5481 auto fileSize = fi.
size();
5482 contents.resize(fileSize);
5483 f.read(contents.data(),fileSize);
5486 err(
"problems while reading file {}\n",fileName);
5492 QCString cmd=filterName+
" \""+fileName+
"\"";
5497 err(
"could not execute filter {}\n",filterName);
5500 const int bufSize=4096;
5503 while ((numRead=
static_cast<int>(fread(buf,1,bufSize,f)))>0)
5506 contents.append(buf,numRead);
5513 if (contents.size()>=2 &&
5514 static_cast<uint8_t
>(contents[0])==0xFF &&
5515 static_cast<uint8_t
>(contents[1])==0xFE
5520 else if (contents.size()>=2 &&
5521 static_cast<uint8_t
>(contents[0])==0xFE &&
5522 static_cast<uint8_t
>(contents[1])==0xFF
5527 else if (contents.size()>=3 &&
5528 static_cast<uint8_t
>(contents[0])==0xEF &&
5529 static_cast<uint8_t
>(contents[1])==0xBB &&
5530 static_cast<uint8_t
>(contents[2])==0xBF
5533 contents.erase(0,3);
5549 std::string t = title.
str();
5550 static const reg::Ex re(R
"(%[a-z_A-Z]+)");
5554 for (; it!=
end ; ++it)
5556 const auto &match = *it;
5557 size_t i = match.position();
5558 size_t l = match.length();
5559 if (i>p) tf+=t.substr(p,i-p);
5560 tf+=match.str().substr(1);
5569template<
class PatternList,
class PatternElem,
typename PatternGet = QCString(*)(const PatternElem &)>
5571 const PatternList &patList,
5578 if (!patList.empty())
5584 for (
const auto &li : patList)
5586 std::string pattern = getter(li).str();
5587 if (!pattern.empty())
5589 size_t i=pattern.find(
'=');
5590 if (i!=std::string::npos) pattern=pattern.substr(0,i);
5592 if (!caseSenseNames)
5623 auto getter = [](std::string s) ->
QCString {
return s; };
5644 if (extLinksInWindow)
5645 return "target=\"_blank\" ";
5647 return "target=\"_parent\" ";
5664 if (!targetFileName.
isEmpty())
5669 if (!anchor.
isEmpty() && isLocalFile)
5680 if (!anchor.
isEmpty()) url+=
"#"+anchor;
5693 result = it->second;
5694 size_t l = result.
length();
5695 if (!relPath.
isEmpty() && l>0 && result.
at(0)==
'.')
5700 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
5701 if (!href) result.
append(
"\" ");
5724 if (!img.
save(fileName))
5726 fprintf(stderr,
"Warning: Cannot open file %s for writing\n",data->
name);
5742 std::string s=str.
str();
5743 static const reg::Ex re(R
"(##[0-9A-Fa-f][0-9A-Fa-f])");
5749 size_t sl=s.length();
5751 for (; it!=
end ; ++it)
5753 const auto &match = *it;
5754 size_t i = match.position();
5755 size_t l = match.length();
5756 if (i>p) result+=s.substr(p,i-p);
5757 std::string lumStr = match.str().substr(2);
5758#define HEXTONUM(x) (((x)>='0' && (x)<='9') ? ((x)-'0') : \
5759 ((x)>='a' && (x)<='f') ? ((x)-'a'+10) : \
5760 ((x)>='A' && (x)<='F') ? ((x)-'A'+10) : 0)
5762 double r = 0,g = 0,b = 0;
5765 pow(level/255.0,gamma/100.0),&r,&g,&b);
5766 int red =
static_cast<int>(r*255.0);
5767 int green =
static_cast<int>(g*255.0);
5768 int blue =
static_cast<int>(b*255.0);
5771 colStr[1]=
hex[red>>4];
5772 colStr[2]=
hex[red&0xf];
5773 colStr[3]=
hex[green>>4];
5774 colStr[4]=
hex[green&0xf];
5775 colStr[5]=
hex[blue>>4];
5776 colStr[6]=
hex[blue&0xf];
5782 if (p<sl) result+=s.substr(p);
5793 err(
"could not copy file {} to {}\n",src,dest);
5807 int m1 = text.
find(marker);
5808 if (m1==-1)
return result;
5813 while (!found && (i=text.
find(
'\n',p))!=-1)
5815 found = (p<=m1 && m1<i);
5831 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp || lang==SrcLangExt::VHDL || lang==SrcLangExt::Python)
5835 else if (lang==SrcLangExt::PHP && !classScope)
5847 static const std::unordered_set<std::string> schemes = {
5848 "http",
"https",
"ftp",
"ftps",
"sftp",
"file",
"news",
"irc",
"ircs"
5851 int colonPos = loc_url.
find(
':');
5852 return colonPos!=-1 && schemes.find(loc_url.
left(colonPos).
str())!=schemes.end();
5874 return (prot!=Protection::Private && prot!=Protection::Package) ||
5875 (prot==Protection::Private && extractPrivate) ||
5876 (prot==Protection::Package && extractPackage);
5887 const char *p=s.
data();
5890 int minIndent=1000000;
5891 bool searchIndent=
true;
5893 bool skipFirst = skipFirstLine;
5896 if (c==
'\t') indent+=tabSize - (indent%tabSize);
5897 else if (c==
'\n') indent=0,searchIndent=
true,skipFirst=
false;
5898 else if (c==
' ') indent++;
5899 else if (searchIndent && !skipFirst)
5902 if (indent<minIndent) minIndent=indent;
5907 if (minIndent==0)
return substitute(s,
"@ilinebr",
"\\ilinebr");
5913 skipFirst=skipFirstLine;
5922 else if (indent<minIndent && !skipFirst)
5926 int newIndent = indent+tabSize-(indent%tabSize);
5940 else if (c==
'\\' &&
literal_at(p,
"ilinebr "))
5943 result <<
"\\ilinebr ";
5946 for (
int j=0;j<minIndent;j++)
if (*(p+j)==
' ') skipAmount++;
5947 if (skipAmount==minIndent)
5954 result <<
"\\ilinebr";
5965 return result.
str();
5972 if (indentationLevel <= 0 || doc.
isEmpty())
return;
5977 const char *src = doc.
data();
5979 bool insideIndent =
false;
5988 insideIndent =
true;
5989 cnt = indentationLevel;
6000 insideIndent =
false;
6010 insideIndent =
false;
6015 doc.
resize(
static_cast<uint32_t
>(dst-doc.
data()));
6024 return ( ((allExternals && fd->
isLinkable()) ||
6042uint32_t getUtf8Code(
const QCString& s,
int idx )
6044 const int length = s.
length();
6045 if (idx >= length) {
return 0; }
6046 const uint32_t c0 = (uint8_t)s.
at(idx);
6047 if ( c0 < 0xC2 || c0 >= 0xF8 )
6051 if (idx+1 >= length) {
return 0; }
6052 const uint32_t c1 = ((uint8_t)s.
at(idx+1)) & 0x3f;
6055 return ((c0 & 0x1f) << 6) | c1;
6057 if (idx+2 >= length) {
return 0; }
6058 const uint32_t c2 = ((uint8_t)s.
at(idx+2)) & 0x3f;
6061 return ((c0 & 0x0f) << 12) | (c1 << 6) | c2;
6063 if (idx+3 >= length) {
return 0; }
6065 const uint32_t c3 = ((uint8_t)s.
at(idx+3)) & 0x3f;
6066 return ((c0 & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
6078uint32_t getUtf8CodeToLower(
const QCString& s,
int idx )
6080 const uint32_t v = getUtf8Code( s, idx );
6081 return v < 0x7f ? tolower( v ) : v;
6093uint32_t getUtf8CodeToUpper(
const QCString& s,
int idx )
6095 const uint32_t v = getUtf8Code( s, idx );
6096 return v < 0x7f ? toupper( v ) : v;
6110 std::string s = docs.
str();
6111 static const reg::Ex re(R
"(\[([ inout,]+)\])");
6116 const auto &match = *it;
6117 size_t p = match.position();
6118 size_t l = match.length();
6122 std::string dir = match[1].str();
6124 dir.erase(std::remove_if(dir.begin(),dir.end(),
6125 [](
const char c) { return c==
' ' || c==
','; }
6127 unsigned char ioMask=0;
6128 size_t inIndex = dir.find(
"in");
6129 if ( inIndex!=std::string::npos) dir.erase( inIndex,2),ioMask|=(1<<0);
6130 size_t outIndex = dir.find(
"out");
6131 if (outIndex!=std::string::npos) dir.erase(outIndex,3),ioMask|=(1<<1);
6132 if (dir.empty() && ioMask!=0)
6135 if (ioMask==((1<<0)|(1<<1)))
return "[in,out]";
6136 else if (ioMask==(1<<0))
return "[in]";
6137 else if (ioMask==(1<<1))
return "[out]";
6169 *outListType1=inListType;
6172 if (inProt==Protection::Public)
6179 else if (inProt==Protection::Protected)
6187 *outListType2=inListType.
toPublic();
6190 else if (inProt==Protection::Private)
6200 *outListType1=inListType.
toPublic();
6222 int i= imgExt.
find(
':');
6223 return i==-1 ? imgExt : imgExt.
left(i);
6228 assert(!f.is_open());
6229 bool fileOpened=
FALSE;
6230 bool writeToStdout=outFile==
"-";
6233 f.basic_ios<char>::rdbuf(std::cout.rdbuf());
6248 fileOpened = f.is_open();
6255 static const std::unordered_set<std::string> fortran_C_keywords = {
6256 "character",
"call",
"close",
"common",
"continue",
6257 "case",
"contains",
"cycle",
"class",
"codimension",
6258 "concurrent",
"contiguous",
"critical"
6261 if (*contents !=
'c' && *contents !=
'C')
return false;
6263 const char *c = contents;
6265 while (*c && *c !=
' ') {keyword += *c; c++;}
6266 keyword = keyword.
lower();
6268 return (fortran_C_keywords.find(keyword.
str()) != fortran_C_keywords.end());
6276 bool skipLine=
FALSE;
6282 size_t sizCont = contents.
length();
6283 for (
size_t i=0;i<sizCont;i++)
6287 switch(contents.
at(i))
6294 column += tabSize-1;
6311 if (column==1)
return TRUE;
6312 if (skipLine)
break;
6315 if (column!=6) skipLine=
TRUE;
6318 if (skipLine)
break;
6319 if (column>=7)
return TRUE;
6344 auto skipBlock = [&markerInfo](
const char *p,
const SelectionBlock &blk)
6351 size_t len = markerInfo.
endLen;
6352 bool negate = *(p+markerInfo.
endLen)==
'!';
6354 size_t blkNameLen =
qstrlen(blk.name);
6355 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6359 return p+len+blkNameLen+markerInfo.
closeLen;
6376 const char *p = s.
data();
6386 bool negate = *(p+len)==
'!';
6388 for (
const auto &blk : blockList)
6390 size_t blkNameLen =
qstrlen(blk.name);
6391 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6394 bool blockEnabled = blk.enabled!=negate;
6396 p+=len+blkNameLen+markerInfo.
closeLen;
6415 size_t len = markerInfo.
endLen;
6416 bool negate = *(p+len)==
'!';
6418 for (
const auto &blk : blockList)
6420 size_t blkNameLen =
qstrlen(blk.name);
6421 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6425 p+=len+blkNameLen+markerInfo.
closeLen;
6456 const char *p = s.
data();
6465 bool negate = *(p+len)==
'!';
6471 if (markerInfo.
closeLen==0 && *p==
'\n')
6473 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
6479 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
6488 size_t len = markerInfo.
endLen;
6489 bool negate = *(p+len)==
'!';
6495 if (markerInfo.
closeLen==0 && *p==
'\n')
6497 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
6503 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
6520 const char *p=s.
data();
6529 while (*e==
' ' || *e==
'\t') e++;
6551 size_t prev = 0, pos = 0, len = s.length();
6554 pos = s.find(delimiter, prev);
6555 if (pos == std::string::npos) pos = len;
6556 if (pos>prev) result.push_back(s.substr(prev,pos-prev));
6557 prev = pos + delimiter.length();
6559 while (pos<len && prev<len);
6571 for ( ; iter !=
end; ++iter)
6573 const auto &match = *iter;
6574 size_t i=match.position();
6575 size_t l=match.length();
6576 if (i>p) result.push_back(s.substr(p,i-p));
6579 if (p<s.length()) result.push_back(s.substr(p));
6586 auto it = std::find(sv.begin(),sv.end(),s);
6587 return it!=sv.end() ?
static_cast<int>(it-sv.begin()) : -1;
6595 return reg::search(s,match,re) ?
static_cast<int>(match.position()) : -1;
6603 for (
const auto &s : sv)
6605 if (!first) result+=delimiter;
6619 while (residual > 0)
6621 modVal[0] = (upper ?
'A':
'a') + (residual-1)%26;
6622 result = modVal + result;
6623 residual = (residual-1) / 26;
6630 static const char *str_romans_upper[] = {
"M",
"CM",
"D",
"CD",
"C",
"XC",
"L",
"XL",
"X",
"IX",
"V",
"IV",
"I" };
6631 static const char *str_romans_lower[] = {
"m",
"cm",
"d",
"cd",
"c",
"xc",
"l",
"xl",
"x",
"ix",
"v",
"iv",
"i" };
6632 static const int values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
6633 static const char **str_romans = upper ? str_romans_upper : str_romans_lower;
6638 for (
int i = 0; i < 13; ++i)
6640 while (residual - values[i] >= 0)
6642 result += str_romans[i];
6643 residual -= values[i];
6653 size_t size = s.
length();
6655 const char *data = s.
data();
6658 constexpr auto doxy_nbsp =
"&_doxy_nbsp;";
6659 const int maxIndent=1000000;
6660 int minIndent=maxIndent;
6669 int stop = tabSize - (col%tabSize);
6672 while (stop--) out.
addChar(
' ');
6676 if (data[i] ==
'\\')
6682 else if (i+5<size &&
literal_at(data+i,
"iskip"))
6687 else if (i+8<size &&
literal_at(data+i,
"endiskip"))
6719 for (
int j=0;j<bytes-1 && c;j++)
6731 if (!skip && col<minIndent) minIndent=col;
6735 if (minIndent!=maxIndent) refIndent=minIndent;
else refIndent=0;
6745 uint8_t md5_sig[16];
6747 MD5Buffer(projectCookie.
data(),
static_cast<unsigned int>(projectCookie.
length()),md5_sig);
6748 MD5SigToString(md5_sig,sigStr);
6749 sigStr[32]=
'_'; sigStr[33]=0;
6756 int l =
static_cast<int>(name.
length());
6757 int lastSepPos = -1;
6758 const char *p = name.
data();
6767 if (sharpCount==0 && p[i+1]==
':' && p[i+2]==
':')
6781 if (ts==-1) ts=0;
else p+=++ts;
6782 for (i=ts;i<l-1;i++)
6785 if (c==
':' && *p==
':') lastSepPos=i;
6820 case '\t': col+=tabSize - (col%tabSize);
6829 for (
int i=0;i<numBytes-1 && (c=*s++);i++) {}
6830 if (c==0)
return col;
6845 int idx = name.
find(
'<');
6858 int idx = result.
find(
'-');
6859 result = result.
left(idx)+templArgs;
6867 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 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
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 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::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 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
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 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)
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
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 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()
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