25#include <unordered_set>
81#define ENABLE_TRACINGSUPPORT 0
83#if defined(__APPLE__) && ENABLE_TRACINGSUPPORT
95#define REL_PATH_TO_ROOT "../../"
97static const char *
hex =
"0123456789ABCDEF";
109 if (s.empty())
return;
117 m_ol.writeNonBreakableSpace(1);
121 m_ol.docify(std::string_view(&c, 1));
133 m_ol.lineBreak(
"typebreak");
134 for (
int i = 0; i < indent; ++i)
m_ol.writeNonBreakableSpace(3);
138 const QCString &anchor,std::string_view text
142 m_ol.writeObjectLink(extRef,file,anchor,text);
165 if (str.
isEmpty())
return result;
168 auto startsWithColon = [](
const std::string &del)
170 for (
size_t i=0;i<del.size();i++)
172 if (del[i]==
'@')
return false;
173 else if (del[i]==
':')
return true;
179 auto endsWithColon = [](
const std::string &del)
181 for (
int i=
static_cast<int>(del.size())-1;i>=0;i--)
183 if (del[i]==
'@')
return false;
184 else if (del[i]==
':')
return true;
189 static const reg::Ex re(R
"([\s:]*@\d+[\s:]*)");
190 std::string s = str.str();
194 size_t sl=s.length();
195 bool needsSeparator=
false;
196 for ( ; iter!=
end ; ++iter)
198 const auto &match = *iter;
199 size_t i = match.position();
202 if (needsSeparator) result+=
"::";
203 needsSeparator=
false;
204 result+=s.substr(p,i-p);
206 std::string delim = match.str();
207 needsSeparator = needsSeparator || (startsWithColon(delim) && endsWithColon(delim));
208 p = match.position()+match.length();
212 if (needsSeparator) result+=
"::";
222 static const reg::Ex marker(R
"(@\d+)");
224 !replacement.isEmpty() ? replacement.data() : "__anonymous__");
235 int sl =
static_cast<int>(s.
length());
243 if (!newScope.
isEmpty()) newScope+=
"::";
244 newScope+=s.
mid(i,l);
249 if (!newScope.
isEmpty()) newScope+=
"::";
250 newScope+=s.
right(sl-i);
282 const int maxMarkerStrLen = 20;
283 char result[maxMarkerStrLen];
284 qsnprintf(result,maxMarkerStrLen,
"@%d",
id);
305 for (
const auto &s : l)
308 if (
prefix.length() > length &&
315 if (length>0)
return potential;
342 static const std::unordered_set<std::string> sourceExt = {
343 "c",
"cc",
"cxx",
"cpp",
"c++",
"cppm",
"ccm",
"cxxm",
"c++m",
347 "ii",
"ixx",
"ipp",
"i++",
"inl",
350 static const std::unordered_set<std::string> headerExt = {
351 "h",
"hh",
"hxx",
"hpp",
"h++",
"ixx",
352 "idl",
"ddl",
"pidl",
"ice"
358 if (sourceExt.find(extension.
str())!=sourceExt.end())
360 return EntryType::makeSource();
362 if (headerExt.find(extension.
str())!=headerExt.end())
364 return EntryType::makeHeader();
371 return EntryType::makeEmpty();
377 AUTO_TRACE(
"context='{}' qualifiedName='{}'",context?context->
name():
"",qualifiedName);
386 if (typedefContext) *typedefContext=context;
389 if (qualifiedName.
find(
'<')!=-1)
394 int scopeIndex = qualifiedName.
findRev(
"::");
398 resName=qualifiedName.
right(qualifiedName.
length()-scopeIndex-2);
406 while (mContext && md==
nullptr)
422 if (!tmp.
isEmpty()) qualScopePart=tmp;
425 if (resScope==
nullptr)
break;
437 bool searchRelated=
false;
438 bool mustBeRelated=
false;
449 if (mn==0 && searchRelated)
457 for (
const auto &tmd_p : *mn)
460 AUTO_TRACE_ADD(
"found candidate member '{}' isTypeDef={}' isRelated={} mustBeRelated={}",
475 if (dist!=-1 && (md==
nullptr || dist<minDist))
497 if (args.
find(
")(")!=-1)
501 else if (args.
find(
'[')!=-1)
521static const char constScope[] = {
'c',
'o',
'n',
's',
't',
':' };
522static const char volatileScope[] = {
'v',
'o',
'l',
'a',
't',
'i',
'l',
'e',
':' };
523static const char virtualScope[] = {
'v',
'i',
'r',
't',
'u',
'a',
'l',
':' };
524static const char operatorScope[] = {
'o',
'p',
'e',
'r',
'a',
't',
'o',
'r',
'?',
'?',
'?' };
580 if (s.
length()*3>growBufLen)
582 growBufLen = s.
length()*3;
583 growBuf =
static_cast<char *
>(realloc(growBuf,growBufLen+1));
585 if (growBuf==
nullptr)
return s;
587 const char *src=s.
data();
598 while (i<l && isspace(
static_cast<uint8_t
>(src[i])))
605 char nc=i+1<l ? src[i+1] :
' ';
607 auto searchForKeyword = [&](
const char *kw,
size_t &matchLen,
size_t totalLen)
609 if (matchLen<=totalLen && c==kw[matchLen] &&
644 if (c==
'\\' && i+1<l)
668 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
669 (
isId(pc) || pc==
'*' || pc==
'&' || pc==
'.' || pc==
'>') &&
670 (osp<8 || (osp==8 && pc!=
'-'))
676 if (i+1<l && (nc==
'-' || nc==
'&'))
683 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
684 ((i+1<l && (
isId(nc) || nc==
'[')) ||
685 (i+2<l && nc==
'$' &&
isId(src[i+2])) ||
686 (i+3<l && nc==
'&' && src[i+2]==
'$' &&
isId(src[i+3]))
696 if (cliSupport && i+1<l && (
isId(nc) || nc==
'-'))
703 if (i+1<l && (
isId(nc) || nc==
'-'))
709 if (i>0 && pc!=
' ' && pc!=
'\t' && pc!=
':' &&
710 pc!=
'*' && pc!=
'&' && pc!=
'(' && pc!=
'/' &&
720 if (i>0 &&
isId(pc) && osp<9)
740 if (i>0 && i+1<l && pc!=
'=' && pc!=
':' && !isspace(
static_cast<uint8_t
>(pc)) &&
771 !(pc==
',' && nc==
'.') &&
772 (osp<8 || (osp>=8 &&
isId(pc) &&
isId(nc)))
780 else if ((pc==
'*' || pc==
'&' || pc==
'.') && nc==
'>')
788 auto correctKeywordAllowedInsideScope = [&](
char cc,
size_t &matchLen,
size_t totalLen) {
789 if (c==cc && matchLen==totalLen)
791 if ((i+2<l && src[i+1] ==
':' && src[i+2] ==
':') ||
792 ((i>matchLen && src[i-matchLen] ==
':' && src[i-matchLen-1] ==
':'))
796 correctKeywordAllowedInsideScope(
't',csp, 5);
797 correctKeywordAllowedInsideScope(
'e',vosp,8);
798 correctKeywordAllowedInsideScope(
'l',vsp, 7);
800 auto correctKeywordNotPartOfScope = [&](
char cc,
size_t &matchLen,
size_t totalLen)
802 if (c==cc && matchLen==totalLen && i+1<l &&
810 correctKeywordNotPartOfScope(
't',csp, 5);
811 correctKeywordNotPartOfScope(
'e',vosp,8);
812 correctKeywordNotPartOfScope(
'l',vsp, 7);
832 if (templateDepth > 0)
834 int nextOpenPos=name.
findRev(
'>', pos);
835 int nextClosePos=name.
findRev(
'<', pos);
836 if (nextOpenPos!=-1 && nextOpenPos>nextClosePos)
841 else if (nextClosePos!=-1)
853 int lastAnglePos=name.
findRev(
'>', pos);
854 int bracePos=name.
findRev(
'(', pos);
855 if (lastAnglePos!=-1 && lastAnglePos>bracePos)
862 int bp = bracePos>0 ? name.
findRev(
'(',bracePos-1) : -1;
864 return bp==-1 || (bp>=8 && name.
mid(bp-8,10)==
"operator()") ? bracePos : bp;
875 return (name==scope ||
876 (scope.
right(nl)==name &&
877 sl>1+nl && scope.
at(sl-nl-1)==
':' && scope.
at(sl-nl-2)==
':'
886 return (name==scope ||
887 (name.
left(sl)==scope &&
888 nl>sl+1 && name.
at(sl)==
':' && name.
at(sl+1)==
':'
896 const QCString &text,
bool autoBreak,
bool external,
897 bool keepSpaces,
int indentLevel)
899 AUTO_TRACE(
"scope={} fileScope={} text={} autoBreak={} external={} keepSpaces={} indentLevel={}",
900 scope?scope->
name():
"",fileScope?fileScope->
name():
"",
901 text,autoBreak,external,keepSpaces,indentLevel);
904 std::string_view txtStr=text.
view();
905 size_t strLen = txtStr.length();
906 if (strLen==0)
return;
908 static const reg::Ex regExp(R
"((::)?\a[\w~!\\.:$"]*)");
918 size_t floatingIndex=0;
919 for (; it!=
end ; ++it)
921 const auto &match = *it;
922 size_t newIndex = match.position();
923 size_t matchLen = match.length();
924 floatingIndex+=newIndex-skipIndex+matchLen;
925 if (newIndex>0 && txtStr.at(newIndex-1)==
'0')
927 std::string_view part = txtStr.substr(skipIndex,newIndex+matchLen-skipIndex);
929 skipIndex=index=newIndex+matchLen;
934 bool insideString=
FALSE;
935 for (
size_t i=index;i<newIndex;i++)
937 if (txtStr.at(i)==
'"') insideString=!insideString;
938 if (txtStr.at(i)==
'\\') i++;
942 if (strLen>35 && floatingIndex>30 && autoBreak)
944 std::string_view splitText = txtStr.substr(skipIndex,newIndex-skipIndex);
945 size_t splitLength = splitText.length();
947 size_t i = splitText.find(
',');
948 if (i==std::string::npos) { i=splitText.find(
'<');
if (i!=std::string::npos) offset=0; }
949 if (i==std::string::npos) i=splitText.find(
'>');
950 if (i==std::string::npos) i=splitText.find(
' ');
952 if (i!=std::string::npos)
954 std::string_view part1 = splitText.substr(0,i+offset);
956 out.
writeBreak(indentLevel==0 ? 0 : indentLevel+1);
957 std::string_view part2 = splitText.substr(i+offset);
959 floatingIndex=splitLength-i-offset+matchLen;
969 std::string_view part = txtStr.substr(skipIndex,newIndex-skipIndex);
973 std::string_view word=txtStr.substr(newIndex,matchLen);
1003 auto writeCompoundName = [&](
const auto *cd_) {
1004 if (external ? cd_->isLinkable() : cd_->isLinkableInProject())
1009 out.
writeLink(cd_->getReference(),cd_->getOutputFileBase(),cd_->anchor(),word);
1021 writeCompoundName(cd);
1023 else if ((cd=
getClass(matchWord+
"-p")))
1025 writeCompoundName(cd);
1029 writeCompoundName(cnd);
1033 writeCompoundName(d);
1040 int m = matchWord.
findRev(
"::");
1048 scopeName=scope->
name();
1052 scopeName = matchWord.
left(m);
1053 matchWord = matchWord.
mid(m+2);
1062 if (result.
found && result.
md &&
1069 if (result.
md!=self && (self==
nullptr || result.
md->
name()!=self->
name()))
1098 skipIndex=index=newIndex+matchLen;
1102 std::string_view lastPart = txtStr.substr(skipIndex);
1107 std::function<
void(
size_t)> replaceFunc)
1109 static const reg::Ex marker(R
"(@(\d+))");
1114 for ( ; it!=
end ; ++it)
1116 const auto &match = *it;
1117 size_t newIndex = match.position();
1118 size_t matchLen = match.length();
1119 ol.
parseText(markerText.substr(index,newIndex-index));
1120 unsigned long entryIndex = std::stoul(match[1].str());
1121 if (entryIndex<
static_cast<unsigned long>(numMarkers))
1123 replaceFunc(entryIndex);
1125 index=newIndex+matchLen;
1132 auto replaceFunc = [&list,&ol](
size_t entryIndex)
1134 const auto &e = list[entryIndex];
1166 if (a.hasDocumentation())
1170 paramDocs+=
" \\ilinebr @param"+direction+
" "+a.name+
" "+docsWithoutDir;
1184 if (!a.docs.isEmpty())
1186 if (!a.name.isEmpty())
1188 paramDocs+=
" \\ilinebr @tparam "+a.name+
" "+a.docs;
1190 else if (!a.type.isEmpty())
1196 paramDocs+=
" \\ilinebr @tparam "+type+
" "+a.docs;
1209 for (
auto it = al.
begin() ; it!=al.
end() ;)
1214 int i=type1.
find(
")(");
1218 type1=type1.
left(i);
1226 result+= type1+
" "+a.
name+type2+a.
array;
1230 result+= type1+type2;
1237 if (it!=al.
end()) result+=
", ";
1252 if (al.
empty())
return result;
1255 for (
const auto &a : al)
1257 if (a.defval.isEmpty() || includeDefault)
1259 if (!first) result+=
", ";
1260 if (!a.name.isEmpty())
1262 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
1270 int i =
static_cast<int>(a.type.length())-1;
1271 while (i>=0 &&
isId(a.type.at(i))) i--;
1274 result+=a.type.
right(a.type.length()-i-1);
1275 if (a.type.find(
"...")!=-1)
1285 if (!a.typeConstraint.isEmpty() && lang==SrcLangExt::Java)
1287 result+=
" extends ";
1288 result+=a.typeConstraint;
1309 size_t len = contents.length();
1313 char c = contents[src++];
1317 if (src<len && contents[src] ==
'\n')
1322 else if ( c ==
'\0' && src<len-1)
1326 contents[dest++] = c;
1328 contents.resize(dest);
1335 for (
const auto &filterStr : filterList)
1338 int i_equals=fs.
find(
'=');
1345 filterPattern = filterPattern.
lower();
1346 input = input.
lower();
1353 if (filterName.
find(
' ')!=-1)
1355 filterName=
"\""+filterName+
"\"";
1375 if (name.
isEmpty())
return "";
1382 if (isSourceCode && !filterSrcList.empty())
1386 if (!found && filterName.
isEmpty())
1397 if (filterName.
length()>=2 && filterName[0]==
'"' && filterName[
static_cast<int>(filterName.
length())-1]==
'"')
1399 filterName = filterName.
mid(1,filterName.
length()-2);
1408 const char *outputEncoding =
"UTF-8";
1409 if (inputEncoding==
nullptr ||
qstricmp(inputEncoding,outputEncoding)==0)
return true;
1410 size_t inputSize=input.length();
1411 size_t outputSize=inputSize*4;
1414 if (cd==
reinterpret_cast<void *
>(-1))
1419 size_t iLeft=inputSize;
1420 size_t oLeft=outputSize;
1421 const char *inputPtr = input.data();
1422 char *outputPtr = output.
rawData();
1425 outputSize-=
static_cast<int>(oLeft);
1426 output.
resize(outputSize);
1427 output.
at(outputSize)=
'\0';
1447 bool fileOpened=
false;
1448 if (name[0]==
'-' && name[1]==0)
1450 std::string contents;
1452 while (getline(std::cin,line))
1454 contents+=line+
'\n';
1463 err(
"file '{}' not found\n",name);
1476 err(
"cannot open file '{}' for reading\n",name);
1484 for (
const auto &bcd : bcl)
1505 AUTO_TRACE(
"target='{}' str='{}'",target,str);
1506 if (target==str) { target.
clear();
return; }
1508 int l=
static_cast<int>(str.
length());
1511 while ((i=target.
find(str,p))!=-1)
1513 for (
int q=p;q<i;q++)
1515 if (target[q]==
'<') sharpCount++;
1516 else if (target[q]==
'>' && sharpCount>0) sharpCount--;
1518 bool isMatch = (i==0 || !
isId(target.
at(i-1))) &&
1519 (i+l==
static_cast<int>(target.
length()) || !
isId(target.
at(i+l))) &&
1520 !insideTemplate && sharpCount==0;
1523 int i1=target.
find(
'*',i+l);
1524 int i2=target.
find(
'&',i+l);
1525 if (i1==-1 && i2==-1)
1532 else if ((i1!=-1 && i<i1) || (i2!=-1 && i<i2))
1575 int i=s.
find(
" class ");
1576 if (i!=-1)
return s.
left(i)+s.
mid(i+6);
1577 i=s.
find(
" typename ");
1578 if (i!=-1)
return s.
left(i)+s.
mid(i+9);
1579 i=s.
find(
" union ");
1580 if (i!=-1)
return s.
left(i)+s.
mid(i+6);
1581 i=s.
find(
" struct ");
1582 if (i!=-1)
return s.
left(i)+s.
mid(i+7);
1595 if (!templSpec.
isEmpty() && templSpec.
at(0) ==
'<')
1602 templSpec = resolvedType;
1614 if (count>10)
return word;
1616 QCString symName,result,templSpec,tmpName;
1617 if (tSpec && !tSpec->
isEmpty())
1620 AUTO_TRACE(
"d='{}' fs='{}' word='{}' templSpec='{}'",d?d->
name():
"",fs?fs->
name():
"",word,templSpec);
1638 bool isTemplInst = cd && !templSpec.
isEmpty();
1639 if (!cd && !templSpec.
isEmpty())
1650 cd?cd->
name():
"",mType?mType->
name():
"",ts,resolvedType);
1673 if (cd==d && tSpec) *tSpec=
"";
1677 result = resolvedType+ts;
1685 if (tSpec) *tSpec=
"";
1699 result=cd->
name()+templSpec;
1749 resolvedType = lang==SrcLangExt::Java ? word :
resolveTypeDef(d,word);
1757 result = resolvedType;
1790 if (i>pp) canType += type.
mid(pp,i-pp);
1811 std::string ts = templSpec.
str();
1812 static const reg::Ex re(R
"(\a\w*)");
1819 for (; it!=
end ; ++it)
1821 const auto &match = *it;
1822 size_t ti = match.position();
1823 size_t tl = match.length();
1824 std::string matchStr = match.str();
1825 canType += ts.substr(tp,ti-tp);
1829 canType+=ts.substr(tp);
1845 if ((type==
"const" || type==
"volatile") && !name.
isEmpty())
1850 if (name==
"const" || name==
"volatile")
1852 if (!type.
isEmpty()) type+=
" ";
1870#define MATCH AUTO_TRACE_EXIT("match at line {}",__LINE__);
1871#define NOMATCH AUTO_TRACE_EXIT("no match at line {}",__LINE__);
1878 AUTO_TRACE(
"srcType='{}' dstType='{}'",srcType,dstType);
1879 if (srcType==dstType)
return true;
1882 int i1=srcType.
find(
")(");
1883 if (i1==-1)
return false;
1884 int i2=dstType.
find(
")(");
1885 if (i1!=i2)
return false;
1888 int j1=srcType.
find(
"(");
1889 if (j1==-1 || j1>i1)
return false;
1890 int j2=dstType.
find(
"(");
1891 if (j2!=j1)
return false;
1892 if (srcType.
left(j1)!=dstType.
left(j2))
return false;
1901 dstScope,dstFileScope,dstType.
left(j2),dstAl.get(),
1911 AUTO_TRACE(
"src: scope={} type={} name={} canType={}, dst: scope={} type={} name={} canType={}",
1930 srcA.
type+=sSrcName;
1934 else if (sDstName==srcType.
right(sDstName.
length()))
1936 dstA.
type+=sDstName;
1952 dstScope,dstFileScope,dstA.
canType,
1975 ASSERT(srcScope!=
nullptr && dstScope!=
nullptr);
1977 AUTO_TRACE(
"srcScope='{}' dstScope='{}' srcArgs='{}' dstArgs='{}' checkCV={} lang={}",
1980 if (srcAl==
nullptr || dstAl==
nullptr)
1982 bool match = srcAl==dstAl;
2013 if (srcAl->
size() != dstAl->
size())
2047 auto srcIt = srcAl->
begin();
2048 auto dstIt = dstAl->
begin();
2049 for (;srcIt!=srcAl->
end() && dstIt!=dstAl->
end();++srcIt,++dstIt)
2054 dstScope,dstFileScope,dstA,
2073 AUTO_TRACE(
"srcAl='{}',dstAl='{}',forceNameOverwrite={}",
2081 auto srcIt=srcAl.
begin();
2082 auto dstIt=dstAl.
begin();
2083 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
2088 AUTO_TRACE_ADD(
"before merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
2104 if (srcA.
name==
"const" || srcA.
name==
"volatile")
2109 if (dstA.
name==
"const" || dstA.
name==
"volatile")
2135 if (forceNameOverwrite)
2178 j1=
static_cast<int>(srcA.
type.
length())-i1-2,
2179 j2=
static_cast<int>(dstA.
type.
length())-i2-2;
2187 else if (i1==-1 && i2!=-1 && dstA.
type.
right(j2)==srcA.
type)
2207 AUTO_TRACE_ADD(
"after merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
2223 auto isUnconstraintTemplate = [](
const QCString &type)
2225 return type==
"typename" || type==
"class" || type.startsWith(
"typename ") || type.startsWith(
"class ");
2227 auto srcIt = srcAl.
begin();
2228 auto dstIt = dstAl.
begin();
2229 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
2233 if ((!isUnconstraintTemplate(srcA.
type) || !isUnconstraintTemplate(dstA.
type)) && srcA.
type!=dstA.
type)
2252 AUTO_TRACE(
"scopeName={},memberName={},forceEmptyScope={}",
2278 result.
found =
true;
2283 result.
found =
true;
2288 result.
found =
true;
2293 result.
found =
true;
2298 result.
found =
true;
2330 bool explicitGlobalScope=
FALSE;
2331 if (scopeName.
at(0)==
':' && scopeName.
at(1)==
':')
2334 explicitGlobalScope=
TRUE;
2342 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(docScopeName.
length());
2347 if (scopeOffset>0) fullName.
prepend(docScopeName.
left(scopeOffset)+
"::");
2371 else if ((scopeOffset=docScopeName.
findRev(
"::",scopeOffset-1))==-1)
2375 }
while (scopeOffset>=0);
2383 const char *p=s.
data();
2385 while ((c=
static_cast<uint8_t
>(*p++)))
if (!islower(c))
return false;
2398 bool lookForSpecialization,
2403 AUTO_TRACE(
"scope={} name={} inSeeBlock={} lang={} lookForSpecialization={} currentFile={} checkScope={}",
2404 scName,name,inSeeBlock,lang,lookForSpecialization,currentFile ? currentFile->
name() :
"", checkScope);
2409 if (fullName.
find(
"anonymous_namespace{")==-1)
2419 if (lang==SrcLangExt::CSharp && (templStartPos=fullName.
find(
'<'))!=-1)
2421 int templEndPos = fullName.
findRev(
'>');
2422 if (templEndPos!=-1)
2430 int endNamePos=bracePos!=-1 ? bracePos :
static_cast<int>(fullName.
length());
2431 int scopePos=fullName.
findRev(
"::",endNamePos);
2432 bool explicitScope = fullName.
startsWith(
"::") &&
2437 bool allowTypeOnly=
false;
2440 *resContext=
nullptr;
2447 if (!inSeeBlock && scopePos==-1 &&
isLowerCase(tsName))
2461 if (scName!=fullName &&
getScopeDefs(scName,fullName,cd,cnd,nd,modd))
2484 else if (scName==fullName || (!inSeeBlock && scopePos==-1))
2503 if (explicitScope) nameStr=nameStr.
mid(2);
2508 if (bracePos!=-1) argsStr=fullName.
right(fullName.
length()-bracePos);
2512 int templPos=nameStr.
find(
'<');
2513 bool tryUnspecializedVersion =
FALSE;
2514 if (templPos!=-1 && nameStr.
find(
"operator")==-1)
2516 int endTemplPos=nameStr.
findRev(
'>');
2517 if (endTemplPos!=-1)
2519 if (!lookForSpecialization)
2521 nameStr=nameStr.
left(templPos)+nameStr.
right(nameStr.
length()-endTemplPos-1);
2525 tryUnspecializedVersion =
TRUE;
2533 nameStr=nameStr.
mid(scopeStr.
length()+2);
2559 *resContext=
nullptr;
2569 *resMember=result.
md;
2570 *resContext=result.
md;
2574 *resContext=
nullptr;
2580 else if (result.
cd) *resContext=result.
cd;
2581 else if (result.
nd) *resContext=result.
nd;
2582 else if (result.
fd) *resContext=result.
fd;
2583 else if (result.
gd) *resContext=result.
gd;
2584 else if (result.
cnd) *resContext=result.
cnd;
2585 else if (result.
modd) *resContext=result.
modd;
2588 *resContext=
nullptr; *resMember=
nullptr;
2615 else if (tsName.
find(
'.')!=-1)
2627 if (tryUnspecializedVersion)
2629 bool b =
resolveRef(scName,name,inSeeBlock,resContext,resMember,lang,
FALSE,
nullptr,checkScope);
2657 if (!isFileName && result.
find(
'<')==-1) result=
substitute(result,
".",
"::",3);
2659 if (result.
at(0)==
':' && result.
at(1)==
':')
2683 *resContext=
nullptr;
2686 if (lang==SrcLangExt::CSharp)
2691 AUTO_TRACE(
"scName='{}',ref='{}'",scName,lr);
2696 const DirDef *dir =
nullptr;
2714 if (si) resAnchor = si->
label();
2726 resAnchor = si->
label();
2733 resAnchor = si->
label();
2763 else if (lang==SrcLangExt::Java &&
2764 (cd=
getClass(linkRefWithoutTemplates)))
2771 else if ((cd=
getClass(linkRef+
"-p")))
2788 resAnchor=modd->
anchor();
2809 if (md) resAnchor=md->
anchor();
2847 if (n.
isEmpty())
return nullptr;
2850 const int maxAddrSize = 20;
2851 char addr[maxAddrSize];
2852 qsnprintf(addr,maxAddrSize,
"%p:",
reinterpret_cast<const void*
>(fnMap));
2861 ambig = cachedResult->
isAmbig;
2872 if (name.
isEmpty())
return nullptr;
2879 if (name.
isEmpty())
return nullptr;
2886 const std::unique_ptr<FileDef> &fd = fn->front();
2888 fd->getPath().right(path.
length())==path :
2890 if (path.
isEmpty() || isSamePath)
2892 cachedResult->
fileDef = fd.get();
2901 for (
const auto &fd_p : *fn)
2915 cachedResult->
isAmbig = ambig;
2916 cachedResult->
fileDef = lastMatch;
2946 for (
const auto &s : examplePathList)
2988 for (
const auto &fd_p : *fn)
2996 if (!first) result +=
"\n";
3010 std::string substRes;
3012 const char *p = s.
data();
3016 substRes.reserve(s.
length()+1024);
3023 for (
const auto &kw : keywords)
3025 size_t keyLen =
qstrlen(kw.keyword);
3026 if (
qstrncmp(p,kw.keyword,keyLen)==0)
3028 const char *startArg = p+keyLen;
3029 bool expectParam = std::holds_alternative<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3031 if (expectParam && *startArg==
'(')
3034 const char *endArg =
nullptr;
3035 while ((c=*(startArg+j)) && c!=
')' && c!=
'\n' && c!=0) j++;
3036 if (c==
')') endArg=startArg+j;
3040 auto &&getValue = std::get<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
3041 substRes+=getValue(value).str();
3048 warn(file,line,
"Missing argument for '{}'",kw.keyword);
3052 else if (!expectParam)
3054 auto &&getValue = std::get<KeywordSubstitution::GetValue>(kw.getValueVariant);
3055 substRes+=getValue().str();
3062 warn(file,line,
"Expected arguments for '{}' but none were specified",kw.keyword);
3072 if (c==
'\n') line++;
3100 int wi = projectLogo.
find(
" width=");
3103 projectLogo = projectLogo.
left(wi);
3105 int hi = projectLogo.
find(
" height=");
3108 projectLogo = projectLogo.
left(hi);
3121 auto extractDimension = [&projectLogo](
const char *startMarker,
size_t startPos,
size_t endPos) ->
QCString
3124 if (result.
length()>=2 && result.
at(0)!=
'"' && result.
at(result.
length()-1)!=
'"')
3126 result=
"\""+result+
"\"";
3132 int wi = projectLogo.
find(
" width=");
3133 int hi = projectLogo.
find(
" height=");
3134 if (wi!=-1 && hi!=-1)
3138 sizeVal = extractDimension(
" width=", wi+7, hi) +
" "
3139 + extractDimension(
" height=", hi+8, projectLogo.
length());
3143 sizeVal = extractDimension(
" height=", hi+8, wi) +
" "
3144 + extractDimension(
" width=", wi+7, projectLogo.
length());
3149 sizeVal = extractDimension(
" width=", wi+7, projectLogo.
length());
3153 sizeVal = extractDimension(
" height=", hi+8, projectLogo.
length());
3166 {
"$title", [&]() {
return !title.
isEmpty() ? title : projName; } },
3167 {
"$doxygenversion", [&]() {
return getDoxygenVersion(); } },
3168 {
"$projectname", [&]() {
return projName; } },
3169 {
"$projectnumber", [&]() {
return projNum; } },
3170 {
"$projectbrief", [&]() {
return projBrief; } },
3174 {
"$langISO", [&]() {
return theTranslator->trISOLang(); } },
3189 for (
const auto &s : sl)
3191 const char *ps=s.c_str();
3192 const char *pd=name.
data();
3194 while (*ps!=0 && *pd!=0 && *ps==*pd)
3200 if (*ps==0 && *pd!=0)
3216int getUtf8Char(
const char *input,
char ids[MAX_UTF8_CHAR_SIZE],CaseModifier modifier)
3219 const unsigned char uc = (
unsigned char)*input;
3220 bool validUTF8Char =
false;
3223 const char* pt = input+1;
3225 if ((uc&0x80)==0x00)
3229 case CaseModifier::None: ids[0]=*input;
break;
3230 case CaseModifier::ToUpper: ids[0]=(char)toupper(*input);
break;
3231 case CaseModifier::ToLower: ids[0]=(char)tolower(*input);
break;
3238 if ((uc&0xE0)==0xC0)
3242 if ((uc&0xF0)==0xE0)
3246 if ((uc&0xF8)==0xF0)
3251 validUTF8Char = l>0;
3252 for (
int m=1; m<l && validUTF8Char; ++m)
3254 unsigned char ct = (
unsigned char)*pt;
3255 if (ct==0 || (ct&0xC0)!=0x80)
3257 validUTF8Char=
false;
3278 if (caseSenseNames == CASE_SENSE_NAMES_t::YES)
return true;
3279 else if (caseSenseNames == CASE_SENSE_NAMES_t::NO)
return false;
3285 if (name.
isEmpty())
return name;
3291 const char *p=name.
data();
3296 case '_':
if (allowUnderscore) result+=
'_';
else result+=
"__";
break;
3297 case '-': result+=
'-';
break;
3298 case ':': result+=
"_1";
break;
3299 case '/': result+=
"_2";
break;
3300 case '<': result+=
"_3";
break;
3301 case '>': result+=
"_4";
break;
3302 case '*': result+=
"_5";
break;
3303 case '&': result+=
"_6";
break;
3304 case '|': result+=
"_7";
break;
3305 case '.':
if (allowDots) result+=
'.';
else result+=
"_8";
break;
3306 case '!': result+=
"_9";
break;
3307 case ',': result+=
"_00";
break;
3308 case ' ': result+=
"_01";
break;
3309 case '{': result+=
"_02";
break;
3310 case '}': result+=
"_03";
break;
3311 case '?': result+=
"_04";
break;
3312 case '^': result+=
"_05";
break;
3313 case '%': result+=
"_06";
break;
3314 case '(': result+=
"_07";
break;
3315 case ')': result+=
"_08";
break;
3316 case '+': result+=
"_09";
break;
3317 case '=': result+=
"_0a";
break;
3318 case '$': result+=
"_0b";
break;
3319 case '\\': result+=
"_0c";
break;
3320 case '@': result+=
"_0d";
break;
3321 case ']': result+=
"_0e";
break;
3322 case '[': result+=
"_0f";
break;
3323 case '#': result+=
"_0g";
break;
3324 case '"': result+=
"_0h";
break;
3325 case '~': result+=
"_0i";
break;
3326 case '\'': result+=
"_0j";
break;
3327 case ';': result+=
"_0k";
break;
3328 case '`': result+=
"_0l";
break;
3332 bool doEscape =
true;
3333 if (allowUnicodeNames)
3346 unsigned char id =
static_cast<unsigned char>(c);
3355 else if (caseSenseNames || !isupper(c))
3362 result+=
static_cast<char>(tolower(c));
3376 const char *p = s.
data();
3386 case '_': result+=c; p++;
break;
3387 case '1': result+=
':'; p++;
break;
3388 case '2': result+=
'/'; p++;
break;
3389 case '3': result+=
'<'; p++;
break;
3390 case '4': result+=
'>'; p++;
break;
3391 case '5': result+=
'*'; p++;
break;
3392 case '6': result+=
'&'; p++;
break;
3393 case '7': result+=
'|'; p++;
break;
3394 case '8': result+=
'.'; p++;
break;
3395 case '9': result+=
'!'; p++;
break;
3399 case '0': result+=
','; p+=2;
break;
3400 case '1': result+=
' '; p+=2;
break;
3401 case '2': result+=
'{'; p+=2;
break;
3402 case '3': result+=
'}'; p+=2;
break;
3403 case '4': result+=
'?'; p+=2;
break;
3404 case '5': result+=
'^'; p+=2;
break;
3405 case '6': result+=
'%'; p+=2;
break;
3406 case '7': result+=
'('; p+=2;
break;
3407 case '8': result+=
')'; p+=2;
break;
3408 case '9': result+=
'+'; p+=2;
break;
3409 case 'a': result+=
'='; p+=2;
break;
3410 case 'b': result+=
'$'; p+=2;
break;
3411 case 'c': result+=
'\\'; p+=2;
break;
3412 case 'd': result+=
'@'; p+=2;
break;
3413 case 'e': result+=
']'; p+=2;
break;
3414 case 'f': result+=
'['; p+=2;
break;
3415 case 'g': result+=
'#'; p+=2;
break;
3416 case 'h': result+=
'"'; p+=2;
break;
3417 case 'i': result+=
'~'; p+=2;
break;
3418 case 'j': result+=
'\''; p+=2;
break;
3419 case 'k': result+=
';'; p+=2;
break;
3420 case 'l': result+=
'`'; p+=2;
break;
3427 if (!caseSenseNames && c>=
'a' && c<=
'z')
3429 result+=
static_cast<char>(toupper(*p));
3460 if (name.
isEmpty())
return name;
3483 size_t resultLen = result.
length();
3487 uint8_t md5_sig[16];
3489 MD5Buffer(result.
data(),
static_cast<unsigned int>(resultLen),md5_sig);
3490 MD5SigToString(md5_sig,sigStr);
3491 result=result.
left(128-32)+sigStr;
3496 int l1Dir=0,l2Dir=0;
3497 int createSubdirsLevel =
Config_getInt(CREATE_SUBDIRS_LEVEL);
3498 int createSubdirsBitmaskL2 = (1<<createSubdirsLevel)-1;
3501 uint8_t md5_sig[16];
3502 MD5Buffer(result.
data(),
static_cast<unsigned int>(result.
length()),md5_sig);
3503 l1Dir = md5_sig[14] & 0xf;
3504 l2Dir = md5_sig[15] & createSubdirsBitmaskL2;
3515 const int sig_size=16;
3516 uint8_t md5_sig[sig_size];
3517 MD5Buffer(fn.
data(),
static_cast<unsigned int>(fn.
length()),md5_sig);
3518 char result[sig_size*3+2];
3521 for (
int i=0;i<sig_size;i++)
3523 static const char oct[]=
"01234567";
3524 uint8_t
byte = md5_sig[i];
3525 *p++=oct[(
byte>>6)&7];
3526 *p++=oct[(
byte>>3)&7];
3527 *p++=oct[(
byte>>0)&7];
3557 QCString absIncFileName = incFileName;
3567 else if (searchIncludes)
3570 for (
const auto &incPath : includePath)
3589 return absIncFileName;
3599 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
3600 for (
int l1=0; l1<16; l1++)
3606 term(
"Failed to create output directory '{}'\n",subdir);
3608 for (
int l2=0; l2<createSubdirsLevelPow2; l2++)
3611 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
3614 term(
"Failed to create output directory '{}'\n",subsubdir);
3626 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
3627 for (
int l1=0;l1<16;l1++)
3631 for (
int l2=0; l2 < createSubdirsLevelPow2; l2++)
3634 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
3653 bool allowEmptyClass)
3660 namespaceName=nd->
name();
3664 p=
static_cast<int>(clName.
length())-2;
3665 while (p>=0 && (i=clName.
findRev(
"::",p))!=-1)
3672 namespaceName=nd->
name();
3681 className=scopeName;
3682 namespaceName.
clear();
3685 if (className.
isEmpty() && !namespaceName.
isEmpty() && !allowEmptyClass)
3688 className=namespaceName;
3689 namespaceName.
clear();
3695 className = className.
left(className.
length()-2);
3736 int l =
static_cast<int>(result.
length());
3739 bool skipBracket=
FALSE;
3746 while (p>=0 && count>=0)
3748 char c=result.
at(p);
3754 if (p>0 && result.
at(p-1)==
':' && (count==0 || skipBracket))
3756 return result.
right(l-p-1);
3767 if (p>0 && result.
at(p-1)==
'>')
3775 bool foundMatch=
false;
3776 while (p>=0 && !foundMatch)
3788 if (round==0) count++;
3795 if (result.
at(p-1) ==
'<')
3802 foundMatch = count==0;
3817 done = count==0 || skipBracket;
3831 const char *p = s.
data();
3837 if ((c>=
'0' && c<=
'9') || (c>=
'a' && c<=
'z') || (c>=
'A' && c<=
'Z') || c==
'-')
3839 if (first && c>=
'0' && c<=
'9') result+=
'a';
3845 encChar[1]=
hex[
static_cast<unsigned char>(c)>>4];
3846 encChar[2]=
hex[
static_cast<unsigned char>(c)&0xF];
3871 const char *p = s.
data();
3877 case '<': result+=
"<";
break;
3878 case '>': result+=
">";
break;
3879 case '&':
if (keepEntities)
3885 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
3891 while (p<e) result+=*p++;
3903 case '\'': result+=
"'";
break;
3904 case '"': result+=
""";
break;
3905 case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
3906 case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
3907 case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
3908 case 27:
case 28:
case 29:
case 30:
case 31:
3910 default: result+=c;
break;
3922 const char *p=s.
data();
3928 case '<': result+=
"<";
break;
3929 case '>': result+=
">";
break;
3930 case '&':
if (keepEntities)
3936 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
3942 while (p<e) result+=*p++;
3954 case '\'': result+=
"'";
break;
3955 case '"': result+=
""";
break;
3958 uint8_t uc =
static_cast<uint8_t
>(c);
3959 if (uc<32 && !isspace(c))
3963 result+=
hex[uc&0xF];
3982 const char *p=s.
data();
3988 case '"':
if (!singleQuotes) result+=
"\\\"";
else result+=c;
3990 case '\'':
if (singleQuotes) result+=
"\\\'";
else result+=c;
3992 case '\\':
if (*p==
'u' && *(p+1)==
'{') result+=
"\\";
3993 else result+=
"\\\\";
3995 default: result+=c;
break;
4005 std::string s = str.
data();
4006 static const reg::Ex re(R
"(&\a\w*;)");
4012 size_t p=0, i=0, l=0;
4013 for (; it!=
end ; ++it)
4015 const auto &match = *it;
4016 p = match.position();
4020 result+=s.substr(i,p-i);
4024 const char *code=
nullptr;
4035 result+=s.substr(i);
4055 ASSERT(context!=
nullptr);
4057 if (ml==
nullptr)
return;
4059 struct MoveMemberInfo
4062 : memberDef(md), memberGroup(mg), sli(rv) {}
4067 std::vector<MoveMemberInfo> movedMembers;
4069 for (
const auto &md : *ml)
4071 if (md->isEnumerate())
4073 for (
const auto &fmd : md->enumFieldList())
4075 int groupId=fmd->getMemberGroupId();
4081 const auto &info = it->second;
4082 auto mg_it = std::find_if(pMemberGroups->begin(),
4083 pMemberGroups->end(),
4084 [&groupId](
const auto &g)
4085 { return g->groupId()==groupId; }
4088 if (mg_it==pMemberGroups->end())
4090 auto mg = std::make_unique<MemberGroup>(
4099 pMemberGroups->push_back(std::move(mg));
4103 mg_ptr = (*mg_it).get();
4115 int groupId=md->getMemberGroupId();
4121 const auto &info = it->second;
4122 auto mg_it = std::find_if(pMemberGroups->begin(),
4123 pMemberGroups->end(),
4124 [&groupId](
const auto &g)
4125 { return g->groupId()==groupId; }
4128 if (mg_it==pMemberGroups->end())
4130 auto mg = std::make_unique<MemberGroup>(
4139 pMemberGroups->push_back(std::move(mg));
4143 mg_ptr = (*mg_it).get();
4145 movedMembers.emplace_back(md,mg_ptr,info->m_sli);
4151 for (
const auto &mmi : movedMembers)
4153 ml->
remove(mmi.memberDef);
4154 mmi.memberGroup->insertMember(mmi.memberDef->resolveAlias());
4155 mmi.memberGroup->setRefItems(mmi.sli);
4171 AUTO_TRACE(
"type='{}' name='{}' lang={}",type,name,lang);
4172 static const reg::Ex re_norm(R
"(\a[\w:]*)");
4173 static const reg::Ex re_fortran(R
"(\a[\w:()=]*)");
4183 size_t typeLen=type.
length();
4186 if (lang == SrcLangExt::Fortran)
4198 std::string s = type.
str();
4204 const auto &match = *it;
4205 size_t i = match.position();
4206 size_t l = match.length();
4211 while (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
' ') { ts++; tl++; }
4212 if (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
'<')
4217 while (te<typeLen && brCount!=0)
4219 if (type[
static_cast<uint32_t
>(te)]==
'<')
4221 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'<') te++;
else brCount++;
4223 if (type[
static_cast<uint32_t
>(te)]==
'>')
4225 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'>') te++;
else brCount--;
4235 pos=
static_cast<int>(i+l+tl);
4239 pos=
static_cast<int>(i+l);
4244 return static_cast<int>(i);
4247 pos =
static_cast<int>(typeLen);
4260 int p=name.
find(
'<');
4261 if (p==-1)
return name;
4265 std::string s = name.
mid(p).
str();
4266 static const reg::Ex re(R
"([\a:][\w:]*)");
4271 for (; it!=
end ; ++it)
4273 const auto &match = *it;
4274 size_t i = match.position();
4275 size_t l = match.length();
4276 result += s.substr(pi,i-pi);
4279 for (
const Argument &formArg : formalArgs)
4281 if (formArg.name == n)
4307 result+=s.substr(pi);
4325 if (formalArgs.
empty())
return nm;
4328 static const reg::Ex re(R
"(\a\w*)");
4329 std::string name = nm.str();
4334 for (; it!=
end ; ++it)
4336 const auto &match = *it;
4337 size_t i = match.position();
4338 size_t l = match.length();
4339 if (i>p) result += name.substr(p,i-p);
4344 actIt = actualArgs->
begin();
4351 for (
auto formIt = formalArgs.
begin();
4352 formIt!=formalArgs.
end() && !found;
4358 if (actualArgs && actIt!=actualArgs->
end())
4365 formArg.
type =
"class";
4370 formArg.
type =
"typename";
4374 formArg.
name +=
"...";
4379 formArg.
name +=
"...";
4386 if (formArg.
name==n && actualArgs && actIt!=actualArgs->
end() && !actArg.
type.
isEmpty())
4393 ii = subst.find(
'<');
4395 if (ii!=-1 &&
static_cast<int>(
prefix.length())>=ii+2 &&
prefix.mid(
prefix.length()-ii-2,ii+1)==subst.left(ii+1))
4400 while ((ii=subst.find(nameArg,pp))!=-1)
4402 bool beforeNonWord = ii==0 || !
isId(subst.at(ii-1));
4403 bool afterNonWord = subst.length()==ii+nameArg.length() || !
isId(subst.at(ii+nameArg.length()));
4404 if (beforeNonWord && afterNonWord)
4408 pp=ii+
static_cast<int>(nameArg.length());
4413 AUTO_TRACE_ADD(
"result={} n={} type={} hasRecursion={}",result,n,actArg.
type,hasRecursion(result,n,actArg.
type));
4414 if (!hasRecursion(result,n,actArg.
type))
4426 result += actArg.
type;
4432 result += actArg.
type+
" "+actArg.
name;
4437 else if (formArg.
name==n &&
4438 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4447 else if (formArg.
name==n &&
4448 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
4456 if (actualArgs && actIt!=actualArgs->
end())
4467 result+=name.substr(p);
4485 bool allowArtificial)
4488 int i=fullName.
find(
'<');
4489 if (i==-1)
return fullName;
4492 int l=
static_cast<int>(fullName.
length());
4499 while (e<l && count>0)
4501 char c=fullName.
at(e++);
4504 case '(': round++;
break;
4505 case ')':
if (round>0) round--;
break;
4506 case '<':
if (round==0) count++;
break;
4507 case '>':
if (round==0) count--;
break;
4512 int si= fullName.
find(
"::",e);
4514 if (parentOnly && si==-1)
break;
4517 result+=fullName.
mid(p,i-p);
4520 if (cd!=
nullptr && (allowArtificial || !cd->
isArtificial()))
4522 result+=fullName.
mid(i,e-i);
4525 else if (pLastScopeStripped)
4528 *pLastScopeStripped=fullName.
mid(i,e-i);
4531 i=fullName.
find(
'<',p);
4533 result+=fullName.
right(l-p);
4550 AUTO_TRACE(
"leftScope='{}' rightScope='{}'",leftScope,rightScope);
4558 int i=0,p=
static_cast<int>(leftScope.
length());
4563 while ((i=leftScope.
findRev(
"::",p))>0)
4567 result = leftScope.
left(i+2)+rightScope;
4595 int sl=
static_cast<int>(s.
length());
4599 if (sp>=sl)
return -1;
4623 while (sp<sl && !done)
4629 case '<': count++;
break;
4630 case '>': count--;
if (count==0) done=
true;
break;
4663 bool newPage =
true;
4668 warn(fileName,startLine,
"multiple use of page label '{}' with different titles, (other occurrence: {}, line: {})",
4752 else if (si->
lineNr() != -1)
4754 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {}, line {})",pd->
name(),si->
fileName(),si->
lineNr());
4758 warn(orgFile,line,
"multiple use of section label '{}', (first occurrence: {})",pd->
name(),si->
fileName());
4783 if (!key.
isEmpty() && key[0]!=
'@')
4788 item->setScope(scope);
4789 item->setName(name);
4790 item->setTitle(title);
4791 item->setArgs(args);
4792 item->setGroup(key);
4840 if (!first) { ol.
writeString(
" | "); }
else first=
false;
4852 if (!first) { ol.
writeString(
" | "); }
else first=
false;
4878 int i_fs = fName.
findRev(
'/');
4879 int i_bs = fName.
findRev(
'\\');
4880 int i = fName.
find(
'.',std::max({ i_fs, i_bs ,0}));
4908 result=result.
mid(i+1);
4913 result=result.
mid(i+1);
4926 if (str.
isEmpty() || word==
nullptr)
return false;
4927 static const reg::Ex re(R
"(\a+)");
4928 std::string s = str.str();
4931 if (it->str()==word)
return true;
4942 static reg::Ex re(R
"(\s*(<\a+>)\s*)");
4943 std::string s = sentence.str();
4949 for ( ; it!=
end ; ++it)
4951 const auto match = *it;
4952 std::string part = match[1].str();
4955 size_t i = match.position();
4956 size_t l = match.length();
4957 result+=s.substr(p,i-p);
4958 result+=match.str();
4964 size_t i = match[1].position();
4965 size_t l = match[1].length();
4966 result+=s.substr(p,i-p);
4970 result+=s.substr(p);
4986 const char *p = s.
data();
4989 int i=0,li=-1,l=
static_cast<int>(s.
length());
4993 if (c==
' ' || c==
'\t' || c==
'\r') { i++; p++; }
4994 else if (c==
'\\' &&
literal_at(p,
"\\ilinebr")) { i+=8; li=i; p+=8; }
4995 else if (c==
'\n') { i++; li=i; docLine++; p++; }
5005 if (c==
' ' || c==
'\t' || c==
'\r') { b--; p--; }
5006 else if (c==
'r' && b>=7 &&
literal_at(p-7,
"\\ilinebr")) { bi=b-7; b-=8; p-=8; }
5007 else if (c==
'>' && b>=11 &&
literal_at(p-11,
"\\ilinebr<br>")) { bi=b-11; b-=12; p-=12; }
5008 else if (c==
'\n') { bi=b; b--; p--; }
5013 if (li==-1 && bi==-1)
return s;
5020 return s.
mid(li,bi-li);
5038 {
"idl",
"c", SrcLangExt::IDL,
".idl" },
5039 {
"java",
"c", SrcLangExt::Java,
".java"},
5040 {
"javascript",
"c", SrcLangExt::JS,
".js" },
5041 {
"csharp",
"c", SrcLangExt::CSharp,
".cs" },
5042 {
"d",
"c", SrcLangExt::D,
".d" },
5043 {
"php",
"c", SrcLangExt::PHP,
".php" },
5044 {
"objective-c",
"c", SrcLangExt::ObjC,
".m" },
5045 {
"c",
"c", SrcLangExt::Cpp,
".c" },
5046 {
"c++",
"c", SrcLangExt::Cpp,
".cpp" },
5047 {
"slice",
"c", SrcLangExt::Slice,
".ice" },
5048 {
"python",
"python", SrcLangExt::Python,
".py" },
5049 {
"fortran",
"fortran", SrcLangExt::Fortran,
".f" },
5050 {
"fortranfree",
"fortranfree", SrcLangExt::Fortran,
".f90" },
5051 {
"fortranfixed",
"fortranfixed", SrcLangExt::Fortran,
".f" },
5052 {
"vhdl",
"vhdl", SrcLangExt::VHDL,
".vhdl"},
5053 {
"xml",
"xml", SrcLangExt::XML,
".xml" },
5054 {
"sql",
"sql", SrcLangExt::SQL,
".sql" },
5055 {
"md",
"md", SrcLangExt::Markdown,
".md" },
5056 {
"lex",
"lex", SrcLangExt::Lex,
".l" },
5063 [&langName](
const auto &info) { return info.langName==langName; });
5070 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5080 err(
"Failed to assign extension {} to parser {} for language {}\n",
5081 extName.
data(),it1->parserName,language);
5169 if (extName.
isEmpty()) extName=
".no_extension";
5170 if (extName.
at(0)!=
'.') extName.
prepend(
".");
5186 if (lang == SrcLangExt::Unknown)
5190 if (langName.
at(0)==
'.') langName = langName.
mid(1);
5192 [&langName](
const auto &info) { return info.langName==langName; });
5195 lang = it->parserId;
5196 fileName = it->defExt;
5200 return SrcLangExt::Cpp;
5209 int lastDot = fn.
findRev(
'.');
5210 if (lastDot!=-1)
return fn.
mid(lastDot);
5219 if (scope==
nullptr ||
5239 if (qualifierIndex!=-1)
5241 explicitScopePart = name.
left(qualifierIndex);
5243 name = name.
mid(qualifierIndex+2);
5247 int minDistance = 10000;
5256 if (distance!=-1 && distance<minDistance)
5258 minDistance = distance;
5272 if (bestMatch && bestMatch->
isTypedef())
5280 if (startPos>=len)
return len;
5281 uint8_t c =
static_cast<uint8_t
>(utf8Str[startPos]);
5286 int (*matcher)(int) =
nullptr;
5287 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5291 c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]);
5295 matcher = std::isxdigit;
5299 matcher = std::isdigit;
5302 else if (std::isalnum(c))
5305 matcher = std::isalnum;
5309 while ((c =
static_cast<uint8_t
>(utf8Str[startPos+bytes]))!=0 && matcher(c))
5319 return startPos+bytes;
5336 .setAutolinkSupport(
false))
5338 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast.get());
5342 std::visit(visitor,astImpl->root);
5347 int l=
static_cast<int>(result.
length());
5351 if (charCnt>=80)
break;
5358 if (result.
at(i)==
',' ||
5359 result.
at(i)==
'.' ||
5360 result.
at(i)==
'!' ||
5361 result.
at(i)==
'?' ||
5369 if ( i < l) result=result.
left(i)+
"...";
5370 return result.
data();
5389 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast.get());
5397 std::visit(visitor,astImpl->root);
5414 if (al.
empty())
return;
5431 .setIndexWords(
true));
5441#ifdef TRACINGSUPPORT
5442 void *backtraceFrames[128];
5443 int frameCount = backtrace(backtraceFrames, 128);
5444 const size_t cmdLen = 40960;
5445 static char cmd[cmdLen];
5447 p +=
qsnprintf(p,cmdLen,
"/usr/bin/atos -p %d ", (
int)getpid());
5448 for (
int x = 0; x < frameCount; x++)
5450 p +=
qsnprintf(p,cmdLen,
"%p ", backtraceFrames[x]);
5452 fprintf(stderr,
"========== STACKTRACE START ==============\n");
5456 while (
size_t len = fread(resBuf, 1,
sizeof(resBuf), fp))
5458 fwrite(resBuf, 1, len, stderr);
5462 fprintf(stderr,
"============ STACKTRACE END ==============\n");
5471 if (
qstricmp(inputEncoding,outputEncoding)==0)
return;
5473 if (cd==
reinterpret_cast<void *
>(-1))
5475 term(
"unsupported character conversion: '{}'->'{}': {}\n"
5476 "Check the INPUT_ENCODING setting in the config file!\n",
5477 inputEncoding,outputEncoding,strerror(errno));
5479 size_t iLeft = contents.size();
5480 const char *srcPtr = contents.data();
5481 size_t tmpBufSize = contents.size()*4+1;
5482 size_t oLeft = tmpBufSize;
5484 tmpBuf.resize(tmpBufSize);
5485 char *dstPtr = tmpBuf.data();
5489 newSize = tmpBufSize-oLeft;
5490 tmpBuf.resize(newSize);
5491 std::swap(contents,tmpBuf);
5496 term(
"{}: failed to translate characters from {} to {}: check INPUT_ENCODING\n",
5497 fileName,inputEncoding,outputEncoding);
5509 if (filterName.
isEmpty() || !filter)
5514 err(
"could not open file {}\n",fileName);
5518 auto fileSize = fi.
size();
5519 contents.resize(fileSize);
5520 f.read(contents.data(),fileSize);
5523 err(
"problems while reading file {}\n",fileName);
5529 QCString cmd=filterName+
" \""+fileName+
"\"";
5534 err(
"could not execute filter {}\n",filterName);
5537 const int bufSize=4096;
5540 while ((numRead=
static_cast<int>(fread(buf,1,bufSize,f)))>0)
5543 contents.append(buf,numRead);
5550 if (contents.size()>=2 &&
5551 static_cast<uint8_t
>(contents[0])==0xFF &&
5552 static_cast<uint8_t
>(contents[1])==0xFE
5557 else if (contents.size()>=2 &&
5558 static_cast<uint8_t
>(contents[0])==0xFE &&
5559 static_cast<uint8_t
>(contents[1])==0xFF
5564 else if (contents.size()>=3 &&
5565 static_cast<uint8_t
>(contents[0])==0xEF &&
5566 static_cast<uint8_t
>(contents[1])==0xBB &&
5567 static_cast<uint8_t
>(contents[2])==0xBF
5570 contents.erase(0,3);
5586 std::string t = title.
str();
5587 static const reg::Ex re(R
"(%[a-z_A-Z]+)");
5591 for (; it!=
end ; ++it)
5593 const auto &match = *it;
5594 size_t i = match.position();
5595 size_t l = match.length();
5596 if (i>p) tf+=t.substr(p,i-p);
5597 tf+=match.str().substr(1);
5606template<
class PatternList,
class PatternElem,
typename PatternGet = QCString(*)(const PatternElem &)>
5608 const PatternList &patList,
5615 if (!patList.empty())
5621 for (
const auto &li : patList)
5623 std::string pattern = getter(li).str();
5624 if (!pattern.empty())
5626 size_t i=pattern.find(
'=');
5627 if (i!=std::string::npos) pattern=pattern.substr(0,i);
5629 if (!caseSenseNames)
5660 auto getter = [](std::string s) ->
QCString {
return s; };
5681 if (extLinksInWindow)
5682 return "target=\"_blank\" ";
5684 return "target=\"_parent\" ";
5701 if (!targetFileName.
isEmpty())
5706 if (!anchor.
isEmpty() && isLocalFile)
5717 if (!anchor.
isEmpty()) url+=
"#"+anchor;
5730 result = it->second;
5731 size_t l = result.
length();
5732 if (!relPath.
isEmpty() && l>0 && result.
at(0)==
'.')
5737 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
5738 if (!href) result.
append(
"\" ");
5761 if (!img.
save(fileName))
5763 fprintf(stderr,
"Warning: Cannot open file %s for writing\n",data->
name);
5779 std::string s=str.
str();
5780 static const reg::Ex re(R
"(##[0-9A-Fa-f][0-9A-Fa-f])");
5786 size_t sl=s.length();
5788 for (; it!=
end ; ++it)
5790 const auto &match = *it;
5791 size_t i = match.position();
5792 size_t l = match.length();
5793 if (i>p) result+=s.substr(p,i-p);
5794 std::string lumStr = match.str().substr(2);
5795#define HEXTONUM(x) (((x)>='0' && (x)<='9') ? ((x)-'0') : \
5796 ((x)>='a' && (x)<='f') ? ((x)-'a'+10) : \
5797 ((x)>='A' && (x)<='F') ? ((x)-'A'+10) : 0)
5799 double r = 0,g = 0,b = 0;
5802 pow(level/255.0,gamma/100.0),&r,&g,&b);
5803 int red =
static_cast<int>(r*255.0);
5804 int green =
static_cast<int>(g*255.0);
5805 int blue =
static_cast<int>(b*255.0);
5808 colStr[1]=
hex[red>>4];
5809 colStr[2]=
hex[red&0xf];
5810 colStr[3]=
hex[green>>4];
5811 colStr[4]=
hex[green&0xf];
5812 colStr[5]=
hex[blue>>4];
5813 colStr[6]=
hex[blue&0xf];
5819 if (p<sl) result+=s.substr(p);
5830 err(
"could not copy file {} to {}\n",src,dest);
5844 int m1 = text.
find(marker);
5845 if (m1==-1)
return result;
5850 while (!found && (i=text.
find(
'\n',p))!=-1)
5852 found = (p<=m1 && m1<i);
5868 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp || lang==SrcLangExt::VHDL || lang==SrcLangExt::Python)
5872 else if (lang==SrcLangExt::PHP && !classScope)
5884 static const std::unordered_set<std::string> schemes = {
5885 "http",
"https",
"ftp",
"ftps",
"sftp",
"file",
"news",
"irc",
"ircs"
5888 int colonPos = loc_url.
find(
':');
5889 return colonPos!=-1 && schemes.find(loc_url.
left(colonPos).
str())!=schemes.end();
5911 return (prot!=Protection::Private && prot!=Protection::Package) ||
5912 (prot==Protection::Private && extractPrivate) ||
5913 (prot==Protection::Package && extractPackage);
5924 const char *p=s.
data();
5927 int minIndent=1000000;
5928 bool searchIndent=
true;
5930 bool skipFirst = skipFirstLine;
5933 if (c==
'\t') { indent+=tabSize - (indent%tabSize); }
5934 else if (c==
'\n') { indent=0; searchIndent=
true; skipFirst=
false; }
5935 else if (c==
' ') { indent++; }
5936 else if (searchIndent && !skipFirst)
5939 if (indent<minIndent) minIndent=indent;
5944 if (minIndent==0)
return substitute(s,
"@ilinebr",
"\\ilinebr");
5950 skipFirst=skipFirstLine;
5959 else if (indent<minIndent && !skipFirst)
5963 int newIndent = indent+tabSize-(indent%tabSize);
5977 else if (c==
'\\' &&
literal_at(p,
"ilinebr "))
5980 result <<
"\\ilinebr ";
5983 for (
int j=0;j<minIndent;j++)
if (*(p+j)==
' ') skipAmount++;
5984 if (skipAmount==minIndent)
5991 result <<
"\\ilinebr";
6002 return result.
str();
6010 if (indentationLevel <= 0 || doc.
isEmpty())
return;
6015 const char *src = doc.
data();
6017 bool insideIndent = !skipFirstLine;
6019 if (!skipFirstLine) cnt = indentationLevel;
6027 insideIndent =
true;
6028 cnt = indentationLevel;
6039 insideIndent =
false;
6049 insideIndent =
false;
6054 doc.
resize(
static_cast<uint32_t
>(dst-doc.
data()));
6063 return ( ((allExternals && fd->
isLinkable()) ||
6081uint32_t getUtf8Code(
const QCString& s,
int idx )
6083 const int length = s.
length();
6084 if (idx >= length) {
return 0; }
6085 const uint32_t c0 = (uint8_t)s.
at(idx);
6086 if ( c0 < 0xC2 || c0 >= 0xF8 )
6090 if (idx+1 >= length) {
return 0; }
6091 const uint32_t c1 = ((uint8_t)s.
at(idx+1)) & 0x3f;
6094 return ((c0 & 0x1f) << 6) | c1;
6096 if (idx+2 >= length) {
return 0; }
6097 const uint32_t c2 = ((uint8_t)s.
at(idx+2)) & 0x3f;
6100 return ((c0 & 0x0f) << 12) | (c1 << 6) | c2;
6102 if (idx+3 >= length) {
return 0; }
6104 const uint32_t c3 = ((uint8_t)s.
at(idx+3)) & 0x3f;
6105 return ((c0 & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
6117uint32_t getUtf8CodeToLower(
const QCString& s,
int idx )
6119 const uint32_t v = getUtf8Code( s, idx );
6120 return v < 0x7f ? tolower( v ) : v;
6132uint32_t getUtf8CodeToUpper(
const QCString& s,
int idx )
6134 const uint32_t v = getUtf8Code( s, idx );
6135 return v < 0x7f ? toupper( v ) : v;
6149 std::string s = docs.
str();
6150 static const reg::Ex re(R
"(\[([ inout,]+)\])");
6155 const auto &match = *it;
6156 size_t p = match.position();
6157 size_t l = match.length();
6161 std::string dir = match[1].str();
6163 dir.erase(std::remove_if(dir.begin(),dir.end(),
6164 [](
const char c) { return c==
' ' || c==
','; }
6166 unsigned char ioMask=0;
6167 size_t inIndex = dir.find(
"in");
6168 if ( inIndex!=std::string::npos) { dir.erase( inIndex,2); ioMask|=(1<<0); }
6169 size_t outIndex = dir.find(
"out");
6170 if (outIndex!=std::string::npos) { dir.erase(outIndex,3); ioMask|=(1<<1); }
6171 if (dir.empty() && ioMask!=0)
6174 if (ioMask==((1<<0)|(1<<1)))
return "[in,out]";
6175 else if (ioMask==(1<<0))
return "[in]";
6176 else if (ioMask==(1<<1))
return "[out]";
6208 *outListType1=inListType;
6211 if (inProt==Protection::Public)
6218 else if (inProt==Protection::Protected)
6226 *outListType2=inListType.
toPublic();
6229 else if (inProt==Protection::Private)
6239 *outListType1=inListType.
toPublic();
6261 int i= imgExt.
find(
':');
6262 return i==-1 ? imgExt : imgExt.
left(i);
6267 assert(!f.is_open());
6268 bool fileOpened=
FALSE;
6269 bool writeToStdout=outFile==
"-";
6272 f.basic_ios<char>::rdbuf(std::cout.rdbuf());
6287 fileOpened = f.is_open();
6294 static const std::unordered_set<std::string> fortran_C_keywords = {
6295 "character",
"call",
"close",
"common",
"continue",
6296 "case",
"contains",
"cycle",
"class",
"codimension",
6297 "concurrent",
"contiguous",
"critical"
6300 if (*contents !=
'c' && *contents !=
'C')
return false;
6302 const char *c = contents;
6304 while (*c && *c !=
' ') {keyword += *c; c++;}
6305 keyword = keyword.
lower();
6307 return (fortran_C_keywords.find(keyword.
str()) != fortran_C_keywords.end());
6315 bool skipLine=
FALSE;
6321 size_t sizCont = contents.
length();
6322 for (
size_t i=0;i<sizCont;i++)
6326 switch(contents.
at(i))
6333 column += tabSize-1;
6350 if (column==1)
return TRUE;
6351 if (skipLine)
break;
6354 if (column!=6) skipLine=
TRUE;
6357 if (skipLine)
break;
6358 if (column>=7)
return TRUE;
6383 auto skipBlock = [&markerInfo](
const char *p,
const SelectionBlock &blk)
6390 size_t len = markerInfo.
endLen;
6391 bool negate = *(p+markerInfo.
endLen)==
'!';
6393 size_t blkNameLen =
qstrlen(blk.name);
6394 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6398 return p+len+blkNameLen+markerInfo.
closeLen;
6415 const char *p = s.
data();
6425 bool negate = *(p+len)==
'!';
6427 for (
const auto &blk : blockList)
6429 size_t blkNameLen =
qstrlen(blk.name);
6430 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6433 bool blockEnabled = blk.enabled!=negate;
6435 p+=len+blkNameLen+markerInfo.
closeLen;
6454 size_t len = markerInfo.
endLen;
6455 bool negate = *(p+len)==
'!';
6457 for (
const auto &blk : blockList)
6459 size_t blkNameLen =
qstrlen(blk.name);
6460 if (
qstrncmp(p+len,blk.name,blkNameLen)==0 &&
6464 p+=len+blkNameLen+markerInfo.
closeLen;
6495 const char *p = s.
data();
6504 bool negate = *(p+len)==
'!';
6510 if (markerInfo.
closeLen==0 && *p==
'\n')
6512 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
6518 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
6527 size_t len = markerInfo.
endLen;
6528 bool negate = *(p+len)==
'!';
6534 if (markerInfo.
closeLen==0 && *p==
'\n')
6536 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
6542 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
6559 const char *p=s.
data();
6568 while (*e==
' ' || *e==
'\t') e++;
6590 size_t prev = 0, pos = 0, len = s.length();
6593 pos = s.find(delimiter, prev);
6594 if (pos == std::string::npos) pos = len;
6595 if (pos>prev) result.push_back(s.substr(prev,pos-prev));
6596 prev = pos + delimiter.length();
6598 while (pos<len && prev<len);
6610 for ( ; iter !=
end; ++iter)
6612 const auto &match = *iter;
6613 size_t i=match.position();
6614 size_t l=match.length();
6615 if (i>p) result.push_back(s.substr(p,i-p));
6618 if (p<s.length()) result.push_back(s.substr(p));
6625 auto it = std::find(sv.begin(),sv.end(),s);
6626 return it!=sv.end() ?
static_cast<int>(it-sv.begin()) : -1;
6634 return reg::search(s,match,re) ?
static_cast<int>(match.position()) : -1;
6642 for (
const auto &s : sv)
6644 if (!first) result+=delimiter;
6658 while (residual > 0)
6660 modVal[0] = (upper ?
'A':
'a') + (residual-1)%26;
6661 result = modVal + result;
6662 residual = (residual-1) / 26;
6669 static const char *str_romans_upper[] = {
"M",
"CM",
"D",
"CD",
"C",
"XC",
"L",
"XL",
"X",
"IX",
"V",
"IV",
"I" };
6670 static const char *str_romans_lower[] = {
"m",
"cm",
"d",
"cd",
"c",
"xc",
"l",
"xl",
"x",
"ix",
"v",
"iv",
"i" };
6671 static const int values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
6672 static const char **str_romans = upper ? str_romans_upper : str_romans_lower;
6677 for (
int i = 0; i < 13; ++i)
6679 while (residual - values[i] >= 0)
6681 result += str_romans[i];
6682 residual -= values[i];
6692 size_t size = s.
length();
6695 const char *data = s.
data();
6698 constexpr auto doxy_nbsp =
"&_doxy_nbsp;";
6699 const int maxIndent=1000000;
6700 int minIndent=maxIndent;
6709 int stop = tabSize - (col%tabSize);
6712 while (stop--) result+=
' ';
6716 if (data[i] ==
'\\')
6722 else if (i+5<size &&
literal_at(data+i,
"iskip"))
6727 else if (i+8<size &&
literal_at(data+i,
"endiskip"))
6759 for (
int j=0;j<bytes-1 && c;j++)
6771 if (!skip && col<minIndent) minIndent=col;
6775 if (minIndent!=maxIndent) refIndent=minIndent;
else refIndent=0;
6784 uint8_t md5_sig[16];
6786 MD5Buffer(projectCookie.
data(),
static_cast<unsigned int>(projectCookie.
length()),md5_sig);
6787 MD5SigToString(md5_sig,sigStr);
6788 sigStr[32]=
'_'; sigStr[33]=0;
6795 int l =
static_cast<int>(name.
length());
6796 int lastSepPos = -1;
6797 const char *p = name.
data();
6806 if (sharpCount==0 && p[i+1]==
':' && p[i+2]==
':')
6820 if (ts==-1) ts=0;
else p+=++ts;
6821 for (i=ts;i<l-1;i++)
6824 if (c==
':' && *p==
':') lastSepPos=i;
6859 case '\t': col+=tabSize - (col%tabSize);
6868 for (
int i=0;i<numBytes-1 && (c=*s++);i++) {}
6869 if (c==0)
return col;
6884 int idx = name.
find(
'<');
6897 int idx = result.
find(
'-');
6898 result = result.
left(idx)+templArgs;
6906 int i = text.
find(
'"');
6930 uint8_t md5_sig[16];
6932 MD5Buffer(content.
data(),
static_cast<unsigned int>(content.
length()),md5_sig);
6933 MD5SigToString(md5_sig,sigStr);
6935 QCString fileName = baseName + sigStr + extension;
6945 file.write( content.
data(), content.
length() );
6950 err(
"Could not open file {} for writing\n",fileName);
This class represents an function or template argument list.
RefQualifierType refQualifier() const
bool pureSpecifier() const
bool hasParameters() const
bool hasDocumentation() const
QCString trailingReturnType() const
typename Vec::const_iterator const_iterator
bool constSpecifier() const
bool hasTemplateDocumentation() const
bool volatileSpecifier() const
A abstract class representing of a compound symbol.
virtual const ArgumentList & templateArguments() const =0
Returns the template arguments of this class.
virtual bool isTemplate() const =0
Returns TRUE if this class is a template.
virtual const BaseClassList & baseClasses() const =0
Returns the list of base classes from which this class directly inherits.
virtual QCString qualifiedNameWithTemplateParameters(const ArgumentLists *actualParams=nullptr, uint32_t *actualParamIndex=nullptr) const =0
virtual FileDef * getFileDef() const =0
Returns the namespace this compound is in, or 0 if it has a global scope.
virtual bool isUsedOnly() const =0
Class representing a bitmap image colored based on hue/sat/gamma settings.
static void hsl2rgb(double h, double s, double l, double *pRed, double *pGreen, double *pBlue)
bool save(const QCString &fileName)
virtual const FileDef * getFileDef() const =0
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
The common base class of all entity definitions found in the sources.
virtual QCString docFile() const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual int docLine() const =0
virtual bool isLinkable() const =0
virtual DefType definitionType() const =0
virtual QCString anchor() const =0
virtual bool isLinkableInProject() const =0
virtual const Definition * findInnerCompound(const QCString &name) const =0
virtual QCString getReference() const =0
virtual const GroupList & partOfGroups() const =0
virtual QCString qualifiedName() const =0
virtual QCString displayName(bool includeScope=TRUE) const =0
virtual bool isArtificial() const =0
virtual QCString getOutputFileBase() const =0
virtual Definition * getOuterScope() const =0
virtual int getStartBodyLine() const =0
virtual bool isReference() const =0
virtual const QCString & name() const =0
virtual void setBodySegment(int defLine, int bls, int ble)=0
virtual void setDocumentation(const QCString &d, const QCString &docFile, int docLine, bool stripWhiteSpace=TRUE)=0
virtual void setLanguage(SrcLangExt lang)=0
virtual void setReference(const QCString &r)=0
virtual void setRefItems(const RefItemVector &sli)=0
A model of a directory symbol.
Class representing a directory in the file system.
bool mkdir(const std::string &path, bool acceptsAbsPath=true) const
bool remove(const std::string &path, bool acceptsAbsPath=true) const
bool isEmpty(const std::string &subdir) const
bool rmdir(const std::string &path, bool acceptsAbsPath=true) const
bool rename(const std::string &orgName, const std::string &newName, bool acceptsAbsPath=true) const
static std::string cleanDirPath(const std::string &path)
Class representing the abstract syntax tree of a documentation block.
static NamespaceLinkedMap * namespaceLinkedMap
static ConceptLinkedMap * conceptLinkedMap
static std::unique_ptr< PageDef > mainPage
static FileNameLinkedMap * inputNameLinkedMap
static ParserManager * parserManager
static InputFileEncodingList inputFileEncodingList
static MemberNameLinkedMap * functionNameLinkedMap
static PageLinkedMap * exampleLinkedMap
static NamespaceDefMutable * globalScope
static MemberGroupInfoMap memberGroupInfoMap
static IndexList * indexList
static StringMap tagDestinationMap
static QCString htmlFileExtension
static PageLinkedMap * pageLinkedMap
static DirLinkedMap * dirLinkedMap
static MemberNameLinkedMap * memberNameLinkedMap
static SymbolMap< Definition > * symbolMap
static FileNameLinkedMap * exampleNameLinkedMap
static GroupLinkedMap * groupLinkedMap
Wrapper class for the Entry type.
A model of a file symbol.
virtual ModuleDef * getModuleDef() const =0
virtual QCString getPath() const =0
virtual bool generateSourceFile() const =0
virtual QCString absFilePath() const =0
virtual bool isDocumentationFile() const =0
Minimal replacement for QFileInfo.
std::string extension(bool complete) const
std::string fileName() const
std::string dirPath(bool absPath=true) const
std::string filePath() const
std::string absFilePath() const
Class representing all files with a certain base name.
Ordered dictionary of FileName objects.
A model of a group of symbols.
virtual void addPage(PageDef *def)=0
Generator for HTML code fragments.
Concrete visitor implementation for HTML output.
static HtmlEntityMapper & instance()
Returns the one and only instance of the HTML entity mapper.
SymType name2sym(const QCString &symName) const
Give code of the requested HTML entity name.
const T * find(const std::string &key) const
A model of a class/file/namespace member symbol.
virtual QCString typeString() const =0
virtual bool isRelated() const =0
virtual const ClassDef * getClassDef() const =0
virtual bool hasReferencesRelation() const =0
virtual GroupDef * getGroupDef()=0
virtual bool isTypedef() const =0
virtual bool hasCallGraph() const =0
virtual const FileDef * getFileDef() const =0
virtual bool isStrongEnumValue() const =0
virtual bool hasInlineSource() const =0
virtual bool hasEnumValues() const =0
virtual const NamespaceDef * getNamespaceDef() const =0
virtual bool hasCallerGraph() const =0
virtual void setMemberGroup(MemberGroup *grp)=0
virtual bool isEnumerate() const =0
virtual bool hasReferencedByRelation() const =0
virtual bool isVariable() const =0
virtual QCString argsString() const =0
virtual void overrideReferencesRelation(bool e)=0
virtual void overrideReferencedByRelation(bool e)=0
virtual void overrideCallGraph(bool e)=0
virtual void overrideInlineSource(bool e)=0
virtual void overrideEnumValues(bool e)=0
virtual void overrideCallerGraph(bool e)=0
A class representing a group of members.
void insertMember(MemberDef *md)
A list of MemberDef objects as shown in documentation sections.
MemberListContainer container() const
Wrapper class for the MemberListType type.
constexpr bool isPrivate() const noexcept
constexpr MemberListType toPublic() const noexcept
static constexpr MemberListType Invalid() noexcept
constexpr MemberListType toProtected() const noexcept
constexpr bool isProtected() const noexcept
ML_TYPES constexpr bool isPublic() const noexcept
Ordered dictionary of MemberName objects.
void remove(const MemberDef *md)
static ModuleManager & instance()
An abstract interface of a namespace symbol.
Class representing a list of different code generators.
void add(OutputCodeIntfPtr &&p)
Class representing a list of output generators that are written to in parallel.
void endPageRef(const QCString &c, const QCString &a)
void writeString(const QCString &text)
void disable(OutputType o)
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name)
void startConstraintParam()
void docify(const QCString &s)
void generateDoc(const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &docStr, const DocOptions &options)
void startConstraintDocs()
void startConstraintType()
void pushGeneratorState()
void disableAllBut(OutputType o)
void endConstraintParam()
void startConstraintList(const QCString &header)
void parseText(const QCString &textStr)
A model of a page symbol.
virtual void setTitle(const QCString &title)=0
virtual void setNestingLevel(int)=0
virtual bool hasTitle() const =0
virtual void setFileName(const QCString &name)=0
virtual void setShowLineNo(bool)=0
virtual QCString title() const =0
virtual void setPageScope(Definition *)=0
virtual const GroupDef * getGroupDef() const =0
This is an alternative implementation of QCString.
int find(char c, int index=0, bool cs=TRUE) const
QCString & prepend(const char *s)
size_t length() const
Returns the length of the string, not counting the 0-terminator.
bool startsWith(const char *s) const
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
bool endsWith(const char *s) const
char & at(size_t i)
Returns a reference to the character at index i.
char * rawData()
Returns a writable pointer to the data.
bool isEmpty() const
Returns TRUE iff the string is empty.
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
void resize(size_t newlen)
const std::string & str() const
QCString & setNum(short n)
QCString simplifyWhiteSpace() const
return a copy of this string with leading and trailing whitespace removed and multiple whitespace cha...
QCString & append(char c)
QCString right(size_t len) const
void reserve(size_t size)
Reserve space for size bytes without changing the string contents.
QCString & sprintf(const char *format,...)
int findRev(char c, int index=-1, bool cs=TRUE) const
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
std::string_view view() const
QCString left(size_t len) const
int contains(char c, bool cs=TRUE) const
bool stripPrefix(const QCString &prefix)
This struct represents an item in the list of references.
class that provide information about a section.
Definition * definition() const
QCString fileName() const
void setTitle(const QCString &t)
SectionInfo * replace(const QCString &label, const QCString &fileName, int lineNr, const QCString &title, SectionType type, int level, const QCString &ref=QCString())
SectionInfo * add(const SectionInfo &si)
static SectionManager & instance()
returns a reference to the singleton
static constexpr int Page
int isAccessibleFrom(const Definition *scope, const Definition *item)
Checks if symbol item is accessible from within scope.
int isAccessibleFromWithExpScope(const Definition *scope, const Definition *item, const QCString &explicitScopePart)
Check if symbol item is accessible from within scope, where it has to match the explicitScopePart.
QCString getResolvedType() const
In case a call to resolveClass() points to a typedef or using declaration.
const Definition * resolveSymbol(const Definition *scope, const QCString &name, const QCString &args=QCString(), bool checkCV=false, bool insideCode=false, bool onlyLinkable=false)
Find the symbool definition matching name within the scope set.
const ClassDef * resolveClass(const Definition *scope, const QCString &name, bool maybeUnlinkable=false, bool mayBeHidden=false)
Find the class definition matching name within the scope set.
QCString getTemplateSpec() const
In case a call to resolveClass() points to a template specialization, the template part is return via...
void setFileScope(const FileDef *fd)
Sets or updates the file scope using when resolving symbols.
const MemberDef * getTypedef() const
In case a call to resolveClass() resolves to a type member (e.g.
Concrete visitor implementation for TEXT output.
Abstract interface for a hyperlinked text fragment.
virtual void writeString(std::string_view, bool) const =0
virtual void writeBreak(int indent) const =0
virtual void writeLink(const QCString &extRef, const QCString &file, const QCString &anchor, std::string_view text) const =0
Implements TextGeneratorIntf for an OutputDocInterface stream.
TextGeneratorOLImpl(OutputList &ol)
void writeBreak(int indent) const override
void writeLink(const QCString &extRef, const QCString &file, const QCString &anchor, std::string_view text) const override
void writeString(std::string_view s, bool keepSpaces) const override
Text streaming class that buffers data.
std::string str() const
Return the contents of the buffer as a std::string object.
ClassDef * getClass(const QCString &n)
ClassDef * toClassDef(Definition *d)
std::vector< BaseClassDef > BaseClassList
Class representing a regular expression.
@ Wildcard
simple globbing pattern.
Class to iterate through matches.
Object representing the matching results.
ConceptDef * toConceptDef(Definition *d)
ConceptDef * getConcept(const QCString &n)
#define Config_getInt(name)
#define Config_getList(name)
#define Config_getEnumAsString(name)
#define Config_getBool(name)
#define Config_getString(name)
#define Config_getEnum(name)
std::unordered_set< std::string > StringUnorderedSet
std::vector< std::string > StringVector
QCString formatDateTime(const QCString &format, const std::tm &dt, int &formatUsed)
Return a string representation for a given std::tm value that is formatted according to the pattern g...
QCString dateTimeFromString(const QCString &spec, std::tm &dt, int &format)
Returns the filled in std::tm for a given string representing a date and/or time.
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const QCString &argsString, QCString *extraTypeChars=nullptr)
DirIterator end(const DirIterator &) noexcept
static constexpr auto hex
#define AUTO_TRACE_ADD(...)
#define AUTO_TRACE_EXIT(...)
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &input, const DocOptions &options)
IDocParserPtr createDocParser()
factory function to create a parser
IDocNodeASTPtr validatingParseTitle(IDocParser &parserIntf, const QCString &fileName, int lineNr, const QCString &input)
static void addMembersToMemberGroup()
FileDef * toFileDef(Definition *d)
Translator * theTranslator
MemberDefMutable * toMemberDefMutable(Definition *d)
MemberDef * toMemberDef(Definition *d)
#define warn(file, line, fmt,...)
ModuleDef * toModuleDef(Definition *d)
std::ifstream openInputStream(const QCString &name, bool binary=false, bool openAtEnd=false)
FILE * popen(const QCString &name, const QCString &type)
std::ofstream openOutputStream(const QCString &name, bool append=false)
bool fileSystemIsCaseSensitive()
void replaceNamespaceAliases(QCString &name)
NamespaceDef * getResolvedNamespace(const QCString &name)
NamespaceDef * toNamespaceDef(Definition *d)
bool search(std::string_view str, Match &match, const Ex &re, size_t pos)
Search in a given string str starting at position pos for a match against regular expression re.
std::string replace(std::string_view str, const Ex &re, std::string_view replacement)
Searching in a given input string for parts that match regular expression re and replaces those parts...
bool match(std::string_view str, Match &match, const Ex &re)
Matches a given string str for a match against regular expression re.
Token literal values and constants.
std::unique_ptr< PageDef > createPageDef(const QCString &f, int l, const QCString &n, const QCString &d, const QCString &t)
Portable versions of functions that are platform dependent.
int portable_iconv_close(void *cd)
size_t portable_iconv(void *cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
void * portable_iconv_open(const char *tocode, const char *fromcode)
int qstricmp(const char *s1, const char *s2)
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
int qstrncmp(const char *str1, const char *str2, size_t len)
const char * qPrint(const char *s)
uint32_t qstrlen(const char *str)
Returns the length of string str, or 0 if a null pointer is passed.
std::vector< RefItem * > RefItemVector
Web server based search engine.
Some helper functions for std::string.
void addTerminalCharIfMissing(std::string &s, char c)
bool literal_at(const char *data, const char(&str)[N])
returns TRUE iff data points to a substring that matches string literal str
This class contains the information about the argument of a function or template.
Data associated with a HSV colored image.
const unsigned char * content
const unsigned char * alpha
Cache element for the file name to FileDef mapping cache.
FindFileCacheElem(FileDef *fd, bool ambig)
This struct is used to capture the tag file information for an Entry.
static constexpr const char * to_string(Protection prot) noexcept
int isUTF8NonBreakableSpace(const char *input)
Check if the first character pointed at by input is a non-breakable whitespace character.
uint8_t getUTF8CharNumBytes(char c)
Returns the number of bytes making up a single UTF8 character given the first byte in the sequence.
Various UTF8 related helper functions.
QCString writeFileContents(const QCString &baseName, const QCString &extension, const QCString &content, bool &exists)
Thread-safe function to write a string to a file.
QCString externalRef(const QCString &relPath, const QCString &ref, bool href)
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const QCString &srcReturnType, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const QCString &dstReturnType, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
QCString removeRedundantWhiteSpace(const QCString &s)
QCString extractDirection(QCString &docs)
Strip the direction part from docs and return it as a string in canonical form The input docs string ...
QCString mergeScopes(const QCString &leftScope, const QCString &rightScope)
QCString findFilePath(const QCString &file, bool &ambig)
QCString normalizeNonTemplateArgumentsInString(const QCString &name, const Definition *context, const ArgumentList &formalArgs)
QCString linkToText(SrcLangExt lang, const QCString &link, bool isFileName)
QCString convertToJSString(const QCString &s, bool keepEntities, bool singleQuotes)
size_t updateColumnCount(const char *s, size_t col)
static std::mutex writeFileContents_lock
void trimBaseClassScope(const BaseClassList &bcl, QCString &s, int level=0)
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
QCString insertTemplateSpecifierInScope(const QCString &scope, const QCString &templ)
bool protectionLevelVisible(Protection prot)
QCString generateAnonymousAnchor(const QCString &fileName, int count)
static std::unordered_map< std::string, QCString > g_docCache
QCString parseCommentAsHtml(const Definition *scope, const MemberDef *member, const QCString &doc, const QCString &fileName, int lineNr)
std::string join(const StringVector &sv, const std::string &delimiter)
create a string where the string in the vector are joined by the given delimiter
bool matchTemplateArguments(const ArgumentList &srcAl, const ArgumentList &dstAl)
int lineBlock(const QCString &text, const QCString &marker)
Returns the line number of the line following the line with the marker.
void addCodeOnlyMappings()
QCString convertToHtml(const QCString &s, bool keepEntities)
QCString substituteTemplateArgumentsInString(const QCString &nm, const ArgumentList &formalArgs, const ArgumentList *actualArgs)
static int g_usedNamesCount
static void filterCRLF(std::string &contents)
bool resolveRef(const QCString &scName, const QCString &name, bool inSeeBlock, const Definition **resContext, const MemberDef **resMember, SrcLangExt lang, bool lookForSpecialization, const FileDef *currentFile, bool checkScope)
QCString stripIndentation(const QCString &s, bool skipFirstLine)
QCString parseCommentAsText(const Definition *scope, const MemberDef *md, const QCString &doc, const QCString &fileName, int lineNr)
int extractClassNameFromType(const QCString &type, int &pos, QCString &name, QCString &templSpec, SrcLangExt lang)
QCString integerToRoman(int n, bool upper)
void checkBlocks(const QCString &s, const QCString fileName, const SelectionMarkerInfo &markerInfo)
void stripIndentationVerbatim(QCString &doc, const int indentationLevel, bool skipFirstLine)
void writeTypeConstraints(OutputList &ol, const Definition *d, const ArgumentList &al)
bool leftScopeMatch(const QCString &scope, const QCString &name)
QCString correctURL(const QCString &url, const QCString &relPath)
Corrects URL url according to the relative path relPath.
QCString stripAnonymousNamespaceScope(const QCString &s)
QCString stripPath(const QCString &s)
QCString stripFromIncludePath(const QCString &path)
static Cache< std::string, FindFileCacheElem > g_findFileDefCache(5000)
QCString removeEmptyLines(const QCString &s)
QCString extractEndRawStringDelimiter(const char *rawEnd)
static const char constScope[]
static bool recursivelyAddGroupListToTitle(OutputList &ol, const Definition *d, bool root)
bool containsWord(const QCString &str, const char *word)
returns TRUE iff string s contains word w
bool checkIfTypedef(const Definition *scope, const FileDef *fileScope, const QCString &n)
bool readInputFile(const QCString &fileName, std::string &contents, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
bool transcodeCharacterStringToUTF8(std::string &input, const char *inputEncoding)
static bool matchCanonicalTypes(const Definition *srcScope, const FileDef *srcFileScope, const QCString &srcType, const Definition *dstScope, const FileDef *dstFileScope, const QCString &dstType, SrcLangExt lang)
bool patternMatch(const FileInfo &fi, const StringVector &patList)
void generateFileRef(OutputList &ol, const QCString &name, const QCString &text)
QCString generateMarker(int id)
QCString selectBlocks(const QCString &s, const SelectionBlockList &blockList, const SelectionMarkerInfo &markerInfo)
remove disabled blocks and all block markers from s and return the result as a string
static std::mutex g_findFileDefMutex
QCString escapeCharsInString(const QCString &name, bool allowDots, bool allowUnderscore)
static std::unordered_map< std::string, SrcLangExt > g_extLookup
static QCString stripDeclKeywords(const QCString &s)
bool recognizeFixedForm(const QCString &contents, FortranFormat format)
bool openOutputFile(const QCString &outFile, std::ofstream &f)
QCString substituteKeywords(const QCString &file, const QCString &s, const KeywordSubstitutionList &keywords)
static MemberDef * getMemberFromSymbol(const Definition *scope, const FileDef *fileScope, const QCString &n)
QCString tempArgListToString(const ArgumentList &al, SrcLangExt lang, bool includeDefault)
static ModuleDef * findModuleDef(const Definition *d)
void addRefItem(const RefItemVector &sli, const QCString &key, const QCString &prefix, const QCString &name, const QCString &title, const QCString &args, const Definition *scope)
void addGroupListToTitle(OutputList &ol, const Definition *d)
QCString relativePathToRoot(const QCString &name)
SrcLangExt getLanguageFromCodeLang(QCString &fileName)
Routine to handle the language attribute of the \code command.
QCString integerToAlpha(int n, bool upper)
void writePageRef(OutputList &ol, const QCString &cn, const QCString &mn)
void clearSubDirs(const Dir &d)
static void transcodeCharacterBuffer(const QCString &fileName, std::string &contents, const QCString &inputEncoding, const QCString &outputEncoding)
QCString showFileDefMatches(const FileNameLinkedMap *fnMap, const QCString &n)
QCString demangleCSharpGenericName(const QCString &name, const QCString &templArgs)
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
QCString stripExtensionGeneral(const QCString &fName, const QCString &ext)
QCString filterTitle(const QCString &title)
QCString unescapeCharsInString(const QCString &s)
QCString removeAnonymousScopes(const QCString &str)
void createSubDirs(const Dir &d)
bool fileVisibleInIndex(const FileDef *fd, bool &genSourceFile)
QCString stripScope(const QCString &name)
QCString resolveTypeDef(const Definition *context, const QCString &qualifiedName, const Definition **typedefContext)
bool checkExtension(const QCString &fName, const QCString &ext)
bool isURL(const QCString &url)
Checks whether the given url starts with a supported protocol.
QCString inlineTemplateArgListToDoc(const ArgumentList &al)
bool resolveLink(const QCString &scName, const QCString &lr, bool, const Definition **resContext, QCString &resAnchor, SrcLangExt lang, const QCString &prefix)
int computeQualifiedIndex(const QCString &name)
Return the index of the last :: in the string name that is still before the first <.
QCString stripExtension(const QCString &fName)
void initDefaultExtensionMapping()
bool findAndRemoveWord(QCString &sentence, const char *word)
removes occurrences of whole word from sentence, while keeps internal spaces and reducing multiple se...
static QCString stripFromPath(const QCString &p, const StringVector &l)
QCString convertNameToFile(const QCString &name, bool allowDots, bool allowUnderscore)
static bool isLowerCase(QCString &s)
static const char virtualScope[]
QCString convertToXML(const QCString &s, bool keepEntities)
QCString langToString(SrcLangExt lang)
Returns a string representation of lang.
QCString determineAbsoluteIncludeName(const QCString &curFile, const QCString &incFileName)
QCString detab(const QCString &s, size_t &refIndent)
EntryType guessSection(const QCString &name)
void extractNamespaceName(const QCString &scopeName, QCString &className, QCString &namespaceName, bool allowEmptyClass)
static StringUnorderedSet writeFileContents_set
void convertProtectionLevel(MemberListType inListType, Protection inProt, MemberListType *outListType1, MemberListType *outListType2)
Computes for a given list type inListType, which are the the corresponding list type(s) in the base c...
static const char volatileScope[]
QCString argListToString(const ArgumentList &al, bool useCanonicalType, bool showDefVals)
int findIndex(const StringVector &sv, const std::string &s)
find the index of a string in a vector of strings, returns -1 if the string could not be found
static void stripIrrelevantString(QCString &target, const QCString &str, bool insideTemplate)
QCString removeLongPathMarker(QCString path)
QCString correctId(const QCString &s)
static QCString extractCanonicalArgType(const Definition *d, const FileDef *fs, const Argument &arg, SrcLangExt lang)
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
void mergeMemberOverrideOptions(MemberDefMutable *md1, MemberDefMutable *md2)
static int nextUTF8CharPosition(const QCString &utf8Str, uint32_t len, uint32_t startPos)
QCString getDotImageExtension()
static QCString extractCanonicalType(const Definition *d, const FileDef *fs, QCString type, SrcLangExt lang, bool insideTemplate)
static QCString getCanonicalTypeForIdentifier(const Definition *d, const FileDef *fs, const QCString &word, SrcLangExt lang, QCString *tSpec, int count=0)
QCString mangleCSharpGenericName(const QCString &name)
GetDefResult getDefs(const GetDefInput &input)
QCString makeBaseName(const QCString &name, const QCString &ext)
QCString projectLogoFile()
static std::mutex g_usedNamesMutex
PageDef * addRelatedPage(const QCString &name, const QCString &ptitle, const QCString &doc, const QCString &fileName, int docLine, int startLine, const RefItemVector &sli, GroupDef *gd, const TagInfo *tagInfo, bool xref, SrcLangExt lang)
static bool matchArgument2(const Definition *srcScope, const FileDef *srcFileScope, Argument &srcA, const Definition *dstScope, const FileDef *dstFileScope, Argument &dstA, SrcLangExt lang)
void mergeArguments(ArgumentList &srcAl, ArgumentList &dstAl, bool forceNameOverwrite)
StringVector split(const std::string &s, const std::string &delimiter)
split input string s by string delimiter delimiter.
QCString getEncoding(const FileInfo &fi)
static std::mutex g_docCacheMutex
static bool keyWordsFortranC(const char *contents)
FortranFormat convertFileNameFortranParserCode(QCString fn)
static QCString getCanonicalTemplateSpec(const Definition *d, const FileDef *fs, const QCString &spec, SrcLangExt lang)
bool genericPatternMatch(const FileInfo &fi, const PatternList &patList, PatternElem &elem, PatternGet getter)
QCString stripLeadingAndTrailingEmptyLines(const QCString &s, int &docLine)
Special version of QCString::stripWhiteSpace() that only strips completely blank lines.
int findParameterList(const QCString &name)
Returns the position in the string where a function parameter list begins, or -1 if one is not found.
bool copyFile(const QCString &src, const QCString &dest)
Copies the contents of file with name src to the newly created file with name dest.
QCString externalLinkTarget(const bool parent)
QCString getFileFilter(const QCString &name, bool isSourceCode)
void stripIrrelevantConstVolatile(QCString &s, bool insideTemplate)
QCString extractBeginRawStringDelimiter(const char *rawStart)
QCString stripTemplateSpecifiersFromScope(const QCString &fullName, bool parentOnly, QCString *pLastScopeStripped, QCString scopeName, bool allowArtificial)
QCString getOverloadDocs()
static QCString getFilterFromList(const QCString &name, const StringVector &filterList, bool &found)
static QCString projectLogoSize()
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