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)
2318 *resContext=
nullptr;
2321 if (lang==SrcLangExt::CSharp)
2326 AUTO_TRACE(
"scName='{}',ref='{}'",scName,lr);
2331 const DirDef *dir =
nullptr;
2337 if (linkRef.
empty())
2349 if (si) resAnchor = si->
label();
2361 resAnchor = si->
label();
2368 resAnchor = si->
label();
2398 else if (lang==SrcLangExt::Java &&
2399 (cd=
getClass(linkRefWithoutTemplates)))
2406 else if ((cd=
getClass(linkRef+
"-p")))
2423 resAnchor=modd->
anchor();
2442 bool res =
resolveRef(scName,lr,
true,resContext,&md,lang,
true,currentFile);
2443 if (md) resAnchor=md->
anchor();
2469 for (
const auto &s : examplePathList)
2497 std::string substRes;
2499 const char *p = s.
data();
2503 substRes.reserve(s.
length()+1024);
2510 for (
const auto &kw : keywords)
2512 size_t keyLen =
dstrlen(kw.keyword);
2513 if (
dstrncmp(p,kw.keyword,keyLen)==0)
2515 const char *startArg = p+keyLen;
2516 bool expectParam = std::holds_alternative<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
2518 if (expectParam && *startArg==
'(')
2521 const char *endArg =
nullptr;
2522 while ((c=*(startArg+j)) && c!=
')' && c!=
'\n' && c!=0) j++;
2523 if (c==
')') endArg=startArg+j;
2527 auto &&getValue = std::get<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
2528 substRes+=getValue(value).str();
2535 warn(file,line,
"Missing argument for '{}'",kw.keyword);
2539 else if (!expectParam)
2541 auto &&getValue = std::get<KeywordSubstitution::GetValue>(kw.getValueVariant);
2542 substRes+=getValue().str();
2549 warn(file,line,
"Expected arguments for '{}' but none were specified",kw.keyword);
2559 if (c==
'\n') line++;
2584 if (!projectLogo.
empty())
2589 projectLogo = projectLogo.
left(wi);
2593 projectLogo = projectLogo.
left(hi);
2604 if (!projectLogo.
empty())
2606 auto extractDimension = [&projectLogo](
const char *startMarker,
size_t startPos,
size_t endPos) ->
DString
2609 if (result.
length()>=2 && result.
at(0)!=
'"' && result.
at(result.
length()-1)!=
'"')
2611 result=
"\""+result+
"\"";
2617 size_t wi = projectLogo.
find(
" width=");
2618 size_t hi = projectLogo.
find(
" height=");
2623 sizeVal = extractDimension(
" width=", wi+7, hi) +
" "
2624 + extractDimension(
" height=", hi+8, projectLogo.
length());
2628 sizeVal = extractDimension(
" height=", hi+8, wi) +
" "
2629 + extractDimension(
" width=", wi+7, projectLogo.
length());
2634 sizeVal = extractDimension(
" width=", wi+7, projectLogo.
length());
2638 sizeVal = extractDimension(
" height=", hi+8, projectLogo.
length());
2654 if (name.
empty())
return 0;
2657 for (
const auto &s : sl)
2659 const char *ps=s.c_str();
2660 const char *pd=name.
data();
2662 while (*ps!=0 && *pd!=0 && *ps==*pd)
2668 if (*ps==0 && *pd!=0)
2674 if (result<
static_cast<int>(name.
length())-1 && name.
at(result)==
'[') result++;
2684 if (caseSenseNames == CASE_SENSE_NAMES_t::YES)
return true;
2685 else if (caseSenseNames == CASE_SENSE_NAMES_t::NO)
return false;
2691 if (name.
empty())
return name;
2697 const char *p=name.
data();
2702 case '_':
if (allowUnderscore) result+=
'_';
else result+=
"__";
break;
2703 case '-': result+=
'-';
break;
2704 case ':': result+=
"_1";
break;
2705 case '/': result+=
"_2";
break;
2706 case '<': result+=
"_3";
break;
2707 case '>': result+=
"_4";
break;
2708 case '*': result+=
"_5";
break;
2709 case '&': result+=
"_6";
break;
2710 case '|': result+=
"_7";
break;
2711 case '.':
if (allowDots) result+=
'.';
else result+=
"_8";
break;
2712 case '!': result+=
"_9";
break;
2713 case ',': result+=
"_00";
break;
2714 case ' ': result+=
"_01";
break;
2715 case '{': result+=
"_02";
break;
2716 case '}': result+=
"_03";
break;
2717 case '?': result+=
"_04";
break;
2718 case '^': result+=
"_05";
break;
2719 case '%': result+=
"_06";
break;
2720 case '(': result+=
"_07";
break;
2721 case ')': result+=
"_08";
break;
2722 case '+': result+=
"_09";
break;
2723 case '=': result+=
"_0a";
break;
2724 case '$': result+=
"_0b";
break;
2725 case '\\': result+=
"_0c";
break;
2726 case '@': result+=
"_0d";
break;
2727 case ']': result+=
"_0e";
break;
2728 case '[': result+=
"_0f";
break;
2729 case '#': result+=
"_0g";
break;
2730 case '"': result+=
"_0h";
break;
2731 case '~': result+=
"_0i";
break;
2732 case '\'': result+=
"_0j";
break;
2733 case ';': result+=
"_0k";
break;
2734 case '`': result+=
"_0l";
break;
2738 bool doEscape =
true;
2739 if (allowUnicodeNames)
2752 unsigned char id =
static_cast<unsigned char>(c);
2761 else if (caseSenseNames || !isupper(c))
2768 result+=
static_cast<char>(tolower(c));
2778 if (s.
empty())
return s;
2782 const char *p = s.
data();
2792 case '_': result+=c; p++;
break;
2793 case '1': result+=
':'; p++;
break;
2794 case '2': result+=
'/'; p++;
break;
2795 case '3': result+=
'<'; p++;
break;
2796 case '4': result+=
'>'; p++;
break;
2797 case '5': result+=
'*'; p++;
break;
2798 case '6': result+=
'&'; p++;
break;
2799 case '7': result+=
'|'; p++;
break;
2800 case '8': result+=
'.'; p++;
break;
2801 case '9': result+=
'!'; p++;
break;
2805 case '0': result+=
','; p+=2;
break;
2806 case '1': result+=
' '; p+=2;
break;
2807 case '2': result+=
'{'; p+=2;
break;
2808 case '3': result+=
'}'; p+=2;
break;
2809 case '4': result+=
'?'; p+=2;
break;
2810 case '5': result+=
'^'; p+=2;
break;
2811 case '6': result+=
'%'; p+=2;
break;
2812 case '7': result+=
'('; p+=2;
break;
2813 case '8': result+=
')'; p+=2;
break;
2814 case '9': result+=
'+'; p+=2;
break;
2815 case 'a': result+=
'='; p+=2;
break;
2816 case 'b': result+=
'$'; p+=2;
break;
2817 case 'c': result+=
'\\'; p+=2;
break;
2818 case 'd': result+=
'@'; p+=2;
break;
2819 case 'e': result+=
']'; p+=2;
break;
2820 case 'f': result+=
'['; p+=2;
break;
2821 case 'g': result+=
'#'; p+=2;
break;
2822 case 'h': result+=
'"'; p+=2;
break;
2823 case 'i': result+=
'~'; p+=2;
break;
2824 case 'j': result+=
'\''; p+=2;
break;
2825 case 'k': result+=
';'; p+=2;
break;
2826 case 'l': result+=
'`'; p+=2;
break;
2833 if (!caseSenseNames && c>=
'a' && c<=
'z')
2835 result+=
static_cast<char>(toupper(*p));
2866 if (name.
empty())
return name;
2889 size_t resultLen = result.
length();
2898 int l1Dir=0,l2Dir=0;
2899 int createSubdirsLevel =
Config_getInt(CREATE_SUBDIRS_LEVEL);
2900 int createSubdirsBitmaskL2 = (1<<createSubdirsLevel)-1;
2904 l1Dir = md5_sig[14] & 0xf;
2905 l2Dir = md5_sig[15] & createSubdirsBitmaskL2;
2933 DString absIncFileName = incFileName;
2943 else if (searchIncludes)
2946 for (
const auto &incPath : includePath)
2965 return absIncFileName;
2975 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
2976 for (
int l1=0; l1<16; l1++)
2982 term(
"Failed to create output directory '{}'\n",subdir);
2984 for (
int l2=0; l2<createSubdirsLevelPow2; l2++)
2987 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
2990 term(
"Failed to create output directory '{}'\n",subsubdir);
3002 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
3003 for (
int l1=0;l1<16;l1++)
3007 for (
int l2=0; l2 < createSubdirsLevelPow2; l2++)
3010 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
3029 bool allowEmptyClass)
3037 namespaceName=nd->
name();
3041 p=
static_cast<int>(clName.
length())-2;
3049 namespaceName=nd->
name();
3050 className=clName.
mid(i+2);
3053 p=
static_cast<int>(i)-2;
3058 className=scopeName;
3059 namespaceName.
clear();
3062 if (className.
empty() && !namespaceName.
empty() && !allowEmptyClass)
3065 className=namespaceName;
3066 namespaceName.
clear();
3072 className = className.
left(className.
length()-2);
3098 result=scope.
left(si) + templ + scope.
mid(si);
3113 int l =
static_cast<int>(result.
length());
3116 bool skipBracket=
false;
3123 while (p>=0 && count>=0)
3125 char c=result.
at(p);
3131 if (p>0 && result.
at(p-1)==
':' && (count==0 || skipBracket))
3133 return result.
right(l-p-1);
3144 if (p>0 && result.
at(p-1)==
'>')
3152 bool foundMatch=
false;
3153 while (p>=0 && !foundMatch)
3165 if (round==0) count++;
3172 if (result.
at(p-1) ==
'<')
3179 foundMatch = count==0;
3194 done = count==0 || skipBracket;
3205 if (s.
empty())
return s;
3208 const char *p = s.
data();
3214 if ((c>=
'0' && c<=
'9') || (c>=
'a' && c<=
'z') || (c>=
'A' && c<=
'Z') || c==
'-')
3216 if (first && c>=
'0' && c<=
'9') result+=
'a';
3222 encChar[1]=
hex[
static_cast<unsigned char>(c)>>4];
3223 encChar[2]=
hex[
static_cast<unsigned char>(c)&0xF];
3235 if (s.
empty())
return s;
3238 const char *p = s.
data();
3244 case '<': result+=
"<";
break;
3245 case '>': result+=
">";
break;
3246 case '&':
if (keepEntities)
3252 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
3258 while (p<e) result+=*p++;
3278 case '\'': result+=
"'";
break;
3279 case '"': result+=
""";
break;
3280 case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
3281 case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
3282 case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
3283 case 27:
case 28:
case 29:
case 30:
case 31:
3285 default: result+=c;
break;
3294 if (s.
empty())
return s;
3297 const char *p=s.
data();
3303 case '<': result+=
"<";
break;
3304 case '>': result+=
">";
break;
3305 case '&':
if (keepEntities)
3311 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
3317 while (p<e) result+=*p++;
3329 case '\'': result+=
"'";
break;
3330 case '"': result+=
""";
break;
3333 uint8_t uc =
static_cast<uint8_t
>(c);
3334 if (uc<32 && !isspace(c))
3338 result+=
hex[uc&0xF];
3354 if (s.
empty())
return s;
3357 const char *p=s.
data();
3363 case '"':
if (!singleQuotes) result+=
"\\\"";
else result+=c;
3365 case '\'':
if (singleQuotes) result+=
"\\\'";
else result+=c;
3367 case '\\':
if (*p==
'u' && *(p+1)==
'{') result+=
"\\";
3368 else result+=
"\\\\";
3370 default: result+=c;
break;
3383 AUTO_TRACE(
"type='{}' pos={} name='{}' lang={}",type,pos,name,lang);
3384 static const reg::Ex re_norm(R
"(\a[\w:]*)");
3385 static const reg::Ex re_fortran(R
"(\a[\w:()=]*)");
3395 size_t typeLen=type.
length();
3398 if (lang == SrcLangExt::Fortran)
3410 std::string s = type.
str();
3416 const auto &match = *it;
3417 size_t i = match.position();
3418 size_t l = match.length();
3423 while (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
' ') { ts++; tl++; }
3424 if (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
'<')
3429 while (te<typeLen && brCount!=0)
3431 if (type[
static_cast<uint32_t
>(te)]==
'<')
3433 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'<') te++;
else brCount++;
3435 if (type[
static_cast<uint32_t
>(te)]==
'>')
3437 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'>') te++;
else brCount--;
3447 pos=
static_cast<int>(i+l+tl);
3451 pos=
static_cast<int>(i+l);
3456 return static_cast<int>(i);
3459 pos =
static_cast<int>(typeLen);
3472 size_t p=name.
find(
'<');
3477 std::string s = name.
mid(p).
str();
3478 static const reg::Ex re(R
"([\a:][\w:]*)");
3483 for (; it!=
end ; ++it)
3485 const auto &match = *it;
3486 size_t i = match.position();
3487 size_t l = match.length();
3488 result += s.
substr(pi,i-pi);
3491 for (
const Argument &formArg : formalArgs)
3493 if (formArg.name == n)
3531 if (formalArgs.
empty())
return nm;
3534 static const reg::Ex re(R
"(\a\w*)");
3535 std::string name = nm.str();
3540 for (; it!=
end ; ++it)
3542 const auto &match = *it;
3543 size_t i = match.position();
3544 size_t l = match.length();
3545 if (i>p) result += name.
substr(p,i-p);
3550 actIt = actualArgs->
begin();
3557 for (
auto formIt = formalArgs.
begin();
3558 formIt!=formalArgs.
end() && !found;
3564 if (actualArgs && actIt!=actualArgs->
end())
3571 formArg.
type =
"class";
3576 formArg.
type =
"typename";
3580 formArg.
name +=
"...";
3585 formArg.
name +=
"...";
3592 if (formArg.
name==n && actualArgs && actIt!=actualArgs->
end() && !actArg.
type.
empty())
3599 ii = subst.find(
'<');
3608 bool beforeNonWord = ii==0 || !
isId(subst.at(ii-1));
3609 bool afterNonWord = subst.length()==ii+nameArg.length() || !
isId(subst.at(ii+nameArg.length()));
3610 if (beforeNonWord && afterNonWord)
3614 pp=ii+nameArg.length();
3619 AUTO_TRACE_ADD(
"result={} n={} type={} hasRecursion={}",result,n,actArg.
type,hasRecursion(result,n,actArg.
type));
3620 if (!hasRecursion(result,n,actArg.
type))
3632 result += actArg.
type;
3638 result += actArg.
type+
" "+actArg.
name;
3643 else if (formArg.
name==n &&
3644 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
3653 else if (formArg.
name==n &&
3654 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
3662 if (actualArgs && actIt!=actualArgs->
end())
3691 bool allowArtificial)
3694 size_t i=fullName.
find(
'<');
3698 size_t l=fullName.
length();
3705 while (e<l && count>0)
3707 char c=fullName.
at(e++);
3710 case '(': round++;
break;
3711 case ')':
if (round>0) round--;
break;
3712 case '<':
if (round==0) count++;
break;
3713 case '>':
if (round==0) count--;
break;
3718 size_t si = fullName.
find(
"::",e);
3723 result+=fullName.
mid(p,i-p);
3726 if (cd!=
nullptr && (allowArtificial || !cd->
isArtificial()))
3728 result+=fullName.
mid(i,e-i);
3731 else if (pLastScopeStripped)
3734 *pLastScopeStripped=fullName.
mid(i,e-i);
3737 i=fullName.
find(
'<',p);
3739 result+=fullName.
right(l-p);
3756 AUTO_TRACE(
"leftScope='{}' rightScope='{}'",leftScope,rightScope);
3764 size_t i=0,p=leftScope.
length();
3773 result = leftScope.
left(i+2)+rightScope;
3786 if (!result.
empty() && !rightScope.
empty()) result+=
"::";
3801 int sl=
static_cast<int>(s.
length());
3805 if (sp>=sl)
return -1;
3829 while (sp<sl && !done)
3835 case '<': count++;
break;
3836 case '>': count--;
if (count==0) done=
true;
break;
3897 if (!first) { ol.
writeString(
" | "); }
else first=
false;
3909 if (!first) { ol.
writeString(
" | "); }
else first=
false;
3934 if (fName.
empty())
return;
3935 size_t i_fs = fName.
rfind(
'/');
3936 size_t i_bs = fName.
rfind(
'\\');
3939 size_t i = fName.
find(
'.',p);
3966 result=result.
mid(i+1);
3970 result=result.
mid(i+1);
3991 const char *p = s.
data();
3994 int i=0,li=-1,l=
static_cast<int>(s.
length());
3998 if (c==
' ' || c==
'\t' || c==
'\r') { i++; p++; }
3999 else if (c==
'\\' &&
literal_at(p,
"\\ilinebr")) { i+=8; li=i; p+=8; }
4000 else if (c==
'\n') { i++; li=i; docLine++; p++; }
4010 if (c==
' ' || c==
'\t' || c==
'\r') { b--; p--; }
4011 else if (c==
'r' && b>=7 &&
literal_at(p-7,
"\\ilinebr")) { bi=b-7; b-=8; p-=8; }
4012 else if (c==
'>' && b>=11 &&
literal_at(p-11,
"\\ilinebr<br>")) { bi=b-11; b-=12; p-=12; }
4013 else if (c==
'\n') { bi=b; b--; p--; }
4018 if (li==-1 && bi==-1)
return s;
4025 return s.
mid(li,bi-li);
4043 {
"idl",
"c", SrcLangExt::IDL,
".idl" },
4044 {
"java",
"c", SrcLangExt::Java,
".java"},
4045 {
"javascript",
"c", SrcLangExt::JS,
".js" },
4046 {
"csharp",
"c", SrcLangExt::CSharp,
".cs" },
4047 {
"d",
"c", SrcLangExt::D,
".d" },
4048 {
"php",
"c", SrcLangExt::PHP,
".php" },
4049 {
"objective-c",
"c", SrcLangExt::ObjC,
".m" },
4050 {
"c",
"c", SrcLangExt::Cpp,
".c" },
4051 {
"c++",
"c", SrcLangExt::Cpp,
".cpp" },
4052 {
"slice",
"c", SrcLangExt::Slice,
".ice" },
4053 {
"python",
"python", SrcLangExt::Python,
".py" },
4054 {
"fortran",
"fortran", SrcLangExt::Fortran,
".f" },
4055 {
"fortranfree",
"fortranfree", SrcLangExt::Fortran,
".f90" },
4056 {
"fortranfixed",
"fortranfixed", SrcLangExt::Fortran,
".f" },
4057 {
"vhdl",
"vhdl", SrcLangExt::VHDL,
".vhdl"},
4058 {
"xml",
"xml", SrcLangExt::XML,
".xml" },
4059 {
"sql",
"sql", SrcLangExt::SQL,
".sql" },
4060 {
"md",
"md", SrcLangExt::Markdown,
".md" },
4061 {
"lex",
"lex", SrcLangExt::Lex,
".l" },
4068 [&langName](
const auto &info) { return info.langName==langName; });
4074 if (extName.
empty())
return false;
4075 if (extName.
at(0)!=
'.') extName.
prepend(
".");
4085 err(
"Failed to assign extension {} to parser {} for language {}\n",
4086 extName.
data(),it1->parserName,language);
4174 if (extName.
empty()) extName=
".no_extension";
4175 if (extName.
at(0)!=
'.') extName.
prepend(
".");
4191 if (lang == SrcLangExt::Unknown)
4195 if (langName.
at(0)==
'.') langName = langName.
mid(1);
4197 [&langName](
const auto &info) { return info.langName==langName; });
4200 lang = it->parserId;
4201 fileName = it->defExt;
4205 return SrcLangExt::Cpp;
4213 if (fn.
empty())
return "";
4223 if (scope==
nullptr ||
4243 if (qualifierIndex!=-1)
4245 explicitScopePart = name.
left(qualifierIndex);
4247 name = name.
mid(qualifierIndex+2);
4251 int minDistance = 10000;
4260 if (distance!=-1 && distance<minDistance)
4262 minDistance = distance;
4276 if (bestMatch && bestMatch->
isTypedef())
4286 if (al.
empty())
return;
4303 .setIndexWords(
true));
4313#ifdef TRACINGSUPPORT
4314 void *backtraceFrames[128];
4315 int frameCount = backtrace(backtraceFrames, 128);
4316 const size_t cmdLen = 40960;
4317 static char cmd[cmdLen];
4319 p += snprintf(p,cmdLen,
"/usr/bin/atos -p %d ", (
int)getpid());
4320 for (
int x = 0; x < frameCount; x++)
4322 p += snprintf(p,cmdLen,
"%p ", backtraceFrames[x]);
4324 fprintf(stderr,
"========== STACKTRACE START ==============\n");
4328 while (
size_t len = fread(resBuf, 1,
sizeof(resBuf), fp))
4330 fwrite(resBuf, 1, len, stderr);
4334 fprintf(stderr,
"============ STACKTRACE END ==============\n");
4342 if (inputEncoding.
empty() || outputEncoding.
empty())
return;
4343 if (
dstricmp(inputEncoding,outputEncoding)==0)
return;
4345 if (cd==
reinterpret_cast<void *
>(-1))
4347 term(
"unsupported character conversion: '{}'->'{}': {}\n"
4348 "Check the INPUT_ENCODING setting in the config file!\n",
4349 inputEncoding,outputEncoding,strerror(errno));
4351 size_t iLeft = contents.size();
4352 const char *srcPtr = contents.data();
4353 size_t tmpBufSize = contents.size()*4+1;
4354 size_t oLeft = tmpBufSize;
4356 tmpBuf.resize(tmpBufSize);
4357 char *dstPtr = tmpBuf.data();
4361 newSize = tmpBufSize-oLeft;
4362 tmpBuf.resize(newSize);
4363 std::swap(contents,tmpBuf);
4368 term(
"{}: failed to translate characters from {} to {}: check INPUT_ENCODING\n",
4369 fileName,inputEncoding,outputEncoding);
4379 if (!fi.
exists())
return false;
4381 if (filterName.
empty() || !filter)
4386 err(
"could not open file {}\n",fileName);
4390 auto fileSize = fi.
size();
4391 contents.resize(fileSize);
4392 f.read(contents.data(),fileSize);
4395 err(
"problems while reading file {}\n",fileName);
4401 DString cmd=filterName+
" \""+fileName+
"\"";
4406 err(
"could not execute filter {}\n",filterName);
4409 const int bufSize=4096;
4412 while ((numRead=
static_cast<int>(fread(buf,1,bufSize,f)))>0)
4415 contents.append(buf,numRead);
4422 if (contents.size()>=2 &&
4423 static_cast<uint8_t
>(contents[0])==0xFF &&
4424 static_cast<uint8_t
>(contents[1])==0xFE
4429 else if (contents.size()>=2 &&
4430 static_cast<uint8_t
>(contents[0])==0xFE &&
4431 static_cast<uint8_t
>(contents[1])==0xFF
4436 else if (contents.size()>=3 &&
4437 static_cast<uint8_t
>(contents[0])==0xEF &&
4438 static_cast<uint8_t
>(contents[1])==0xBB &&
4439 static_cast<uint8_t
>(contents[2])==0xBF
4442 contents.erase(0,3);
4458 std::string t = title.
str();
4459 static const reg::Ex re(R
"(%[a-z_A-Z]+)");
4463 for (; it!=
end ; ++it)
4465 const auto &match = *it;
4466 size_t i = match.position();
4467 size_t l = match.length();
4468 if (i>p) tf+=t.substr(p,i-p);
4469 tf+=match.str().substr(1);
4495 if (extLinksInWindow)
4496 return "target=\"_blank\" ";
4498 return "target=\"_parent\" ";
4506 const DString &targetFileName,
4514 if (!targetFileName.
empty())
4519 if (!anchor.
empty() && isLocalFile)
4530 if (!anchor.
empty())
4547 result = it->second;
4548 size_t l = result.
length();
4549 if (!relPath.
empty() && l>0 && result.
at(0)==
'.')
4554 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
4573 std::string s=str.
str();
4574 static const reg::Ex re(R
"(##[0-9A-Fa-f][0-9A-Fa-f])");
4580 size_t sl=s.length();
4582 for (; it!=
end ; ++it)
4584 const auto &match = *it;
4585 size_t i = match.position();
4586 size_t l = match.length();
4587 if (i>p) result+=s.substr(p,i-p);
4588 std::string lumStr = match.str().substr(2);
4589#define HEXTONUM(x) (((x)>='0' && (x)<='9') ? ((x)-'0') : \
4590 ((x)>='a' && (x)<='f') ? ((x)-'a'+10) : \
4591 ((x)>='A' && (x)<='F') ? ((x)-'A'+10) : 0)
4593 double r = 0,g = 0,b = 0;
4596 pow(level/255.0,gamma/100.0),&r,&g,&b);
4597 int red =
static_cast<int>(r*255.0);
4598 int green =
static_cast<int>(g*255.0);
4599 int blue =
static_cast<int>(b*255.0);
4602 colStr[1]=
hex[red>>4];
4603 colStr[2]=
hex[red&0xf];
4604 colStr[3]=
hex[green>>4];
4605 colStr[4]=
hex[green&0xf];
4606 colStr[5]=
hex[blue>>4];
4607 colStr[6]=
hex[blue&0xf];
4613 if (p<sl) result+=s.substr(p);
4624 err(
"could not copy file {} to {}\n",src,dest);
4632 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp || lang==SrcLangExt::VHDL || lang==SrcLangExt::Python)
4636 else if (lang==SrcLangExt::PHP && !classScope)
4649 static const std::unordered_set<std::string> schemes = {
4650 "http",
"https",
"ftp",
"ftps",
"sftp",
"file",
"news",
"irc",
"ircs"
4653 size_t colonPos = loc_url.
find(
':');
4677 return (prot!=Protection::Private && prot!=Protection::Package) ||
4678 (prot==Protection::Private && extractPrivate) ||
4679 (prot==Protection::Package && extractPackage);
4686 if (s.
empty())
return s;
4690 const char *p=s.
data();
4693 int minIndent=1000000;
4694 bool searchIndent=
true;
4696 bool skipFirst = skipFirstLine;
4699 if (c==
'\t') { indent+=tabSize - (indent%tabSize); }
4700 else if (c==
'\n') { indent=0; searchIndent=
true; skipFirst=
false; }
4701 else if (c==
' ') { indent++; }
4702 else if (searchIndent && !skipFirst)
4705 if (indent<minIndent) minIndent=indent;
4710 if (minIndent==0)
return substitute(s,
"@ilinebr",
"\\ilinebr");
4716 skipFirst=skipFirstLine;
4725 else if (indent<minIndent && !skipFirst)
4729 int newIndent = indent+tabSize-(indent%tabSize);
4743 else if (c==
'\\' &&
literal_at(p,
"ilinebr "))
4746 result <<
"\\ilinebr ";
4749 for (
int j=0;j<minIndent;j++)
if (*(p+j)==
' ') skipAmount++;
4750 if (skipAmount==minIndent)
4757 result <<
"\\ilinebr";
4768 return result.
str();
4776 if (indentationLevel <= 0 || doc.
empty())
return;
4781 const char *src = doc.
data();
4783 bool insideIndent = !skipFirstLine;
4785 if (!skipFirstLine) cnt = indentationLevel;
4793 insideIndent =
true;
4794 cnt = indentationLevel;
4805 insideIndent =
false;
4815 insideIndent =
false;
4820 doc.
resize(
static_cast<uint32_t
>(dst-doc.
data()));
4832 std::string s = docs.
str();
4833 static const reg::Ex re(R
"(\[([ inout,]+)\])");
4838 const auto &match = *it;
4839 size_t p = match.position();
4840 size_t l = match.length();
4844 std::string dir = match[1].str();
4846 dir.erase(std::remove_if(dir.begin(),dir.end(),
4847 [](
const char c) { return c==
' ' || c==
','; }
4849 unsigned char ioMask=0;
4850 size_t inIndex = dir.find(
"in");
4851 if ( inIndex!=std::string::npos) { dir.erase( inIndex,2); ioMask|=(1<<0); }
4852 size_t outIndex = dir.find(
"out");
4853 if (outIndex!=std::string::npos) { dir.erase(outIndex,3); ioMask|=(1<<1); }
4854 if (dir.empty() && ioMask!=0)
4857 if (ioMask==((1<<0)|(1<<1)))
return "[in,out]";
4858 else if (ioMask==(1<<0))
return "[in]";
4859 else if (ioMask==(1<<1))
return "[out]";
4873 if (a.hasDocumentation(
true))
4875 DString docsWithoutDir = a.docs;
4882 paramDocs+=
" \\ilinebr @param"+direction+
" "+name+
" "+docsWithoutDir;
4915 *outListType1=inListType;
4918 if (inProt==Protection::Public)
4925 else if (inProt==Protection::Protected)
4933 *outListType2=inListType.
toPublic();
4936 else if (inProt==Protection::Private)
4946 *outListType1=inListType.
toPublic();
4971 size_t i= format.
find(
':');
4979 for (
size_t i = splitExt.size(); i > 0; )
4982 extGen += splitExt[i] + (i!=0 ?
"." :
"");
4990 bool fileOpened=
false;
4991 bool writeToStdout=outFile==
"-";
4994 f.basic_ios<char>::rdbuf(std::cout.rdbuf());
5009 fileOpened = f.is_open();
5019 if (s.
empty())
return s;
5022 auto skipBlock = [&markerInfo](
const char *p,
const SelectionBlock &blk)
5029 size_t len = markerInfo.
endLen;
5030 bool negate = *(p+markerInfo.
endLen)==
'!';
5032 size_t blkNameLen =
dstrlen(blk.name);
5033 if (
dstrncmp(p+len,blk.name,blkNameLen)==0 &&
5037 return p+len+blkNameLen+markerInfo.
closeLen;
5054 const char *p = s.
data();
5064 bool negate = *(p+len)==
'!';
5066 for (
const auto &blk : blockList)
5068 size_t blkNameLen =
dstrlen(blk.name);
5069 if (
dstrncmp(p+len,blk.name,blkNameLen)==0 &&
5072 bool blockEnabled = blk.enabled!=negate;
5074 p+=len+blkNameLen+markerInfo.
closeLen;
5093 size_t len = markerInfo.
endLen;
5094 bool negate = *(p+len)==
'!';
5096 for (
const auto &blk : blockList)
5098 size_t blkNameLen =
dstrlen(blk.name);
5099 if (
dstrncmp(p+len,blk.name,blkNameLen)==0 &&
5103 p+=len+blkNameLen+markerInfo.
closeLen;
5132 if (s.
empty())
return;
5134 const char *p = s.
data();
5143 bool negate = *(p+len)==
'!';
5149 if (markerInfo.
closeLen==0 && *p==
'\n')
5151 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
5157 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
5166 size_t len = markerInfo.
endLen;
5167 bool negate = *(p+len)==
'!';
5173 if (markerInfo.
closeLen==0 && *p==
'\n')
5175 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
5181 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
5198 size_t size = s.
length();
5201 const char *data = s.
data();
5204 constexpr auto doxy_nbsp =
"&_doxy_nbsp;";
5205 const int maxIndent=1000000;
5206 int minIndent=maxIndent;
5215 int stop = tabSize - (col%tabSize);
5218 while (stop--) result+=
' ';
5222 if (skip && data[i] ==
'\\' && i+8<size &&
literal_at(data+i+1,
"endiskip"))
5228 else if (data[i] ==
'\\')
5234 else if (i+5<size &&
literal_at(data+i,
"iskip"))
5239 else if (i+8<size &&
literal_at(data+i,
"endiskip"))
5259 if (
static_cast<signed char>(c)<0 && i<size)
5271 for (
int j=0;j<bytes-1 && c;j++)
5283 if (!skip && col<minIndent) minIndent=col;
5287 if (minIndent!=maxIndent) refIndent=minIndent;
else refIndent=0;
5302 int l =
static_cast<int>(name.
length());
5303 int lastSepPos = -1;
5304 const char *p = name.
data();
5313 if (sharpCount==0 && p[i+1]==
':' && p[i+2]==
':')
5327 if (ts==-1) ts=0;
else p+=++ts;
5328 for (i=ts;i<l-1;i++)
5331 if (c==
':' && *p==
':') lastSepPos=i;
5355 size_t idx = result.
find(
'-');
5356 result = result.
left(idx)+templArgs;
5364 size_t i = text.
find(
'"');
5392 file.write( content.
data(), content.
length() );
5397 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)
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 resolveLink(const DString &scName, const DString &lr, bool, const Definition **resContext, DString &resAnchor, SrcLangExt lang, const DString &prefix, const FileDef *currentFile)
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