25#include <unordered_set>
80#define ENABLE_TRACINGSUPPORT 0
82#if defined(__APPLE__) && ENABLE_TRACINGSUPPORT
94#define REL_PATH_TO_ROOT "../../"
96static const char *
hex =
"0123456789ABCDEF";
108 if (s.empty())
return;
116 m_ol.writeNonBreakableSpace(1);
120 m_ol.docify(std::string_view(&c, 1));
132 m_ol.lineBreak(
"typebreak");
133 for (
int i = 0; i < indent; ++i)
m_ol.writeNonBreakableSpace(3);
137 const QCString &anchor,std::string_view text
141 m_ol.writeObjectLink(extRef,file,anchor,text);
164 if (str.
isEmpty())
return result;
167 auto startsWithColon = [](
const std::string &del)
169 for (
size_t i=0;i<del.size();i++)
171 if (del[i]==
'@')
return false;
172 else if (del[i]==
':')
return true;
178 auto endsWithColon = [](
const std::string &del)
180 for (
int i=
static_cast<int>(del.size())-1;i>=0;i--)
182 if (del[i]==
'@')
return false;
183 else if (del[i]==
':')
return true;
188 static const reg::Ex re(R
"([\s:]*@\d+[\s:]*)");
189 std::string s = str.str();
193 size_t sl=s.length();
194 bool needsSeparator=
false;
195 for ( ; iter!=
end ; ++iter)
197 const auto &match = *iter;
198 size_t i = match.position();
201 if (needsSeparator) result+=
"::";
202 needsSeparator=
false;
203 result+=s.substr(p,i-p);
205 std::string delim = match.str();
206 needsSeparator = needsSeparator || (startsWithColon(delim) && endsWithColon(delim));
207 p = match.position()+match.length();
211 if (needsSeparator) result+=
"::";
221 static const reg::Ex marker(R
"(@\d+)");
223 !replacement.isEmpty() ? replacement.data() : "__anonymous__");
234 int sl =
static_cast<int>(s.
length());
242 if (!newScope.
isEmpty()) newScope+=
"::";
243 newScope+=s.
mid(i,l);
248 if (!newScope.
isEmpty()) newScope+=
"::";
249 newScope+=s.
right(sl-i);
281 const int maxMarkerStrLen = 20;
282 char result[maxMarkerStrLen];
283 qsnprintf(result,maxMarkerStrLen,
"@%d",
id);
304 for (
const auto &s : l)
307 if (
prefix.length() > length &&
314 if (length>0)
return potential;
341 static const std::unordered_set<std::string> sourceExt = {
342 "c",
"cc",
"cxx",
"cpp",
"c++",
"cppm",
"ccm",
"cxxm",
"c++m",
346 "ii",
"ixx",
"ipp",
"i++",
"inl",
349 static const std::unordered_set<std::string> headerExt = {
350 "h",
"hh",
"hxx",
"hpp",
"h++",
"ixx",
351 "idl",
"ddl",
"pidl",
"ice"
357 if (sourceExt.find(extension.
str())!=sourceExt.end())
359 return EntryType::makeSource();
361 if (headerExt.find(extension.
str())!=headerExt.end())
363 return EntryType::makeHeader();
370 return EntryType::makeEmpty();
376 AUTO_TRACE(
"context='{}' qualifiedName='{}'",context?context->
name():
"",qualifiedName);
385 if (typedefContext) *typedefContext=context;
388 if (qualifiedName.
find(
'<')!=-1)
393 int scopeIndex = qualifiedName.
findRev(
"::");
397 resName=qualifiedName.
right(qualifiedName.
length()-scopeIndex-2);
405 while (mContext && md==
nullptr)
421 if (!tmp.
isEmpty()) qualScopePart=tmp;
424 if (resScope==
nullptr)
break;
436 bool searchRelated=
false;
437 bool mustBeRelated=
false;
448 if (mn==0 && searchRelated)
456 for (
const auto &tmd_p : *mn)
459 AUTO_TRACE_ADD(
"found candidate member '{}' isTypeDef={}' isRelated={} mustBeRelated={}",
474 if (dist!=-1 && (md==
nullptr || dist<minDist))
496 if (args.
find(
")(")!=-1)
500 else if (args.
find(
'[')!=-1)
520static const char constScope[] = {
'c',
'o',
'n',
's',
't',
':' };
521static const char volatileScope[] = {
'v',
'o',
'l',
'a',
't',
'i',
'l',
'e',
':' };
522static const char virtualScope[] = {
'v',
'i',
'r',
't',
'u',
'a',
'l',
':' };
523static const char operatorScope[] = {
'o',
'p',
'e',
'r',
'a',
't',
'o',
'r',
'?',
'?',
'?' };
579 if (s.
length()*3>growBufLen)
581 growBufLen = s.
length()*3;
582 growBuf =
static_cast<char *
>(realloc(growBuf,growBufLen+1));
584 if (growBuf==
nullptr)
return s;
586 const char *src=s.
data();
597 while (i<l && isspace(
static_cast<uint8_t
>(src[i])))
604 char nc=i+1<l ? src[i+1] :
' ';
606 auto searchForKeyword = [&](
const char *kw,
size_t &matchLen,
size_t totalLen)
608 if (matchLen<=totalLen && c==kw[matchLen] &&
643 if (c==
'\\' && i+1<l)
667 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
668 (
isId(pc) || pc==
'*' || pc==
'&' || pc==
'.' || pc==
'>') &&
669 (osp<8 || (osp==8 && pc!=
'-'))
675 if (i+1<l && (nc==
'-' || nc==
'&'))
682 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
683 ((i+1<l && (
isId(nc) || nc==
'[')) ||
684 (i+2<l && nc==
'$' &&
isId(src[i+2])) ||
685 (i+3<l && nc==
'&' && src[i+2]==
'$' &&
isId(src[i+3]))
695 if (cliSupport && i+1<l && (
isId(nc) || nc==
'-'))
702 if (i+1<l && (
isId(nc) || nc==
'-'))
708 if (i>0 && pc!=
' ' && pc!=
'\t' && pc!=
':' &&
709 pc!=
'*' && pc!=
'&' && pc!=
'(' && pc!=
'/' && pc!=
'[' &&
719 if (i>0 &&
isId(pc) && osp<9)
739 if (i>0 && i+1<l && pc!=
'=' && pc!=
':' && !isspace(
static_cast<uint8_t
>(pc)) &&
770 !(pc==
',' && nc==
'.') &&
771 (osp<8 || (osp>=8 &&
isId(pc) &&
isId(nc)))
779 else if ((pc==
'*' || pc==
'&' || pc==
'.') && nc==
'>')
787 auto correctKeywordAllowedInsideScope = [&](
char cc,
size_t &matchLen,
size_t totalLen) {
788 if (c==cc && matchLen==totalLen)
790 if ((i+2<l && src[i+1] ==
':' && src[i+2] ==
':') ||
791 ((i>matchLen && src[i-matchLen] ==
':' && src[i-matchLen-1] ==
':'))
795 correctKeywordAllowedInsideScope(
't',csp, 5);
796 correctKeywordAllowedInsideScope(
'e',vosp,8);
797 correctKeywordAllowedInsideScope(
'l',vsp, 7);
799 auto correctKeywordNotPartOfScope = [&](
char cc,
size_t &matchLen,
size_t totalLen)
801 if (c==cc && matchLen==totalLen && i+1<l &&
809 correctKeywordNotPartOfScope(
't',csp, 5);
810 correctKeywordNotPartOfScope(
'e',vosp,8);
811 correctKeywordNotPartOfScope(
'l',vsp, 7);
831 if (templateDepth > 0)
833 int nextOpenPos=name.
findRev(
'>', pos);
834 int nextClosePos=name.
findRev(
'<', pos);
835 if (nextOpenPos!=-1 && nextOpenPos>nextClosePos)
840 else if (nextClosePos!=-1)
852 int lastAnglePos=name.
findRev(
'>', pos);
853 int bracePos=name.
findRev(
'(', pos);
854 if (lastAnglePos!=-1 && lastAnglePos>bracePos)
861 int bp = bracePos>0 ? name.
findRev(
'(',bracePos-1) : -1;
863 return bp==-1 || (bp>=8 && name.
mid(bp-8,10)==
"operator()") ? bracePos : bp;
874 return (name==scope ||
875 (scope.
right(nl)==name &&
876 sl>1+nl && scope.
at(sl-nl-1)==
':' && scope.
at(sl-nl-2)==
':'
885 return (name==scope ||
886 (name.
left(sl)==scope &&
887 nl>sl+1 && name.
at(sl)==
':' && name.
at(sl+1)==
':'
899 AUTO_TRACE(
"scope={} fileScope={} text={} autoBreak={} external={} keepSpaces={} indentLevel={}",
900 scope?scope->
name():
"",fileScope?fileScope->
name():
"",
905 std::string_view txtStr=text.
view();
906 size_t strLen = txtStr.length();
907 if (strLen==0)
return;
909 static const reg::Ex regExp(R
"((::)?\a[\w~!\\.:$"]*)");
919 size_t floatingIndex=0;
920 for (; it!=
end ; ++it)
922 const auto &match = *it;
923 size_t newIndex = match.position();
924 size_t matchLen = match.length();
925 floatingIndex+=newIndex-skipIndex+matchLen;
926 if (newIndex>0 && txtStr.at(newIndex-1)==
'0')
928 std::string_view part = txtStr.substr(skipIndex,newIndex+matchLen-skipIndex);
930 skipIndex=index=newIndex+matchLen;
935 bool insideString=
FALSE;
936 for (
size_t i=index;i<newIndex;i++)
938 if (txtStr.at(i)==
'"') insideString=!insideString;
939 if (txtStr.at(i)==
'\\') i++;
946 std::string_view splitText = txtStr.substr(skipIndex,newIndex-skipIndex);
947 size_t splitLength = splitText.length();
949 size_t i = splitText.find(
',');
950 if (i==std::string::npos) { i=splitText.find(
'<');
if (i!=std::string::npos) offset=0; }
951 if (i==std::string::npos) { i=splitText.find(
"||");
if (i!=std::string::npos) offset=2; }
952 if (i==std::string::npos) { i=splitText.find(
"&&");
if (i!=std::string::npos) offset=2; }
953 if (i==std::string::npos) { i=splitText.find(
">>");
if (i!=std::string::npos) offset=2; }
954 if (i==std::string::npos) i=splitText.find(
'>');
955 if (i==std::string::npos) i=splitText.find(
' ');
957 if (i!=std::string::npos)
959 std::string_view part1 = splitText.substr(0,i+offset);
962 std::string_view part2 = splitText.substr(i+offset);
964 floatingIndex=splitLength-i-offset+matchLen;
974 std::string_view part = txtStr.substr(skipIndex,newIndex-skipIndex);
978 std::string_view word=txtStr.substr(newIndex,matchLen);
986 if (it1->name == matchWord)
1021 auto writeCompoundName = [&](
const auto *cd_) {
1022 if (options.
external() ? cd_->isLinkable() : cd_->isLinkableInProject())
1027 out.
writeLink(cd_->getReference(),cd_->getOutputFileBase(),cd_->anchor(),word);
1039 writeCompoundName(cd);
1041 else if ((cd=
getClass(matchWord+
"-p")))
1043 writeCompoundName(cd);
1047 writeCompoundName(cnd);
1051 writeCompoundName(d);
1058 int m = matchWord.
findRev(
"::");
1066 scopeName=scope->
name();
1070 scopeName = matchWord.
left(m);
1071 matchWord = matchWord.
mid(m+2);
1080 if (result.
found && result.
md &&
1087 if (result.
md!=self && (self==
nullptr || result.
md->
name()!=self->
name()))
1116 skipIndex=index=newIndex+matchLen;
1120 std::string_view lastPart = txtStr.substr(skipIndex);
1125 std::function<
void(
size_t)> replaceFunc)
1127 static const reg::Ex marker(R
"(@(\d+))");
1131 for ( ; it!=
end ; ++it)
1133 const auto &match = *it;
1134 size_t newIndex = match.position();
1135 size_t matchLen = match.length();
1136 ol.
parseText(markerText.substr(index,newIndex-index));
1137 unsigned long entryIndex = std::stoul(match[1].str());
1138 if (entryIndex<
static_cast<unsigned long>(numMarkers))
1140 replaceFunc(entryIndex);
1142 index=newIndex+matchLen;
1148 std::function<
QCString(
size_t)> replaceFunc)
1151 static const reg::Ex marker(R
"(@(\d+))");
1155 for ( ; it!=
end ; ++it)
1157 const auto &match = *it;
1158 size_t newIndex = match.position();
1159 size_t matchLen = match.length();
1160 result += markerText.substr(index,newIndex-index);
1161 unsigned long entryIndex = std::stoul(match[1].str());
1162 if (entryIndex<
static_cast<unsigned long>(numMarkers))
1164 result+=replaceFunc(entryIndex);
1166 index=newIndex+matchLen;
1168 if (index<markerText.size())
1170 result += markerText.substr(index);
1177 auto replaceFunc = [&list,&ol](
size_t entryIndex)
1179 const auto &e = list[entryIndex];
1211 if (a.hasDocumentation(
true))
1220 paramDocs+=
" \\ilinebr @param"+direction+
" "+name+
" "+docsWithoutDir;
1234 if (!a.docs.isEmpty())
1236 if (!a.name.isEmpty())
1238 paramDocs+=
" \\ilinebr @tparam "+a.name+
" "+a.docs;
1240 else if (!a.type.isEmpty())
1246 paramDocs+=
" \\ilinebr @tparam "+type+
" "+a.docs;
1259 for (
auto it = al.
begin() ; it!=al.
end() ;)
1264 int i=type1.
find(
")(");
1268 type1=type1.
left(i);
1276 result+= type1+
" "+a.
name+type2+a.
array;
1280 result+= type1+type2;
1287 if (it!=al.
end()) result+=
", ";
1302 if (al.
empty())
return result;
1305 for (
const auto &a : al)
1307 if (a.defval.isEmpty() || includeDefault)
1309 if (!first) result+=
", ";
1310 if (!a.name.isEmpty())
1312 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
1320 int i =
static_cast<int>(a.type.length())-1;
1321 while (i>=0 &&
isId(a.type.at(i))) i--;
1324 result+=a.type.
right(a.type.length()-i-1);
1325 if (a.type.find(
"...")!=-1)
1335 if (!a.typeConstraint.isEmpty() && lang==SrcLangExt::Java)
1337 result+=
" extends ";
1338 result+=a.typeConstraint;
1359 size_t len = contents.length();
1363 char c = contents[src++];
1367 if (src<len && contents[src] ==
'\n')
1372 else if ( c ==
'\0' && src<len-1)
1376 contents[dest++] = c;
1378 contents.resize(dest);
1385 for (
const auto &filterStr : filterList)
1388 int i_equals=fs.
find(
'=');
1395 filterPattern = filterPattern.
lower();
1396 input = input.
lower();
1403 if (filterName.
find(
' ')!=-1)
1405 filterName=
"\""+filterName+
"\"";
1425 if (name.
isEmpty())
return "";
1432 if (isSourceCode && !filterSrcList.empty())
1436 if (!found && filterName.
isEmpty())
1447 if (filterName.
length()>=2 && filterName[0]==
'"' && filterName[
static_cast<int>(filterName.
length())-1]==
'"')
1449 filterName = filterName.
mid(1,filterName.
length()-2);
1458 const char *outputEncoding =
"UTF-8";
1459 if (inputEncoding==
nullptr ||
qstricmp(inputEncoding,outputEncoding)==0)
return true;
1460 size_t inputSize=input.length();
1461 size_t outputSize=inputSize*4;
1464 if (cd==
reinterpret_cast<void *
>(-1))
1469 size_t iLeft=inputSize;
1470 size_t oLeft=outputSize;
1471 const char *inputPtr = input.data();
1472 char *outputPtr = output.
rawData();
1475 outputSize-=
static_cast<int>(oLeft);
1476 output.
resize(outputSize);
1477 output.
at(outputSize)=
'\0';
1497 bool fileOpened=
false;
1498 if (name[0]==
'-' && name[1]==0)
1500 std::string contents;
1502 while (getline(std::cin,line))
1504 contents+=line+
'\n';
1513 err(
"file '{}' not found\n",name);
1526 err(
"cannot open file '{}' for reading\n",name);
1534 for (
const auto &bcd : bcl)
1555 AUTO_TRACE(
"target='{}' str='{}'",target,str);
1556 if (target==str) { target.
clear();
return; }
1558 int l=
static_cast<int>(str.
length());
1561 while ((i=target.
find(str,p))!=-1)
1563 for (
int q=p;q<i;q++)
1565 if (target[q]==
'<') sharpCount++;
1566 else if (target[q]==
'>' && sharpCount>0) sharpCount--;
1568 bool isMatch = (i==0 || !
isId(target.
at(i-1))) &&
1569 (i+l==
static_cast<int>(target.
length()) || !
isId(target.
at(i+l))) &&
1570 !insideTemplate && sharpCount==0;
1573 int i1=target.
find(
'*',i+l);
1574 int i2=target.
find(
'&',i+l);
1575 if (i1==-1 && i2==-1)
1582 else if ((i1!=-1 && i<i1) || (i2!=-1 && i<i2))
1625 int i=s.
find(
" class ");
1626 if (i!=-1)
return s.
left(i)+s.
mid(i+6);
1627 i=s.
find(
" typename ");
1628 if (i!=-1)
return s.
left(i)+s.
mid(i+9);
1629 i=s.
find(
" union ");
1630 if (i!=-1)
return s.
left(i)+s.
mid(i+6);
1631 i=s.
find(
" struct ");
1632 if (i!=-1)
return s.
left(i)+s.
mid(i+7);
1645 if (!templSpec.
isEmpty() && templSpec.
at(0) ==
'<')
1652 templSpec = resolvedType;
1664 if (count>10)
return word;
1666 QCString symName,result,templSpec,tmpName;
1667 if (tSpec && !tSpec->
isEmpty())
1670 AUTO_TRACE(
"d='{}' fs='{}' word='{}' templSpec='{}'",d?d->
name():
"",fs?fs->
name():
"",word,templSpec);
1688 bool isTemplInst = cd && !templSpec.
isEmpty();
1689 if (!cd && !templSpec.
isEmpty())
1700 cd?cd->
name():
"",mType?mType->
name():
"",ts,resolvedType);
1723 if (cd==d && tSpec) *tSpec=
"";
1727 result = resolvedType+ts;
1735 if (tSpec) *tSpec=
"";
1749 result=cd->
name()+templSpec;
1799 resolvedType = lang==SrcLangExt::Java ? word :
resolveTypeDef(d,word);
1807 result = resolvedType;
1842 if (i-pp>=2 && type[i-2]==
':' && type[i-1]==
':')
1844 canType += type.
mid(pp,i-pp-2);
1848 canType += type.
mid(pp,i-pp);
1871 std::string ts = templSpec.
str();
1872 static const reg::Ex re(R
"(\a\w*)");
1879 for (; it!=
end ; ++it)
1881 const auto &match = *it;
1882 size_t ti = match.position();
1883 size_t tl = match.length();
1884 std::string matchStr = match.str();
1885 canType += ts.substr(tp,ti-tp);
1889 canType+=ts.substr(tp);
1905 if ((type==
"const" || type==
"volatile") && !name.
isEmpty())
1910 if (name==
"const" || name==
"volatile")
1912 if (!type.
isEmpty()) type+=
" ";
1930#define MATCH AUTO_TRACE_EXIT("match at line {}",__LINE__);
1931#define NOMATCH AUTO_TRACE_EXIT("no match at line {}",__LINE__);
1938 AUTO_TRACE(
"srcType='{}' dstType='{}'",srcType,dstType);
1939 if (srcType==dstType)
return true;
1942 int i1=srcType.
find(
")(");
1943 if (i1==-1)
return false;
1944 int i2=dstType.
find(
")(");
1945 if (i1!=i2)
return false;
1948 int j1=srcType.
find(
"(");
1949 if (j1==-1 || j1>i1)
return false;
1950 int j2=dstType.
find(
"(");
1951 if (j2!=j1)
return false;
1952 if (srcType.
left(j1)!=dstType.
left(j2))
return false;
1961 dstScope,dstFileScope,dstType.
left(j2),dstAl.get(),
1971 AUTO_TRACE(
"src: scope={} type={} name={} canType={}, dst: scope={} type={} name={} canType={}",
1990 srcA.
type+=sSrcName;
1994 else if (sDstName==srcType.
right(sDstName.
length()))
1996 dstA.
type+=sDstName;
2012 dstScope,dstFileScope,dstA.
canType,
2035 ASSERT(srcScope!=
nullptr && dstScope!=
nullptr);
2037 AUTO_TRACE(
"srcScope='{}' dstScope='{}' srcArgs='{}' dstArgs='{}' checkCV={} lang={}",
2040 if (srcAl==
nullptr || dstAl==
nullptr)
2042 bool match = srcAl==dstAl;
2073 if (srcAl->
size() != dstAl->
size())
2107 auto srcIt = srcAl->
begin();
2108 auto dstIt = dstAl->
begin();
2109 for (;srcIt!=srcAl->
end() && dstIt!=dstAl->
end();++srcIt,++dstIt)
2114 dstScope,dstFileScope,dstA,
2133 AUTO_TRACE(
"srcAl='{}',dstAl='{}',forceNameOverwrite={}",
2141 auto srcIt=srcAl.
begin();
2142 auto dstIt=dstAl.
begin();
2143 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
2148 AUTO_TRACE_ADD(
"before merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
2164 if (srcA.
name==
"const" || srcA.
name==
"volatile")
2169 if (dstA.
name==
"const" || dstA.
name==
"volatile")
2195 if (forceNameOverwrite)
2238 j1=
static_cast<int>(srcA.
type.
length())-i1-2,
2239 j2=
static_cast<int>(dstA.
type.
length())-i2-2;
2247 else if (i1==-1 && i2!=-1 && dstA.
type.
right(j2)==srcA.
type)
2267 AUTO_TRACE_ADD(
"after merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
2283 auto isUnconstraintTemplate = [](
const QCString &type)
2285 return type==
"typename" || type==
"class" || type.startsWith(
"typename ") || type.startsWith(
"class ");
2287 auto srcIt = srcAl.
begin();
2288 auto dstIt = dstAl.
begin();
2289 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
2293 if ((!isUnconstraintTemplate(srcA.
type) || !isUnconstraintTemplate(dstA.
type)) && srcA.
type!=dstA.
type)
2312 AUTO_TRACE(
"scopeName={},memberName={},forceEmptyScope={}",
2338 result.
found =
true;
2343 result.
found =
true;
2348 result.
found =
true;
2353 result.
found =
true;
2358 result.
found =
true;
2390 bool explicitGlobalScope=
FALSE;
2391 if (scopeName.
at(0)==
':' && scopeName.
at(1)==
':')
2394 explicitGlobalScope=
TRUE;
2402 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(docScopeName.
length());
2407 if (scopeOffset>0) fullName.
prepend(docScopeName.
left(scopeOffset)+
"::");
2431 else if ((scopeOffset=docScopeName.
findRev(
"::",scopeOffset-1))==-1)
2435 }
while (scopeOffset>=0);
2443 const char *p=s.
data();
2445 while ((c=
static_cast<uint8_t
>(*p++)))
if (!islower(c))
return false;
2458 bool lookForSpecialization,
2463 AUTO_TRACE(
"scope={} name={} inSeeBlock={} lang={} lookForSpecialization={} currentFile={} checkScope={}",
2464 scName,name,inSeeBlock,lang,lookForSpecialization,currentFile ? currentFile->
name() :
"", checkScope);
2469 if (fullName.
find(
"anonymous_namespace{")==-1)
2479 if (lang==SrcLangExt::CSharp && (templStartPos=fullName.
find(
'<'))!=-1)
2481 int templEndPos = fullName.
findRev(
'>');
2482 if (templEndPos!=-1)
2490 int endNamePos=bracePos!=-1 ? bracePos :
static_cast<int>(fullName.
length());
2491 int scopePos=fullName.
findRev(
"::",endNamePos);
2492 bool explicitScope = fullName.
startsWith(
"::") &&
2497 bool allowTypeOnly=
false;
2500 *resContext=
nullptr;
2507 if (!inSeeBlock && scopePos==-1 &&
isLowerCase(tsName))
2521 if (scName!=fullName &&
getScopeDefs(scName,fullName,cd,cnd,nd,modd))
2544 else if (scName==fullName || (!inSeeBlock && scopePos==-1))
2563 if (explicitScope) nameStr=nameStr.
mid(2);
2568 if (bracePos!=-1) argsStr=fullName.
right(fullName.
length()-bracePos);
2572 int templPos=nameStr.
find(
'<');
2573 bool tryUnspecializedVersion =
FALSE;
2574 if (templPos!=-1 && nameStr.
find(
"operator")==-1)
2576 int endTemplPos=nameStr.
findRev(
'>');
2577 if (endTemplPos!=-1)
2579 if (!lookForSpecialization)
2581 nameStr=nameStr.
left(templPos)+nameStr.
right(nameStr.
length()-endTemplPos-1);
2585 tryUnspecializedVersion =
TRUE;
2593 nameStr=nameStr.
mid(scopeStr.
length()+2);
2619 *resContext=
nullptr;
2629 *resMember=result.
md;
2630 *resContext=result.
md;
2634 *resContext=
nullptr;
2640 else if (result.
cd) *resContext=result.
cd;
2641 else if (result.
nd) *resContext=result.
nd;
2642 else if (result.
fd) *resContext=result.
fd;
2643 else if (result.
gd) *resContext=result.
gd;
2644 else if (result.
cnd) *resContext=result.
cnd;
2645 else if (result.
modd) *resContext=result.
modd;
2648 *resContext=
nullptr; *resMember=
nullptr;
2675 else if (tsName.
find(
'.')!=-1)
2687 if (tryUnspecializedVersion)
2689 bool b =
resolveRef(scName,name,inSeeBlock,resContext,resMember,lang,
FALSE,
nullptr,checkScope);
2717 if (!isFileName && result.
find(
'<')==-1) result=
substitute(result,
".",
"::",3);
2719 if (result.
at(0)==
':' && result.
at(1)==
':')
2743 *resContext=
nullptr;
2746 if (lang==SrcLangExt::CSharp)
2751 AUTO_TRACE(
"scName='{}',ref='{}'",scName,lr);
2756 const DirDef *dir =
nullptr;
2774 if (si) resAnchor = si->
label();
2786 resAnchor = si->
label();
2793 resAnchor = si->
label();
2823 else if (lang==SrcLangExt::Java &&
2824 (cd=
getClass(linkRefWithoutTemplates)))
2831 else if ((cd=
getClass(linkRef+
"-p")))
2848 resAnchor=modd->
anchor();
2869 if (md) resAnchor=md->
anchor();
2907 if (n.
isEmpty())
return nullptr;
2910 const int maxAddrSize = 20;
2911 char addr[maxAddrSize];
2912 qsnprintf(addr,maxAddrSize,
"%p:",
reinterpret_cast<const void*
>(fnMap));
2921 ambig = cachedResult->
isAmbig;
2932 if (name.
isEmpty())
return nullptr;
2939 if (name.
isEmpty())
return nullptr;
2946 const std::unique_ptr<FileDef> &fd = fn->front();
2948 fd->getPath().right(path.
length())==path :
2950 if (path.
isEmpty() || isSamePath)
2952 cachedResult->
fileDef = fd.get();
2961 for (
const auto &fd_p : *fn)
2965 if (fdStripPath == pathStripped)
2982 cachedResult->
isAmbig = ambig;
2983 cachedResult->
fileDef = lastMatch;
3013 for (
const auto &s : examplePathList)
3055 for (
const auto &fd_p : *fn)
3063 if (!first) result +=
"\n";
3077 std::string substRes;
3079 const char *p = s.
data();
3083 substRes.reserve(s.
length()+1024);
3090 for (
const auto &kw : keywords)
3092 size_t keyLen =
qstrlen(kw.keyword);
3093 if (
qstrncmp(p,kw.keyword,keyLen)==0)
3095 const char *startArg = p+keyLen;
3096 bool expectParam = std::holds_alternative<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3098 if (expectParam && *startArg==
'(')
3101 const char *endArg =
nullptr;
3102 while ((c=*(startArg+j)) && c!=
')' && c!=
'\n' && c!=0) j++;
3103 if (c==
')') endArg=startArg+j;
3107 auto &&getValue = std::get<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3108 substRes+=getValue(value).str();
3115 warn(file,line,
"Missing argument for '{}'",kw.keyword);
3119 else if (!expectParam)
3121 auto &&getValue = std::get<KeywordSubstitution::GetValue>(kw.getValueVariant);
3122 substRes+=getValue().str();
3129 warn(file,line,
"Expected arguments for '{}' but none were specified",kw.keyword);
3139 if (c==
'\n') line++;
3167 int wi = projectLogo.
find(
" width=");
3170 projectLogo = projectLogo.
left(wi);
3172 int hi = projectLogo.
find(
" height=");
3175 projectLogo = projectLogo.
left(hi);
3188 auto extractDimension = [&projectLogo](
const char *startMarker,
size_t startPos,
size_t endPos) ->
QCString
3191 if (result.
length()>=2 && result.
at(0)!=
'"' && result.
at(result.
length()-1)!=
'"')
3193 result=
"\""+result+
"\"";
3199 int wi = projectLogo.
find(
" width=");
3200 int hi = projectLogo.
find(
" height=");
3201 if (wi!=-1 && hi!=-1)
3205 sizeVal = extractDimension(
" width=", wi+7, hi) +
" "
3206 + extractDimension(
" height=", hi+8, projectLogo.
length());
3210 sizeVal = extractDimension(
" height=", hi+8, wi) +
" "
3211 + extractDimension(
" width=", wi+7, projectLogo.
length());
3216 sizeVal = extractDimension(
" width=", wi+7, projectLogo.
length());
3220 sizeVal = extractDimension(
" height=", hi+8, projectLogo.
length());
3233 {
"$title", [&]() {
return !title.
isEmpty() ? title : projName; } },
3234 {
"$doxygenversion", [&]() {
return getDoxygenVersion(); } },
3235 {
"$projectname", [&]() {
return projName; } },
3236 {
"$projectnumber", [&]() {
return projNum; } },
3237 {
"$projectbrief", [&]() {
return projBrief; } },
3241 {
"$langISO", [&]() {
return theTranslator->trISOLang(); } },
3256 for (
const auto &s : sl)
3258 const char *ps=s.c_str();
3259 const char *pd=name.
data();
3261 while (*ps!=0 && *pd!=0 && *ps==*pd)
3267 if (*ps==0 && *pd!=0)
3283int getUtf8Char(
const char *input,
char ids[MAX_UTF8_CHAR_SIZE],CaseModifier modifier)
3286 const unsigned char uc = (
unsigned char)*input;
3287 bool validUTF8Char =
false;
3290 const char* pt = input+1;
3292 if ((uc&0x80)==0x00)
3296 case CaseModifier::None: ids[0]=*input;
break;
3297 case CaseModifier::ToUpper: ids[0]=(char)toupper(*input);
break;
3298 case CaseModifier::ToLower: ids[0]=(char)tolower(*input);
break;
3305 if ((uc&0xE0)==0xC0)
3309 if ((uc&0xF0)==0xE0)
3313 if ((uc&0xF8)==0xF0)
3318 validUTF8Char = l>0;
3319 for (
int m=1; m<l && validUTF8Char; ++m)
3321 unsigned char ct = (
unsigned char)*pt;
3322 if (ct==0 || (ct&0xC0)!=0x80)
3324 validUTF8Char=
false;
3345 if (caseSenseNames == CASE_SENSE_NAMES_t::YES)
return true;
3346 else if (caseSenseNames == CASE_SENSE_NAMES_t::NO)
return false;
3352 if (name.
isEmpty())
return name;
3358 const char *p=name.
data();
3363 case '_':
if (allowUnderscore) result+=
'_';
else result+=
"__";
break;
3364 case '-': result+=
'-';
break;
3365 case ':': result+=
"_1";
break;
3366 case '/': result+=
"_2";
break;
3367 case '<': result+=
"_3";
break;
3368 case '>': result+=
"_4";
break;
3369 case '*': result+=
"_5";
break;
3370 case '&': result+=
"_6";
break;
3371 case '|': result+=
"_7";
break;
3372 case '.':
if (allowDots) result+=
'.';
else result+=
"_8";
break;
3373 case '!': result+=
"_9";
break;
3374 case ',': result+=
"_00";
break;
3375 case ' ': result+=
"_01";
break;
3376 case '{': result+=
"_02";
break;
3377 case '}': result+=
"_03";
break;
3378 case '?': result+=
"_04";
break;
3379 case '^': result+=
"_05";
break;
3380 case '%': result+=
"_06";
break;
3381 case '(': result+=
"_07";
break;
3382 case ')': result+=
"_08";
break;
3383 case '+': result+=
"_09";
break;
3384 case '=': result+=
"_0a";
break;
3385 case '$': result+=
"_0b";
break;
3386 case '\\': result+=
"_0c";
break;
3387 case '@': result+=
"_0d";
break;
3388 case ']': result+=
"_0e";
break;
3389 case '[': result+=
"_0f";
break;
3390 case '#': result+=
"_0g";
break;
3391 case '"': result+=
"_0h";
break;
3392 case '~': result+=
"_0i";
break;
3393 case '\'': result+=
"_0j";
break;
3394 case ';': result+=
"_0k";
break;
3395 case '`': result+=
"_0l";
break;
3399 bool doEscape =
true;
3400 if (allowUnicodeNames)
3413 unsigned char id =
static_cast<unsigned char>(c);
3422 else if (caseSenseNames || !isupper(c))
3429 result+=
static_cast<char>(tolower(c));
3443 const char *p = s.
data();
3453 case '_': result+=c; p++;
break;
3454 case '1': result+=
':'; p++;
break;
3455 case '2': result+=
'/'; p++;
break;
3456 case '3': result+=
'<'; p++;
break;
3457 case '4': result+=
'>'; p++;
break;
3458 case '5': result+=
'*'; p++;
break;
3459 case '6': result+=
'&'; p++;
break;
3460 case '7': result+=
'|'; p++;
break;
3461 case '8': result+=
'.'; p++;
break;
3462 case '9': result+=
'!'; p++;
break;
3466 case '0': result+=
','; p+=2;
break;
3467 case '1': result+=
' '; p+=2;
break;
3468 case '2': result+=
'{'; p+=2;
break;
3469 case '3': result+=
'}'; p+=2;
break;
3470 case '4': result+=
'?'; p+=2;
break;
3471 case '5': result+=
'^'; p+=2;
break;
3472 case '6': result+=
'%'; p+=2;
break;
3473 case '7': result+=
'('; p+=2;
break;
3474 case '8': result+=
')'; p+=2;
break;
3475 case '9': result+=
'+'; p+=2;
break;
3476 case 'a': result+=
'='; p+=2;
break;
3477 case 'b': result+=
'$'; p+=2;
break;
3478 case 'c': result+=
'\\'; p+=2;
break;
3479 case 'd': result+=
'@'; p+=2;
break;
3480 case 'e': result+=
']'; p+=2;
break;
3481 case 'f': result+=
'['; p+=2;
break;
3482 case 'g': result+=
'#'; p+=2;
break;
3483 case 'h': result+=
'"'; p+=2;
break;
3484 case 'i': result+=
'~'; p+=2;
break;
3485 case 'j': result+=
'\''; p+=2;
break;
3486 case 'k': result+=
';'; p+=2;
break;
3487 case 'l': result+=
'`'; p+=2;
break;
3494 if (!caseSenseNames && c>=
'a' && c<=
'z')
3496 result+=
static_cast<char>(toupper(*p));
3527 if (name.
isEmpty())
return name;
3550 size_t resultLen = result.
length();
3554 uint8_t md5_sig[16];
3556 MD5Buffer(result.
data(),
static_cast<unsigned int>(resultLen),md5_sig);
3557 MD5SigToString(md5_sig,sigStr);
3558 result=result.
left(128-32)+sigStr;
3563 int l1Dir=0,l2Dir=0;
3564 int createSubdirsLevel =
Config_getInt(CREATE_SUBDIRS_LEVEL);
3565 int createSubdirsBitmaskL2 = (1<<createSubdirsLevel)-1;
3568 uint8_t md5_sig[16];
3569 MD5Buffer(result.
data(),
static_cast<unsigned int>(result.
length()),md5_sig);
3570 l1Dir = md5_sig[14] & 0xf;
3571 l2Dir = md5_sig[15] & createSubdirsBitmaskL2;
3582 const int sig_size=16;
3583 uint8_t md5_sig[sig_size];
3584 MD5Buffer(fn.
data(),
static_cast<unsigned int>(fn.
length()),md5_sig);
3585 char result[sig_size*3+2];
3588 for (
int i=0;i<sig_size;i++)
3590 static const char oct[]=
"01234567";
3591 uint8_t
byte = md5_sig[i];
3592 *p++=oct[(
byte>>6)&7];
3593 *p++=oct[(
byte>>3)&7];
3594 *p++=oct[(
byte>>0)&7];
3624 QCString absIncFileName = incFileName;
3634 else if (searchIncludes)
3637 for (
const auto &incPath : includePath)
3656 return absIncFileName;
3666 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
3667 for (
int l1=0; l1<16; l1++)
3673 term(
"Failed to create output directory '{}'\n",subdir);
3675 for (
int l2=0; l2<createSubdirsLevelPow2; l2++)
3678 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
3681 term(
"Failed to create output directory '{}'\n",subsubdir);
3693 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
3694 for (
int l1=0;l1<16;l1++)
3698 for (
int l2=0; l2 < createSubdirsLevelPow2; l2++)
3701 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
3720 bool allowEmptyClass)
3727 namespaceName=nd->
name();
3731 p=
static_cast<int>(clName.
length())-2;
3732 while (p>=0 && (i=clName.
findRev(
"::",p))!=-1)
3739 namespaceName=nd->
name();
3748 className=scopeName;
3749 namespaceName.
clear();
3752 if (className.
isEmpty() && !namespaceName.
isEmpty() && !allowEmptyClass)
3755 className=namespaceName;
3756 namespaceName.
clear();
3762 className = className.
left(className.
length()-2);
3803 int l =
static_cast<int>(result.
length());
3806 bool skipBracket=
FALSE;
3813 while (p>=0 && count>=0)
3815 char c=result.
at(p);
3821 if (p>0 && result.
at(p-1)==
':' && (count==0 || skipBracket))
3823 return result.
right(l-p-1);
3834 if (p>0 && result.
at(p-1)==
'>')
3842 bool foundMatch=
false;
3843 while (p>=0 && !foundMatch)
3855 if (round==0) count++;
3862 if (result.
at(p-1) ==
'<')
3869 foundMatch = count==0;
3884 done = count==0 || skipBracket;
3898 const char *p = s.
data();
3904 if ((c>=
'0' && c<=
'9') || (c>=
'a' && c<=
'z') || (c>=
'A' && c<=
'Z') || c==
'-')
3906 if (first && c>=
'0' && c<=
'9') result+=
'a';
3912 encChar[1]=
hex[
static_cast<unsigned char>(c)>>4];
3913 encChar[2]=
hex[
static_cast<unsigned char>(c)&0xF];
3938 const char *p = s.
data();
3944 case '<': result+=
"<";
break;
3945 case '>': result+=
">";
break;
3946 case '&':
if (keepEntities)
3952 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
3958 while (p<e) result+=*p++;
3970 case '\'': result+=
"'";
break;
3971 case '"': result+=
""";
break;
3972 case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
3973 case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
3974 case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
3975 case 27:
case 28:
case 29:
case 30:
case 31:
3977 default: result+=c;
break;
3989 const char *p=s.
data();
3995 case '<': result+=
"<";
break;
3996 case '>': result+=
">";
break;
3997 case '&':
if (keepEntities)
4003 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
4009 while (p<e) result+=*p++;
4021 case '\'': result+=
"'";
break;
4022 case '"': result+=
""";
break;
4025 uint8_t uc =
static_cast<uint8_t
>(c);
4026 if (uc<32 && !isspace(c))
4030 result+=
hex[uc&0xF];
4049 const char *p=s.
data();
4055 case '"':
if (!singleQuotes) result+=
"\\\"";
else result+=c;
4057 case '\'':
if (singleQuotes) result+=
"\\\'";
else result+=c;
4059 case '\\':
if (*p==
'u' && *(p+1)==
'{') result+=
"\\";
4060 else result+=
"\\\\";
4062 default: result+=c;
break;
4072 std::string s = str.
data();
4073 static const reg::Ex re(R
"(&\a\w*;)");
4079 size_t p=0, i=0, l=0;
4080 for (; it!=
end ; ++it)
4082 const auto &match = *it;
4083 p = match.position();
4087 result+=s.substr(i,p-i);
4091 const char *code=
nullptr;
4102 result+=s.substr(i);
4122 ASSERT(context!=
nullptr);
4124 if (ml==
nullptr)
return;
4126 struct MoveMemberInfo
4129 : memberDef(md), memberGroup(mg), sli(rv) {}
4134 std::vector<MoveMemberInfo> movedMembers;
4136 for (
const auto &md : *ml)
4138 if (md->isEnumerate())
4140 for (
const auto &fmd : md->enumFieldList())
4142 int groupId=fmd->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();
4182 int groupId=md->getMemberGroupId();
4188 const auto &info = it->second;
4189 auto mg_it = std::find_if(pMemberGroups->begin(),
4190 pMemberGroups->end(),
4191 [&groupId](
const auto &g)
4192 { return g->groupId()==groupId; }
4195 if (mg_it==pMemberGroups->end())
4197 auto mg = std::make_unique<MemberGroup>(
4206 pMemberGroups->push_back(std::move(mg));
4210 mg_ptr = (*mg_it).get();
4212 movedMembers.emplace_back(md,mg_ptr,info->m_sli);
4218 for (
const auto &mmi : movedMembers)
4220 ml->
remove(mmi.memberDef);
4221 mmi.memberGroup->insertMember(mmi.memberDef->resolveAlias());
4222 mmi.memberGroup->setRefItems(mmi.sli);
4238 AUTO_TRACE(
"type='{}' pos={} name='{}' lang={}",type,pos,name,lang);
4239 static const reg::Ex re_norm(R
"(\a[\w:]*)");
4240 static const reg::Ex re_fortran(R
"(\a[\w:()=]*)");
4250 size_t typeLen=type.
length();
4253 if (lang == SrcLangExt::Fortran)
4265 std::string s = type.
str();
4271 const auto &match = *it;
4272 size_t i = match.position();
4273 size_t l = match.length();
4278 while (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
' ') { ts++; tl++; }
4279 if (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
'<')
4284 while (te<typeLen && brCount!=0)
4286 if (type[
static_cast<uint32_t
>(te)]==
'<')
4288 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'<') te++;
else brCount++;
4290 if (type[
static_cast<uint32_t
>(te)]==
'>')
4292 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'>') te++;
else brCount--;
4302 pos=
static_cast<int>(i+l+tl);
4306 pos=
static_cast<int>(i+l);
4311 return static_cast<int>(i);
4314 pos =
static_cast<int>(typeLen);
4327 int p=name.
find(
'<');
4328 if (p==-1)
return name;
4332 std::string s = name.
mid(p).
str();
4333 static const reg::Ex re(R
"([\a:][\w:]*)");
4338 for (; it!=
end ; ++it)
4340 const auto &match = *it;
4341 size_t i = match.position();
4342 size_t l = match.length();
4343 result += s.substr(pi,i-pi);
4346 for (
const Argument &formArg : formalArgs)
4348 if (formArg.name == n)
4374 result+=s.substr(pi);
4392 if (formalArgs.
empty())
return nm;
4395 static const reg::Ex re(R
"(\a\w*)");
4396 std::string name = nm.str();
4401 for (; it!=
end ; ++it)
4403 const auto &match = *it;
4404 size_t i = match.position();
4405 size_t l = match.length();
4406 if (i>p) result += name.substr(p,i-p);
4411 actIt = actualArgs->
begin();
4418 for (
auto formIt = formalArgs.
begin();
4419 formIt!=formalArgs.
end() && !found;
4425 if (actualArgs && actIt!=actualArgs->
end())
4432 formArg.
type =
"class";
4437 formArg.
type =
"typename";
4441 formArg.
name +=
"...";
4446 formArg.
name +=
"...";
4453 if (formArg.
name==n && actualArgs && actIt!=actualArgs->
end() && !actArg.
type.
isEmpty())
4460 ii = subst.find(
'<');
4462 if (ii!=-1 &&
static_cast<int>(
prefix.length())>=ii+2 &&
prefix.mid(
prefix.length()-ii-2,ii+1)==subst.left(ii+1))
4467 while ((ii=subst.find(nameArg,pp))!=-1)
4469 bool beforeNonWord = ii==0 || !
isId(subst.at(ii-1));
4470 bool afterNonWord = subst.length()==ii+nameArg.length() || !
isId(subst.at(ii+nameArg.length()));
4471 if (beforeNonWord && afterNonWord)
4475 pp=ii+
static_cast<int>(nameArg.length());
4480 AUTO_TRACE_ADD(
"result={} n={} type={} hasRecursion={}",result,n,actArg.
type,hasRecursion(result,n,actArg.
type));
4481 if (!hasRecursion(result,n,actArg.
type))
4493 result += actArg.
type;
4499 result += actArg.
type+
" "+actArg.
name;
4504 else if (formArg.
name==n &&
4505 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4514 else if (formArg.
name==n &&
4515 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4523 if (actualArgs && actIt!=actualArgs->
end())
4534 result+=name.substr(p);
4552 bool allowArtificial)
4555 int i=fullName.
find(
'<');
4556 if (i==-1)
return fullName;
4559 int l=
static_cast<int>(fullName.
length());
4566 while (e<l && count>0)
4568 char c=fullName.
at(e++);
4571 case '(': round++;
break;
4572 case ')':
if (round>0) round--;
break;
4573 case '<':
if (round==0) count++;
break;
4574 case '>':
if (round==0) count--;
break;
4579 int si= fullName.
find(
"::",e);
4581 if (parentOnly && si==-1)
break;
4584 result+=fullName.
mid(p,i-p);
4587 if (cd!=
nullptr && (allowArtificial || !cd->
isArtificial()))
4589 result+=fullName.
mid(i,e-i);
4592 else if (pLastScopeStripped)
4595 *pLastScopeStripped=fullName.
mid(i,e-i);
4598 i=fullName.
find(
'<',p);
4600 result+=fullName.
right(l-p);
4617 AUTO_TRACE(
"leftScope='{}' rightScope='{}'",leftScope,rightScope);
4625 int i=0,p=
static_cast<int>(leftScope.
length());
4630 while ((i=leftScope.
findRev(
"::",p))>0)
4634 result = leftScope.
left(i+2)+rightScope;
4662 int sl=
static_cast<int>(s.
length());
4666 if (sp>=sl)
return -1;
4690 while (sp<sl && !done)
4696 case '<': count++;
break;
4697 case '>': count--;
if (count==0) done=
true;
break;
4730 bool newPage =
true;
4735 warn(fileName,startLine,
"multiple use of page label '{}' with different titles, (other occurrence: {}, line: {})",
4819 else if (si->
lineNr() != -1)
4821 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {}, line {})",pd->
name(),si->
fileName(),si->
lineNr());
4825 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {})",pd->
name(),si->
fileName());
4850 if (!key.
isEmpty() && key[0]!=
'@')
4855 item->setScope(scope);
4856 item->setName(name);
4857 item->setTitle(title);
4858 item->setArgs(args);
4859 item->setGroup(key);
4907 if (!first) { ol.
writeString(
" | "); }
else first=
false;
4919 if (!first) { ol.
writeString(
" | "); }
else first=
false;
4945 int i_fs = fName.
findRev(
'/');
4946 int i_bs = fName.
findRev(
'\\');
4947 int i = fName.
find(
'.',std::max({ i_fs, i_bs ,0}));
4975 result=result.
mid(i+1);
4980 result=result.
mid(i+1);
4993 if (str.
isEmpty() || word==
nullptr)
return false;
4994 static const reg::Ex re(R
"(\a+)");
4995 std::string s = str.str();
4998 if (it->str()==word)
return true;
5009 static reg::Ex re(R
"(\s*(<\a+>)\s*)");
5010 std::string s = sentence.str();
5016 for ( ; it!=
end ; ++it)
5018 const auto match = *it;
5019 std::string part = match[1].str();
5022 size_t i = match.position();
5023 size_t l = match.length();
5024 result+=s.substr(p,i-p);
5025 result+=match.str();
5031 size_t i = match[1].position();
5032 size_t l = match[1].length();
5033 result+=s.substr(p,i-p);
5037 result+=s.substr(p);
5053 const char *p = s.
data();
5056 int i=0,li=-1,l=
static_cast<int>(s.
length());
5060 if (c==
' ' || c==
'\t' || c==
'\r') { i++; p++; }
5061 else if (c==
'\\' &&
literal_at(p,
"\\ilinebr")) { i+=8; li=i; p+=8; }
5062 else if (c==
'\n') { i++; li=i; docLine++; p++; }
5072 if (c==
' ' || c==
'\t' || c==
'\r') { b--; p--; }
5073 else if (c==
'r' && b>=7 &&
literal_at(p-7,
"\\ilinebr")) { bi=b-7; b-=8; p-=8; }
5074 else if (c==
'>' && b>=11 &&
literal_at(p-11,
"\\ilinebr<br>")) { bi=b-11; b-=12; p-=12; }
5075 else if (c==
'\n') { bi=b; b--; p--; }
5080 if (li==-1 && bi==-1)
return s;
5087 return s.
mid(li,bi-li);
5105 {
"idl",
"c", SrcLangExt::IDL,
".idl" },
5106 {
"java",
"c", SrcLangExt::Java,
".java"},
5107 {
"javascript",
"c", SrcLangExt::JS,
".js" },
5108 {
"csharp",
"c", SrcLangExt::CSharp,
".cs" },
5109 {
"d",
"c", SrcLangExt::D,
".d" },
5110 {
"php",
"c", SrcLangExt::PHP,
".php" },
5111 {
"objective-c",
"c", SrcLangExt::ObjC,
".m" },
5112 {
"c",
"c", SrcLangExt::Cpp,
".c" },
5113 {
"c++",
"c", SrcLangExt::Cpp,
".cpp" },
5114 {
"slice",
"c", SrcLangExt::Slice,
".ice" },
5115 {
"python",
"python", SrcLangExt::Python,
".py" },
5116 {
"fortran",
"fortran", SrcLangExt::Fortran,
".f" },
5117 {
"fortranfree",
"fortranfree", SrcLangExt::Fortran,
".f90" },
5118 {
"fortranfixed",
"fortranfixed", SrcLangExt::Fortran,
".f" },
5119 {
"vhdl",
"vhdl", SrcLangExt::VHDL,
".vhdl"},
5120 {
"xml",
"xml", SrcLangExt::XML,
".xml" },
5121 {
"sql",
"sql", SrcLangExt::SQL,
".sql" },
5122 {
"md",
"md", SrcLangExt::Markdown,
".md" },
5123 {
"lex",
"lex", SrcLangExt::Lex,
".l" },
5130 [&langName](
const auto &info) { return info.langName==langName; });
5137 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5147 err(
"Failed to assign extension {} to parser {} for language {}\n",
5148 extName.
data(),it1->parserName,language);
5236 if (extName.
isEmpty()) extName=
".no_extension";
5237 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5253 if (lang == SrcLangExt::Unknown)
5257 if (langName.
at(0)==
'.') langName = langName.
mid(1);
5259 [&langName](
const auto &info) { return info.langName==langName; });
5262 lang = it->parserId;
5263 fileName = it->defExt;
5267 return SrcLangExt::Cpp;
5276 int lastDot = fn.
findRev(
'.');
5277 if (lastDot!=-1)
return fn.
mid(lastDot);
5286 if (scope==
nullptr ||
5306 if (qualifierIndex!=-1)
5308 explicitScopePart = name.
left(qualifierIndex);
5310 name = name.
mid(qualifierIndex+2);
5314 int minDistance = 10000;
5323 if (distance!=-1 && distance<minDistance)
5325 minDistance = distance;
5339 if (bestMatch && bestMatch->
isTypedef())
5347 if (startPos>=len)
return len;
5348 uint8_t c =
static_cast<uint8_t
>(utf8Str[startPos]);
5353 int (*matcher)(int) =
nullptr;
5354 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5358 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5362 matcher = std::isxdigit;
5366 matcher = std::isdigit;
5369 else if (std::isalnum(c))
5372 matcher = std::isalnum;
5376 while ((c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]))!=0 && matcher(c))
5386 return startPos+bytes;
5403 .setAutolinkSupport(
false))
5405 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast.get());
5409 std::visit(visitor,astImpl->root);
5414 int l=
static_cast<int>(result.
length());
5418 if (charCnt>=80)
break;
5425 if (result.
at(i)==
',' ||
5426 result.
at(i)==
'.' ||
5427 result.
at(i)==
'!' ||
5428 result.
at(i)==
'?' ||
5436 if ( i < l) result=result.
left(i)+
"...";
5437 return result.
data();
5456 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast.get());
5464 std::visit(visitor,astImpl->root);
5481 if (al.
empty())
return;
5498 .setIndexWords(
true));
5508#ifdef TRACINGSUPPORT
5509 void *backtraceFrames[128];
5510 int frameCount = backtrace(backtraceFrames, 128);
5511 const size_t cmdLen = 40960;
5512 static char cmd[cmdLen];
5514 p +=
qsnprintf(p,cmdLen,
"/usr/bin/atos -p %d ", (
int)getpid());
5515 for (
int x = 0; x < frameCount; x++)
5517 p +=
qsnprintf(p,cmdLen,
"%p ", backtraceFrames[x]);
5519 fprintf(stderr,
"========== STACKTRACE START ==============\n");
5523 while (
size_t len = fread(resBuf, 1,
sizeof(resBuf), fp))
5525 fwrite(resBuf, 1, len, stderr);
5529 fprintf(stderr,
"============ STACKTRACE END ==============\n");
5538 if (
qstricmp(inputEncoding,outputEncoding)==0)
return;
5540 if (cd==
reinterpret_cast<void *
>(-1))
5542 term(
"unsupported character conversion: '{}'->'{}': {}\n"
5543 "Check the INPUT_ENCODING setting in the config file!\n",
5544 inputEncoding,outputEncoding,strerror(errno));
5546 size_t iLeft = contents.size();
5547 const char *srcPtr = contents.data();
5548 size_t tmpBufSize = contents.size()*4+1;
5549 size_t oLeft = tmpBufSize;
5551 tmpBuf.resize(tmpBufSize);
5552 char *dstPtr = tmpBuf.data();
5556 newSize = tmpBufSize-oLeft;
5557 tmpBuf.resize(newSize);
5558 std::swap(contents,tmpBuf);
5563 term(
"{}: failed to translate characters from {} to {}: check INPUT_ENCODING\n",
5564 fileName,inputEncoding,outputEncoding);
5576 if (filterName.
isEmpty() || !filter)
5581 err(
"could not open file {}\n",fileName);
5585 auto fileSize = fi.
size();
5586 contents.resize(fileSize);
5587 f.read(contents.data(),fileSize);
5590 err(
"problems while reading file {}\n",fileName);
5596 QCString cmd=filterName+
" \""+fileName+
"\"";
5601 err(
"could not execute filter {}\n",filterName);
5604 const int bufSize=4096;
5607 while ((numRead=
static_cast<int>(fread(buf,1,bufSize,f)))>0)
5610 contents.append(buf,numRead);
5617 if (contents.size()>=2 &&
5618 static_cast<uint8_t
>(contents[0])==0xFF &&
5619 static_cast<uint8_t
>(contents[1])==0xFE
5624 else if (contents.size()>=2 &&
5625 static_cast<uint8_t
>(contents[0])==0xFE &&
5626 static_cast<uint8_t
>(contents[1])==0xFF
5631 else if (contents.size()>=3 &&
5632 static_cast<uint8_t
>(contents[0])==0xEF &&
5633 static_cast<uint8_t
>(contents[1])==0xBB &&
5634 static_cast<uint8_t
>(contents[2])==0xBF
5637 contents.erase(0,3);
5653 std::string t = title.
str();
5654 static const reg::Ex re(R
"(%[a-z_A-Z]+)");
5658 for (; it!=
end ; ++it)
5660 const auto &match = *it;
5661 size_t i = match.position();
5662 size_t l = match.length();
5663 if (i>p) tf+=t.substr(p,i-p);
5664 tf+=match.str().substr(1);
5673template<
class PatternList,
class PatternElem,
typename PatternGet = QCString(*)(const PatternElem &)>
5675 const PatternList &patList,
5682 if (!patList.empty())
5688 for (
const auto &li : patList)
5690 std::string pattern = getter(li).str();
5691 if (!pattern.empty())
5693 size_t i=pattern.find(
'=');
5694 if (i!=std::string::npos) pattern=pattern.substr(0,i);
5696 if (!caseSenseNames)
5727 auto getter = [](std::string s) ->
QCString {
return s; };
5748 if (extLinksInWindow)
5749 return "target=\"_blank\" ";
5751 return "target=\"_parent\" ";
5768 if (!targetFileName.
isEmpty())
5773 if (!anchor.
isEmpty() && isLocalFile)
5801 result = it->second;
5802 size_t l = result.
length();
5803 if (!relPath.
isEmpty() && l>0 && result.
at(0)==
'.')
5808 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
5809 if (!href) result.
append(
"\" ");
5828 std::string s=str.
str();
5829 static const reg::Ex re(R
"(##[0-9A-Fa-f][0-9A-Fa-f])");
5835 size_t sl=s.length();
5837 for (; it!=
end ; ++it)
5839 const auto &match = *it;
5840 size_t i = match.position();
5841 size_t l = match.length();
5842 if (i>p) result+=s.substr(p,i-p);
5843 std::string lumStr = match.str().substr(2);
5844#define HEXTONUM(x) (((x)>='0' && (x)<='9') ? ((x)-'0') : \
5845 ((x)>='a' && (x)<='f') ? ((x)-'a'+10) : \
5846 ((x)>='A' && (x)<='F') ? ((x)-'A'+10) : 0)
5848 double r = 0,g = 0,b = 0;
5851 pow(level/255.0,gamma/100.0),&r,&g,&b);
5852 int red =
static_cast<int>(r*255.0);
5853 int green =
static_cast<int>(g*255.0);
5854 int blue =
static_cast<int>(b*255.0);
5857 colStr[1]=
hex[red>>4];
5858 colStr[2]=
hex[red&0xf];
5859 colStr[3]=
hex[green>>4];
5860 colStr[4]=
hex[green&0xf];
5861 colStr[5]=
hex[blue>>4];
5862 colStr[6]=
hex[blue&0xf];
5868 if (p<sl) result+=s.substr(p);
5879 err(
"could not copy file {} to {}\n",src,dest);
5893 int m1 = text.
find(marker);
5894 if (m1==-1)
return result;
5899 while (!found && (i=text.
find(
'\n',p))!=-1)
5901 found = (p<=m1 && m1<i);
5917 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp || lang==SrcLangExt::VHDL || lang==SrcLangExt::Python)
5921 else if (lang==SrcLangExt::PHP && !classScope)
5933 static const std::unordered_set<std::string> schemes = {
5934 "http",
"https",
"ftp",
"ftps",
"sftp",
"file",
"news",
"irc",
"ircs"
5937 int colonPos = loc_url.
find(
':');
5938 return colonPos!=-1 && schemes.find(loc_url.
left(colonPos).
str())!=schemes.end();
5960 return (prot!=Protection::Private && prot!=Protection::Package) ||
5961 (prot==Protection::Private && extractPrivate) ||
5962 (prot==Protection::Package && extractPackage);
5973 const char *p=s.
data();
5976 int minIndent=1000000;
5977 bool searchIndent=
true;
5979 bool skipFirst = skipFirstLine;
5982 if (c==
'\t') { indent+=tabSize - (indent%tabSize); }
5983 else if (c==
'\n') { indent=0; searchIndent=
true; skipFirst=
false; }
5984 else if (c==
' ') { indent++; }
5985 else if (searchIndent && !skipFirst)
5988 if (indent<minIndent) minIndent=indent;
5993 if (minIndent==0)
return substitute(s,
"@ilinebr",
"\\ilinebr");
5999 skipFirst=skipFirstLine;
6008 else if (indent<minIndent && !skipFirst)
6012 int newIndent = indent+tabSize-(indent%tabSize);
6026 else if (c==
'\\' &&
literal_at(p,
"ilinebr "))
6029 result <<
"\\ilinebr ";
6032 for (
int j=0;j<minIndent;j++)
if (*(p+j)==
' ') skipAmount++;
6033 if (skipAmount==minIndent)
6040 result <<
"\\ilinebr";
6051 return result.
str();
6059 if (indentationLevel <= 0 || doc.
isEmpty())
return;
6064 const char *src = doc.
data();
6066 bool insideIndent = !skipFirstLine;
6068 if (!skipFirstLine) cnt = indentationLevel;
6076 insideIndent =
true;
6077 cnt = indentationLevel;
6088 insideIndent =
false;
6098 insideIndent =
false;
6103 doc.
resize(
static_cast<uint32_t
>(dst-doc.
data()));
6112 return ( ((allExternals && fd->
isLinkable()) ||
6130uint32_t getUtf8Code(
const QCString& s,
int idx )
6132 const int length = s.
length();
6133 if (idx >= length) {
return 0; }
6134 const uint32_t c0 = (uint8_t)s.
at(idx);
6135 if ( c0 < 0xC2 || c0 >= 0xF8 )
6139 if (idx+1 >= length) {
return 0; }
6140 const uint32_t c1 = ((uint8_t)s.
at(idx+1)) & 0x3f;
6143 return ((c0 & 0x1f) << 6) | c1;
6145 if (idx+2 >= length) {
return 0; }
6146 const uint32_t c2 = ((uint8_t)s.
at(idx+2)) & 0x3f;
6149 return ((c0 & 0x0f) << 12) | (c1 << 6) | c2;
6151 if (idx+3 >= length) {
return 0; }
6153 const uint32_t c3 = ((uint8_t)s.
at(idx+3)) & 0x3f;
6154 return ((c0 & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
6166uint32_t getUtf8CodeToLower(
const QCString& s,
int idx )
6168 const uint32_t v = getUtf8Code( s, idx );
6169 return v < 0x7f ? tolower( v ) : v;
6181uint32_t getUtf8CodeToUpper(
const QCString& s,
int idx )
6183 const uint32_t v = getUtf8Code( s, idx );
6184 return v < 0x7f ? toupper( v ) : v;
6198 std::string s = docs.
str();
6199 static const reg::Ex re(R
"(\[([ inout,]+)\])");
6204 const auto &match = *it;
6205 size_t p = match.position();
6206 size_t l = match.length();
6210 std::string dir = match[1].str();
6212 dir.erase(std::remove_if(dir.begin(),dir.end(),
6213 [](
const char c) { return c==
' ' || c==
','; }
6215 unsigned char ioMask=0;
6216 size_t inIndex = dir.find(
"in");
6217 if ( inIndex!=std::string::npos) { dir.erase( inIndex,2); ioMask|=(1<<0); }
6218 size_t outIndex = dir.find(
"out");
6219 if (outIndex!=std::string::npos) { dir.erase(outIndex,3); ioMask|=(1<<1); }
6220 if (dir.empty() && ioMask!=0)
6223 if (ioMask==((1<<0)|(1<<1)))
return "[in,out]";
6224 else if (ioMask==(1<<0))
return "[in]";
6225 else if (ioMask==(1<<1))
return "[out]";
6257 *outListType1=inListType;
6260 if (inProt==Protection::Public)
6267 else if (inProt==Protection::Protected)
6275 *outListType2=inListType.
toPublic();
6278 else if (inProt==Protection::Private)
6288 *outListType1=inListType.
toPublic();
6310 int i= imgExt.
find(
':');
6311 return i==-1 ? imgExt : imgExt.
left(i);
6316 assert(!f.is_open());
6317 bool fileOpened=
FALSE;
6318 bool writeToStdout=outFile==
"-";
6321 f.basic_ios<char>::rdbuf(std::cout.rdbuf());
6336 fileOpened = f.is_open();
6343 static const std::unordered_set<std::string> fortran_C_keywords = {
6344 "character",
"call",
"close",
"common",
"continue",
6345 "case",
"contains",
"cycle",
"class",
"codimension",
6346 "concurrent",
"contiguous",
"critical"
6349 if (*contents !=
'c' && *contents !=
'C')
return false;
6351 const char *c = contents;
6353 while (*c && *c !=
' ') {keyword += *c; c++;}
6354 keyword = keyword.
lower();
6356 return (fortran_C_keywords.find(keyword.
str()) != fortran_C_keywords.end());
6364 bool skipLine=
FALSE;
6370 size_t sizCont = contents.
length();
6371 for (
size_t i=0;i<sizCont;i++)
6375 switch(contents.
at(i))
6382 column += tabSize-1;
6399 if (column==1)
return TRUE;
6400 if (skipLine)
break;
6403 if (column!=6) skipLine=
TRUE;
6406 if (skipLine)
break;
6407 if (column>=7)
return TRUE;
6432 auto skipBlock = [&markerInfo](
const char *p,
const SelectionBlock &blk)
6439 size_t len = markerInfo.
endLen;
6440 bool negate = *(p+markerInfo.
endLen)==
'!';
6442 size_t blkNameLen =
qstrlen(blk.name);
6443 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6447 return p+len+blkNameLen+markerInfo.
closeLen;
6464 const char *p = s.
data();
6474 bool negate = *(p+len)==
'!';
6476 for (
const auto &blk : blockList)
6478 size_t blkNameLen =
qstrlen(blk.name);
6479 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6482 bool blockEnabled = blk.enabled!=negate;
6484 p+=len+blkNameLen+markerInfo.
closeLen;
6503 size_t len = markerInfo.
endLen;
6504 bool negate = *(p+len)==
'!';
6506 for (
const auto &blk : blockList)
6508 size_t blkNameLen =
qstrlen(blk.name);
6509 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6513 p+=len+blkNameLen+markerInfo.
closeLen;
6544 const char *p = s.
data();
6553 bool negate = *(p+len)==
'!';
6559 if (markerInfo.
closeLen==0 && *p==
'\n')
6561 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
6567 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
6576 size_t len = markerInfo.
endLen;
6577 bool negate = *(p+len)==
'!';
6583 if (markerInfo.
closeLen==0 && *p==
'\n')
6585 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
6591 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
6608 const char *p=s.
data();
6617 while (*e==
' ' || *e==
'\t') e++;
6639 size_t prev = 0, pos = 0, len = s.length();
6642 pos = s.find(delimiter, prev);
6643 if (pos == std::string::npos) pos = len;
6644 if (pos>prev) result.push_back(s.substr(prev,pos-prev));
6645 prev = pos + delimiter.length();
6647 while (pos<len && prev<len);
6659 for ( ; iter !=
end; ++iter)
6661 const auto &match = *iter;
6662 size_t i=match.position();
6663 size_t l=match.length();
6664 if (i>p) result.push_back(s.substr(p,i-p));
6667 if (p<s.length()) result.push_back(s.substr(p));
6674 auto it = std::find(sv.begin(),sv.end(),s);
6675 return it!=sv.end() ?
static_cast<int>(it-sv.begin()) : -1;
6683 return reg::search(s,match,re) ?
static_cast<int>(match.position()) : -1;
6691 for (
const auto &s : sv)
6693 if (!first) result+=delimiter;
6707 while (residual > 0)
6709 modVal[0] = (upper ?
'A':
'a') + (residual-1)%26;
6710 result = modVal + result;
6711 residual = (residual-1) / 26;
6718 static const char *str_romans_upper[] = {
"M",
"CM",
"D",
"CD",
"C",
"XC",
"L",
"XL",
"X",
"IX",
"V",
"IV",
"I" };
6719 static const char *str_romans_lower[] = {
"m",
"cm",
"d",
"cd",
"c",
"xc",
"l",
"xl",
"x",
"ix",
"v",
"iv",
"i" };
6720 static const int values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
6721 static const char **str_romans = upper ? str_romans_upper : str_romans_lower;
6726 for (
int i = 0; i < 13; ++i)
6728 while (residual - values[i] >= 0)
6730 result += str_romans[i];
6731 residual -= values[i];
6741 size_t size = s.
length();
6744 const char *data = s.
data();
6747 constexpr auto doxy_nbsp =
"&_doxy_nbsp;";
6748 const int maxIndent=1000000;
6749 int minIndent=maxIndent;
6758 int stop = tabSize - (col%tabSize);
6761 while (stop--) result+=
' ';
6765 if (data[i] ==
'\\')
6771 else if (i+5<size &&
literal_at(data+i,
"iskip"))
6776 else if (i+8<size &&
literal_at(data+i,
"endiskip"))
6808 for (
int j=0;j<bytes-1 && c;j++)
6820 if (!skip && col<minIndent) minIndent=col;
6824 if (minIndent!=maxIndent) refIndent=minIndent;
else refIndent=0;
6833 uint8_t md5_sig[16];
6835 MD5Buffer(projectCookie.
data(),
static_cast<unsigned int>(projectCookie.
length()),md5_sig);
6836 MD5SigToString(md5_sig,sigStr);
6837 sigStr[32]=
'_'; sigStr[33]=0;
6844 int l =
static_cast<int>(name.
length());
6845 int lastSepPos = -1;
6846 const char *p = name.
data();
6855 if (sharpCount==0 && p[i+1]==
':' && p[i+2]==
':')
6869 if (ts==-1) ts=0;
else p+=++ts;
6870 for (i=ts;i<l-1;i++)
6873 if (c==
':' && *p==
':') lastSepPos=i;
6908 case '\t': col+=tabSize - (col%tabSize);
6917 for (
int i=0;i<numBytes-1 && (c=*s++);i++) {}
6918 if (c==0)
return col;
6933 int idx = name.
find(
'<');
6946 int idx = result.
find(
'-');
6947 result = result.
left(idx)+templArgs;
6955 int i = text.
find(
'"');
6979 uint8_t md5_sig[16];
6981 MD5Buffer(content.
data(),
static_cast<unsigned int>(content.
length()),md5_sig);
6982 MD5SigToString(md5_sig,sigStr);
6984 QCString fileName = baseName + sigStr + extension;
6994 file.write( content.
data(), content.
length() );
6999 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
QCString trailingReturnType() const
typename Vec::const_iterator const_iterator
bool constSpecifier() const
bool hasDocumentation(bool allowEmptyNames=false) 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
static void hsl2rgb(double h, double s, double l, double *pRed, double *pGreen, double *pBlue)
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 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.
Cache element for the file name to FileDef mapping cache.
FindFileCacheElem(FileDef *fd, bool ambig)
const ArgumentList * argumentList() const
const Definition * scope() const
const Definition * self() const
size_t breakThreshold() const
const FileDef * fileScope() const
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
void linkifyText(const TextGeneratorIntf &out, const QCString &text, const LinkifyTextOptions &options)
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)
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)
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