27#include <unordered_set>
65#define ENABLE_TRACINGSUPPORT 0
67#if defined(__APPLE__) && ENABLE_TRACINGSUPPORT
78#define REL_PATH_TO_ROOT "../../"
80static const char *
hex =
"0123456789ABCDEF";
101 if (str.
empty())
return result;
104 auto startsWithColon = [](
const std::string &del)
106 for (
size_t i=0;i<del.size();i++)
108 if (del[i]==
'@')
return false;
109 else if (del[i]==
':')
return true;
115 auto endsWithColon = [](
const std::string &del)
117 for (
int i=
static_cast<int>(del.size())-1;i>=0;i--)
119 if (del[i]==
'@')
return false;
120 else if (del[i]==
':')
return true;
125 static const reg::Ex re(R
"([\s:]*@\d+[\s:]*)");
126 std::string s = str.str();
130 size_t sl=s.length();
131 bool needsSeparator=
false;
132 for ( ; iter!=
end ; ++iter)
134 const auto &match = *iter;
135 size_t i = match.position();
138 if (needsSeparator) result+=
"::";
139 needsSeparator=
false;
140 result+=s.substr(p,i-p);
142 std::string delim = match.str();
143 needsSeparator = needsSeparator || (startsWithColon(delim) && endsWithColon(delim));
144 p = match.position()+match.length();
148 if (needsSeparator) result+=
"::";
157 if (s.
empty())
return s;
158 static const reg::Ex marker(R
"(@\d+)");
160 !replacement.empty() ? replacement.data() : "__anonymous__");
171 int sl =
static_cast<int>(s.
length());
179 if (!newScope.
empty()) newScope+=
"::";
180 newScope+=s.
mid(i,l);
185 if (!newScope.
empty()) newScope+=
"::";
186 newScope+=s.
right(sl-i);
202 for (
const auto &s : l)
205 if (
prefix.length() > length &&
212 if (length>0)
return potential;
235 AUTO_TRACE(
"context='{}' qualifiedName='{}'",context?context->
name():
"",qualifiedName);
237 if (qualifiedName.
empty())
244 if (typedefContext) *typedefContext=context;
252 size_t scopeIndex = qualifiedName.
rfind(
"::");
256 resName=qualifiedName.
mid(scopeIndex+2);
264 while (mContext && md==
nullptr)
271 DString resScopeName = qualifiedName.
left(scopeIndex);
278 DString qualScopePart = resScopeName.
mid(is,l);
280 if (!tmp.
empty()) qualScopePart=tmp;
283 if (resScope==
nullptr)
break;
295 bool searchRelated=
false;
296 bool mustBeRelated=
false;
307 if (mn==0 && searchRelated)
315 for (
const auto &tmd_p : *mn)
318 AUTO_TRACE_ADD(
"found candidate member '{}' isTypeDef={}' isRelated={} mustBeRelated={}",
333 if (dist!=-1 && (md==
nullptr || dist<minDist))
379static const char constScope[] = {
'c',
'o',
'n',
's',
't',
':' };
380static const char volatileScope[] = {
'v',
'o',
'l',
'a',
't',
'i',
'l',
'e',
':' };
381static const char virtualScope[] = {
'v',
'i',
'r',
't',
'u',
'a',
'l',
':' };
382static const char operatorScope[] = {
'o',
'p',
'e',
'r',
'a',
't',
'o',
'r',
'?',
'?',
'?' };
388 charMap[
static_cast<int>(
'(')].before=
false;
389 charMap[
static_cast<int>(
'=')].before=
false;
390 charMap[
static_cast<int>(
'&')].before=
false;
391 charMap[
static_cast<int>(
'*')].before=
false;
392 charMap[
static_cast<int>(
'[')].before=
false;
393 charMap[
static_cast<int>(
'|')].before=
false;
394 charMap[
static_cast<int>(
'+')].before=
false;
395 charMap[
static_cast<int>(
';')].before=
false;
396 charMap[
static_cast<int>(
':')].before=
false;
397 charMap[
static_cast<int>(
'/')].before=
false;
399 charMap[
static_cast<int>(
'=')].after=
false;
400 charMap[
static_cast<int>(
' ')].after=
false;
401 charMap[
static_cast<int>(
'[')].after=
false;
402 charMap[
static_cast<int>(
']')].after=
false;
403 charMap[
static_cast<int>(
'\t')].after=
false;
404 charMap[
static_cast<int>(
'\n')].after=
false;
405 charMap[
static_cast<int>(
')')].after=
false;
406 charMap[
static_cast<int>(
',')].after=
false;
407 charMap[
static_cast<int>(
'<')].after=
false;
408 charMap[
static_cast<int>(
'|')].after=
false;
409 charMap[
static_cast<int>(
'+')].after=
false;
410 charMap[
static_cast<int>(
'(')].after=
false;
411 charMap[
static_cast<int>(
'/')].after=
false;
438 if (s.
length()*3>growBufLen)
440 growBufLen = s.
length()*3;
441 growBuf =
static_cast<char *
>(realloc(growBuf,growBufLen+1));
443 if (growBuf==
nullptr)
return s;
445 const char *src=s.
data();
456 while (i<l && isspace(
static_cast<uint8_t
>(src[i])))
463 char nc=i+1<l ? src[i+1] :
' ';
465 auto searchForKeyword = [&](
const char *kw,
size_t &matchLen,
size_t totalLen)
467 if (matchLen<=totalLen && c==kw[matchLen] &&
502 if (c==
'\\' && i+1<l)
526 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
527 (
isId(pc) || pc==
'*' || pc==
'&' || pc==
'.' || pc==
'>') &&
528 (osp<8 || (osp==8 && pc!=
'-'))
534 if (i+1<l && (nc==
'-' || nc==
'&'))
541 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
542 ((i+1<l && (
isId(nc) || nc==
'[')) ||
543 (i+2<l && nc==
'$' &&
isId(src[i+2])) ||
544 (i+3<l && nc==
'&' && src[i+2]==
'$' &&
isId(src[i+3]))
554 if (cliSupport && i+1<l && (
isId(nc) || nc==
'-'))
561 if (i+1<l && (
isId(nc) || nc==
'-'))
567 if (i>0 && pc!=
' ' && pc!=
'\t' && pc!=
':' &&
568 pc!=
'*' && pc!=
'&' && pc!=
'(' && pc!=
'/' && pc!=
'[' &&
578 if (i>0 &&
isId(pc) && osp<9)
598 if (i>0 && i+1<l && pc!=
'=' && pc!=
':' && !isspace(
static_cast<uint8_t
>(pc)) &&
629 !(pc==
',' && nc==
'.') &&
630 (osp<8 || (osp>=8 &&
isId(pc) &&
isId(nc)))
638 else if ((pc==
'*' || pc==
'&' || pc==
'.') && nc==
'>')
646 auto correctKeywordAllowedInsideScope = [&](
char cc,
size_t &matchLen,
size_t totalLen) {
647 if (c==cc && matchLen==totalLen)
649 if ((i+2<l && src[i+1] ==
':' && src[i+2] ==
':') ||
650 ((i>matchLen && src[i-matchLen] ==
':' && src[i-matchLen-1] ==
':'))
654 correctKeywordAllowedInsideScope(
't',csp, 5);
655 correctKeywordAllowedInsideScope(
'e',vosp,8);
656 correctKeywordAllowedInsideScope(
'l',vsp, 7);
658 auto correctKeywordNotPartOfScope = [&](
char cc,
size_t &matchLen,
size_t totalLen)
660 if (c==cc && matchLen==totalLen && i+1<l &&
668 correctKeywordNotPartOfScope(
't',csp, 5);
669 correctKeywordNotPartOfScope(
'e',vosp,8);
670 correctKeywordNotPartOfScope(
'l',vsp, 7);
690 if (templateDepth > 0)
692 size_t nextOpenPos = name.
rfind(
'>', pos);
693 size_t nextClosePos = name.
rfind(
'<', pos);
711 size_t lastAnglePos = name.
rfind(
'>', pos);
712 size_t bracePos = name.
rfind(
'(', pos);
722 return bp==
DString::npos || (bp>=8 && name.
mid(bp-8,10)==
"operator()") ? bracePos : bp;
733 return (name==scope ||
734 (scope.
right(nl)==name &&
735 sl>1+nl && scope.
at(sl-nl-1)==
':' && scope.
at(sl-nl-2)==
':'
744 return (name==scope ||
745 (name.
left(sl)==scope &&
746 nl>sl+1 && name.
at(sl)==
':' && name.
at(sl+1)==
':'
754 std::function<
void(
size_t)> replaceFunc)
756 static const reg::Ex marker(R
"(@(\d+))");
760 for ( ; it!=
end ; ++it)
762 const auto &match = *it;
763 size_t newIndex = match.position();
764 size_t matchLen = match.length();
765 ol.
parseText(markerText.substr(index,newIndex-index));
766 unsigned long entryIndex = std::stoul(match[1].str());
767 if (entryIndex<
static_cast<unsigned long>(numMarkers))
769 replaceFunc(entryIndex);
771 index=newIndex+matchLen;
777 std::function<
DString(
size_t)> replaceFunc)
780 static const reg::Ex marker(R
"(@(\d+))");
784 for ( ; it!=
end ; ++it)
786 const auto &match = *it;
787 size_t newIndex = match.position();
788 size_t matchLen = match.length();
789 result += markerText.
substr(index,newIndex-index);
790 unsigned long entryIndex = std::stoul(match[1].str());
791 if (entryIndex<
static_cast<unsigned long>(numMarkers))
793 result+=replaceFunc(entryIndex);
795 index=newIndex+matchLen;
797 if (index<markerText.size())
799 result += markerText.
substr(index);
806 auto replaceFunc = [&list,&ol](
size_t entryIndex)
808 const auto &e = list[entryIndex];
843 paramDocs+=
" \\ilinebr @tparam "+a.name+
" "+a.docs;
845 else if (!a.type.empty())
851 paramDocs+=
" \\ilinebr @tparam "+type+
" "+a.docs;
864 for (
auto it = al.
begin() ; it!=al.
end() ;)
884 result+= type1+type2;
891 if (it!=al.
end()) result+=
", ";
906 if (al.
empty())
return result;
909 for (
const auto &a : al)
911 if (a.defval.empty() || includeDefault)
913 if (!first) result+=
", ";
916 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
924 int i =
static_cast<int>(a.type.length())-1;
925 while (i>=0 &&
isId(a.type.at(i))) i--;
928 result+=a.type.
right(a.type.length()-i-1);
939 if (!a.typeConstraint.empty() && lang==SrcLangExt::Java)
942 result+=a.typeConstraint;
963 size_t len = contents.length();
967 char c = contents[src++];
971 if (src<len && contents[src] ==
'\n')
976 else if ( c ==
'\0' && src<len-1)
980 contents[dest++] = c;
982 contents.resize(dest);
989 for (
const auto &filterStr : filterList)
998 filterPattern = filterPattern.
lower();
999 input = input.
lower();
1008 filterName=
"\""+filterName+
"\"";
1023 if (name.
empty())
return "";
1030 if (isSourceCode && !filterSrcList.empty())
1034 if (!found && filterName.
empty())
1045 if (filterName.
length()>=2 && filterName[0]==
'"' && filterName[
static_cast<int>(filterName.
length())-1]==
'"')
1047 filterName = filterName.
mid(1,filterName.
length()-2);
1056 bool fileOpened=
false;
1057 if (name[0]==
'-' && name[1]==0)
1059 std::string contents;
1061 while (getline(std::cin,line))
1063 contents+=line+
'\n';
1072 err(
"file '{}' not found\n",name);
1085 err(
"cannot open file '{}' for reading\n",name);
1093 for (
const auto &bcd : bcl)
1113 AUTO_TRACE(
"target='{}' str='{}'",target,str);
1114 if (target==str) { target.
clear();
return; }
1121 for (
size_t q=p;q<i;q++)
1123 if (target[q]==
'<') sharpCount++;
1124 else if (target[q]==
'>' && sharpCount>0) sharpCount--;
1126 bool isMatch = (i==0 || !
isId(target.
at(i-1))) &&
1128 !insideTemplate && sharpCount==0;
1131 size_t i1=target.
find(
'*',i+l);
1132 size_t i2=target.
find(
'&',i+l);
1136 target=target.
left(i)+target.
mid(i+l);
1143 target=str+
" "+target.
left(i)+target.
mid(i+l);
1183 size_t i=s.
find(
" class ");
1185 i=s.
find(
" typename ");
1187 i=s.
find(
" union ");
1189 i=s.
find(
" struct ");
1203 if (!templSpec.
empty() && templSpec.
at(0) ==
'<')
1208 if (!resolvedType.
empty())
1210 templSpec = resolvedType;
1222 if (count>10)
return word;
1224 DString symName,result,templSpec,tmpName;
1225 if (tSpec && !tSpec->
empty())
1228 AUTO_TRACE(
"d='{}' fs='{}' word='{}' templSpec='{}'",d?d->
name():
"",fs?fs->
name():
"",word,templSpec);
1246 bool isTemplInst = cd && !templSpec.
empty();
1247 if (!cd && !templSpec.
empty())
1258 cd?cd->
name():
"",mType?mType->
name():
"",ts,resolvedType);
1281 if (cd==d && tSpec) *tSpec=
"";
1285 result = resolvedType+ts;
1293 if (tSpec) *tSpec=
"";
1305 if (!templSpec.
empty())
1307 result=cd->
name()+templSpec;
1357 resolvedType = lang==SrcLangExt::Java ? word :
resolveTypeDef(d,word);
1359 if (resolvedType.
empty())
1365 result = resolvedType;
1400 if (i-pp>=2 && type[i-2]==
':' && type[i-1]==
':')
1402 canType += type.
mid(pp,i-pp-2);
1406 canType += type.
mid(pp,i-pp);
1415 if (ct.
empty() && type.
mid(p,2)==
"::")
1425 if (!templSpec.
empty())
1429 std::string ts = templSpec.
str();
1430 static const reg::Ex re(R
"(\a\w*)");
1437 for (; it!=
end ; ++it)
1439 const auto &match = *it;
1440 size_t ti = match.position();
1441 size_t tl = match.length();
1442 std::string matchStr = match.str();
1443 canType += ts.
substr(tp,ti-tp);
1452 canType += type.
mid(pp);
1463 if ((type==
"const" || type==
"volatile") && !name.
empty())
1468 if (name==
"const" || name==
"volatile")
1470 if (!type.
empty()) type+=
" ";
1488#define MATCH AUTO_TRACE_EXIT("match at line {}",__LINE__);
1489#define NOMATCH AUTO_TRACE_EXIT("no match at line {}",__LINE__);
1496 AUTO_TRACE(
"srcType='{}' dstType='{}'",srcType,dstType);
1497 if (srcType==dstType)
return true;
1500 size_t i1=srcType.
find(
")(");
1502 size_t i2=dstType.
find(
")(");
1503 if (i1!=i2)
return false;
1506 size_t j1=srcType.
find(
"(");
1508 size_t j2=dstType.
find(
"(");
1509 if (j2!=j1)
return false;
1510 if (srcType.
left(j1)!=dstType.
left(j2))
return false;
1519 dstScope,dstFileScope,dstType.
left(j2),dstAl.get(),
1529 AUTO_TRACE(
"src: scope={} type={} name={} canType={}, dst: scope={} type={} name={} canType={}",
1548 srcA.
type+=sSrcName;
1552 else if (sDstName==srcType.
right(sDstName.
length()))
1554 dstA.
type+=sDstName;
1570 dstScope,dstFileScope,dstA.
canType,
1593 ASSERT(srcScope!=
nullptr && dstScope!=
nullptr);
1595 AUTO_TRACE(
"srcScope='{}' dstScope='{}' srcArgs='{}' dstArgs='{}' checkCV={} lang={}",
1598 if (srcAl==
nullptr || dstAl==
nullptr)
1600 bool match = srcAl==dstAl;
1631 if (srcAl->
size() != dstAl->
size())
1665 auto srcIt = srcAl->
begin();
1666 auto dstIt = dstAl->
begin();
1667 for (;srcIt!=srcAl->
end() && dstIt!=dstAl->
end();++srcIt,++dstIt)
1672 dstScope,dstFileScope,dstA,
1691 AUTO_TRACE(
"srcAl='{}',dstAl='{}',forceNameOverwrite={}",
1699 auto srcIt=srcAl.
begin();
1700 auto dstIt=dstAl.
begin();
1701 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
1706 AUTO_TRACE_ADD(
"before merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
1722 if (srcA.
name==
"const" || srcA.
name==
"volatile")
1727 if (dstA.
name==
"const" || dstA.
name==
"volatile")
1753 if (forceNameOverwrite)
1825 AUTO_TRACE_ADD(
"after merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
1841 auto isUnconstraintTemplate = [](
const DString &type)
1843 return type==
"typename" || type==
"class" || type.startsWith(
"typename ") || type.startsWith(
"class ");
1845 auto srcIt = srcAl.
begin();
1846 auto dstIt = dstAl.
begin();
1847 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
1851 if ((!isUnconstraintTemplate(srcA.
type) || !isUnconstraintTemplate(dstA.
type)) && srcA.
type!=dstA.
type)
1870 AUTO_TRACE(
"scopeName={},memberName={},forceEmptyScope={}",
1896 result.
found =
true;
1901 result.
found =
true;
1906 result.
found =
true;
1911 result.
found =
true;
1916 result.
found =
true;
1946 if (scopeName.
empty())
return false;
1948 bool explicitGlobalScope=
false;
1949 if (scopeName.
at(0)==
':' && scopeName.
at(1)==
':')
1951 scopeName=scopeName.
mid(2);
1952 explicitGlobalScope=
true;
1954 if (scopeName.
empty())
1959 DString docScopeName=docScope;
1960 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(docScopeName.
length());
1965 if (scopeOffset>0) fullName.
prepend(docScopeName.
left(scopeOffset)+
"::");
1991 size_t o = docScopeName.
rfind(
"::",scopeOffset-1);
1994 }
while (scopeOffset>=0);
2001 if (s.
empty())
return true;
2002 const char *p=s.
data();
2004 while ((c=
static_cast<uint8_t
>(*p++)))
if (!islower(c))
return false;
2014 bool lookForSpecialization,
2019 AUTO_TRACE(
"scope={} name={} inSeeBlock={} lang={} lookForSpecialization={} currentFile={} checkScope={}",
2020 scName,name,inSeeBlock,lang,lookForSpecialization,currentFile ? currentFile->
name() :
"", checkScope);
2034 size_t templStartPos;
2035 if (lang==SrcLangExt::CSharp && (templStartPos=fullName.
find(
'<'))!=
DString::npos)
2037 size_t templEndPos = fullName.
rfind(
'>');
2047 size_t scopePos = fullName.
rfind(
"::",endNamePos);
2048 bool explicitScope = fullName.
startsWith(
"::") &&
2053 bool allowTypeOnly=
false;
2056 *resContext=
nullptr;
2077 if (scName!=fullName &&
getScopeDefs(scName,fullName,cd,cnd,nd,modd))
2100 else if (scName==fullName || (!inSeeBlock && scopePos==
DString::npos))
2119 if (explicitScope) nameStr=nameStr.
mid(2);
2128 size_t templPos = nameStr.
find(
'<');
2129 bool tryUnspecializedVersion =
false;
2132 size_t endTemplPos=nameStr.
rfind(
'>');
2135 if (!lookForSpecialization)
2137 nameStr=nameStr.
left(templPos)+nameStr.
mid(endTemplPos+1);
2141 tryUnspecializedVersion =
true;
2149 nameStr=nameStr.
mid(scopeStr.
length()+2);
2167 size_t np = nameStr.
find(
"::");
2176 *resContext=
nullptr;
2186 *resMember=result.
md;
2187 *resContext=result.
md;
2191 *resContext=
nullptr;
2197 else if (result.
cd) *resContext=result.
cd;
2198 else if (result.
nd) *resContext=result.
nd;
2199 else if (result.
fd) *resContext=result.
fd;
2200 else if (result.
gd) *resContext=result.
gd;
2201 else if (result.
cnd) *resContext=result.
cnd;
2202 else if (result.
modd) *resContext=result.
modd;
2205 *resContext=
nullptr; *resMember=
nullptr;
2244 if (tryUnspecializedVersion)
2246 bool b =
resolveRef(scName,name,inSeeBlock,resContext,resMember,lang,
false,
nullptr,checkScope);
2269 if (!result.
empty())
2276 if (result.
at(0)==
':' && result.
at(1)==
':')
2278 result=result.
mid(2);
2297 for (
const auto &path : stripPaths)
2317 *resContext=
nullptr;
2320 if (lang==SrcLangExt::CSharp)
2325 AUTO_TRACE(
"scName='{}',ref='{}'",scName,lr);
2330 const DirDef *dir =
nullptr;
2336 if (linkRef.
empty())
2348 if (si) resAnchor = si->
label();
2360 resAnchor = si->
label();
2367 resAnchor = si->
label();
2397 else if (lang==SrcLangExt::Java &&
2398 (cd=
getClass(linkRefWithoutTemplates)))
2405 else if ((cd=
getClass(linkRef+
"-p")))
2422 resAnchor=modd->
anchor();
2441 bool res =
resolveRef(scName,lr,
true,resContext,&md,lang);
2442 if (md) resAnchor=md->
anchor();
2468 for (
const auto &s : examplePathList)
2496 std::string substRes;
2498 const char *p = s.
data();
2502 substRes.reserve(s.
length()+1024);
2509 for (
const auto &kw : keywords)
2511 size_t keyLen =
dstrlen(kw.keyword);
2512 if (
dstrncmp(p,kw.keyword,keyLen)==0)
2514 const char *startArg = p+keyLen;
2515 bool expectParam = std::holds_alternative<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
2517 if (expectParam && *startArg==
'(')
2520 const char *endArg =
nullptr;
2521 while ((c=*(startArg+j)) && c!=
')' && c!=
'\n' && c!=0) j++;
2522 if (c==
')') endArg=startArg+j;
2526 auto &&getValue = std::get<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
2527 substRes+=getValue(value).str();
2534 warn(file,line,
"Missing argument for '{}'",kw.keyword);
2538 else if (!expectParam)
2540 auto &&getValue = std::get<KeywordSubstitution::GetValue>(kw.getValueVariant);
2541 substRes+=getValue().str();
2548 warn(file,line,
"Expected arguments for '{}' but none were specified",kw.keyword);
2558 if (c==
'\n') line++;
2583 if (!projectLogo.
empty())
2588 projectLogo = projectLogo.
left(wi);
2592 projectLogo = projectLogo.
left(hi);
2603 if (!projectLogo.
empty())
2605 auto extractDimension = [&projectLogo](
const char *startMarker,
size_t startPos,
size_t endPos) ->
DString
2608 if (result.
length()>=2 && result.
at(0)!=
'"' && result.
at(result.
length()-1)!=
'"')
2610 result=
"\""+result+
"\"";
2616 size_t wi = projectLogo.
find(
" width=");
2617 size_t hi = projectLogo.
find(
" height=");
2622 sizeVal = extractDimension(
" width=", wi+7, hi) +
" "
2623 + extractDimension(
" height=", hi+8, projectLogo.
length());
2627 sizeVal = extractDimension(
" height=", hi+8, wi) +
" "
2628 + extractDimension(
" width=", wi+7, projectLogo.
length());
2633 sizeVal = extractDimension(
" width=", wi+7, projectLogo.
length());
2637 sizeVal = extractDimension(
" height=", hi+8, projectLogo.
length());
2653 if (name.
empty())
return 0;
2656 for (
const auto &s : sl)
2658 const char *ps=s.c_str();
2659 const char *pd=name.
data();
2661 while (*ps!=0 && *pd!=0 && *ps==*pd)
2667 if (*ps==0 && *pd!=0)
2673 if (result<
static_cast<int>(name.
length())-1 && name.
at(result)==
'[') result++;
2683 if (caseSenseNames == CASE_SENSE_NAMES_t::YES)
return true;
2684 else if (caseSenseNames == CASE_SENSE_NAMES_t::NO)
return false;
2690 if (name.
empty())
return name;
2696 const char *p=name.
data();
2701 case '_':
if (allowUnderscore) result+=
'_';
else result+=
"__";
break;
2702 case '-': result+=
'-';
break;
2703 case ':': result+=
"_1";
break;
2704 case '/': result+=
"_2";
break;
2705 case '<': result+=
"_3";
break;
2706 case '>': result+=
"_4";
break;
2707 case '*': result+=
"_5";
break;
2708 case '&': result+=
"_6";
break;
2709 case '|': result+=
"_7";
break;
2710 case '.':
if (allowDots) result+=
'.';
else result+=
"_8";
break;
2711 case '!': result+=
"_9";
break;
2712 case ',': result+=
"_00";
break;
2713 case ' ': result+=
"_01";
break;
2714 case '{': result+=
"_02";
break;
2715 case '}': result+=
"_03";
break;
2716 case '?': result+=
"_04";
break;
2717 case '^': result+=
"_05";
break;
2718 case '%': result+=
"_06";
break;
2719 case '(': result+=
"_07";
break;
2720 case ')': result+=
"_08";
break;
2721 case '+': result+=
"_09";
break;
2722 case '=': result+=
"_0a";
break;
2723 case '$': result+=
"_0b";
break;
2724 case '\\': result+=
"_0c";
break;
2725 case '@': result+=
"_0d";
break;
2726 case ']': result+=
"_0e";
break;
2727 case '[': result+=
"_0f";
break;
2728 case '#': result+=
"_0g";
break;
2729 case '"': result+=
"_0h";
break;
2730 case '~': result+=
"_0i";
break;
2731 case '\'': result+=
"_0j";
break;
2732 case ';': result+=
"_0k";
break;
2733 case '`': result+=
"_0l";
break;
2737 bool doEscape =
true;
2738 if (allowUnicodeNames)
2751 unsigned char id =
static_cast<unsigned char>(c);
2760 else if (caseSenseNames || !isupper(c))
2767 result+=
static_cast<char>(tolower(c));
2777 if (s.
empty())
return s;
2781 const char *p = s.
data();
2791 case '_': result+=c; p++;
break;
2792 case '1': result+=
':'; p++;
break;
2793 case '2': result+=
'/'; p++;
break;
2794 case '3': result+=
'<'; p++;
break;
2795 case '4': result+=
'>'; p++;
break;
2796 case '5': result+=
'*'; p++;
break;
2797 case '6': result+=
'&'; p++;
break;
2798 case '7': result+=
'|'; p++;
break;
2799 case '8': result+=
'.'; p++;
break;
2800 case '9': result+=
'!'; p++;
break;
2804 case '0': result+=
','; p+=2;
break;
2805 case '1': result+=
' '; p+=2;
break;
2806 case '2': result+=
'{'; p+=2;
break;
2807 case '3': result+=
'}'; p+=2;
break;
2808 case '4': result+=
'?'; p+=2;
break;
2809 case '5': result+=
'^'; p+=2;
break;
2810 case '6': result+=
'%'; p+=2;
break;
2811 case '7': result+=
'('; p+=2;
break;
2812 case '8': result+=
')'; p+=2;
break;
2813 case '9': result+=
'+'; p+=2;
break;
2814 case 'a': result+=
'='; p+=2;
break;
2815 case 'b': result+=
'$'; p+=2;
break;
2816 case 'c': result+=
'\\'; p+=2;
break;
2817 case 'd': result+=
'@'; p+=2;
break;
2818 case 'e': result+=
']'; p+=2;
break;
2819 case 'f': result+=
'['; p+=2;
break;
2820 case 'g': result+=
'#'; p+=2;
break;
2821 case 'h': result+=
'"'; p+=2;
break;
2822 case 'i': result+=
'~'; p+=2;
break;
2823 case 'j': result+=
'\''; p+=2;
break;
2824 case 'k': result+=
';'; p+=2;
break;
2825 case 'l': result+=
'`'; p+=2;
break;
2832 if (!caseSenseNames && c>=
'a' && c<=
'z')
2834 result+=
static_cast<char>(toupper(*p));
2865 if (name.
empty())
return name;
2888 size_t resultLen = result.
length();
2897 int l1Dir=0,l2Dir=0;
2898 int createSubdirsLevel =
Config_getInt(CREATE_SUBDIRS_LEVEL);
2899 int createSubdirsBitmaskL2 = (1<<createSubdirsLevel)-1;
2903 l1Dir = md5_sig[14] & 0xf;
2904 l2Dir = md5_sig[15] & createSubdirsBitmaskL2;
2932 DString absIncFileName = incFileName;
2942 else if (searchIncludes)
2945 for (
const auto &incPath : includePath)
2964 return absIncFileName;
2974 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
2975 for (
int l1=0; l1<16; l1++)
2981 term(
"Failed to create output directory '{}'\n",subdir);
2983 for (
int l2=0; l2<createSubdirsLevelPow2; l2++)
2986 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
2989 term(
"Failed to create output directory '{}'\n",subsubdir);
3001 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
3002 for (
int l1=0;l1<16;l1++)
3006 for (
int l2=0; l2 < createSubdirsLevelPow2; l2++)
3009 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
3028 bool allowEmptyClass)
3036 namespaceName=nd->
name();
3040 p=
static_cast<int>(clName.
length())-2;
3048 namespaceName=nd->
name();
3049 className=clName.
mid(i+2);
3052 p=
static_cast<int>(i)-2;
3057 className=scopeName;
3058 namespaceName.
clear();
3061 if (className.
empty() && !namespaceName.
empty() && !allowEmptyClass)
3064 className=namespaceName;
3065 namespaceName.
clear();
3071 className = className.
left(className.
length()-2);
3097 result=scope.
left(si) + templ + scope.
mid(si);
3112 int l =
static_cast<int>(result.
length());
3115 bool skipBracket=
false;
3122 while (p>=0 && count>=0)
3124 char c=result.
at(p);
3130 if (p>0 && result.
at(p-1)==
':' && (count==0 || skipBracket))
3132 return result.
right(l-p-1);
3143 if (p>0 && result.
at(p-1)==
'>')
3151 bool foundMatch=
false;
3152 while (p>=0 && !foundMatch)
3164 if (round==0) count++;
3171 if (result.
at(p-1) ==
'<')
3178 foundMatch = count==0;
3193 done = count==0 || skipBracket;
3204 if (s.
empty())
return s;
3207 const char *p = s.
data();
3213 if ((c>=
'0' && c<=
'9') || (c>=
'a' && c<=
'z') || (c>=
'A' && c<=
'Z') || c==
'-')
3215 if (first && c>=
'0' && c<=
'9') result+=
'a';
3221 encChar[1]=
hex[
static_cast<unsigned char>(c)>>4];
3222 encChar[2]=
hex[
static_cast<unsigned char>(c)&0xF];
3234 if (s.
empty())
return s;
3237 const char *p = s.
data();
3243 case '<': result+=
"<";
break;
3244 case '>': result+=
">";
break;
3245 case '&':
if (keepEntities)
3251 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
3257 while (p<e) result+=*p++;
3277 case '\'': result+=
"'";
break;
3278 case '"': result+=
""";
break;
3279 case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
3280 case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
3281 case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
3282 case 27:
case 28:
case 29:
case 30:
case 31:
3284 default: result+=c;
break;
3293 if (s.
empty())
return s;
3296 const char *p=s.
data();
3302 case '<': result+=
"<";
break;
3303 case '>': result+=
">";
break;
3304 case '&':
if (keepEntities)
3310 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
3316 while (p<e) result+=*p++;
3328 case '\'': result+=
"'";
break;
3329 case '"': result+=
""";
break;
3332 uint8_t uc =
static_cast<uint8_t
>(c);
3333 if (uc<32 && !isspace(c))
3337 result+=
hex[uc&0xF];
3353 if (s.
empty())
return s;
3356 const char *p=s.
data();
3362 case '"':
if (!singleQuotes) result+=
"\\\"";
else result+=c;
3364 case '\'':
if (singleQuotes) result+=
"\\\'";
else result+=c;
3366 case '\\':
if (*p==
'u' && *(p+1)==
'{') result+=
"\\";
3367 else result+=
"\\\\";
3369 default: result+=c;
break;
3382 AUTO_TRACE(
"type='{}' pos={} name='{}' lang={}",type,pos,name,lang);
3383 static const reg::Ex re_norm(R
"(\a[\w:]*)");
3384 static const reg::Ex re_fortran(R
"(\a[\w:()=]*)");
3394 size_t typeLen=type.
length();
3397 if (lang == SrcLangExt::Fortran)
3409 std::string s = type.
str();
3415 const auto &match = *it;
3416 size_t i = match.position();
3417 size_t l = match.length();
3422 while (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
' ') { ts++; tl++; }
3423 if (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
'<')
3428 while (te<typeLen && brCount!=0)
3430 if (type[
static_cast<uint32_t
>(te)]==
'<')
3432 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'<') te++;
else brCount++;
3434 if (type[
static_cast<uint32_t
>(te)]==
'>')
3436 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'>') te++;
else brCount--;
3446 pos=
static_cast<int>(i+l+tl);
3450 pos=
static_cast<int>(i+l);
3455 return static_cast<int>(i);
3458 pos =
static_cast<int>(typeLen);
3471 size_t p=name.
find(
'<');
3476 std::string s = name.
mid(p).
str();
3477 static const reg::Ex re(R
"([\a:][\w:]*)");
3482 for (; it!=
end ; ++it)
3484 const auto &match = *it;
3485 size_t i = match.position();
3486 size_t l = match.length();
3487 result += s.
substr(pi,i-pi);
3490 for (
const Argument &formArg : formalArgs)
3492 if (formArg.name == n)
3530 if (formalArgs.
empty())
return nm;
3533 static const reg::Ex re(R
"(\a\w*)");
3534 std::string name = nm.str();
3539 for (; it!=
end ; ++it)
3541 const auto &match = *it;
3542 size_t i = match.position();
3543 size_t l = match.length();
3544 if (i>p) result += name.
substr(p,i-p);
3549 actIt = actualArgs->
begin();
3556 for (
auto formIt = formalArgs.
begin();
3557 formIt!=formalArgs.
end() && !found;
3563 if (actualArgs && actIt!=actualArgs->
end())
3570 formArg.
type =
"class";
3575 formArg.
type =
"typename";
3579 formArg.
name +=
"...";
3584 formArg.
name +=
"...";
3591 if (formArg.
name==n && actualArgs && actIt!=actualArgs->
end() && !actArg.
type.
empty())
3598 ii = subst.find(
'<');
3607 bool beforeNonWord = ii==0 || !
isId(subst.at(ii-1));
3608 bool afterNonWord = subst.length()==ii+nameArg.length() || !
isId(subst.at(ii+nameArg.length()));
3609 if (beforeNonWord && afterNonWord)
3613 pp=ii+nameArg.length();
3618 AUTO_TRACE_ADD(
"result={} n={} type={} hasRecursion={}",result,n,actArg.
type,hasRecursion(result,n,actArg.
type));
3619 if (!hasRecursion(result,n,actArg.
type))
3631 result += actArg.
type;
3637 result += actArg.
type+
" "+actArg.
name;
3642 else if (formArg.
name==n &&
3643 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
3652 else if (formArg.
name==n &&
3653 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
3661 if (actualArgs && actIt!=actualArgs->
end())
3690 bool allowArtificial)
3693 size_t i=fullName.
find(
'<');
3697 size_t l=fullName.
length();
3704 while (e<l && count>0)
3706 char c=fullName.
at(e++);
3709 case '(': round++;
break;
3710 case ')':
if (round>0) round--;
break;
3711 case '<':
if (round==0) count++;
break;
3712 case '>':
if (round==0) count--;
break;
3717 size_t si = fullName.
find(
"::",e);
3722 result+=fullName.
mid(p,i-p);
3725 if (cd!=
nullptr && (allowArtificial || !cd->
isArtificial()))
3727 result+=fullName.
mid(i,e-i);
3730 else if (pLastScopeStripped)
3733 *pLastScopeStripped=fullName.
mid(i,e-i);
3736 i=fullName.
find(
'<',p);
3738 result+=fullName.
right(l-p);
3755 AUTO_TRACE(
"leftScope='{}' rightScope='{}'",leftScope,rightScope);
3763 size_t i=0,p=leftScope.
length();
3772 result = leftScope.
left(i+2)+rightScope;
3785 if (!result.
empty() && !rightScope.
empty()) result+=
"::";
3800 int sl=
static_cast<int>(s.
length());
3804 if (sp>=sl)
return -1;
3828 while (sp<sl && !done)
3834 case '<': count++;
break;
3835 case '>': count--;
if (count==0) done=
true;
break;
3896 if (!first) { ol.
writeString(
" | "); }
else first=
false;
3908 if (!first) { ol.
writeString(
" | "); }
else first=
false;
3933 if (fName.
empty())
return;
3934 size_t i_fs = fName.
rfind(
'/');
3935 size_t i_bs = fName.
rfind(
'\\');
3938 size_t i = fName.
find(
'.',p);
3965 result=result.
mid(i+1);
3969 result=result.
mid(i+1);
3990 const char *p = s.
data();
3993 int i=0,li=-1,l=
static_cast<int>(s.
length());
3997 if (c==
' ' || c==
'\t' || c==
'\r') { i++; p++; }
3998 else if (c==
'\\' &&
literal_at(p,
"\\ilinebr")) { i+=8; li=i; p+=8; }
3999 else if (c==
'\n') { i++; li=i; docLine++; p++; }
4009 if (c==
' ' || c==
'\t' || c==
'\r') { b--; p--; }
4010 else if (c==
'r' && b>=7 &&
literal_at(p-7,
"\\ilinebr")) { bi=b-7; b-=8; p-=8; }
4011 else if (c==
'>' && b>=11 &&
literal_at(p-11,
"\\ilinebr<br>")) { bi=b-11; b-=12; p-=12; }
4012 else if (c==
'\n') { bi=b; b--; p--; }
4017 if (li==-1 && bi==-1)
return s;
4024 return s.
mid(li,bi-li);
4042 {
"idl",
"c", SrcLangExt::IDL,
".idl" },
4043 {
"java",
"c", SrcLangExt::Java,
".java"},
4044 {
"javascript",
"c", SrcLangExt::JS,
".js" },
4045 {
"csharp",
"c", SrcLangExt::CSharp,
".cs" },
4046 {
"d",
"c", SrcLangExt::D,
".d" },
4047 {
"php",
"c", SrcLangExt::PHP,
".php" },
4048 {
"objective-c",
"c", SrcLangExt::ObjC,
".m" },
4049 {
"c",
"c", SrcLangExt::Cpp,
".c" },
4050 {
"c++",
"c", SrcLangExt::Cpp,
".cpp" },
4051 {
"slice",
"c", SrcLangExt::Slice,
".ice" },
4052 {
"python",
"python", SrcLangExt::Python,
".py" },
4053 {
"fortran",
"fortran", SrcLangExt::Fortran,
".f" },
4054 {
"fortranfree",
"fortranfree", SrcLangExt::Fortran,
".f90" },
4055 {
"fortranfixed",
"fortranfixed", SrcLangExt::Fortran,
".f" },
4056 {
"vhdl",
"vhdl", SrcLangExt::VHDL,
".vhdl"},
4057 {
"xml",
"xml", SrcLangExt::XML,
".xml" },
4058 {
"sql",
"sql", SrcLangExt::SQL,
".sql" },
4059 {
"md",
"md", SrcLangExt::Markdown,
".md" },
4060 {
"lex",
"lex", SrcLangExt::Lex,
".l" },
4067 [&langName](
const auto &info) { return info.langName==langName; });
4073 if (extName.
empty())
return false;
4074 if (extName.
at(0)!=
'.') extName.
prepend(
".");
4084 err(
"Failed to assign extension {} to parser {} for language {}\n",
4085 extName.
data(),it1->parserName,language);
4173 if (extName.
empty()) extName=
".no_extension";
4174 if (extName.
at(0)!=
'.') extName.
prepend(
".");
4190 if (lang == SrcLangExt::Unknown)
4194 if (langName.
at(0)==
'.') langName = langName.
mid(1);
4196 [&langName](
const auto &info) { return info.langName==langName; });
4199 lang = it->parserId;
4200 fileName = it->defExt;
4204 return SrcLangExt::Cpp;
4212 if (fn.
empty())
return "";
4222 if (scope==
nullptr ||
4242 if (qualifierIndex!=-1)
4244 explicitScopePart = name.
left(qualifierIndex);
4246 name = name.
mid(qualifierIndex+2);
4250 int minDistance = 10000;
4259 if (distance!=-1 && distance<minDistance)
4261 minDistance = distance;
4275 if (bestMatch && bestMatch->
isTypedef())
4285 if (al.
empty())
return;
4302 .setIndexWords(
true));
4312#ifdef TRACINGSUPPORT
4313 void *backtraceFrames[128];
4314 int frameCount = backtrace(backtraceFrames, 128);
4315 const size_t cmdLen = 40960;
4316 static char cmd[cmdLen];
4318 p += snprintf(p,cmdLen,
"/usr/bin/atos -p %d ", (
int)getpid());
4319 for (
int x = 0; x < frameCount; x++)
4321 p += snprintf(p,cmdLen,
"%p ", backtraceFrames[x]);
4323 fprintf(stderr,
"========== STACKTRACE START ==============\n");
4327 while (
size_t len = fread(resBuf, 1,
sizeof(resBuf), fp))
4329 fwrite(resBuf, 1, len, stderr);
4333 fprintf(stderr,
"============ STACKTRACE END ==============\n");
4341 if (inputEncoding.
empty() || outputEncoding.
empty())
return;
4342 if (
dstricmp(inputEncoding,outputEncoding)==0)
return;
4344 if (cd==
reinterpret_cast<void *
>(-1))
4346 term(
"unsupported character conversion: '{}'->'{}': {}\n"
4347 "Check the INPUT_ENCODING setting in the config file!\n",
4348 inputEncoding,outputEncoding,strerror(errno));
4350 size_t iLeft = contents.size();
4351 const char *srcPtr = contents.data();
4352 size_t tmpBufSize = contents.size()*4+1;
4353 size_t oLeft = tmpBufSize;
4355 tmpBuf.resize(tmpBufSize);
4356 char *dstPtr = tmpBuf.data();
4360 newSize = tmpBufSize-oLeft;
4361 tmpBuf.resize(newSize);
4362 std::swap(contents,tmpBuf);
4367 term(
"{}: failed to translate characters from {} to {}: check INPUT_ENCODING\n",
4368 fileName,inputEncoding,outputEncoding);
4378 if (!fi.
exists())
return false;
4380 if (filterName.
empty() || !filter)
4385 err(
"could not open file {}\n",fileName);
4389 auto fileSize = fi.
size();
4390 contents.resize(fileSize);
4391 f.read(contents.data(),fileSize);
4394 err(
"problems while reading file {}\n",fileName);
4400 DString cmd=filterName+
" \""+fileName+
"\"";
4405 err(
"could not execute filter {}\n",filterName);
4408 const int bufSize=4096;
4411 while ((numRead=
static_cast<int>(fread(buf,1,bufSize,f)))>0)
4414 contents.append(buf,numRead);
4421 if (contents.size()>=2 &&
4422 static_cast<uint8_t
>(contents[0])==0xFF &&
4423 static_cast<uint8_t
>(contents[1])==0xFE
4428 else if (contents.size()>=2 &&
4429 static_cast<uint8_t
>(contents[0])==0xFE &&
4430 static_cast<uint8_t
>(contents[1])==0xFF
4435 else if (contents.size()>=3 &&
4436 static_cast<uint8_t
>(contents[0])==0xEF &&
4437 static_cast<uint8_t
>(contents[1])==0xBB &&
4438 static_cast<uint8_t
>(contents[2])==0xBF
4441 contents.erase(0,3);
4457 std::string t = title.
str();
4458 static const reg::Ex re(R
"(%[a-z_A-Z]+)");
4462 for (; it!=
end ; ++it)
4464 const auto &match = *it;
4465 size_t i = match.position();
4466 size_t l = match.length();
4467 if (i>p) tf+=t.substr(p,i-p);
4468 tf+=match.str().substr(1);
4494 if (extLinksInWindow)
4495 return "target=\"_blank\" ";
4497 return "target=\"_parent\" ";
4505 const DString &targetFileName,
4513 if (!targetFileName.
empty())
4518 if (!anchor.
empty() && isLocalFile)
4529 if (!anchor.
empty())
4546 result = it->second;
4547 size_t l = result.
length();
4548 if (!relPath.
empty() && l>0 && result.
at(0)==
'.')
4553 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
4572 std::string s=str.
str();
4573 static const reg::Ex re(R
"(##[0-9A-Fa-f][0-9A-Fa-f])");
4579 size_t sl=s.length();
4581 for (; it!=
end ; ++it)
4583 const auto &match = *it;
4584 size_t i = match.position();
4585 size_t l = match.length();
4586 if (i>p) result+=s.substr(p,i-p);
4587 std::string lumStr = match.str().substr(2);
4588#define HEXTONUM(x) (((x)>='0' && (x)<='9') ? ((x)-'0') : \
4589 ((x)>='a' && (x)<='f') ? ((x)-'a'+10) : \
4590 ((x)>='A' && (x)<='F') ? ((x)-'A'+10) : 0)
4592 double r = 0,g = 0,b = 0;
4595 pow(level/255.0,gamma/100.0),&r,&g,&b);
4596 int red =
static_cast<int>(r*255.0);
4597 int green =
static_cast<int>(g*255.0);
4598 int blue =
static_cast<int>(b*255.0);
4601 colStr[1]=
hex[red>>4];
4602 colStr[2]=
hex[red&0xf];
4603 colStr[3]=
hex[green>>4];
4604 colStr[4]=
hex[green&0xf];
4605 colStr[5]=
hex[blue>>4];
4606 colStr[6]=
hex[blue&0xf];
4612 if (p<sl) result+=s.substr(p);
4623 err(
"could not copy file {} to {}\n",src,dest);
4631 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp || lang==SrcLangExt::VHDL || lang==SrcLangExt::Python)
4635 else if (lang==SrcLangExt::PHP && !classScope)
4648 static const std::unordered_set<std::string> schemes = {
4649 "http",
"https",
"ftp",
"ftps",
"sftp",
"file",
"news",
"irc",
"ircs"
4652 size_t colonPos = loc_url.
find(
':');
4676 return (prot!=Protection::Private && prot!=Protection::Package) ||
4677 (prot==Protection::Private && extractPrivate) ||
4678 (prot==Protection::Package && extractPackage);
4685 if (s.
empty())
return s;
4689 const char *p=s.
data();
4692 int minIndent=1000000;
4693 bool searchIndent=
true;
4695 bool skipFirst = skipFirstLine;
4698 if (c==
'\t') { indent+=tabSize - (indent%tabSize); }
4699 else if (c==
'\n') { indent=0; searchIndent=
true; skipFirst=
false; }
4700 else if (c==
' ') { indent++; }
4701 else if (searchIndent && !skipFirst)
4704 if (indent<minIndent) minIndent=indent;
4709 if (minIndent==0)
return substitute(s,
"@ilinebr",
"\\ilinebr");
4715 skipFirst=skipFirstLine;
4724 else if (indent<minIndent && !skipFirst)
4728 int newIndent = indent+tabSize-(indent%tabSize);
4742 else if (c==
'\\' &&
literal_at(p,
"ilinebr "))
4745 result <<
"\\ilinebr ";
4748 for (
int j=0;j<minIndent;j++)
if (*(p+j)==
' ') skipAmount++;
4749 if (skipAmount==minIndent)
4756 result <<
"\\ilinebr";
4767 return result.
str();
4775 if (indentationLevel <= 0 || doc.
empty())
return;
4780 const char *src = doc.
data();
4782 bool insideIndent = !skipFirstLine;
4784 if (!skipFirstLine) cnt = indentationLevel;
4792 insideIndent =
true;
4793 cnt = indentationLevel;
4804 insideIndent =
false;
4814 insideIndent =
false;
4819 doc.
resize(
static_cast<uint32_t
>(dst-doc.
data()));
4831 std::string s = docs.
str();
4832 static const reg::Ex re(R
"(\[([ inout,]+)\])");
4837 const auto &match = *it;
4838 size_t p = match.position();
4839 size_t l = match.length();
4843 std::string dir = match[1].str();
4845 dir.erase(std::remove_if(dir.begin(),dir.end(),
4846 [](
const char c) { return c==
' ' || c==
','; }
4848 unsigned char ioMask=0;
4849 size_t inIndex = dir.find(
"in");
4850 if ( inIndex!=std::string::npos) { dir.erase( inIndex,2); ioMask|=(1<<0); }
4851 size_t outIndex = dir.find(
"out");
4852 if (outIndex!=std::string::npos) { dir.erase(outIndex,3); ioMask|=(1<<1); }
4853 if (dir.empty() && ioMask!=0)
4856 if (ioMask==((1<<0)|(1<<1)))
return "[in,out]";
4857 else if (ioMask==(1<<0))
return "[in]";
4858 else if (ioMask==(1<<1))
return "[out]";
4872 if (a.hasDocumentation(
true))
4874 DString docsWithoutDir = a.docs;
4881 paramDocs+=
" \\ilinebr @param"+direction+
" "+name+
" "+docsWithoutDir;
4914 *outListType1=inListType;
4917 if (inProt==Protection::Public)
4924 else if (inProt==Protection::Protected)
4932 *outListType2=inListType.
toPublic();
4935 else if (inProt==Protection::Private)
4945 *outListType1=inListType.
toPublic();
4970 size_t i= format.
find(
':');
4978 for (
size_t i = splitExt.size(); i > 0; )
4981 extGen += splitExt[i] + (i!=0 ?
"." :
"");
4989 bool fileOpened=
false;
4990 bool writeToStdout=outFile==
"-";
4993 f.basic_ios<char>::rdbuf(std::cout.rdbuf());
5008 fileOpened = f.is_open();
5018 if (s.
empty())
return s;
5021 auto skipBlock = [&markerInfo](
const char *p,
const SelectionBlock &blk)
5028 size_t len = markerInfo.
endLen;
5029 bool negate = *(p+markerInfo.
endLen)==
'!';
5031 size_t blkNameLen =
dstrlen(blk.name);
5032 if (
dstrncmp(p+len,blk.name,blkNameLen)==0 &&
5036 return p+len+blkNameLen+markerInfo.
closeLen;
5053 const char *p = s.
data();
5063 bool negate = *(p+len)==
'!';
5065 for (
const auto &blk : blockList)
5067 size_t blkNameLen =
dstrlen(blk.name);
5068 if (
dstrncmp(p+len,blk.name,blkNameLen)==0 &&
5071 bool blockEnabled = blk.enabled!=negate;
5073 p+=len+blkNameLen+markerInfo.
closeLen;
5092 size_t len = markerInfo.
endLen;
5093 bool negate = *(p+len)==
'!';
5095 for (
const auto &blk : blockList)
5097 size_t blkNameLen =
dstrlen(blk.name);
5098 if (
dstrncmp(p+len,blk.name,blkNameLen)==0 &&
5102 p+=len+blkNameLen+markerInfo.
closeLen;
5131 if (s.
empty())
return;
5133 const char *p = s.
data();
5142 bool negate = *(p+len)==
'!';
5148 if (markerInfo.
closeLen==0 && *p==
'\n')
5150 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
5156 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
5165 size_t len = markerInfo.
endLen;
5166 bool negate = *(p+len)==
'!';
5172 if (markerInfo.
closeLen==0 && *p==
'\n')
5174 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
5180 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
5197 size_t size = s.
length();
5200 const char *data = s.
data();
5203 constexpr auto doxy_nbsp =
"&_doxy_nbsp;";
5204 const int maxIndent=1000000;
5205 int minIndent=maxIndent;
5214 int stop = tabSize - (col%tabSize);
5217 while (stop--) result+=
' ';
5221 if (data[i] ==
'\\')
5227 else if (i+5<size &&
literal_at(data+i,
"iskip"))
5232 else if (i+8<size &&
literal_at(data+i,
"endiskip"))
5252 if (
static_cast<signed char>(c)<0 && i<size)
5264 for (
int j=0;j<bytes-1 && c;j++)
5276 if (!skip && col<minIndent) minIndent=col;
5280 if (minIndent!=maxIndent) refIndent=minIndent;
else refIndent=0;
5295 int l =
static_cast<int>(name.
length());
5296 int lastSepPos = -1;
5297 const char *p = name.
data();
5306 if (sharpCount==0 && p[i+1]==
':' && p[i+2]==
':')
5320 if (ts==-1) ts=0;
else p+=++ts;
5321 for (i=ts;i<l-1;i++)
5324 if (c==
':' && *p==
':') lastSepPos=i;
5348 size_t idx = result.
find(
'-');
5349 result = result.
left(idx)+templArgs;
5357 size_t i = text.
find(
'"');
5385 file.write( content.
data(), content.
length() );
5390 err(
"Could not open file {} for writing\n",fileName);
This class contains the information about the argument of a function or template.
This class represents an function or template argument list.
RefQualifierType refQualifier() const
bool pureSpecifier() const
bool hasParameters() const
DString 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 DString qualifiedNameWithTemplateParameters(const ArgumentLists *actualParams=nullptr, uint32_t *actualParamIndex=nullptr) const =0
virtual FileDef * getFileDef() const =0
Returns the file in which this compound's definition can be found.
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
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
DString & setNum(short n)
void resize(size_t newlen)
size_t rfind(char c, size_t pos=npos) const
DString mid(size_t index, size_t len=npos) const
DString simplifyWhiteSpace() const
return a copy of this string with leading and trailing whitespace removed and multiple internal white...
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
DString substr(size_t pos=0, size_t count=npos) const
Returns a substring of length count starting at pos.
char * rawData()
Returns a writable pointer to the data.
std::string_view view() const
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
char & at(size_t i)
Returns a reference to the character at index i.
DString right(size_t len) const
DString & prepend(const char *s)
int contains(char c, bool cs=true) const
size_t find(char c, size_t pos=0) const
DString & sprintf(const char *format,...)
void reserve(size_t size)
Reserve space for size bytes without changing the string contents.
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
DString left(size_t len) const
const std::string & str() const
bool stripPrefix(const DString &prefix)
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
bool startsWith(const char *s) const
bool endsWith(const char *s) const
size_t length() const
Returns the length of the string, not counting the 0-terminator.
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 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 const DString & name() const =0
virtual DString displayName(bool includeScope=true) const =0
virtual DString qualifiedName() const =0
virtual DString anchor() const =0
virtual DString getReference() const =0
virtual const GroupList & partOfGroups() const =0
virtual bool isArtificial() const =0
virtual Definition * getOuterScope() const =0
virtual DString docFile() const =0
virtual const Definition * findInnerCompound(const DString &name) const =0
virtual DString getOutputFileBase() const =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 empty(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 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 StringMap tagDestinationMap
static PageLinkedMap * pageLinkedMap
static DString htmlFileExtension
static DirLinkedMap * dirLinkedMap
static MemberNameLinkedMap * memberNameLinkedMap
static SymbolMap< Definition > * symbolMap
static FileNameLinkedMap * exampleNameLinkedMap
static GroupLinkedMap * groupLinkedMap
A model of a file symbol.
virtual ModuleDef * getModuleDef() const =0
virtual DString absFilePath() const =0
Minimal replacement for QFileInfo.
std::string extension(bool complete) const
bool match(const PatternList &patList, bool caseSenseNames, PatternElem *elem=nullptr, PatternGet getter=[](const std::string &s){ return s;}) const
Match the file name against a list of patterns.
std::string dirPath(bool absPath=true) const
std::string filePath() const
std::string absFilePath() const
FileDef * findFileDef(const DString &n, bool &ambig) const
Returns the file definition in fnMap that matches the file name n.
A model of a group of symbols.
const char * writeHtmlEntity(T &result, const char *s, HtmlEntityMapperFunc &&mapper, const char *fallback)
const char * xml(SymType symb) const
Access routine to the XML code of the HTML entity.
static HtmlEntityMapper & instance()
Returns the one and only instance of the HTML entity mapper.
DString convertCharEntitiesToUTF8(const DString &s) const
const T * find(const std::string &key) const
A model of a class/file/namespace member symbol.
virtual DString argsString() const =0
virtual bool isRelated() const =0
virtual const ClassDef * getClassDef() const =0
virtual GroupDef * getGroupDef()=0
virtual bool isTypedef() const =0
virtual const FileDef * getFileDef() const =0
virtual bool isStrongEnumValue() const =0
virtual const NamespaceDef * getNamespaceDef() const =0
virtual bool isEnumerate() const =0
virtual DString typeString() const =0
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.
static ModuleManager & instance()
An abstract interface of a namespace symbol.
Class representing a list of output generators that are written to in parallel.
void parseText(const DString &textStr)
void disable(OutputType o)
void writeObjectLink(const DString &ref, const DString &file, const DString &anchor, const DString &name)
void startConstraintList(const DString &header)
void startConstraintParam()
void writeString(const DString &text)
void startConstraintDocs()
void startConstraintType()
void pushGeneratorState()
void disableAllBut(OutputType o)
void endConstraintParam()
void generateDoc(const DString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const DString &docStr, const DocOptions &options)
A model of a page symbol.
virtual const GroupDef * getGroupDef() const =0
class that provide information about a section.
Definition * definition() const
static SectionManager & instance()
returns a reference to the singleton
const VectorPtr & find(const DString &name)
int isAccessibleFrom(const Definition *scope, const Definition *item)
Checks if symbol item is accessible from within scope.
const ClassDef * resolveClass(const Definition *scope, const DString &name, bool maybeUnlinkable=false, bool mayBeHidden=false)
Find the class definition matching name within the scope set.
const Definition * resolveSymbol(const Definition *scope, const DString &name, const DString &args=DString(), bool checkCV=false, bool insideCode=false, bool onlyLinkable=false)
Find the symbool definition matching name within the scope set.
DString getResolvedType() const
In case a call to resolveClass() points to a typedef or using declaration.
int isAccessibleFromWithExpScope(const Definition *scope, const Definition *item, const DString &explicitScopePart)
Check if symbol item is accessible from within scope, where it has to match the explicitScopePart.
DString 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. an enum) this method will return it.
Implements TextGeneratorIntf for an OutputDocInterface stream.
Text streaming class that buffers data.
std::string str() const
Return the contents of the buffer as a std::string object.
virtual DString trTypeConstraints()=0
virtual DString trModule(bool first_capital, bool singular)=0
virtual DString trWriteList(int numEntries)=0
ClassDef * getClass(const DString &n)
ClassDef * toClassDef(Definition *d)
std::vector< BaseClassDef > BaseClassList
Class representing a regular expression.
@ Wildcard
simple globbing pattern.
Class to iterate through matches.
ConceptDef * getConcept(const DString &n)
ConceptDef * toConceptDef(Definition *d)
#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
DString formatDateTime(const DString &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...
DString dateTimeFromString(const DString &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 DString &argsString, DString *extraTypeChars=nullptr)
DirIterator end(const DirIterator &) noexcept
#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.
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
int dstricmp(const char *s1, const char *s2)
bool isId(char c)
Returns true if c is a valid character for an identifier.
int dstrncmp(const char *str1, const char *str2, size_t len)
uint32_t dstrlen(const char *str)
Returns the length of string str, or 0 if a null pointer is passed.
const char * qPrint(const char *s)
FileDef * toFileDef(Definition *d)
Translator * theTranslator
void linkifyText(const TextGeneratorIntf &out, const DString &text, const LinkifyTextOptions &options)
DString md5str(const std::string_view &str)
std::array< uint8_t, 16 > md5hash(const std::string_view &str)
MemberDef * toMemberDef(Definition *d)
#define warn(file, line, fmt,...)
ModuleDef * toModuleDef(Definition *d)
FILE * popen(const DString &name, const DString &type)
std::ifstream openInputStream(const DString &name, bool binary=false, bool openAtEnd=false)
DString removeLongPathMarker(const DString &path)
bool fileSystemIsCaseSensitive()
std::ofstream openOutputStream(const DString &name, bool append=false)
void replaceNamespaceAliases(DString &name)
NamespaceDef * getResolvedNamespace(const DString &name)
NamespaceDef * toNamespaceDef(Definition *d)
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.
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)
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
StringVector split(const std::string &s, const std::string &delimiter)
split input string s by string delimiter delimiter.
Helper class to pass options when calling OutputList::generateDoc().
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.
DString stripExtension(const DString &fName)
bool useCaseSenseNames()
Returns true if the names of the symbols can be case sensitive.
bool isURL(const DString &url)
Checks whether the given url starts with a supported protocol.
DString substituteTemplateArgumentsInString(const DString &nm, const ArgumentList &formalArgs, const ArgumentList *actualArgs)
static DString extractDirection(DString &docs)
Strip the direction part from docs and return it as a string in canonical form.
static size_t findParameterList(const DString &name)
Returns the position in the string where a function parameter list begins, or DString::npos if one is...
static std::mutex writeFileContents_lock
DString inlineArgListToDoc(const ArgumentList &al)
DString stripLeadingAndTrailingEmptyLines(const DString &s, int &docLine)
Special version of DString::stripWhiteSpace() that only strips completely blank lines.
DString replaceColorMarkers(const DString &str)
Replaces any markers of the form ##AA in input string str by new markers of the form #AABBCC,...
bool protectionLevelVisible(Protection prot)
DString stripFromIncludePath(const DString &path)
DString mergeScopes(const DString &leftScope, const DString &rightScope)
bool resolveLink(const DString &scName, const DString &lr, bool, const Definition **resContext, DString &resAnchor, SrcLangExt lang, const DString &prefix)
DString filterTitle(const DString &title)
DString detab(const DString &s, size_t &refIndent)
DString selectBlocks(const DString &s, const SelectionBlockList &blockList, const SelectionMarkerInfo &markerInfo)
remove disabled blocks and all block markers from s and return the result as a string
bool matchTemplateArguments(const ArgumentList &srcAl, const ArgumentList &dstAl)
void stripIndentationVerbatim(DString &doc, size_t indentationLevel, bool skipFirstLine)
void addCodeOnlyMappings()
static int g_usedNamesCount
static void filterCRLF(std::string &contents)
static void stripIrrelevantString(DString &target, const DString &str, bool insideTemplate)
static DString stripDeclKeywords(const DString &s)
void writeTypeConstraints(OutputList &ol, const Definition *d, const ArgumentList &al)
DString extractBeginRawStringDelimiter(const char *rawStart)
void stripIrrelevantConstVolatile(DString &s, bool insideTemplate)
static DString getFilterFromList(const DString &name, const StringVector &filterList, bool &found)
static DString extractCanonicalArgType(const Definition *d, const FileDef *fs, const Argument &arg, SrcLangExt lang)
static DString getCanonicalTemplateSpec(const Definition *d, const FileDef *fs, const DString &spec, SrcLangExt lang)
DString writeInlineGraph(const DString &baseName, const DString &extension, const DString &content, bool &exists)
bool rightScopeMatch(const DString &scope, const DString &name)
bool checkIfTypedef(const Definition *scope, const FileDef *fileScope, const DString &n)
static const char constScope[]
static bool recursivelyAddGroupListToTitle(OutputList &ol, const Definition *d, bool root)
DString unescapeCharsInString(const DString &s)
bool resolveRef(const DString &scName, const DString &name, bool inSeeBlock, const Definition **resContext, const MemberDef **resMember, SrcLangExt lang, bool lookForSpecialization, const FileDef *currentFile, bool checkScope)
DString externalLinkTarget(const bool parent)
DString replaceAnonymousScopes(const DString &s, const DString &replacement)
void cleanupInlineGraphs()
DString correctURL(const DString &url, const DString &relPath)
Corrects URL url according to the relative path relPath.
int computeQualifiedIndex(const DString &name)
Return the index of the last :: in the string name that is still before the first <.
DString convertToJSString(const DString &s, bool keepEntities, bool singleQuotes)
DString convertToId(const DString &s)
void trimBaseClassScope(const BaseClassList &bcl, DString &s, int level=0)
DString insertTemplateSpecifierInScope(const DString &scope, const DString &templ)
DString removeRedundantWhiteSpace(const DString &s)
static std::unordered_map< std::string, SrcLangExt > g_extLookup
bool checkExtension(const DString &fName, const DString &ext)
DString convertNameToFile(const DString &name, bool allowDots, bool allowUnderscore)
DString showDate(const DString &fmt)
bool leftScopeMatch(const DString &scope, const DString &name)
DString stripExtensionGeneral(const DString &fName, const DString &ext)
DString tempArgListToString(const ArgumentList &al, SrcLangExt lang, bool includeDefault)
static ModuleDef * findModuleDef(const Definition *d)
void addGroupListToTitle(OutputList &ol, const Definition *d)
DString extractEndRawStringDelimiter(const char *rawEnd)
static DString extractCanonicalType(const Definition *d, const FileDef *fs, DString type, SrcLangExt lang, bool insideTemplate)
void clearSubDirs(const Dir &d)
DString stripScope(const DString &name)
DString getFileNameExtension(const DString &fn)
void createSubDirs(const Dir &d)
DString convertToHtml(const DString &s, bool keepEntities)
DString resolveTypeDef(const Definition *context, const DString &qualifiedName, const Definition **typedefContext)
bool readInputFile(const DString &fileName, std::string &contents, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
DString normalizeNonTemplateArgumentsInString(const DString &name, const Definition *context, const ArgumentList &formalArgs)
SrcLangExt getLanguageFromFileName(const DString &fileName, SrcLangExt defLang)
DString getFileFilter(const DString &name, bool isSourceCode)
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const DString &srcReturnType, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const DString &dstReturnType, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
static MemberDef * getMemberFromSymbol(const Definition *scope, const FileDef *fileScope, const DString &n)
void initDefaultExtensionMapping()
void addHtmlExtensionIfMissing(DString &fName)
void checkBlocks(const DString &s, const DString fileName, const SelectionMarkerInfo &markerInfo)
static void transcodeCharacterBuffer(const DString &fileName, std::string &contents, const DString &inputEncoding, const DString &outputEncoding)
DString fileToString(const DString &name, bool filter, bool isSourceCode)
static const char virtualScope[]
DString linkToText(SrcLangExt lang, const DString &link, bool ignoreDots)
DString substituteKeywords(const DString &file, const DString &s, const KeywordSubstitutionList &keywords)
void extractNamespaceName(const DString &scopeName, DString &className, DString &namespaceName, bool allowEmptyClass)
DString convertToXML(const DString &s, bool keepEntities, const bool citeEntry)
DString stripTemplateSpecifiersFromScope(const DString &fullName, bool parentOnly, DString *pLastScopeStripped, DString scopeName, bool allowArtificial)
DString relativePathToRoot(const DString &name)
static const DirDef * resolveDirLink(const DString &linkRef)
DString argListToString(const ArgumentList &al, bool useCanonicalType, bool showDefVals)
DString projectLogoFile()
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[]
DString getEncoding(const FileInfo &fi)
bool copyFile(const DString &src, const DString &dest)
Copies the contents of file with name src to the newly created file with name dest.
int getPrefixIndex(const DString &name)
DString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
bool updateLanguageMapping(const DString &extension, const DString &language)
DString demangleCSharpGenericName(const DString &name, const DString &templArgs)
DString createHtmlUrl(const DString &relPath, const DString &ref, bool isLocalFile, const DString &targetFileName, const DString &anchor)
DString projectLogoSize()
static DString getCanonicalTypeForIdentifier(const Definition *d, const FileDef *fs, const DString &word, SrcLangExt lang, DString *tSpec, int count=0)
DString mangleCSharpGenericName(const DString &name)
GetDefResult getDefs(const GetDefInput &input)
DString getDotImageExtension()
DString escapeCharsInString(const DString &name, bool allowDots, bool allowUnderscore)
static std::mutex g_usedNamesMutex
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)
int getScopeFragment(const DString &s, int p, int *l)
static bool getScopeDefs(const DString &docScope, const DString &scope, ClassDef *&cd, ConceptDef *&cnd, NamespaceDef *&nd, ModuleDef *&modd)
DString stripIndentation(const DString &s, bool skipFirstLine)
static bool matchCanonicalTypes(const Definition *srcScope, const FileDef *srcFileScope, const DString &srcType, const Definition *dstScope, const FileDef *dstFileScope, const DString &dstType, SrcLangExt lang)
int extractClassNameFromType(const DString &type, int &pos, DString &name, DString &templSpec, SrcLangExt lang)
DString determineAbsoluteIncludeName(const DString &curFile, const DString &incFileName)
static DString stripFromPath(const DString &p, StringVector l)
DString removeAnonymousScopes(const DString &str)
DString makeBaseName(const DString &name, const DString &ext)
DString getDotImageExtensionGenerated(const DString &format)
void writeMarkerList(OutputList &ol, const std::string &markerText, size_t numMarkers, std::function< void(size_t)> replaceFunc)
DString externalRef(const DString &relPath, const DString &ref)
static bool isLowerCase(DString &s)
DString stripPath(const DString &s)
static std::unordered_map< std::string, int > g_usedNames
static CharAroundSpace g_charAroundSpace
DString inlineTemplateArgListToDoc(const ArgumentList &al)
void writeExamples(OutputList &ol, const ExampleList &list)
static std::mutex g_matchArgsMutex
static const char operatorScope[]
bool openOutputFile(const DString &outFile, std::ofstream &f)
static std::vector< Lang2ExtMap > g_lang2extMap
DString stripAnonymousNamespaceScope(const DString &s)
DString findExampleFilePath(const DString &file, bool &ambig)
SrcLangExt getLanguageFromCodeLang(DString &fileName)
Routine to handle the language attribute of the \code command.
A bunch of utility functions.
std::vector< KeywordSubstitution > KeywordSubstitutionList
std::vector< SelectionBlock > SelectionBlockList