29#include <unordered_set>
67#define ENABLE_TRACINGSUPPORT 0
69#if defined(__APPLE__) && ENABLE_TRACINGSUPPORT
80#define REL_PATH_TO_ROOT "../../"
82static const char *
hex =
"0123456789ABCDEF";
103 if (str.
empty())
return result;
106 auto startsWithColon = [](
const std::string &del)
108 for (
size_t i=0;i<del.size();i++)
110 if (del[i]==
'@')
return false;
111 else if (del[i]==
':')
return true;
117 auto endsWithColon = [](
const std::string &del)
119 for (
int i=
static_cast<int>(del.size())-1;i>=0;i--)
121 if (del[i]==
'@')
return false;
122 else if (del[i]==
':')
return true;
127 static const reg::Ex re(R
"([\s:]*@\d+[\s:]*)");
128 std::string s = str.str();
132 size_t sl=s.length();
133 bool needsSeparator=
false;
134 for ( ; iter!=
end ; ++iter)
136 const auto &match = *iter;
137 size_t i = match.position();
140 if (needsSeparator) result+=
"::";
141 needsSeparator=
false;
142 result+=s.substr(p,i-p);
144 std::string delim = match.str();
145 needsSeparator = needsSeparator || (startsWithColon(delim) && endsWithColon(delim));
146 p = match.position()+match.length();
150 if (needsSeparator) result+=
"::";
159 if (s.
empty())
return s;
160 static const reg::Ex marker(R
"(@\d+)");
162 !replacement.empty() ? replacement.data() : "__anonymous__");
173 int sl =
static_cast<int>(s.
length());
181 if (!newScope.
empty()) newScope+=
"::";
182 newScope+=s.
mid(i,l);
187 if (!newScope.
empty()) newScope+=
"::";
188 newScope+=s.
right(sl-i);
204 for (
const auto &s : l)
207 if (
prefix.length() > length &&
214 if (length>0)
return potential;
237 AUTO_TRACE(
"context='{}' qualifiedName='{}'",context?context->
name():
"",qualifiedName);
239 if (qualifiedName.
empty())
246 if (typedefContext) *typedefContext=context;
254 size_t scopeIndex = qualifiedName.
rfind(
"::");
258 resName=qualifiedName.
mid(scopeIndex+2);
266 while (mContext && md==
nullptr)
273 DString resScopeName = qualifiedName.
left(scopeIndex);
280 DString qualScopePart = resScopeName.
mid(is,l);
282 if (!tmp.
empty()) qualScopePart=tmp;
285 if (resScope==
nullptr)
break;
297 bool searchRelated=
false;
298 bool mustBeRelated=
false;
309 if (mn==0 && searchRelated)
317 for (
const auto &tmd_p : *mn)
320 AUTO_TRACE_ADD(
"found candidate member '{}' isTypeDef={}' isRelated={} mustBeRelated={}",
335 if (dist!=-1 && (md==
nullptr || dist<minDist))
381static const char constScope[] = {
'c',
'o',
'n',
's',
't',
':' };
382static const char volatileScope[] = {
'v',
'o',
'l',
'a',
't',
'i',
'l',
'e',
':' };
383static const char virtualScope[] = {
'v',
'i',
'r',
't',
'u',
'a',
'l',
':' };
384static const char operatorScope[] = {
'o',
'p',
'e',
'r',
'a',
't',
'o',
'r',
'?',
'?',
'?' };
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;
398 charMap[
static_cast<int>(
':')].before=
false;
399 charMap[
static_cast<int>(
'/')].before=
false;
401 charMap[
static_cast<int>(
'=')].after=
false;
402 charMap[
static_cast<int>(
' ')].after=
false;
403 charMap[
static_cast<int>(
'[')].after=
false;
404 charMap[
static_cast<int>(
']')].after=
false;
405 charMap[
static_cast<int>(
'\t')].after=
false;
406 charMap[
static_cast<int>(
'\n')].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;
412 charMap[
static_cast<int>(
'(')].after=
false;
413 charMap[
static_cast<int>(
'/')].after=
false;
440 if (s.
length()*3>growBufLen)
442 growBufLen = s.
length()*3;
443 growBuf =
static_cast<char *
>(realloc(growBuf,growBufLen+1));
445 if (growBuf==
nullptr)
return s;
447 const char *src=s.
data();
458 while (i<l && isspace(
static_cast<uint8_t
>(src[i])))
465 char nc=i+1<l ? src[i+1] :
' ';
467 auto searchForKeyword = [&](
const char *kw,
size_t &matchLen,
size_t totalLen)
469 if (matchLen<=totalLen && c==kw[matchLen] &&
504 if (c==
'\\' && i+1<l)
528 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
529 (
isId(pc) || pc==
'*' || pc==
'&' || pc==
'.' || pc==
'>') &&
530 (osp<8 || (osp==8 && pc!=
'-'))
536 if (i+1<l && (nc==
'-' || nc==
'&'))
543 if (i>0 && !isspace(
static_cast<uint8_t
>(pc)) &&
544 ((i+1<l && (
isId(nc) || nc==
'[')) ||
545 (i+2<l && nc==
'$' &&
isId(src[i+2])) ||
546 (i+3<l && nc==
'&' && src[i+2]==
'$' &&
isId(src[i+3]))
556 if (cliSupport && i+1<l && (
isId(nc) || nc==
'-'))
563 if (i+1<l && (
isId(nc) || nc==
'-'))
569 if (i>0 && pc!=
' ' && pc!=
'\t' && pc!=
':' &&
570 pc!=
'*' && pc!=
'&' && pc!=
'(' && pc!=
'/' && pc!=
'[' &&
580 if (i>0 &&
isId(pc) && osp<9)
600 if (i>0 && i+1<l && pc!=
'=' && pc!=
':' && !isspace(
static_cast<uint8_t
>(pc)) &&
631 !(pc==
',' && nc==
'.') &&
632 (osp<8 || (osp>=8 &&
isId(pc) &&
isId(nc)))
640 else if ((pc==
'*' || pc==
'&' || pc==
'.') && nc==
'>')
648 auto correctKeywordAllowedInsideScope = [&](
char cc,
size_t &matchLen,
size_t totalLen) {
649 if (c==cc && matchLen==totalLen)
651 if ((i+2<l && src[i+1] ==
':' && src[i+2] ==
':') ||
652 ((i>matchLen && src[i-matchLen] ==
':' && src[i-matchLen-1] ==
':'))
656 correctKeywordAllowedInsideScope(
't',csp, 5);
657 correctKeywordAllowedInsideScope(
'e',vosp,8);
658 correctKeywordAllowedInsideScope(
'l',vsp, 7);
660 auto correctKeywordNotPartOfScope = [&](
char cc,
size_t &matchLen,
size_t totalLen)
662 if (c==cc && matchLen==totalLen && i+1<l &&
670 correctKeywordNotPartOfScope(
't',csp, 5);
671 correctKeywordNotPartOfScope(
'e',vosp,8);
672 correctKeywordNotPartOfScope(
'l',vsp, 7);
692 if (templateDepth > 0)
694 size_t nextOpenPos = name.
rfind(
'>', pos);
695 size_t nextClosePos = name.
rfind(
'<', pos);
713 size_t lastAnglePos = name.
rfind(
'>', pos);
714 size_t bracePos = name.
rfind(
'(', pos);
724 return bp==
DString::npos || (bp>=8 && name.
mid(bp-8,10)==
"operator()") ? bracePos : bp;
735 return (name==scope ||
736 (scope.
right(nl)==name &&
737 sl>1+nl && scope.
at(sl-nl-1)==
':' && scope.
at(sl-nl-2)==
':'
746 return (name==scope ||
747 (name.
left(sl)==scope &&
748 nl>sl+1 && name.
at(sl)==
':' && name.
at(sl+1)==
':'
756 std::function<
void(
size_t)> replaceFunc)
758 static const reg::Ex marker(R
"(@(\d+))");
762 for ( ; it!=
end ; ++it)
764 const auto &match = *it;
765 size_t newIndex = match.position();
766 size_t matchLen = match.length();
767 ol.
parseText(markerText.substr(index,newIndex-index));
768 unsigned long entryIndex = std::stoul(match[1].str());
769 if (entryIndex<
static_cast<unsigned long>(numMarkers))
771 replaceFunc(entryIndex);
773 index=newIndex+matchLen;
779 std::function<
DString(
size_t)> replaceFunc)
782 static const reg::Ex marker(R
"(@(\d+))");
786 for ( ; it!=
end ; ++it)
788 const auto &match = *it;
789 size_t newIndex = match.position();
790 size_t matchLen = match.length();
791 result += markerText.
substr(index,newIndex-index);
792 unsigned long entryIndex = std::stoul(match[1].str());
793 if (entryIndex<
static_cast<unsigned long>(numMarkers))
795 result+=replaceFunc(entryIndex);
797 index=newIndex+matchLen;
799 if (index<markerText.size())
801 result += markerText.
substr(index);
808 auto replaceFunc = [&list,&ol](
size_t entryIndex)
810 const auto &e = list[entryIndex];
845 paramDocs+=
" \\ilinebr @tparam "+a.name+
" "+a.docs;
847 else if (!a.type.empty())
853 paramDocs+=
" \\ilinebr @tparam "+type+
" "+a.docs;
866 for (
auto it = al.
begin() ; it!=al.
end() ;)
886 result+= type1+type2;
893 if (it!=al.
end()) result+=
", ";
908 if (al.
empty())
return result;
911 for (
const auto &a : al)
913 if (a.defval.empty() || includeDefault)
915 if (!first) result+=
", ";
918 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
926 int i =
static_cast<int>(a.type.length())-1;
927 while (i>=0 &&
isId(a.type.at(i))) i--;
930 result+=a.type.
right(a.type.length()-i-1);
941 if (!a.typeConstraint.empty() && lang==SrcLangExt::Java)
944 result+=a.typeConstraint;
965 size_t len = contents.length();
969 char c = contents[src++];
973 if (src<len && contents[src] ==
'\n')
978 else if ( c ==
'\0' && src<len-1)
982 contents[dest++] = c;
984 contents.resize(dest);
991 for (
const auto &filterStr : filterList)
1000 filterPattern = filterPattern.
lower();
1001 input = input.
lower();
1010 filterName=
"\""+filterName+
"\"";
1025 if (name.
empty())
return "";
1032 if (isSourceCode && !filterSrcList.empty())
1036 if (!found && filterName.
empty())
1047 if (filterName.
length()>=2 && filterName[0]==
'"' && filterName[
static_cast<int>(filterName.
length())-1]==
'"')
1049 filterName = filterName.
mid(1,filterName.
length()-2);
1058 bool fileOpened=
false;
1059 if (name[0]==
'-' && name[1]==0)
1061 std::string contents;
1063 while (getline(std::cin,line))
1065 contents+=line+
'\n';
1074 err(
"file '{}' not found\n",name);
1087 err(
"cannot open file '{}' for reading\n",name);
1095 for (
const auto &bcd : bcl)
1115 AUTO_TRACE(
"target='{}' str='{}'",target,str);
1116 if (target==str) { target.
clear();
return; }
1123 for (
size_t q=p;q<i;q++)
1125 if (target[q]==
'<') sharpCount++;
1126 else if (target[q]==
'>' && sharpCount>0) sharpCount--;
1128 bool isMatch = (i==0 || !
isId(target.
at(i-1))) &&
1130 !insideTemplate && sharpCount==0;
1133 size_t i1=target.
find(
'*',i+l);
1134 size_t i2=target.
find(
'&',i+l);
1138 target=target.
left(i)+target.
mid(i+l);
1145 target=str+
" "+target.
left(i)+target.
mid(i+l);
1185 size_t i=s.
find(
" class ");
1187 i=s.
find(
" typename ");
1189 i=s.
find(
" union ");
1191 i=s.
find(
" struct ");
1205 if (!templSpec.
empty() && templSpec.
at(0) ==
'<')
1210 if (!resolvedType.
empty())
1212 templSpec = resolvedType;
1224 if (count>10)
return word;
1226 DString symName,result,templSpec,tmpName;
1227 if (tSpec && !tSpec->
empty())
1230 AUTO_TRACE(
"d='{}' fs='{}' word='{}' templSpec='{}'",d?d->
name():
"",fs?fs->
name():
"",word,templSpec);
1248 bool isTemplInst = cd && !templSpec.
empty();
1249 if (!cd && !templSpec.
empty())
1260 cd?cd->
name():
"",mType?mType->
name():
"",ts,resolvedType);
1283 if (cd==d && tSpec) *tSpec=
"";
1287 result = resolvedType+ts;
1295 if (tSpec) *tSpec=
"";
1307 if (!templSpec.
empty())
1309 result=cd->
name()+templSpec;
1359 resolvedType = lang==SrcLangExt::Java ? word :
resolveTypeDef(d,word);
1361 if (resolvedType.
empty())
1367 result = resolvedType;
1402 if (i-pp>=2 && type[i-2]==
':' && type[i-1]==
':')
1404 canType += type.
mid(pp,i-pp-2);
1408 canType += type.
mid(pp,i-pp);
1417 if (ct.
empty() && type.
mid(p,2)==
"::")
1427 if (!templSpec.
empty())
1431 std::string ts = templSpec.
str();
1432 static const reg::Ex re(R
"(\a\w*)");
1439 for (; it!=
end ; ++it)
1441 const auto &match = *it;
1442 size_t ti = match.position();
1443 size_t tl = match.length();
1444 std::string matchStr = match.str();
1445 canType += ts.
substr(tp,ti-tp);
1454 canType += type.
mid(pp);
1465 if ((type==
"const" || type==
"volatile") && !name.
empty())
1470 if (name==
"const" || name==
"volatile")
1472 if (!type.
empty()) type+=
" ";
1490#define MATCH AUTO_TRACE_EXIT("match at line {}",__LINE__);
1491#define NOMATCH AUTO_TRACE_EXIT("no match at line {}",__LINE__);
1498 AUTO_TRACE(
"srcType='{}' dstType='{}'",srcType,dstType);
1499 if (srcType==dstType)
return true;
1502 size_t i1=srcType.
find(
")(");
1504 size_t i2=dstType.
find(
")(");
1505 if (i1!=i2)
return false;
1508 size_t j1=srcType.
find(
"(");
1510 size_t j2=dstType.
find(
"(");
1511 if (j2!=j1)
return false;
1512 if (srcType.
left(j1)!=dstType.
left(j2))
return false;
1521 dstScope,dstFileScope,dstType.
left(j2),dstAl.get(),
1531 AUTO_TRACE(
"src: scope={} type={} name={} canType={}, dst: scope={} type={} name={} canType={}",
1550 srcA.
type+=sSrcName;
1554 else if (sDstName==srcType.
right(sDstName.
length()))
1556 dstA.
type+=sDstName;
1572 dstScope,dstFileScope,dstA.
canType,
1595 ASSERT(srcScope!=
nullptr && dstScope!=
nullptr);
1597 AUTO_TRACE(
"srcScope='{}' dstScope='{}' srcArgs='{}' dstArgs='{}' checkCV={} lang={}",
1600 if (srcAl==
nullptr || dstAl==
nullptr)
1602 bool match = srcAl==dstAl;
1633 if (srcAl->
size() != dstAl->
size())
1667 auto srcIt = srcAl->
begin();
1668 auto dstIt = dstAl->
begin();
1669 for (;srcIt!=srcAl->
end() && dstIt!=dstAl->
end();++srcIt,++dstIt)
1674 dstScope,dstFileScope,dstA,
1693 AUTO_TRACE(
"srcAl='{}',dstAl='{}',forceNameOverwrite={}",
1701 auto srcIt=srcAl.
begin();
1702 auto dstIt=dstAl.
begin();
1703 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
1708 AUTO_TRACE_ADD(
"before merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
1724 if (srcA.
name==
"const" || srcA.
name==
"volatile")
1729 if (dstA.
name==
"const" || dstA.
name==
"volatile")
1755 if (forceNameOverwrite)
1827 AUTO_TRACE_ADD(
"after merge: src=[type='{}',name='{}',def='{}'] dst=[type='{}',name='{}',def='{}']",
1843 auto isUnconstraintTemplate = [](
const DString &type)
1845 return type==
"typename" || type==
"class" || type.startsWith(
"typename ") || type.startsWith(
"class ");
1847 auto srcIt = srcAl.
begin();
1848 auto dstIt = dstAl.
begin();
1849 while (srcIt!=srcAl.
end() && dstIt!=dstAl.
end())
1853 if ((!isUnconstraintTemplate(srcA.
type) || !isUnconstraintTemplate(dstA.
type)) && srcA.
type!=dstA.
type)
1872 AUTO_TRACE(
"scopeName={},memberName={},forceEmptyScope={}",
1898 result.
found =
true;
1903 result.
found =
true;
1908 result.
found =
true;
1913 result.
found =
true;
1918 result.
found =
true;
1948 if (scopeName.
empty())
return false;
1950 bool explicitGlobalScope=
false;
1951 if (scopeName.
at(0)==
':' && scopeName.
at(1)==
':')
1953 scopeName=scopeName.
mid(2);
1954 explicitGlobalScope=
true;
1956 if (scopeName.
empty())
1961 DString docScopeName=docScope;
1962 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(docScopeName.
length());
1967 if (scopeOffset>0) fullName.
prepend(docScopeName.
left(scopeOffset)+
"::");
1993 size_t o = docScopeName.
rfind(
"::",scopeOffset-1);
1996 }
while (scopeOffset>=0);
2003 if (s.
empty())
return true;
2004 const char *p=s.
data();
2006 while ((c=
static_cast<uint8_t
>(*p++)))
if (!islower(c))
return false;
2016 bool lookForSpecialization,
2021 AUTO_TRACE(
"scope={} name={} inSeeBlock={} lang={} lookForSpecialization={} currentFile={} checkScope={}",
2022 scName,name,inSeeBlock,lang,lookForSpecialization,currentFile ? currentFile->
name() :
"", checkScope);
2036 size_t templStartPos;
2037 if (lang==SrcLangExt::CSharp && (templStartPos=fullName.
find(
'<'))!=
DString::npos)
2039 size_t templEndPos = fullName.
rfind(
'>');
2049 size_t scopePos = fullName.
rfind(
"::",endNamePos);
2050 bool explicitScope = fullName.
startsWith(
"::") &&
2055 bool allowTypeOnly=
false;
2058 *resContext=
nullptr;
2079 if (scName!=fullName &&
getScopeDefs(scName,fullName,cd,cnd,nd,modd))
2102 else if (scName==fullName || (!inSeeBlock && scopePos==
DString::npos))
2121 if (explicitScope) nameStr=nameStr.
mid(2);
2130 size_t templPos = nameStr.
find(
'<');
2131 bool tryUnspecializedVersion =
false;
2134 size_t endTemplPos=nameStr.
rfind(
'>');
2137 if (!lookForSpecialization)
2139 nameStr=nameStr.
left(templPos)+nameStr.
mid(endTemplPos+1);
2143 tryUnspecializedVersion =
true;
2151 nameStr=nameStr.
mid(scopeStr.
length()+2);
2169 size_t np = nameStr.
find(
"::");
2178 *resContext=
nullptr;
2188 *resMember=result.
md;
2189 *resContext=result.
md;
2193 *resContext=
nullptr;
2199 else if (result.
cd) *resContext=result.
cd;
2200 else if (result.
nd) *resContext=result.
nd;
2201 else if (result.
fd) *resContext=result.
fd;
2202 else if (result.
gd) *resContext=result.
gd;
2203 else if (result.
cnd) *resContext=result.
cnd;
2204 else if (result.
modd) *resContext=result.
modd;
2207 *resContext=
nullptr; *resMember=
nullptr;
2246 if (tryUnspecializedVersion)
2248 bool b =
resolveRef(scName,name,inSeeBlock,resContext,resMember,lang,
false,
nullptr,checkScope);
2271 if (!result.
empty())
2278 if (result.
at(0)==
':' && result.
at(1)==
':')
2280 result=result.
mid(2);
2299 for (
const auto &path : stripPaths)
2319 *resContext=
nullptr;
2322 if (lang==SrcLangExt::CSharp)
2327 AUTO_TRACE(
"scName='{}',ref='{}'",scName,lr);
2332 const DirDef *dir =
nullptr;
2338 if (linkRef.
empty())
2350 if (si) resAnchor = si->
label();
2362 resAnchor = si->
label();
2369 resAnchor = si->
label();
2399 else if (lang==SrcLangExt::Java &&
2400 (cd=
getClass(linkRefWithoutTemplates)))
2407 else if ((cd=
getClass(linkRef+
"-p")))
2424 resAnchor=modd->
anchor();
2443 bool res =
resolveRef(scName,lr,
true,resContext,&md,lang);
2444 if (md) resAnchor=md->
anchor();
2470 for (
const auto &s : examplePathList)
2498 std::string substRes;
2500 const char *p = s.
data();
2504 substRes.reserve(s.
length()+1024);
2511 for (
const auto &kw : keywords)
2513 size_t keyLen =
dstrlen(kw.keyword);
2514 if (
dstrncmp(p,kw.keyword,keyLen)==0)
2516 const char *startArg = p+keyLen;
2517 bool expectParam = std::holds_alternative<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
2519 if (expectParam && *startArg==
'(')
2522 const char *endArg =
nullptr;
2523 while ((c=*(startArg+j)) && c!=
')' && c!=
'\n' && c!=0) j++;
2524 if (c==
')') endArg=startArg+j;
2528 auto &&getValue = std::get<KeywordSubstitution::GetValueWithParam>(kw.getValueVariant);
2529 substRes+=getValue(value).str();
2536 warn(file,line,
"Missing argument for '{}'",kw.keyword);
2540 else if (!expectParam)
2542 auto &&getValue = std::get<KeywordSubstitution::GetValue>(kw.getValueVariant);
2543 substRes+=getValue().str();
2550 warn(file,line,
"Expected arguments for '{}' but none were specified",kw.keyword);
2560 if (c==
'\n') line++;
2585 if (!projectLogo.
empty())
2590 projectLogo = projectLogo.
left(wi);
2594 projectLogo = projectLogo.
left(hi);
2605 if (!projectLogo.
empty())
2607 auto extractDimension = [&projectLogo](
const char *startMarker,
size_t startPos,
size_t endPos) ->
DString
2610 if (result.
length()>=2 && result.
at(0)!=
'"' && result.
at(result.
length()-1)!=
'"')
2612 result=
"\""+result+
"\"";
2618 size_t wi = projectLogo.
find(
" width=");
2619 size_t hi = projectLogo.
find(
" height=");
2624 sizeVal = extractDimension(
" width=", wi+7, hi) +
" "
2625 + extractDimension(
" height=", hi+8, projectLogo.
length());
2629 sizeVal = extractDimension(
" height=", hi+8, wi) +
" "
2630 + extractDimension(
" width=", wi+7, projectLogo.
length());
2635 sizeVal = extractDimension(
" width=", wi+7, projectLogo.
length());
2639 sizeVal = extractDimension(
" height=", hi+8, projectLogo.
length());
2655 if (name.
empty())
return 0;
2658 for (
const auto &s : sl)
2660 const char *ps=s.c_str();
2661 const char *pd=name.
data();
2663 while (*ps!=0 && *pd!=0 && *ps==*pd)
2669 if (*ps==0 && *pd!=0)
2675 if (result<
static_cast<int>(name.
length())-1 && name.
at(result)==
'[') result++;
2685 if (caseSenseNames == CASE_SENSE_NAMES_t::YES)
return true;
2686 else if (caseSenseNames == CASE_SENSE_NAMES_t::NO)
return false;
2692 if (name.
empty())
return name;
2698 const char *p=name.
data();
2703 case '_':
if (allowUnderscore) result+=
'_';
else result+=
"__";
break;
2704 case '-': result+=
'-';
break;
2705 case ':': result+=
"_1";
break;
2706 case '/': result+=
"_2";
break;
2707 case '<': result+=
"_3";
break;
2708 case '>': result+=
"_4";
break;
2709 case '*': result+=
"_5";
break;
2710 case '&': result+=
"_6";
break;
2711 case '|': result+=
"_7";
break;
2712 case '.':
if (allowDots) result+=
'.';
else result+=
"_8";
break;
2713 case '!': result+=
"_9";
break;
2714 case ',': result+=
"_00";
break;
2715 case ' ': result+=
"_01";
break;
2716 case '{': result+=
"_02";
break;
2717 case '}': result+=
"_03";
break;
2718 case '?': result+=
"_04";
break;
2719 case '^': result+=
"_05";
break;
2720 case '%': result+=
"_06";
break;
2721 case '(': result+=
"_07";
break;
2722 case ')': result+=
"_08";
break;
2723 case '+': result+=
"_09";
break;
2724 case '=': result+=
"_0a";
break;
2725 case '$': result+=
"_0b";
break;
2726 case '\\': result+=
"_0c";
break;
2727 case '@': result+=
"_0d";
break;
2728 case ']': result+=
"_0e";
break;
2729 case '[': result+=
"_0f";
break;
2730 case '#': result+=
"_0g";
break;
2731 case '"': result+=
"_0h";
break;
2732 case '~': result+=
"_0i";
break;
2733 case '\'': result+=
"_0j";
break;
2734 case ';': result+=
"_0k";
break;
2735 case '`': result+=
"_0l";
break;
2739 bool doEscape =
true;
2740 if (allowUnicodeNames)
2753 unsigned char id =
static_cast<unsigned char>(c);
2762 else if (caseSenseNames || !isupper(c))
2769 result+=
static_cast<char>(tolower(c));
2779 if (s.
empty())
return s;
2783 const char *p = s.
data();
2793 case '_': result+=c; p++;
break;
2794 case '1': result+=
':'; p++;
break;
2795 case '2': result+=
'/'; p++;
break;
2796 case '3': result+=
'<'; p++;
break;
2797 case '4': result+=
'>'; p++;
break;
2798 case '5': result+=
'*'; p++;
break;
2799 case '6': result+=
'&'; p++;
break;
2800 case '7': result+=
'|'; p++;
break;
2801 case '8': result+=
'.'; p++;
break;
2802 case '9': result+=
'!'; p++;
break;
2806 case '0': result+=
','; p+=2;
break;
2807 case '1': result+=
' '; p+=2;
break;
2808 case '2': result+=
'{'; p+=2;
break;
2809 case '3': result+=
'}'; p+=2;
break;
2810 case '4': result+=
'?'; p+=2;
break;
2811 case '5': result+=
'^'; p+=2;
break;
2812 case '6': result+=
'%'; p+=2;
break;
2813 case '7': result+=
'('; p+=2;
break;
2814 case '8': result+=
')'; p+=2;
break;
2815 case '9': result+=
'+'; p+=2;
break;
2816 case 'a': result+=
'='; p+=2;
break;
2817 case 'b': result+=
'$'; p+=2;
break;
2818 case 'c': result+=
'\\'; p+=2;
break;
2819 case 'd': result+=
'@'; p+=2;
break;
2820 case 'e': result+=
']'; p+=2;
break;
2821 case 'f': result+=
'['; p+=2;
break;
2822 case 'g': result+=
'#'; p+=2;
break;
2823 case 'h': result+=
'"'; p+=2;
break;
2824 case 'i': result+=
'~'; p+=2;
break;
2825 case 'j': result+=
'\''; p+=2;
break;
2826 case 'k': result+=
';'; p+=2;
break;
2827 case 'l': result+=
'`'; p+=2;
break;
2834 if (!caseSenseNames && c>=
'a' && c<=
'z')
2836 result+=
static_cast<char>(toupper(*p));
2867 if (name.
empty())
return name;
2890 size_t resultLen = result.
length();
2899 int l1Dir=0,l2Dir=0;
2900 int createSubdirsLevel =
Config_getInt(CREATE_SUBDIRS_LEVEL);
2901 int createSubdirsBitmaskL2 = (1<<createSubdirsLevel)-1;
2905 l1Dir = md5_sig[14] & 0xf;
2906 l2Dir = md5_sig[15] & createSubdirsBitmaskL2;
2934 DString absIncFileName = incFileName;
2944 else if (searchIncludes)
2947 for (
const auto &incPath : includePath)
2966 return absIncFileName;
2976 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
2977 for (
int l1=0; l1<16; l1++)
2983 term(
"Failed to create output directory '{}'\n",subdir);
2985 for (
int l2=0; l2<createSubdirsLevelPow2; l2++)
2988 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
2991 term(
"Failed to create output directory '{}'\n",subsubdir);
3003 int createSubdirsLevelPow2 = 1 <<
Config_getInt(CREATE_SUBDIRS_LEVEL);
3004 for (
int l1=0;l1<16;l1++)
3008 for (
int l2=0; l2 < createSubdirsLevelPow2; l2++)
3011 subsubdir.
sprintf(
"d%x/d%02x",l1,l2);
3030 bool allowEmptyClass)
3038 namespaceName=nd->
name();
3042 p=
static_cast<int>(clName.
length())-2;
3050 namespaceName=nd->
name();
3051 className=clName.
mid(i+2);
3054 p=
static_cast<int>(i)-2;
3059 className=scopeName;
3060 namespaceName.
clear();
3063 if (className.
empty() && !namespaceName.
empty() && !allowEmptyClass)
3066 className=namespaceName;
3067 namespaceName.
clear();
3073 className = className.
left(className.
length()-2);
3099 result=scope.
left(si) + templ + scope.
mid(si);
3114 int l =
static_cast<int>(result.
length());
3117 bool skipBracket=
false;
3124 while (p>=0 && count>=0)
3126 char c=result.
at(p);
3132 if (p>0 && result.
at(p-1)==
':' && (count==0 || skipBracket))
3134 return result.
right(l-p-1);
3145 if (p>0 && result.
at(p-1)==
'>')
3153 bool foundMatch=
false;
3154 while (p>=0 && !foundMatch)
3166 if (round==0) count++;
3173 if (result.
at(p-1) ==
'<')
3180 foundMatch = count==0;
3195 done = count==0 || skipBracket;
3206 if (s.
empty())
return s;
3209 const char *p = s.
data();
3215 if ((c>=
'0' && c<=
'9') || (c>=
'a' && c<=
'z') || (c>=
'A' && c<=
'Z') || c==
'-')
3217 if (first && c>=
'0' && c<=
'9') result+=
'a';
3223 encChar[1]=
hex[
static_cast<unsigned char>(c)>>4];
3224 encChar[2]=
hex[
static_cast<unsigned char>(c)&0xF];
3236 if (s.
empty())
return s;
3239 const char *p = s.
data();
3245 case '<': result+=
"<";
break;
3246 case '>': result+=
">";
break;
3247 case '&':
if (keepEntities)
3253 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
3259 while (p<e) result+=*p++;
3279 case '\'': result+=
"'";
break;
3280 case '"': result+=
""";
break;
3281 case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
3282 case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
3283 case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
3284 case 27:
case 28:
case 29:
case 30:
case 31:
3286 default: result+=c;
break;
3295 if (s.
empty())
return s;
3298 const char *p=s.
data();
3304 case '<': result+=
"<";
break;
3305 case '>': result+=
">";
break;
3306 case '&':
if (keepEntities)
3312 if (ce==
';' || (!(
isId(ce) || ce==
'#')))
break;
3318 while (p<e) result+=*p++;
3330 case '\'': result+=
"'";
break;
3331 case '"': result+=
""";
break;
3334 uint8_t uc =
static_cast<uint8_t
>(c);
3335 if (uc<32 && !isspace(c))
3339 result+=
hex[uc&0xF];
3355 if (s.
empty())
return s;
3358 const char *p=s.
data();
3364 case '"':
if (!singleQuotes) result+=
"\\\"";
else result+=c;
3366 case '\'':
if (singleQuotes) result+=
"\\\'";
else result+=c;
3368 case '\\':
if (*p==
'u' && *(p+1)==
'{') result+=
"\\";
3369 else result+=
"\\\\";
3371 default: result+=c;
break;
3384 AUTO_TRACE(
"type='{}' pos={} name='{}' lang={}",type,pos,name,lang);
3385 static const reg::Ex re_norm(R
"(\a[\w:]*)");
3386 static const reg::Ex re_fortran(R
"(\a[\w:()=]*)");
3396 size_t typeLen=type.
length();
3399 if (lang == SrcLangExt::Fortran)
3411 std::string s = type.
str();
3417 const auto &match = *it;
3418 size_t i = match.position();
3419 size_t l = match.length();
3424 while (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
' ') { ts++; tl++; }
3425 if (ts<typeLen && type[
static_cast<uint32_t
>(ts)]==
'<')
3430 while (te<typeLen && brCount!=0)
3432 if (type[
static_cast<uint32_t
>(te)]==
'<')
3434 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'<') te++;
else brCount++;
3436 if (type[
static_cast<uint32_t
>(te)]==
'>')
3438 if (te<typeLen-1 && type[
static_cast<uint32_t
>(te)+1]==
'>') te++;
else brCount--;
3448 pos=
static_cast<int>(i+l+tl);
3452 pos=
static_cast<int>(i+l);
3457 return static_cast<int>(i);
3460 pos =
static_cast<int>(typeLen);
3473 size_t p=name.
find(
'<');
3478 std::string s = name.
mid(p).
str();
3479 static const reg::Ex re(R
"([\a:][\w:]*)");
3484 for (; it!=
end ; ++it)
3486 const auto &match = *it;
3487 size_t i = match.position();
3488 size_t l = match.length();
3489 result += s.
substr(pi,i-pi);
3492 for (
const Argument &formArg : formalArgs)
3494 if (formArg.name == n)
3532 if (formalArgs.
empty())
return nm;
3535 static const reg::Ex re(R
"(\a\w*)");
3536 std::string name = nm.str();
3541 for (; it!=
end ; ++it)
3543 const auto &match = *it;
3544 size_t i = match.position();
3545 size_t l = match.length();
3546 if (i>p) result += name.
substr(p,i-p);
3551 actIt = actualArgs->
begin();
3558 for (
auto formIt = formalArgs.
begin();
3559 formIt!=formalArgs.
end() && !found;
3565 if (actualArgs && actIt!=actualArgs->
end())
3572 formArg.
type =
"class";
3577 formArg.
type =
"typename";
3581 formArg.
name +=
"...";
3586 formArg.
name +=
"...";
3593 if (formArg.
name==n && actualArgs && actIt!=actualArgs->
end() && !actArg.
type.
empty())
3600 ii = subst.find(
'<');
3609 bool beforeNonWord = ii==0 || !
isId(subst.at(ii-1));
3610 bool afterNonWord = subst.length()==ii+nameArg.length() || !
isId(subst.at(ii+nameArg.length()));
3611 if (beforeNonWord && afterNonWord)
3615 pp=ii+nameArg.length();
3620 AUTO_TRACE_ADD(
"result={} n={} type={} hasRecursion={}",result,n,actArg.
type,hasRecursion(result,n,actArg.
type));
3621 if (!hasRecursion(result,n,actArg.
type))
3633 result += actArg.
type;
3639 result += actArg.
type+
" "+actArg.
name;
3644 else if (formArg.
name==n &&
3645 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
3654 else if (formArg.
name==n &&
3655 (actualArgs==
nullptr || actIt==actualArgs->
end()) &&
3663 if (actualArgs && actIt!=actualArgs->
end())
3692 bool allowArtificial)
3695 size_t i=fullName.
find(
'<');
3699 size_t l=fullName.
length();
3706 while (e<l && count>0)
3708 char c=fullName.
at(e++);
3711 case '(': round++;
break;
3712 case ')':
if (round>0) round--;
break;
3713 case '<':
if (round==0) count++;
break;
3714 case '>':
if (round==0) count--;
break;
3719 size_t si = fullName.
find(
"::",e);
3724 result+=fullName.
mid(p,i-p);
3727 if (cd!=
nullptr && (allowArtificial || !cd->
isArtificial()))
3729 result+=fullName.
mid(i,e-i);
3732 else if (pLastScopeStripped)
3735 *pLastScopeStripped=fullName.
mid(i,e-i);
3738 i=fullName.
find(
'<',p);
3740 result+=fullName.
right(l-p);
3757 AUTO_TRACE(
"leftScope='{}' rightScope='{}'",leftScope,rightScope);
3765 size_t i=0,p=leftScope.
length();
3774 result = leftScope.
left(i+2)+rightScope;
3787 if (!result.
empty() && !rightScope.
empty()) result+=
"::";
3802 int sl=
static_cast<int>(s.
length());
3806 if (sp>=sl)
return -1;
3830 while (sp<sl && !done)
3836 case '<': count++;
break;
3837 case '>': count--;
if (count==0) done=
true;
break;
3898 if (!first) { ol.
writeString(
" | "); }
else first=
false;
3910 if (!first) { ol.
writeString(
" | "); }
else first=
false;
3935 if (fName.
empty())
return;
3936 size_t i_fs = fName.
rfind(
'/');
3937 size_t i_bs = fName.
rfind(
'\\');
3940 size_t i = fName.
find(
'.',p);
3967 result=result.
mid(i+1);
3971 result=result.
mid(i+1);
3992 const char *p = s.
data();
3995 int i=0,li=-1,l=
static_cast<int>(s.
length());
3999 if (c==
' ' || c==
'\t' || c==
'\r') { i++; p++; }
4000 else if (c==
'\\' &&
literal_at(p,
"\\ilinebr")) { i+=8; li=i; p+=8; }
4001 else if (c==
'\n') { i++; li=i; docLine++; p++; }
4011 if (c==
' ' || c==
'\t' || c==
'\r') { b--; p--; }
4012 else if (c==
'r' && b>=7 &&
literal_at(p-7,
"\\ilinebr")) { bi=b-7; b-=8; p-=8; }
4013 else if (c==
'>' && b>=11 &&
literal_at(p-11,
"\\ilinebr<br>")) { bi=b-11; b-=12; p-=12; }
4014 else if (c==
'\n') { bi=b; b--; p--; }
4019 if (li==-1 && bi==-1)
return s;
4026 return s.
mid(li,bi-li);
4044 {
"idl",
"c", SrcLangExt::IDL,
".idl" },
4045 {
"java",
"c", SrcLangExt::Java,
".java"},
4046 {
"javascript",
"c", SrcLangExt::JS,
".js" },
4047 {
"csharp",
"c", SrcLangExt::CSharp,
".cs" },
4048 {
"d",
"c", SrcLangExt::D,
".d" },
4049 {
"php",
"c", SrcLangExt::PHP,
".php" },
4050 {
"objective-c",
"c", SrcLangExt::ObjC,
".m" },
4051 {
"c",
"c", SrcLangExt::Cpp,
".c" },
4052 {
"c++",
"c", SrcLangExt::Cpp,
".cpp" },
4053 {
"slice",
"c", SrcLangExt::Slice,
".ice" },
4054 {
"python",
"python", SrcLangExt::Python,
".py" },
4055 {
"fortran",
"fortran", SrcLangExt::Fortran,
".f" },
4056 {
"fortranfree",
"fortranfree", SrcLangExt::Fortran,
".f90" },
4057 {
"fortranfixed",
"fortranfixed", SrcLangExt::Fortran,
".f" },
4058 {
"vhdl",
"vhdl", SrcLangExt::VHDL,
".vhdl"},
4059 {
"xml",
"xml", SrcLangExt::XML,
".xml" },
4060 {
"sql",
"sql", SrcLangExt::SQL,
".sql" },
4061 {
"md",
"md", SrcLangExt::Markdown,
".md" },
4062 {
"lex",
"lex", SrcLangExt::Lex,
".l" },
4069 [&langName](
const auto &info) { return info.langName==langName; });
4075 if (extName.
empty())
return false;
4076 if (extName.
at(0)!=
'.') extName.
prepend(
".");
4086 err(
"Failed to assign extension {} to parser {} for language {}\n",
4087 extName.
data(),it1->parserName,language);
4175 if (extName.
empty()) extName=
".no_extension";
4176 if (extName.
at(0)!=
'.') extName.
prepend(
".");
4192 if (lang == SrcLangExt::Unknown)
4196 if (langName.
at(0)==
'.') langName = langName.
mid(1);
4198 [&langName](
const auto &info) { return info.langName==langName; });
4201 lang = it->parserId;
4202 fileName = it->defExt;
4206 return SrcLangExt::Cpp;
4214 if (fn.
empty())
return "";
4224 if (scope==
nullptr ||
4244 if (qualifierIndex!=-1)
4246 explicitScopePart = name.
left(qualifierIndex);
4248 name = name.
mid(qualifierIndex+2);
4252 int minDistance = 10000;
4261 if (distance!=-1 && distance<minDistance)
4263 minDistance = distance;
4277 if (bestMatch && bestMatch->
isTypedef())
4287 if (al.
empty())
return;
4304 .setIndexWords(
true));
4314#ifdef TRACINGSUPPORT
4315 void *backtraceFrames[128];
4316 int frameCount = backtrace(backtraceFrames, 128);
4317 const size_t cmdLen = 40960;
4318 static char cmd[cmdLen];
4320 p += snprintf(p,cmdLen,
"/usr/bin/atos -p %d ", (
int)getpid());
4321 for (
int x = 0; x < frameCount; x++)
4323 p += snprintf(p,cmdLen,
"%p ", backtraceFrames[x]);
4325 fprintf(stderr,
"========== STACKTRACE START ==============\n");
4329 while (
size_t len = fread(resBuf, 1,
sizeof(resBuf), fp))
4331 fwrite(resBuf, 1, len, stderr);
4335 fprintf(stderr,
"============ STACKTRACE END ==============\n");
4343 if (inputEncoding.
empty() || outputEncoding.
empty())
return;
4344 if (
dstricmp(inputEncoding,outputEncoding)==0)
return;
4346 if (cd==
reinterpret_cast<void *
>(-1))
4348 term(
"unsupported character conversion: '{}'->'{}': {}\n"
4349 "Check the INPUT_ENCODING setting in the config file!\n",
4350 inputEncoding,outputEncoding,strerror(errno));
4352 size_t iLeft = contents.size();
4353 const char *srcPtr = contents.data();
4354 size_t tmpBufSize = contents.size()*4+1;
4355 size_t oLeft = tmpBufSize;
4357 tmpBuf.resize(tmpBufSize);
4358 char *dstPtr = tmpBuf.data();
4362 newSize = tmpBufSize-oLeft;
4363 tmpBuf.resize(newSize);
4364 std::swap(contents,tmpBuf);
4369 term(
"{}: failed to translate characters from {} to {}: check INPUT_ENCODING\n",
4370 fileName,inputEncoding,outputEncoding);
4380 if (!fi.
exists())
return false;
4382 if (filterName.
empty() || !filter)
4387 err(
"could not open file {}\n",fileName);
4391 auto fileSize = fi.
size();
4392 contents.resize(fileSize);
4393 f.read(contents.data(),fileSize);
4396 err(
"problems while reading file {}\n",fileName);
4402 DString cmd=filterName+
" \""+fileName+
"\"";
4407 err(
"could not execute filter {}\n",filterName);
4410 const int bufSize=4096;
4413 while ((numRead=
static_cast<int>(fread(buf,1,bufSize,f)))>0)
4416 contents.append(buf,numRead);
4423 if (contents.size()>=2 &&
4424 static_cast<uint8_t
>(contents[0])==0xFF &&
4425 static_cast<uint8_t
>(contents[1])==0xFE
4430 else if (contents.size()>=2 &&
4431 static_cast<uint8_t
>(contents[0])==0xFE &&
4432 static_cast<uint8_t
>(contents[1])==0xFF
4437 else if (contents.size()>=3 &&
4438 static_cast<uint8_t
>(contents[0])==0xEF &&
4439 static_cast<uint8_t
>(contents[1])==0xBB &&
4440 static_cast<uint8_t
>(contents[2])==0xBF
4443 contents.erase(0,3);
4459 std::string t = title.
str();
4460 static const reg::Ex re(R
"(%[a-z_A-Z]+)");
4464 for (; it!=
end ; ++it)
4466 const auto &match = *it;
4467 size_t i = match.position();
4468 size_t l = match.length();
4469 if (i>p) tf+=t.substr(p,i-p);
4470 tf+=match.str().substr(1);
4496 if (extLinksInWindow)
4497 return "target=\"_blank\" ";
4499 return "target=\"_parent\" ";
4507 const DString &targetFileName,
4515 if (!targetFileName.
empty())
4520 if (!anchor.
empty() && isLocalFile)
4531 if (!anchor.
empty())
4548 result = it->second;
4549 size_t l = result.
length();
4550 if (!relPath.
empty() && l>0 && result.
at(0)==
'.')
4555 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
4574 std::string s=str.
str();
4575 static const reg::Ex re(R
"(##[0-9A-Fa-f][0-9A-Fa-f])");
4581 size_t sl=s.length();
4583 for (; it!=
end ; ++it)
4585 const auto &match = *it;
4586 size_t i = match.position();
4587 size_t l = match.length();
4588 if (i>p) result+=s.substr(p,i-p);
4589 std::string lumStr = match.str().substr(2);
4590#define HEXTONUM(x) (((x)>='0' && (x)<='9') ? ((x)-'0') : \
4591 ((x)>='a' && (x)<='f') ? ((x)-'a'+10) : \
4592 ((x)>='A' && (x)<='F') ? ((x)-'A'+10) : 0)
4594 double r = 0,g = 0,b = 0;
4597 pow(level/255.0,gamma/100.0),&r,&g,&b);
4598 int red =
static_cast<int>(r*255.0);
4599 int green =
static_cast<int>(g*255.0);
4600 int blue =
static_cast<int>(b*255.0);
4603 colStr[1]=
hex[red>>4];
4604 colStr[2]=
hex[red&0xf];
4605 colStr[3]=
hex[green>>4];
4606 colStr[4]=
hex[green&0xf];
4607 colStr[5]=
hex[blue>>4];
4608 colStr[6]=
hex[blue&0xf];
4614 if (p<sl) result+=s.substr(p);
4625 err(
"could not copy file {} to {}\n",src,dest);
4633 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp || lang==SrcLangExt::VHDL || lang==SrcLangExt::Python)
4637 else if (lang==SrcLangExt::PHP && !classScope)
4650 static const std::unordered_set<std::string> schemes = {
4651 "http",
"https",
"ftp",
"ftps",
"sftp",
"file",
"news",
"irc",
"ircs"
4654 size_t colonPos = loc_url.
find(
':');
4678 return (prot!=Protection::Private && prot!=Protection::Package) ||
4679 (prot==Protection::Private && extractPrivate) ||
4680 (prot==Protection::Package && extractPackage);
4687 if (s.
empty())
return s;
4691 const char *p=s.
data();
4694 int minIndent=1000000;
4695 bool searchIndent=
true;
4697 bool skipFirst = skipFirstLine;
4700 if (c==
'\t') { indent+=tabSize - (indent%tabSize); }
4701 else if (c==
'\n') { indent=0; searchIndent=
true; skipFirst=
false; }
4702 else if (c==
' ') { indent++; }
4703 else if (searchIndent && !skipFirst)
4706 if (indent<minIndent) minIndent=indent;
4711 if (minIndent==0)
return substitute(s,
"@ilinebr",
"\\ilinebr");
4717 skipFirst=skipFirstLine;
4726 else if (indent<minIndent && !skipFirst)
4730 int newIndent = indent+tabSize-(indent%tabSize);
4744 else if (c==
'\\' &&
literal_at(p,
"ilinebr "))
4747 result <<
"\\ilinebr ";
4750 for (
int j=0;j<minIndent;j++)
if (*(p+j)==
' ') skipAmount++;
4751 if (skipAmount==minIndent)
4758 result <<
"\\ilinebr";
4769 return result.
str();
4777 if (indentationLevel <= 0 || doc.
empty())
return;
4782 const char *src = doc.
data();
4784 bool insideIndent = !skipFirstLine;
4786 if (!skipFirstLine) cnt = indentationLevel;
4794 insideIndent =
true;
4795 cnt = indentationLevel;
4806 insideIndent =
false;
4816 insideIndent =
false;
4821 doc.
resize(
static_cast<uint32_t
>(dst-doc.
data()));
4833 std::string s = docs.
str();
4834 static const reg::Ex re(R
"(\[([ inout,]+)\])");
4839 const auto &match = *it;
4840 size_t p = match.position();
4841 size_t l = match.length();
4845 std::string dir = match[1].str();
4847 dir.erase(std::remove_if(dir.begin(),dir.end(),
4848 [](
const char c) { return c==
' ' || c==
','; }
4850 unsigned char ioMask=0;
4851 size_t inIndex = dir.find(
"in");
4852 if ( inIndex!=std::string::npos) { dir.erase( inIndex,2); ioMask|=(1<<0); }
4853 size_t outIndex = dir.find(
"out");
4854 if (outIndex!=std::string::npos) { dir.erase(outIndex,3); ioMask|=(1<<1); }
4855 if (dir.empty() && ioMask!=0)
4858 if (ioMask==((1<<0)|(1<<1)))
return "[in,out]";
4859 else if (ioMask==(1<<0))
return "[in]";
4860 else if (ioMask==(1<<1))
return "[out]";
4874 if (a.hasDocumentation(
true))
4876 DString docsWithoutDir = a.docs;
4883 paramDocs+=
" \\ilinebr @param"+direction+
" "+name+
" "+docsWithoutDir;
4916 *outListType1=inListType;
4919 if (inProt==Protection::Public)
4926 else if (inProt==Protection::Protected)
4934 *outListType2=inListType.
toPublic();
4937 else if (inProt==Protection::Private)
4947 *outListType1=inListType.
toPublic();
4969 size_t i= imgExt.
find(
':');
4975 assert(!f.is_open());
4976 bool fileOpened=
false;
4977 bool writeToStdout=outFile==
"-";
4980 f.basic_ios<char>::rdbuf(std::cout.rdbuf());
4995 fileOpened = f.is_open();
5005 if (s.
empty())
return s;
5008 auto skipBlock = [&markerInfo](
const char *p,
const SelectionBlock &blk)
5015 size_t len = markerInfo.
endLen;
5016 bool negate = *(p+markerInfo.
endLen)==
'!';
5018 size_t blkNameLen =
dstrlen(blk.name);
5019 if (
dstrncmp(p+len,blk.name,blkNameLen)==0 &&
5023 return p+len+blkNameLen+markerInfo.
closeLen;
5040 const char *p = s.
data();
5050 bool negate = *(p+len)==
'!';
5052 for (
const auto &blk : blockList)
5054 size_t blkNameLen =
dstrlen(blk.name);
5055 if (
dstrncmp(p+len,blk.name,blkNameLen)==0 &&
5058 bool blockEnabled = blk.enabled!=negate;
5060 p+=len+blkNameLen+markerInfo.
closeLen;
5079 size_t len = markerInfo.
endLen;
5080 bool negate = *(p+len)==
'!';
5082 for (
const auto &blk : blockList)
5084 size_t blkNameLen =
dstrlen(blk.name);
5085 if (
dstrncmp(p+len,blk.name,blkNameLen)==0 &&
5089 p+=len+blkNameLen+markerInfo.
closeLen;
5118 if (s.
empty())
return;
5120 const char *p = s.
data();
5129 bool negate = *(p+len)==
'!';
5135 if (markerInfo.
closeLen==0 && *p==
'\n')
5137 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
5143 warn(fileName,-1,
"Remaining begin replacement with marker '{}'",marker);
5152 size_t len = markerInfo.
endLen;
5153 bool negate = *(p+len)==
'!';
5159 if (markerInfo.
closeLen==0 && *p==
'\n')
5161 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
5167 warn(fileName,-1,
"Remaining end replacement with marker '{}'",marker);
5184 size_t size = s.
length();
5187 const char *data = s.
data();
5190 constexpr auto doxy_nbsp =
"&_doxy_nbsp;";
5191 const int maxIndent=1000000;
5192 int minIndent=maxIndent;
5201 int stop = tabSize - (col%tabSize);
5204 while (stop--) result+=
' ';
5208 if (data[i] ==
'\\')
5214 else if (i+5<size &&
literal_at(data+i,
"iskip"))
5219 else if (i+8<size &&
literal_at(data+i,
"endiskip"))
5251 for (
int j=0;j<bytes-1 && c;j++)
5263 if (!skip && col<minIndent) minIndent=col;
5267 if (minIndent!=maxIndent) refIndent=minIndent;
else refIndent=0;
5282 int l =
static_cast<int>(name.
length());
5283 int lastSepPos = -1;
5284 const char *p = name.
data();
5293 if (sharpCount==0 && p[i+1]==
':' && p[i+2]==
':')
5307 if (ts==-1) ts=0;
else p+=++ts;
5308 for (i=ts;i<l-1;i++)
5311 if (c==
':' && *p==
':') lastSepPos=i;
5335 size_t idx = result.
find(
'-');
5336 result = result.
left(idx)+templArgs;
5344 size_t i = text.
find(
'"');
5372 file.write( content.
data(), content.
length() );
5377 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)
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)
bool isId(int c)
Returns true if c is a valid character for an identifier.
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
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)
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