105 #define RECURSE_ENTRYTREE(func,var) \ 106 do { if (var->children()) { \ 107 EntryNavListIterator eli(*var->children()); \ 108 for (;eli.current();++eli) func(eli.current()); \ 112 #if !defined(_WIN32) || defined(__CYGWIN__) 187 g_inputFiles.
clear();
191 Doxygen::classSDict->
clear();
192 Doxygen::namespaceSDict->
clear();
193 Doxygen::pageSDict->
clear();
194 Doxygen::exampleSDict->
clear();
195 Doxygen::inputNameList->
clear();
196 Doxygen::formulaList->
clear();
197 Doxygen::sectionDict->
clear();
198 Doxygen::inputNameDict->clear();
199 Doxygen::includeNameDict->clear();
200 Doxygen::exampleNameDict->clear();
201 Doxygen::imageNameDict->clear();
202 Doxygen::dotFileNameDict->clear();
203 Doxygen::mscFileNameDict->clear();
204 Doxygen::diaFileNameDict->clear();
205 Doxygen::formulaDict->clear();
206 Doxygen::formulaNameDict->clear();
225 stats.getLast()->elapsed=((double)
time.elapsed())/1000.0;
235 msg(
"----------------------\n");
249 stat() : name(NULL),elapsed(0) {}
250 stat(
const char *
n,
double el) : name(n),elapsed(el) {}
259 fprintf(
stderr,
"--- inputNameDict stats ----\n");
260 Doxygen::inputNameDict->statistics();
261 fprintf(
stderr,
"--- includeNameDict stats ----\n");
262 Doxygen::includeNameDict->statistics();
263 fprintf(
stderr,
"--- exampleNameDict stats ----\n");
264 Doxygen::exampleNameDict->statistics();
265 fprintf(
stderr,
"--- imageNameDict stats ----\n");
266 Doxygen::imageNameDict->statistics();
267 fprintf(
stderr,
"--- dotFileNameDict stats ----\n");
268 Doxygen::dotFileNameDict->statistics();
269 fprintf(
stderr,
"--- mscFileNameDict stats ----\n");
270 Doxygen::mscFileNameDict->statistics();
271 fprintf(
stderr,
"--- diaFileNameDict stats ----\n");
272 Doxygen::diaFileNameDict->statistics();
275 fprintf(
stderr,
"--- aliasDict stats ----\n");
277 fprintf(
stderr,
"--- typedefDict stats ----\n");
278 fprintf(
stderr,
"--- namespaceAliasDict stats ----\n");
280 fprintf(
stderr,
"--- formulaDict stats ----\n");
281 Doxygen::formulaDict->statistics();
282 fprintf(
stderr,
"--- formulaNameDict stats ----\n");
283 Doxygen::formulaNameDict->statistics();
284 fprintf(
stderr,
"--- tagDestinationDict stats ----\n");
286 fprintf(
stderr,
"--- g_compoundKeywordDict stats ----\n");
288 fprintf(
stderr,
"--- expandAsDefinedDict stats ----\n");
290 fprintf(
stderr,
"--- memGrpInfoDict stats ----\n");
316 QDict<int> *templateNames,
339 {
"allocator", 0, 0,
"T",
"elements", 0, 0,
FALSE,
FALSE },
340 {
"array", 0, 0,
"T",
"elements", 0, 0,
FALSE, FALSE },
341 {
"auto_ptr", 0, 0,
"T",
"ptr", 0, 0,
FALSE, FALSE },
342 {
"smart_ptr", 0, 0,
"T",
"ptr", 0, 0,
FALSE, FALSE },
343 {
"unique_ptr", 0, 0,
"T",
"ptr", 0, 0,
FALSE, FALSE },
344 {
"weak_ptr", 0, 0,
"T",
"ptr", 0, 0,
FALSE, FALSE },
345 {
"ios_base", 0, 0, 0, 0, 0, 0,
FALSE, FALSE },
346 {
"error_code", 0, 0, 0, 0, 0, 0,
FALSE, FALSE },
347 {
"error_category", 0, 0, 0, 0, 0, 0,
FALSE, FALSE },
348 {
"system_error", 0, 0, 0, 0, 0, 0,
FALSE, FALSE },
349 {
"error_condition", 0, 0, 0, 0, 0, 0,
FALSE, FALSE },
350 {
"thread", 0, 0, 0, 0, 0, 0,
FALSE, FALSE },
351 {
"basic_ios",
"ios_base", 0,
"Char", 0, 0, 0,
FALSE, FALSE },
352 {
"basic_istream",
"basic_ios<Char>", 0,
"Char", 0, 0, 0,
TRUE, FALSE },
353 {
"basic_ostream",
"basic_ios<Char>", 0,
"Char", 0, 0, 0,
TRUE, FALSE },
354 {
"basic_iostream",
"basic_istream<Char>",
"basic_ostream<Char>",
"Char", 0, 0, 0,
FALSE, FALSE },
355 {
"basic_ifstream",
"basic_istream<Char>", 0,
"Char", 0, 0, 0,
FALSE, FALSE },
356 {
"basic_ofstream",
"basic_ostream<Char>", 0,
"Char", 0, 0, 0,
FALSE, FALSE },
357 {
"basic_fstream",
"basic_iostream<Char>", 0,
"Char", 0, 0, 0,
FALSE, FALSE },
358 {
"basic_istringstream",
"basic_istream<Char>", 0,
"Char", 0, 0, 0,
FALSE, FALSE },
359 {
"basic_ostringstream",
"basic_ostream<Char>", 0,
"Char", 0, 0, 0,
FALSE, FALSE },
360 {
"basic_stringstream",
"basic_iostream<Char>", 0,
"Char", 0, 0, 0,
FALSE, FALSE },
361 {
"ios",
"basic_ios<char>", 0, 0, 0, 0, 0,
FALSE, FALSE },
362 {
"wios",
"basic_ios<wchar_t>", 0, 0, 0, 0, 0,
FALSE, FALSE },
363 {
"istream",
"basic_istream<char>", 0, 0, 0, 0, 0,
FALSE, FALSE },
364 {
"wistream",
"basic_istream<wchar_t>", 0, 0, 0, 0, 0,
FALSE, FALSE },
365 {
"ostream",
"basic_ostream<char>", 0, 0, 0, 0, 0,
FALSE, FALSE },
366 {
"wostream",
"basic_ostream<wchar_t>", 0, 0, 0, 0, 0,
FALSE, FALSE },
367 {
"ifstream",
"basic_ifstream<char>", 0, 0, 0, 0, 0,
FALSE, FALSE },
368 {
"wifstream",
"basic_ifstream<wchar_t>", 0, 0, 0, 0, 0,
FALSE, FALSE },
369 {
"ofstream",
"basic_ofstream<char>", 0, 0, 0, 0, 0,
FALSE, FALSE },
370 {
"wofstream",
"basic_ofstream<wchar_t>", 0, 0, 0, 0, 0,
FALSE, FALSE },
371 {
"fstream",
"basic_fstream<char>", 0, 0, 0, 0, 0,
FALSE, FALSE },
372 {
"wfstream",
"basic_fstream<wchar_t>", 0, 0, 0, 0, 0,
FALSE, FALSE },
373 {
"istringstream",
"basic_istringstream<char>", 0, 0, 0, 0, 0,
FALSE, FALSE },
374 {
"wistringstream",
"basic_istringstream<wchar_t>", 0, 0, 0, 0, 0,
FALSE, FALSE },
375 {
"ostringstream",
"basic_ostringstream<char>", 0, 0, 0, 0, 0,
FALSE, FALSE },
376 {
"wostringstream",
"basic_ostringstream<wchar_t>", 0, 0, 0, 0, 0,
FALSE, FALSE },
377 {
"stringstream",
"basic_stringstream<char>", 0, 0, 0, 0, 0,
FALSE, FALSE },
378 {
"wstringstream",
"basic_stringstream<wchar_t>", 0, 0, 0, 0, 0,
FALSE, FALSE },
379 {
"basic_string", 0, 0,
"Char", 0, 0, 0,
FALSE,
TRUE },
380 {
"string",
"basic_string<char>", 0, 0, 0, 0, 0,
FALSE, TRUE },
381 {
"wstring",
"basic_string<wchar_t>", 0, 0, 0, 0, 0,
FALSE, TRUE },
382 {
"complex", 0, 0, 0, 0, 0, 0,
FALSE, FALSE },
383 {
"bitset", 0, 0,
"Bits", 0, 0, 0,
FALSE, FALSE },
384 {
"deque", 0, 0,
"T",
"elements", 0, 0,
FALSE, TRUE },
385 {
"list", 0, 0,
"T",
"elements", 0, 0,
FALSE, TRUE },
386 {
"forward_list", 0, 0,
"T",
"elements", 0, 0,
FALSE, TRUE },
387 {
"map", 0, 0,
"K",
"keys",
"T",
"elements",
FALSE, TRUE },
388 {
"unordered_map", 0, 0,
"K",
"keys",
"T",
"elements",
FALSE, TRUE },
389 {
"multimap", 0, 0,
"K",
"keys",
"T",
"elements",
FALSE, TRUE },
390 {
"unordered_multimap", 0, 0,
"K",
"keys",
"T",
"elements",
FALSE, TRUE },
391 {
"set", 0, 0,
"K",
"keys", 0, 0,
FALSE, TRUE },
392 {
"unordered_set", 0, 0,
"K",
"keys", 0, 0,
FALSE, TRUE },
393 {
"multiset", 0, 0,
"K",
"keys", 0, 0,
FALSE, TRUE },
394 {
"unordered_multiset", 0, 0,
"K",
"keys", 0, 0,
FALSE, TRUE },
395 {
"vector", 0, 0,
"T",
"elements", 0, 0,
FALSE, TRUE },
396 {
"queue", 0, 0,
"T",
"elements", 0, 0,
FALSE, FALSE },
397 {
"priority_queue", 0, 0,
"T",
"elements", 0, 0,
FALSE, FALSE },
398 {
"stack", 0, 0,
"T",
"elements", 0, 0,
FALSE, FALSE },
399 {
"valarray", 0, 0,
"T",
"elements", 0, 0,
FALSE, FALSE },
400 {
"exception", 0, 0, 0, 0, 0, 0,
FALSE, FALSE },
401 {
"bad_alloc",
"exception", 0, 0, 0, 0, 0,
FALSE, FALSE },
402 {
"bad_cast",
"exception", 0, 0, 0, 0, 0,
FALSE, FALSE },
403 {
"bad_typeid",
"exception", 0, 0, 0, 0, 0,
FALSE, FALSE },
404 {
"logic_error",
"exception", 0, 0, 0, 0, 0,
FALSE, FALSE },
405 {
"ios_base::failure",
"exception", 0, 0, 0, 0, 0,
FALSE, FALSE },
406 {
"runtime_error",
"exception", 0, 0, 0, 0, 0,
FALSE, FALSE },
407 {
"bad_exception",
"exception", 0, 0, 0, 0, 0,
FALSE, FALSE },
408 {
"domain_error",
"logic_error", 0, 0, 0, 0, 0,
FALSE, FALSE },
409 {
"invalid_argument",
"logic_error", 0, 0, 0, 0, 0,
FALSE, FALSE },
410 {
"length_error",
"logic_error", 0, 0, 0, 0, 0,
FALSE, FALSE },
411 {
"out_of_range",
"logic_error", 0, 0, 0, 0, 0,
FALSE, FALSE },
412 {
"range_error",
"runtime_error", 0, 0, 0, 0, 0,
FALSE, FALSE },
413 {
"overflow_error",
"runtime_error", 0, 0, 0, 0, 0,
FALSE, FALSE },
414 {
"underflow_error",
"runtime_error", 0, 0, 0, 0, 0,
FALSE, FALSE },
415 { 0, 0, 0, 0, 0, 0, 0,
FALSE, FALSE }
425 memEntry->
brief =
"STL member";
438 iteratorClassEntry->
fileName =
"[STL]";
442 iteratorClassEntry->
brief =
"STL iterator class";
445 EntryNav *iteratorClassEntryNav =
new EntryNav(classEntryNav,iteratorClassEntry);
446 iteratorClassEntryNav->
setEntry(iteratorClassEntry);
447 classEntryNav->
addChild(iteratorClassEntryNav);
457 namespaceEntry->
name =
"std";
459 namespaceEntry->
brief =
"STL namespace";
464 namespaceEntryNav->
setEntry(namespaceEntry);
465 rootNav->
addChild(namespaceEntryNav);
478 classEntry->
name = fullName;
481 classEntry->
brief =
"STL class";
486 classEntryNav->
setEntry(classEntry);
487 namespaceEntryNav->
addChild(classEntryNav);
517 if (fullName==
"std::auto_ptr" || fullName==
"std::smart_ptr" ||
518 fullName==
"std::unique_ptr" || fullName==
"std::weak_ptr")
521 memEntry->
name =
"operator->";
522 memEntry->
args =
"()";
523 memEntry->
type =
"T*";
526 memEntry->
brief =
"STL member";
531 classEntryNav->
addChild(memEntryNav);
547 addSTLIterator(classEntryNav,fullName+
"::const_reverse_iterator");
568 scope+=
"::"+pd->
name();
615 ((!includeExternal && rootNav->
tagInfo()==0) ||
616 ( includeExternal && rootNav->
tagInfo()!=0))
638 "group %s: ignoring title \"%s\" that does not match old title \"%s\"\n",
676 for (;(e=eli.current());++eli)
704 if ((gd=Doxygen::groupSDict->find(rootNav->
name())))
712 scope+=
"::"+gd->
name();
734 if ((gd=Doxygen::groupSDict->find(root->
name)))
747 for (;(e=eli.current());++eli)
787 "file %s already documented. " 788 "Skipping documentation.",
821 text.
sprintf(
"the name `%s' supplied as " 822 "the second argument in the \\file statement ",
826 text+=
"matches the following input files:\n";
828 text+=
"Please use a more specific name by " 829 "including a (larger) part of the path!";
833 text+=
"is not an input file";
856 if (!includeFile.
isEmpty() && includeFile.
at(0)==
'"')
859 includeFile=includeFile.
mid(1,includeFile.
length()-2);
861 else if (!includeFile.
isEmpty() && includeFile.
at(0)==
'<')
864 includeFile=includeFile.
mid(1,includeFile.
length()-2);
872 (fd=
findFileDef(Doxygen::inputNameDict,includeFile,ambig))==0
876 text.
sprintf(
"the name `%s' supplied as " 877 "the argument of the \\class, \\struct, \\union, or \\include command ",
882 text+=
"matches the following input files:\n";
884 text+=
"Please use a more specific name by " 885 "including a (larger) part of the path!";
889 text+=
"is not an input file";
893 else if (includeFile.
isEmpty() && ifd &&
907 if (iName.
at(0)==
'<') local=
FALSE;
908 else if (iName.
at(0)==
'"') local=
TRUE;
909 if (iName.
at(0)==
'"' || iName.
at(0)==
'<')
952 if (!nsName.
isEmpty() && nsName.
at(0)!=
'@' &&
972 if (root==0)
return 0;
1012 if (idx==-1)
return prevScope;
1014 if (nsName.
isEmpty())
return prevScope;
1015 if (!fullScope.
isEmpty()) fullScope+=
"::";
1020 if (nd==0) cd =
getClass(fullScope);
1025 else if (nd==0 && cd==0 && fullScope.
find(
'<')==-1)
1030 "[generated]",1,1,fullScope,
1036 Doxygen::namespaceSDict->
inSort(fullScope,nd);
1054 prevScope=innerScope;
1074 int p=i1+
l1,l2=0,i2;
1085 if (orgScope==Doxygen::globalScope && fileScope &&
1091 for (ni.toFirst();((nd=ni.current()) && resultScope==0);++ni)
1117 for (ui.toFirst();(usedFd=ui.current());++ui)
1153 if (tArgLists==0)
return 0;
1159 while ((i=name.
find(
"::",p))!=-1)
1260 qualifiedName.
prepend(scName+
"::");
1271 fullName=cd->
name();
1320 if (fullName.
find(
"::")!=-1)
1334 fullName=fullName.
left(i);
1371 Doxygen::classSDict->
append(fullName,cd);
1376 Doxygen::genericsDict->
insert(fullName,cd);
1431 for (cli.toFirst();cli.current();++
cli) cli.current()->visited=
FALSE;
1440 for (cli.toFirst();(cd=cli.current());++
cli)
1467 for (cli.toFirst();(cd=cli.current());++
cli)
1484 "Internal inconsistency: scope for class %s not " 1485 "found!",name.
data()
1499 for (cli.toFirst();cli.current();++
cli) cli.current()->visited=
FALSE;
1502 for (cli.toFirst();(cd=cli.current());++
cli)
1512 for (ncli.toFirst();(ncd=ncli.current());++ncli)
1514 if (ncd->partOfGroups()==0)
1532 if (fullName.
right(2)==
"::") fullName=fullName.
left(fullName.
length()-2);
1533 fullName+=
"."+fieldName;
1569 Doxygen::classSDict->
append(fullName,cd);
1626 if (type.
find(
"::@")!=-1)
1630 for (it.toFirst();(icd=it.current());++it)
1634 if (type.
find(icd->name())!=-1)
1637 if (name.
at(0)==
'@') name =
"__unnamed__";
1681 for (it.toFirst();(icd=it.current());++it)
1683 if (icd->name().find(
"@")==-1)
1697 for (cli.toFirst();(cd=cli.current());++
cli)
1738 if ((nd=Doxygen::namespaceSDict->find(fullName)))
1800 Doxygen::namespaceSDict->
inSort(fullName,nd);
1838 for (unli.toFirst();(und=unli.current());++unli)
1858 if (name.
right(2)==
"::")
1886 int scopeOffset = nsName.
length();
1897 else if ((scopeOffset=nsName.
findRev(
"::",scopeOffset-1))==-1)
1901 }
while (scopeOffset>=0 && usingNd==0);
1903 if (usingNd==0 && nd)
1907 while (pnd && usingNd==0)
1924 if (usingNd==0 && fd)
1944 fd->addUsingDirective(usingNd);
1962 for (;(g=gli.
current());++gli)
1972 fd->insertNamespace(nd);
1973 fd->addUsingDirective(nd);
1980 Doxygen::namespaceSDict->
inSort(name,nd);
2058 usingCd = Doxygen::hiddenClasses->
find(name);
2070 Doxygen::hiddenClasses->
append(root->
name,usingCd);
2071 usingCd->setArtificial(
TRUE);
2072 usingCd->setLanguage(root->
lang);
2135 for ( ; (mi=mnii.
current()) ; ++mnii )
2214 for (;(fd=fni.
current());++fni)
2259 " class variable:\n" 2260 " `%s' `%s'::`%s' `%s' prot=`%d ann=%d init=`%s'\n",
2277 def=
"using "+name+
" = "+root->
type.
mid(7);
2281 def=root->
type+
" "+name+root->
args;
2288 def=
"using "+qualScope+scopeSeparator+name+
" = "+root->
type.
mid(7);
2292 def=root->
type+
" "+qualScope+scopeSeparator+name+root->
args;
2300 def=name+root->
args;
2304 def=qualScope+scopeSeparator+name+root->
args;
2400 Doxygen::memberNameSDict->
append(name,mn);
2426 " global variable:\n" 2427 " type=`%s' scope=`%s' name=`%s' args=`%s' prot=`%d mtype=%d lang=%d\n",
2444 if (type.
left(7)==
"struct " || type.
left(6)==
"union ")
2448 static QRegExp re(
"[a-z_A-Z][a-z_A-Z0-9]*");
2450 s = re.
match(type,0,&l);
2472 if (scope.
find(
'@')!=-1)
return 0;
2494 def=
"using "+nd->
name()+sep+name+
" = "+root->
type;
2503 def=nd->
name()+sep+name+root->
args;
2510 if (name.
at(0)==
'@')
2522 def=root->
type+
" "+name+root->
args;
2528 def=name+root->
args;
2561 bool staticsInDifferentFiles =
2567 !staticsInDifferentFiles
2589 " new variable, nd=%s!\n",nd?
qPrint(nd->
name()):
"<global>");
2645 Doxygen::functionNameSDict->
append(name,mn);
2658 static const QRegExp re(
"([^)]*[\\*\\^][^)]*)");
2660 int bb=type.
find(
'<');
2663 (i=re.
match(type,0,&
l))!=-1 &&
2664 type.
find(
"operator")==-1 &&
2665 (type.
find(
")(")==-1 || type.
find(
"typedef ")!=-1) &&
2670 if (pLength) *pLength=
l;
2687 static QRegExp initChars(
"[0-9\"'&*!^]+");
2688 static QRegExp idChars(
"[a-z_A-Z][a-z_A-Z0-9]*");
2705 else if ((fd = rootNav->
fileDef()) &&
2728 if (!typeIsClass && (ti=type.
find(
'<'))!=-1)
2785 if (idChars.
match(resType,0,&len)==0)
2787 resType=resType.
left(len);
2789 if (resType==
"int" || resType==
"long" || resType==
"float" ||
2790 resType==
"double" || resType==
"char" || resType==
"signed" ||
2791 resType==
"const" || resType==
"unsigned" || resType==
"void")
2815 " type=`%s' name=`%s' args=`%s' bodyLine=`%d' mGrpId=%d relates=%s\n",
2833 static const QRegExp reName(
"[a-z_A-Z][a-z_A-Z0-9]*");
2857 else if (root->
type.
find(
')',i)!=-1)
2889 bool isRelated=
FALSE;
2890 bool isMemberOf=
FALSE;
2898 if (root->
type==
"friend class" || root->
type==
"friend struct" ||
2899 root->
type==
"friend union")
2926 else if (type.
left(8)==
"typedef ")
2928 else if (type.
left(7)==
"friend ")
2948 if (cd==0 && classScope!=scope) cd=
getClass(classScope);
2958 int si=scope.
find(
'@');
2962 static bool inlineSimpleStructs =
Config_getBool(
"INLINE_SIMPLE_STRUCTS");
2963 if (si!=-1 && !inlineSimpleStructs)
2969 pScope.
prepend(annScopePrefix);
2970 else if (annScopePrefix.
length()>2)
2971 pScope=annScopePrefix.
left(annScopePrefix.
length()-2);
2972 if (name.
at(0)!=
'@')
3028 rootNav->
type().
find(
"typedef ")!=-1
3037 for (;(e=eli.current());++eli)
3075 for (;(e=eli.current());++eli)
3129 " Interface Member:\n" 3130 " `%s' `%s' proto=%d\n" 3140 if ((mn=Doxygen::memberNameSDict->find(rname)))
3148 Doxygen::memberNameSDict->
append(rname,mn);
3176 "EXPORTED_INTERFACE_SEC:\n" 3177 " `%s' `%s'::`%s' `%s' relates=`%s' relatesType=`%d' file=`%s' line=`%d' bodyLine=`%d' #tArgLists=%d mGrpId=%d spec=%lld proto=%d docFile=%s\n",
3196 if (!rname.isEmpty())
3212 else if (rname.isEmpty())
3215 "Illegal member name found.");
3221 switch (rootNav->
lang())
3238 const QCString &rname,
bool isFriend)
3244 static QRegExp re(
"([a-z_A-Z0-9: ]*[ &*]+[ ]*");
3248 if (i!=-1 && ts!=-1 && ts<te && ts<i && i<te)
3272 name.
left(9)!=
"operator " && (i=name.
find(
'<'))!=-1 && name.
find(
'>')!=-1)
3316 if (scopeSeparator!=
"::")
3318 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3323 scopeSeparator=
"::";
3335 def=root->
type+
" "+name+root->
args;
3346 def=name+root->
args;
3356 def=root->
type+
" "+qualScope+scopeSeparator+
name;
3360 def=root->
type+
" "+qualScope+scopeSeparator+name+root->
args;
3367 def=qualScope+scopeSeparator+
name;
3371 def=qualScope+scopeSeparator+name+root->
args;
3382 " `%s' `%s'::`%s' `%s' proto=%d\n" 3395 if ((mn=Doxygen::memberNameSDict->find(name)))
3403 Doxygen::memberNameSDict->
append(name,mn);
3426 " `%s' `%s'::`%s' `%s' relates=`%s' relatesType=`%d' file=`%s' line=`%d' bodyLine=`%d' #tArgLists=%d mGrpId=%d spec=%lld proto=%d docFile=%s\n",
3443 bool isFriend=root->
type.
find(
"friend ")!=-1;
3456 int memIndex=rname.
findRev(
"::");
3459 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
3466 bool isMember=
FALSE;
3469 int ts=rname.
find(
'<');
3470 int te=rname.
find(
'>');
3471 if (memIndex>0 && (ts==-1 || te==-1))
3488 isMember=memIndex<ts || memIndex>te;
3492 static QRegExp re(
"([a-z_A-Z0-9: ]*[ &*]+[ ]*");
3502 (ts!=-1 && ts<te && ts<ti && ti<te) ||
3529 if ((mn=Doxygen::functionNameSDict->find(rname)))
3543 fullScope.
prepend(parentScope);
3547 FileDef *mfd = md->getFileDef();
3549 if (mnd) nsName = mnd->
name().
copy();
3550 if (rnd) rnsName = rnd->
name().
copy();
3558 bool sameNumTemplateArgs =
TRUE;
3559 bool matchingReturnTypes =
TRUE;
3564 sameNumTemplateArgs =
FALSE;
3568 matchingReturnTypes =
FALSE;
3572 bool staticsInDifferentFiles =
3573 root->
stat && md->isStatic() && root->
fileName!=md->getDefFileName();
3579 sameNumTemplateArgs &&
3580 matchingReturnTypes &&
3581 !staticsInDifferentFiles
3592 found=(mnd && rnd && nsName==rnsName) ||
3593 ((mnd==0 && rnd==0 && mfd!=0 &&
3598 if (!found && gd && gd==md->getGroupDef() && nsName==rnsName)
3612 if (md->documentation().isEmpty() && !root->
doc.
isEmpty())
3619 md->setDeclArgumentList(argList);
3623 md->setArgumentList(argList);
3629 md->setDocsForDefinition(!root->
proto);
3630 if (md->getStartBodyLine()==-1 && root->
bodyLine!=-1)
3633 md->setBodyDef(rfd);
3636 if (md->briefDescription().isEmpty() && !root->
brief.
isEmpty())
3638 md->setArgsString(root->
args);
3642 md->addSectionsToDefinition(root->
anchors);
3644 md->enableCallGraph(md->hasCallGraph() || root->
callGraph);
3645 md->enableCallerGraph(md->hasCallerGraph() || root->
callerGraph);
3652 else if (md->getGroupDef()!=0 && root->
groups->
count()==0)
3664 if (md->isPrototype() && !root->
proto)
3666 md->setPrototype(
FALSE);
3737 def=root->
type+
" "+scope+name+root->
args;
3744 def=scope+name.
copy();
3748 def=scope+name+root->
args;
3752 " Global Function:\n" 3753 " `%s' `%s'::`%s' `%s' proto=%d\n" 3788 if ((mn=Doxygen::functionNameSDict->find(name)))
3796 Doxygen::functionNameSDict->
append(name,mn);
3829 "Illegal member name found." 3845 for (;(fn=fnli.current());++fnli)
3849 if ((mn=Doxygen::memberNameSDict->find(fn->
memberName())))
3854 for (;(fmd=fni.
current());++fni)
3858 for (;(mmd=mni.
current());++mni)
3934 for (;(mn=mnli.current());++mnli)
3940 for (;(mdec=mni1.
current());++mni1)
3942 if (mdec->isPrototype() ||
3943 (mdec->isVariable() && mdec->isExternal())
3947 for (;(mdef=mni2.
current());++mni2)
3962 for (;(mn=mnli.current());++mnli)
3967 for (;(md=mni.
current());++mni)
3985 mdec->getOuterScope(),mdec->getFileDef(),mdecAl,
3991 MemberSDict *decDict = mdec->getReferencesMembers();
3996 for (msdi.toFirst();(rmd=msdi.current());++msdi)
3998 if (decDict==0 || decDict->
find(rmd->
name())==0)
4008 for (msdi.toFirst();(rmd=msdi.current());++msdi)
4010 if (defDict==0 || defDict->
find(rmd->
name())==0)
4018 decDict = mdec->getReferencedByMembers();
4023 for (msdi.toFirst();(rmd=msdi.current());++msdi)
4025 if (decDict==0 || decDict->
find(rmd->
name())==0)
4035 for (msdi.toFirst();(rmd=msdi.current());++msdi)
4037 if (defDict==0 || defDict->
find(rmd->
name())==0)
4056 for (mnli.toFirst();(mn=mnli.current());++mnli)
4065 if ((rmn=Doxygen::memberNameSDict->find(md->
name())))
4105 QDict<int> *templateNames =
new QDict<int>(17);
4106 templateNames->setAutoDelete(
TRUE);
4107 static QRegExp re(
"[a-z_A-Z][a-z_A-Z0-9:]*");
4108 if (templateArguments)
4116 while ((i=re.
match(name,p,&
l))!=-1)
4121 if (templateNames->find(n)==0)
4123 templateNames->
insert(n,
new int(count));
4130 return templateNames;
4144 if (context && cd!=context)
4160 result = Doxygen::genericsDict->
find(name);
4179 QDict<int> *templateNames=0
4188 for (;(mni=mnili.current());++mnili)
4200 if (!typedefValue.isEmpty())
4202 type = typedefValue;
4228 usedClassName = typeCd->
name();
4231 int sp=usedClassName.
find(
'<');
4233 int si=usedClassName.
findRev(
"::",sp);
4243 bool delTempNames=
FALSE;
4244 if (templateNames==0)
4257 for (ali.toFirst();(arg=ali.current());++ali,++
count)
4259 if (arg->name==usedName)
4264 ClassDef *usedCd = Doxygen::hiddenClasses->
find(usedName);
4276 Doxygen::hiddenClasses->
append(usedName,usedCd);
4302 delete templateNames;
4306 if (!found && !type.
isEmpty())
4311 if (type.
right(2)==
"(*" || type.
right(2)==
"(^")
4322 Doxygen::hiddenClasses->
append(type,usedCd);
4350 QDict<int> *templateNames=0
4364 bool delTempNames=
FALSE;
4365 if (templateNames==0)
4398 delete templateNames;
4409 QDict<int> *templateNames,
4427 bool existingClass = (templSpec ==
4430 if (existingClass)
return TRUE;
4432 bool freshInstance=
FALSE;
4441 Doxygen::classSDict->
append(instanceClass->
name(),instanceClass);
4447 if (templateRootNav)
4449 bool unloadNeeded=
FALSE;
4450 Entry *templateRoot = templateRootNav->
entry();
4451 if (templateRoot==0)
4454 templateRoot = templateRootNav->
entry();
4467 isArtificial,templArgs,templateNames);
4523 bool insideString=
FALSE;
4524 bool insideChar=
FALSE;
4526 while (e<len && brCount!=0)
4532 if (!insideString && !insideChar)
4534 if (e<len-1 && s.
at(e+1)==
'<')
4536 else if (roundCount==0)
4541 if (!insideString && !insideChar)
4543 if (e<len-1 && s.
at(e+1)==
'>')
4545 else if (roundCount==0)
4550 if (!insideString && !insideChar)
4554 if (!insideString && !insideChar)
4560 if (insideString && pc!=
'\\')
4569 if (insideChar && pc!=
'\\')
4579 return brCount==0 ? e : -1;
4587 QDict<int> *templateNames,
4608 bool explicitGlobalScope=
FALSE;
4610 if (biName.
left(2)==
"::")
4613 explicitGlobalScope=
TRUE;
4617 bool lastParent=
FALSE;
4622 int scopeOffset=explicitGlobalScope ? 0 : scopeName.
length();
4631 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
4661 || explicitGlobalScope
4669 Debug::Classes,0,
" class relation %s inherited/used by %s found (%s and %s) templSpec='%s'\n",
4677 int i=baseClassName.
find(
'<');
4678 int si=baseClassName.
findRev(
"::",i==-1 ? baseClassName.
length() : i);
4683 baseClass = Doxygen::genericsDict->
find(baseClassName.
left(i));
4686 if (baseClass==0 && i!=-1)
4696 baseClassName=baseClassName.
left(i)+baseClassName.
right(baseClassName.length()-
e);
4697 baseClass=
getResolvedClass(explicitGlobalScope ? Doxygen::globalScope : context,
4709 else if (baseClass && !templSpec.isEmpty())
4720 baseClass = templClass;
4721 templSpec.resize(0);
4728 if (!found && si!=-1)
4733 baseClass=
getResolvedClass(explicitGlobalScope ? Doxygen::globalScope : context,
4741 found=baseClass!=0 && baseClass!=cd;
4742 if (found) templSpec = tmpTemplSpec;
4758 found = baseClass!=0 && baseClass!=cd;
4769 found = baseClass!=0 && baseClass!=cd;
4772 bool isATemplateArgument = templateNames!=0 && templateNames->find(biName)!=0;
4798 if (baseClassTypeDef==0)
4808 if (baseClassTypeDef || cd->
isCSharp())
4824 "Detected potential recursive class relation " 4825 "between class %s and base class %s!",
4832 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
4835 " New undocumented base class `%s' baseClassName=%s templSpec=%s isArtificial=%d\n",
4839 if (isATemplateArgument)
4841 baseClass=Doxygen::hiddenClasses->
find(baseClassName);
4847 Doxygen::hiddenClasses->
append(baseClassName,baseClass);
4854 baseClass=Doxygen::classSDict->
find(baseClassName);
4862 Doxygen::classSDict->
append(baseClassName,baseClass);
4865 int si = baseClassName.
findRev(
"::");
4869 if (sd==0 || sd==Doxygen::globalScope)
4876 if (biName.
right(2)==
"-p")
4878 biName=
"<"+biName.
left(biName.
length()-2)+
">";
4887 if (baseClassName.
right(2)==
"-p")
4903 "Detected potential recursive class relation " 4904 "between class %s and base class %s!\n",
4916 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
4921 }
while (scopeOffset>=0);
4929 parentNode=parentNode->
parent();
4931 }
while (lastParent);
4955 if (extends)
return TRUE;
4980 (i=bName.find(
'<'))!=-1)
4984 bName=bName.left(i);
4997 for (cli.toFirst();cli.current();++
cli) cli.current()->visited=
FALSE;
5000 for (;(rootNav=edi.current());++edi)
5018 for (cli.toFirst();cli.current();++
cli) cli.current()->visited=
FALSE;
5021 for (;(rootNav=edi.current());++edi)
5039 for (cli.toFirst();cli.current();++
cli) cli.current()->visited=
FALSE;
5042 for (;(rootNav=edi.current());++edi)
5056 bName.
right(2)!=
"::")
5066 "Compound %s is not documented.",
5079 for (;(rootNav=edi.current());++edi)
5088 QDict<ClassDef> *templInstances = 0;
5092 QDictIterator<ClassDef> tdi(*templInstances);
5094 for (tdi.toFirst();(tcd=tdi.current());++tdi)
5097 QCString templSpec = tdi.currentKey();
5114 QDict<int> *actualTemplateNames =
new QDict<int>(17);
5115 actualTemplateNames->setAutoDelete(
TRUE);
5116 QDictIterator<int> qdi(*templateNames);
5117 for (qdi.toFirst();qdi.current();++qdi)
5119 int templIndex = *qdi.current();
5121 if (templIndex<(
int)templArgs->
count())
5123 actArg=templArgs->
at(templIndex);
5126 baseClassNames!=0 &&
5127 baseClassNames->find(actArg->
type)!=0 &&
5128 actualTemplateNames->find(actArg->
type)==0
5131 actualTemplateNames->insert(actArg->
type,
new int(templIndex));
5134 delete templateNames;
5143 delete actualTemplateNames;
5161 for (cli.toFirst();(cd=cli.current());++
cli)
5171 for (;(fd=fni.
current());++fni)
5178 for (nli.toFirst();(nd=nli.current());++nli)
5184 for (gli.toFirst();(gd=gli.current());++gli)
5196 for (mnli.toFirst();(mn=mnli.current());++mnli)
5206 for (fmnli.toFirst();(mn=fmnli.current());++fmnli)
5218 for (cli.toFirst();(cd=cli.current());++
cli)
5229 for (;(fd=fni.
current());++fni)
5237 for (nli.toFirst();(nd=nli.current());++nli)
5244 for (gli.toFirst();(gd=gli.current());++gli)
5251 for (pdi.toFirst();(pd=pdi.current());++pdi)
5269 for (ddi.toFirst();(dd=ddi.current());++ddi)
5290 for (di.toFirst();(rl=di.current());++di)
5321 fullName = cd->
name();
5323 fullName = nd->
name();
5325 if (!fullName.
isEmpty()) fullName+=
"::";
5326 fullName+=md->
name();
5423 "member %s belongs to two different groups. The second " 5424 "one found here will be ignored.",
5442 const char *scopeName)
5458 const char *tempArg,
5464 "2. findGlobalMember(namespace=%s,type=%s,name=%s,tempArg=%s,decl=%s)\n",
5472 mn=Doxygen::functionNameSDict->
find(n);
5498 if ((namespaceName.
isEmpty() && nd==0) ||
5499 (nd && nd->
name()==namespaceName) ||
5507 if (!namespaceName.
isEmpty()) rnd = Doxygen::namespaceSDict->find(namespaceName);
5576 warnMsg+=
"\nPossible candidates:\n";
5590 if (root->
type!=
"friend class" &&
5591 root->
type!=
"friend struct" &&
5592 root->
type!=
"friend union" &&
5598 "documented symbol `%s' was not declared or defined.",decl
5612 for (;srclali.
current();++srclali,++dstlali)
5639 QRegExp re(
"[A-Za-z_][A-Za-z_0-9]*");
5642 while ((i=re.
match(src,p,&
l))!=-1)
5645 dst+=src.
mid(p,i-p);
5656 if (funcTempArgList)
5659 fa = fali->current();
5662 for (tsali.toFirst();(tsa=tsali.current()) && !found;++tsali)
5664 tda = tdali.current();
5668 if (name==tsa->
name)
5670 if (tda && tda->name.isEmpty())
5673 if (tda->type.left(6)==
"class ") vc=6;
5674 else if (tda->type.left(9)==
"typename ") vc=9;
5677 tda->name = tda->type.mid(vc);
5678 tda->type = tda->type.left(vc-1);
5681 if (tda && !tda->name.isEmpty())
5695 { ++(*fali); fa=fali->current(); }
5729 srcTempArgLists,dstTempArgLists,funcTempArgs,
5732 srcTempArgLists,dstTempArgLists,funcTempArgs,
5754 srcTempArgLists,dstTempArgLists,
5781 "findMember(root=%p,funcDecl=`%s',related=`%s',overload=%d," 5782 "isFunc=%d mGrpId=%d tArgList=%p (#=%d) " 5783 "spec=%lld lang=%x\n",
5798 bool isRelated=
FALSE;
5799 bool isMemberOf=
FALSE;
5800 bool isFriend=
FALSE;
5833 while ((sep=funcDecl.
find(
';'))!=-1)
5839 if (!funcDecl.
isEmpty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
5851 if (isFriend && funcDecl.
left(6)==
"class ")
5855 funcName = funcDecl.
copy();
5857 else if (isFriend && funcDecl.
left(7)==
"struct ")
5860 funcName = funcDecl.
copy();
5866 funcArgs,funcTempList,exceptions
5900 if (!scopeName.isEmpty() &&
5901 (
getClass(joinedName) || Doxygen::namespaceSDict->
find(joinedName)))
5903 scopeName = joinedName;
5921 for (nsdi.toFirst();(fnd=nsdi.current());++nsdi)
5923 joinedName = fnd->
name()+
"::"+scopeName;
5924 if (Doxygen::namespaceSDict->find(joinedName))
5926 scopeName=joinedName;
5956 if (namespaceName.
find(
'@')!=-1)
return;
5960 scopeName.resize(0);
5965 scopeName=namespaceName;
5977 else if (!className.
isEmpty())
5994 tempScopeName=scopeName+funcSpec;
6002 if (!scopeName.isEmpty() && !isRelated && !isFriend && !
Config_getBool(
"HIDE_SCOPE_NAMES"))
6008 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+
funcTempList;
6012 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
6023 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
6037 funcDecl=funcType+
" "+funcName+funcArgs;
6048 funcDecl=funcName+funcArgs;
6053 if (funcType==
"template class" && !funcTempList.
isEmpty())
6057 "findMember() Parse results:\n" 6058 " namespaceName=`%s'\n" 6064 " funcTempList=`%s'\n" 6067 " exceptions=`%s'\n" 6082 "1. funcName=`%s'\n",funcName.
data());
6083 if (funcName.
left(9)==
"operator ")
6085 funcName =
substitute(funcName,className+
"::",
"");
6089 mn=Doxygen::memberNameSDict->
find(funcName+funcTempList);
6093 mn=Doxygen::memberNameSDict->
find(funcName);
6095 if (!isRelated && mn)
6098 "2. member name exists (%d members with this name)\n",mn->
count());
6107 bool memFound=
FALSE;
6112 "3. member definition found, " 6113 "scope needed=`%s' scope=`%s' args=`%s' fileName=%s\n",
6115 qPrint(md->argsString()),
6137 "4. class definition %s found\n",cd->
name().
data());
6145 declTemplArgs.
append(templAl);
6153 bool substDone=
FALSE;
6160 if (declTemplArgs.count()>0 && defTemplArgs &&
6161 declTemplArgs.
count()==defTemplArgs->
count() &&
6182 "5. matching `%s'<=>`%s' className=%s namespaceName=%s\n",
6188 md->isVariable() || md->isTypedef() ||
6191 md->getClassDef(),md->getFileDef(),argList,
6201 if (md->templateArguments()!=0 && root->
tArgLists!=0)
6203 QCString memType = md->typeString();
6210 "5b. Comparing return types '%s'<->'%s' #args %d<->%d\n",
6222 bool mdIsTemplate = md->templateArguments()!=0;
6223 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6224 bool rootIsTemplate = root->
tArgLists!=0;
6226 if (!rootIsUserDoc &&
6227 (mdIsTemplate || rootIsTemplate) &&
6228 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6234 "5b. Comparing return types: template v.s. non-template\n");
6240 "6. match results of matchArguments2 = %d\n",matching);
6246 md->setDefinitionTemplateParameterLists(root->
tArgLists);
6247 md->setArgumentList(argList);
6251 if (!funcTempList.
isEmpty() &&
6273 else if (cd && cd!=tcd)
6279 if (count==0 && rootNav->
parent() &&
6282 goto localObjCMethod;
6284 if (count==0 && !(isFriend && funcType==
"class"))
6311 "7. new candidate className=%s scope=%s args=%s exact match\n",
6319 "7. new candidate className=%s scope=%s args=%s no match\n",
6326 static bool strictProtoMatching =
Config_getBool(
"STRICT_PROTO_MATCHING");
6327 if (!strictProtoMatching)
6329 if (candidates==1 && ucd && umd)
6336 else if (candidates>1 && ecd && emd)
6347 if (noMatchCount>1) warnMsg+=
"uniquely ";
6348 warnMsg+=
"matching class member found for \n";
6354 for (;(al=alli.
current());++alli)
6356 warnMsg+=
" template ";
6365 warnMsg+=fullFuncDecl;
6370 warnMsg+=
"Possible candidates:\n";
6379 warnMsg+=
" 'template ";
6384 if (md->typeString())
6386 warnMsg+=md->typeString();
6391 warnMsg+=qScope+
"::"+md->name();
6392 if (md->argsString())
6393 warnMsg+=md->argsString();
6397 " of file "+md->getDefFileName();
6426 funcType,funcName,funcArgs,exceptions,
6462 else if (overloaded)
6475 for (;(md=mni.
current());++mni)
6478 if (className!=cd->
name()) unique=
FALSE;
6494 funcType,funcName,funcArgs,exceptions,
6496 mtype,tArgList,root->
argList);
6497 md->setTagInfo(rootNav->
tagInfo());
6498 md->setLanguage(root->
lang);
6499 md->setId(root->
id);
6501 md->setMemberClass(cd);
6502 md->setDefinition(funcDecl);
6511 md->setDocsForDefinition(!root->
proto);
6512 md->setPrototype(root->
proto);
6513 md->addSectionsToDefinition(root->
anchors);
6517 md->setMemberSpecifiers(root->
spec);
6518 md->setMemberGroupId(root->
mGrpId);
6522 md->setRefItems(root->
sli);
6527 if (!
findGlobalMember(rootNav,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl))
6532 "Cannot determine class for function\n%s",
6541 " scopeName=%s className=%s\n",
qPrint(scopeName),
qPrint(className));
6547 bool newMember=
TRUE;
6548 bool newMemberName=
FALSE;
6550 bool isDefine=
FALSE;
6557 while (mdDefine && !isDefine)
6559 isDefine = isDefine || mdDefine->
isDefine();
6560 if (!isDefine) { ++mni; mdDefine=mni.
current(); }
6567 if ((mn=Doxygen::memberNameSDict->find(funcName))==0)
6576 while ((rmd=mni.
current()) && newMember)
6585 if (newMember) ++mni;
6587 if (!newMember && rmd)
6609 if (isDefine && mdDefine)
6614 funcDecl=funcType +
" " + funcName;
6628 funcType,funcName,funcArgs,exceptions,
6630 root->
stat && !isMemberOf,
6636 if (isDefine && mdDefine)
6671 while ((rmd=rmni.
current()) && !found)
6733 Doxygen::memberNameSDict->
append(funcName,mn);
6738 if (!
findGlobalMember(rootNav,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl))
6743 "Cannot determine file/namespace for relatedalso function\n%s",
6752 "class `%s' for related function `%s' is not " 6770 funcType,funcName,funcArgs,exceptions,
6795 if ((mn=Doxygen::memberNameSDict->find(root->
name)))
6803 Doxygen::memberNameSDict->
append(root->
name,mn);
6813 bool globMem =
findGlobalMember(rootNav,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl);
6814 if (className.
isEmpty() && !globMem)
6817 "class for member `%s' cannot " 6818 "be found.", funcName.
data()
6821 else if (!className.
isEmpty() && !globMem)
6824 "member `%s' of class `%s' cannot be found",
6833 "member with no name found.");
6847 "findMemberDocumentation(): root->type=`%s' root->inside=`%s' root->name=`%s' root->args=`%s' section=%x root->spec=%lld root->mGrpId=%d\n",
6913 if (root->
type==
"friend class" || root->
type==
"friend struct" ||
6914 root->
type==
"friend union")
6986 for (;(e=eli.current());++eli)
7001 for (;(objCImplNav=eli.current());++eli)
7007 for (;(objCMethodNav=seli.current());++seli)
7012 Entry *objCMethod = objCMethodNav->entry();
7015 findMember(objCMethodNav, objCMethod->
type+
" "+objCImplNav->name()+
"::"+
7019 objCMethodNav->releaseEntry();
7043 bool isRelated=
FALSE;
7044 bool isMemberOf=
FALSE;
7156 if (fd==0 && rootNav->
parent())
7186 if ((mn=(*mnsd)[name]))
7224 bool isRelated=
FALSE;
7295 for (;(e=eli.current());++eli)
7308 e->loadEntry(g_storage);
7309 Entry *root = e->entry();
7315 qualifiedName=
substitute(scope,
"::",
".")+
"."+qualifiedName;
7367 MemberNameSDict *emnsd = isRelated ? Doxygen::functionNameSDict : mnsd;
7368 if (!e->name().isEmpty() && (fmn=(*emnsd)[e->name()]))
7397 else if (isRelated && cd)
7444 && rootNav->
name().
at(0)!=
'@' 7570 "Documentation for undefined enum `%s' found.",
7588 for (mnli.toFirst();(mn=mnli.current());++mnli)
7598 int documentedEnumValues=0;
7620 findDEV(*Doxygen::memberNameSDict);
7621 findDEV(*Doxygen::functionNameSDict);
7631 for (mnli.toFirst();(mn=mnli.current());++mnli)
7643 for (fnli.toFirst();(mn=fnli.current());++fnli)
7671 for ( ; (mn=mnli.current()) ; ++mnli )
7677 for ( ; (md=mdi.
current()) ; ++mdi )
7689 if (md!=bmd && bmcd && mcd && bmcd!=mcd &&
7750 for (cli.toFirst();(cd=cli.current());++
cli)
7756 QDictIterator<ClassDef> qdi(*templInstances);
7759 for (qdi.toFirst();(tcd=qdi.current());++qdi)
7774 for (cli.toFirst();(cd=cli.current());++
cli)
7780 ClassDef *baseClass=Doxygen::classSDict->
find(baseName);
7798 for (cli.toFirst();(cd=cli.current());++
cli)
7809 for (cli.toFirst();(cd=cli.current());++
cli)
7819 if (Doxygen::inputNameList->
count()>0)
7822 static bool clangAssistedParsing =
Config_getBool(
"CLANG_ASSISTED_PARSING");
7823 if (clangAssistedParsing)
7825 QDict<void> g_processedFiles(10007);
7828 QDict<void> g_filesToProcess(10007);
7835 for (;(fd=fni.
current());++fni)
7837 g_filesToProcess.insert(fd->
absFilePath(),(
void*)0x8);
7845 for (;(fd=fni.
current());++fni)
7865 char *incFile = filesInSameTu.
first();
7866 while (incFile && g_filesToProcess.find(incFile))
7887 g_processedFiles.insert(incFile,(
void*)0x8);
7890 incFile = filesInSameTu.
next();
7893 g_processedFiles.insert(fd->
absFilePath(),(
void*)0x8);
7902 for (;(fd=fni.
current());++fni)
7930 for (;(fn=fnli.
current());++fnli)
7934 for (;(fd=fni.
current());++fni)
7963 if (Doxygen::inputNameList->
count()>0)
7991 for (cli.toFirst();(cd=cli.current());++
cli)
8002 for (nli.toFirst();(nd=nli.current());++nli)
8014 for (mnli.toFirst();(mn=mnli.current());++mnli)
8038 for (fnli.toFirst();(mn=fnli.current());++fnli)
8071 for (cli.toFirst();(cd=cli.current());++
cli)
8079 for (nli.toFirst();(nd=nli.current());++nli)
8087 for (;(fn=fnli.
current());++fnli)
8091 for (;(fd=fni.
current());++fni)
8100 for (gli.toFirst();(gd=gli.current());++gli)
8112 for ( ; cli.current() ; ++
cli )
8127 msg(
"Generating docs for compound %s...\n",cd->
name().
data());
8151 for (;(mn=mnli.current());++mnli)
8155 for (;(md=mni.
current());++mni)
8211 for (nli.toFirst() ; (nd=nli.current()) ; ++nli )
8215 for (nli.toFirst() ; (nd=nli.current()) ; ++nli )
8228 for ( ; (cd=cli.current()) ; ++
cli )
8247 for ( ; (nd=nli.current()) ; ++nli )
8254 for (gli.toFirst();(gd=gli.current());++gli)
8267 for ( ; (cd=cli.current()) ; ++
cli )
8286 for ( ; (nd=nli.current()) ; ++nli )
8293 for (gli.toFirst();(gd=gli.current());++gli)
8306 for ( ; (cd=cli.current()) ; ++
cli )
8325 for ( ; (nd=nli.current()) ; ++nli )
8332 for (gli.toFirst();(gd=gli.current());++gli)
8339 for (pdi.toFirst();(pd=pdi.current());++pdi)
8365 for (;(fn=fnli.current());++fnli)
8369 for (;(fmd=fni.
current());++fni)
8379 for (;(fn=mnli.current());++mnli)
8383 for (;(fmd=mni.
current());++mni)
8420 for (;(fn=fnli.current());++fnli)
8424 for (;(fmd=fni.
current());++fni)
8430 for (;(fn=mnli.current());++mnli)
8434 for (;(fmd=mni.
current());++mni)
8467 if ((mn=Doxygen::functionNameSDict->find(root->
name)))
8475 Doxygen::functionNameSDict->
append(root->
name,mn);
8484 for (;(md=mni.
current());++mni)
8567 "documentation for unknown define %s found.\n",
8574 "found documented #define but ignoring it because " 8575 "ENABLE_PREPROCESSING is NO.\n",
8596 normalizedName =
substitute(normalizedName,
"\\",
"/");
8599 if (root->
docFile==normalizedName)
8601 int lastSlashPos=normalizedName.
findRev(
'/');
8602 if (lastSlashPos!=-1)
8604 normalizedName=normalizedName.
left(lastSlashPos);
8607 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
8609 normalizedName+=
'/';
8613 for (sdi.toFirst();(dir=sdi.current());++sdi)
8621 "\\dir command matches multiple directories.\n" 8622 " Applying the command for directory %s\n" 8623 " Ignoring the command for directory %s\n",
8644 "directory found for command \\dir %s\n",normalizedName.
data());
8698 if (Doxygen::mainPage==0 && rootNav->
tagInfo()==0)
8730 Doxygen::mainPage->
name(),
8731 Doxygen::mainPage->
title(),
8734 Doxygen::sectionDict->
append(indexName,si);
8738 else if (rootNav->
tagInfo()==0)
8742 "found more than one \\mainpage comment block! (first occurrence: %s, line %d), Skipping current block!",
8758 if (Doxygen::mainPage && rootNav->
tagInfo())
8779 Doxygen::pageSDict->
find(root->
name) :
8806 for (pdi.toFirst();(pd=pdi.current());++pdi)
8813 err(
"page defined at line %d of file %s with label %s is a subpage " 8814 "of itself! Please remove this cyclic dependency.\n",
8829 for (;(si=sdi.current());++sdi)
8843 for (rli.toFirst();(rl=rli.current());++rli)
8903 for (pdi.toFirst();(pd=pdi.current());++pdi)
8907 msg(
"Generating docs for page %s...\n",pd->
name().
data());
8910 Doxygen::insideMainPage=
FALSE;
8925 if (Doxygen::exampleSDict->find(root->
name))
8928 "Example %s was already documented. Ignoring " 8929 "documentation found here.",
8943 Doxygen::exampleSDict->
inSort(root->
name,pd);
8959 indentStr.
fill(
' ',indent);
8960 msg(
"%s%s (sec=0x%x)\n",
8967 for (;eli.current();++eli)
printNavTree(eli.current(),indent+2);
8980 for (pdi.toFirst();(pd=pdi.current());++pdi)
8982 msg(
"Generating docs for example %s...\n",pd->
name().
data());
9011 for (gli.toFirst();(gd=gli.current());++gli)
9047 for (;(nd=nli.current());++nli)
9052 msg(
"Generating docs for namespace %s\n",nd->
name().
data());
9059 for ( ; (cd=
cli.current()) ; ++
cli )
9061 if ( ( cd->isLinkableInProject() &&
9062 cd->templateMaster()==0
9065 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
9068 msg(
"Generating docs for compound %s...\n",cd->name().data());
9070 cd->writeDocumentation(*g_outputList);
9071 cd->writeMemberList(*g_outputList);
9073 cd->writeDocumentationForInnerClasses(*g_outputList);
9083 for (i=0;i<s.
length();i++)
9107 bool updateOnly=
FALSE)
9111 bool writeToStdout=(configFile[0]==
'-' && configFile[1]==
'\0');
9120 msg(
"\n\nConfiguration file `%s' created.\n\n",configFile);
9121 msg(
"Now edit the configuration file and enter\n\n");
9122 if (
qstrcmp(configFile,
"Doxyfile") ||
qstrcmp(configFile,
"doxyfile"))
9123 msg(
" doxygen %s\n\n",configFile);
9125 msg(
" doxygen\n\n");
9126 msg(
"to generate the documentation for your project\n\n");
9130 msg(
"\n\nConfiguration file `%s' updated.\n\n",configFile);
9136 err(
"Cannot open file %s for writing\n",configFile);
9159 int eqPos = tagLine.
find(
'=');
9163 destName = tagLine.
right(tagLine.
length()-eqPos-1).stripWhiteSpace();
9176 err(
"Tag file `%s' does not exist or is not a file. Skipping it...\n",
9182 msg(
"Reading tag file `%s', location `%s'...\n",fileName.
data(),destName.
data());
9184 msg(
"Reading tag file `%s'...\n",fileName.
data());
9193 for (
uint i=0; i<latexExtraStyleSheet.
count(); ++i)
9201 err(
"Style sheet '%s' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",
fileName.data());
9220 if (!htmlStyleSheet.
isEmpty())
9225 err(
"Style sheet '%s' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet.
data());
9226 htmlStyleSheet.
resize(0);
9231 copyFile(htmlStyleSheet,destFileName);
9235 for (
uint i=0; i<htmlExtraStyleSheet.
count(); ++i)
9243 err(
"Style sheet '%s' specified by HTML_EXTRA_STYLESHEET does not exist!\n",
fileName.data());
9247 err(
"Style sheet %s specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName().
data());
9266 err(
"Project logo '%s' specified by PROJECT_LOGO does not exist!\n",projectLogo.
data());
9272 copyFile(projectLogo,destFileName);
9282 for (i=0; i<files.
count(); ++i)
9291 err(
"Extra file '%s' specified in " + filesOption +
" does not exist!\n",
fileName.data());
9309 int sep = fileName.
findRev(
'/');
9310 int ei = fileName.
findRev(
'.');
9311 if (ei!=-1 && (sep==-1 || ei>sep))
9317 extension =
".no_extension";
9320 return Doxygen::parserManager->
getParser(extension);
9325 bool sameTu,
QStrList &filesInSameTu)
9328 static bool clangAssistedParsing =
Config_getBool(
"CLANG_ASSISTED_PARSING");
9330 static bool clangAssistedParsing =
FALSE;
9334 int ei = fileName.
findRev(
'.');
9341 extension =
".no_extension";
9351 msg(
"Preprocessing %s...\n",fn);
9357 msg(
"Reading %s...\n",fn);
9360 if (preBuf.data() && preBuf.curPos()>0 && *(preBuf.data()+preBuf.curPos()-1)!=
'\n')
9362 preBuf.addChar(
'\n');
9365 BufStr convBuf(preBuf.curPos()+1024);
9370 convBuf.addChar(
'\0');
9372 if (clangAssistedParsing && !sameTu)
9378 parser->
parseInput(fileName,convBuf.
data(),root,sameTu,filesInSameTu);
9390 static bool clangAssistedParsing =
Config_getBool(
"CLANG_ASSISTED_PARSING");
9391 if (clangAssistedParsing)
9393 QDict<void> g_processedFiles(10007);
9396 QDict<void> g_filesToProcess(10007);
9401 g_filesToProcess.
insert(*s,(
void*)0x8);
9420 char *incFile = filesInSameTu.
first();
9421 while (incFile && g_filesToProcess.find(incFile))
9423 if (
qstrcmp(incFile,s->
data()) && !g_processedFiles.find(incFile))
9431 g_processedFiles.insert(incFile,(
void*)0x8);
9434 incFile = filesInSameTu.
next();
9437 g_processedFiles.insert(*s,(
void*)0x8);
9443 if (!g_processedFiles.find(*s))
9453 g_processedFiles.insert(*s,(
void*)0x8);
9482 QDict<void> nonSymlinks;
9490 if (sepPos==0 && (result.
left(2)==
"//" || result.
left(2)==
"\\\\"))
9491 sepPos = result.
find(
'/',2);
9493 sepPos = result.
find(
'/',sepPos+1);
9495 sepPos = result.
find(
'/',sepPos+1);
9498 if (nonSymlinks.find(prefix)==0)
9515 target+=result.
mid(sepPos);
9519 if (known.find(result))
return QCString();
9520 known.
insert(result,(
void*)0x8);
9533 nonSymlinks.
insert(prefix,(
void*)0x8);
9559 bool errorIfNotExist,
9561 QDict<void> *killDict,
9566 if (paths && paths->find(dirName)==0)
9568 paths->
insert(dirName,(
void*)0x8);
9573 if (dirName.
isEmpty())
return 0;
9596 if (errorIfNotExist)
9601 else if (cfi->
isFile() &&
9623 if (fnList) fnList->
inSort(fn);
9624 fnDict->insert(name,fn);
9628 if (resultList || resultDict)
9632 if (resultList) resultList->
append(rs);
9634 if (killDict) killDict->insert(cfi->
absFilePath().
utf8(),(
void *)0x8);
9636 else if (recursive &&
9643 totalSize+=
readDir(cfi,fnList,fnDict,exclDict,
9644 patList,exclPatList,resultList,resultDict,errorIfNotExist,
9645 recursive,killDict,paths);
9668 bool errorIfNotExist,
9669 QDict<void> *killDict,
9678 if (lc==
'/' || lc==
'\\') fs = fs.
left(fs.
length()-1);
9688 if (errorIfNotExist)
9690 warn_uncond(
"source %s is not a readable file or directory... skipping.\n",s);
9699 if (paths && paths->find(dirPath))
9701 paths->
insert(dirPath,(
void*)0x8);
9704 if (killDict==0 || killDict->find(filePath)==0)
9722 if (fnList) fnList->
inSort(fn);
9723 fnDict->insert(name,fn);
9727 if (resultList || resultDict)
9730 if (resultList) resultList->
append(rs);
9731 if (resultDict) resultDict->insert(filePath,rs);
9737 else if (fi.
isDir())
9739 totalSize+=
readDir(&fi,fnList,fnDict,exclDict,patList,
9740 exclPatList,resultList,resultDict,errorIfNotExist,
9741 recursive,killDict,paths);
9756 msg(
"Reading formula repository...\n");
9765 warn_uncond(
"formula.repository is corrupted!\n");
9774 Doxygen::formulaList->
append(f);
9775 Doxygen::formulaDict->insert(formText,f);
9776 Doxygen::formulaNameDict->insert(formName,f);
9788 for (adi.toFirst();(s=adi.current());++adi)
9800 for (adi.toFirst();(s=adi.current());++adi)
9805 while ((in=value.
find(
"\\n",p))!=-1)
9807 newValue+=value.
mid(p,in-p);
9809 if (value.
mid(in,5)!=
"\\note" &&
9810 value.
mid(in,5)!=
"\\name" &&
9811 value.
mid(in,10)!=
"\\namespace" &&
9812 value.
mid(in,14)!=
"\\nosubgrouping" 9815 newValue+=
"\\_linebr ";
9836 const char *s=aliasList.
first();
9842 int i=alias.
find(
'=');
9883 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('" 9886 << d->
name() <<
"','" 9900 for (;(intf=di.current());++di)
9915 if (d!=Doxygen::globalScope)
dumpSymbol(t,d);
9924 msg(
"Developer parameters:\n");
9925 msg(
" -m dump symbol map\n");
9926 msg(
" -b output to wizard\n");
9927 msg(
" -T activates output generation via Django like template\n");
9928 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
9938 msg(
"Doxygen version %s\nCopyright Dimitri van Heesch 1997-2015\n\n",
versionString);
9939 msg(
"You can use doxygen in a number of ways:\n\n");
9940 msg(
"1) Use doxygen to generate a template configuration file:\n");
9941 msg(
" %s [-s] -g [configName]\n\n",name);
9942 msg(
" If - is used for configName doxygen will write to standard output.\n\n");
9943 msg(
"2) Use doxygen to update an old configuration file:\n");
9944 msg(
" %s [-s] -u [configName]\n\n",name);
9945 msg(
"3) Use doxygen to generate documentation using an existing ");
9946 msg(
"configuration file:\n");
9947 msg(
" %s [configName]\n\n",name);
9948 msg(
" If - is used for configName doxygen will read from standard input.\n\n");
9949 msg(
"4) Use doxygen to generate a template file controlling the layout of the\n");
9950 msg(
" generated documentation:\n");
9951 msg(
" %s -l [layoutFileName.xml]\n\n",name);
9952 msg(
"5) Use doxygen to generate a template style sheet file for RTF, HTML or Latex.\n");
9953 msg(
" RTF: %s -w rtf styleSheetFile\n",name);
9954 msg(
" HTML: %s -w html headerFile footerFile styleSheetFile [configFile]\n",name);
9955 msg(
" LaTeX: %s -w latex headerFile footerFile styleSheetFile [configFile]\n\n",name);
9956 msg(
"6) Use doxygen to generate a rtf extensions file\n");
9957 msg(
" RTF: %s -e rtf extensionsFile\n\n",name);
9958 msg(
"If -s is specified the comments of the configuration items in the config file will be omitted.\n");
9959 msg(
"If configName is omitted `Doxyfile' will be used as a default.\n\n");
9960 msg(
"-v print version string\n");
9970 if (
qstrlen(&argv[optind][2])>0)
9972 else if (optind+1<argc && argv[optind+1][0]!=
'-')
9984 setlocale(LC_ALL,
"");
9985 setlocale(LC_CTYPE,
"C");
9986 setlocale(LC_NUMERIC,
"C");
9988 Doxygen::runningTime.
start();
10011 #ifdef USE_LIBCLANG 10022 Doxygen::globalScope =
new NamespaceDef(
"<globalScope>",1,1,
"<globalScope>");
10027 Doxygen::hiddenClasses =
new ClassSDict(257);
10029 Doxygen::directories =
new DirSDict(17);
10031 Doxygen::pageSDict =
new PageSDict(1009);
10033 Doxygen::exampleSDict =
new PageSDict(1009);
10038 Doxygen::exampleNameDict->setAutoDelete(
TRUE);
10040 Doxygen::imageNameDict->setAutoDelete(
TRUE);
10047 Doxygen::citeDict =
new CiteDict(257);
10052 Doxygen::formulaNameDict =
new FormulaDict(1009);
10103 for (dli.toFirst();(di=dli.current());)
10137 while (v!=0) v>>=1,r++;
10151 const char *configName=0;
10152 const char *layoutName=0;
10153 const char *debugLabel;
10154 const char *formatName;
10155 bool genConfig=
FALSE;
10156 bool shortList=
FALSE;
10157 bool updateConfig=
FALSE;
10158 bool genLayout=
FALSE;
10160 while (optind<argc && argv[optind][0]==
'-' &&
10161 (isalpha(argv[optind][1]) || argv[optind][1]==
'?' ||
10162 argv[optind][1]==
'-')
10165 switch(argv[optind][1])
10169 configName=
getArg(argc,argv,optind);
10170 if (optind+1<argc &&
qstrcmp(argv[optind+1],
"-")==0)
10171 { configName=
"-"; optind++; }
10173 { configName=
"Doxyfile"; }
10177 layoutName=
getArg(argc,argv,optind);
10179 { layoutName=
"DoxygenLayout.xml"; }
10182 debugLabel=
getArg(argc,argv,optind);
10185 err(
"option \"-d\" is missing debug specifier.\n");
10193 err(
"option \"-d\" has unknown debug specifier: \"%s\".\n",debugLabel);
10205 formatName=
getArg(argc,argv,optind);
10208 err(
"option \"-e\" is missing format specifier rtf.\n");
10212 if (
qstricmp(formatName,
"rtf")==0)
10214 if (optind+1>=argc)
10216 err(
"option \"-e rtf\" is missing an extensions file name\n");
10228 err(
"option \"-e\" has invalid format specifier.\n");
10233 formatName=
getArg(argc,argv,optind);
10236 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
10240 if (
qstricmp(formatName,
"rtf")==0)
10242 if (optind+1>=argc)
10244 err(
"option \"-w rtf\" is missing a style sheet file name\n");
10256 else if (
qstricmp(formatName,
"html")==0)
10263 err(
"error opening or reading configuration file %s!\n",argv[optind+4]);
10279 if (optind+3>=argc)
10281 err(
"option \"-w html\" does not have enough arguments\n");
10289 warn_uncond(
"Output language %s not supported! Using English instead.\n", outputLanguage.
data());
10310 else if (
qstricmp(formatName,
"latex")==0)
10317 err(
"error opening or reading configuration file %s!\n",argv[optind+4]);
10331 if (optind+3>=argc)
10333 err(
"option \"-w latex\" does not have enough arguments\n");
10341 warn_uncond(
"Output language %s not supported! Using English instead.\n", outputLanguage.
data());
10364 err(
"Illegal format specifier \"%s\": should be one of rtf, html or latex\n",formatName);
10378 if (
qstrcmp(&argv[optind][2],
"help")==0)
10383 else if (
qstrcmp(&argv[optind][2],
"version")==0)
10391 err(
"Unknown option \"-%s\"\n",&argv[optind][1]);
10397 setvbuf(
stdout,NULL,_IONBF,0);
10401 msg(
"Warning: this option activates output generation via Django like template files. " 10402 "This option is scheduled for doxygen 2.0, is currently incomplete and highly experimental! " 10403 "Only use if you are a doxygen developer\n");
10412 err(
"Unknown option \"-%c\"\n",argv[optind][1]);
10438 QFileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
10441 if (configFileInfo1.exists())
10443 configName=
"Doxyfile";
10445 else if (configFileInfo2.
exists())
10447 configName=
"doxyfile";
10451 err(
"Doxyfile not found and no input file specified!\n");
10461 configName=argv[optind];
10465 err(
"configuration file %s not found!\n",argv[optind]);
10474 err(
"could not open or read configuration file %s!\n",configName);
10509 warn_uncond(
"Output language %s not supported! Using English instead.\n",
10510 outputLanguage.
data());
10513 char *s=includePath.first();
10518 s=includePath.next();
10539 char *mapping = extMaps.
first();
10544 if ((i=mapStr.
find(
'='))!=-1)
10550 err(
"Failed to map file extension '%s' to unsupported language '%s'.\n" 10551 "Check the EXTENSION_MAPPING setting in the config file.\n",
10556 msg(
"Adding custom extension mapping: .%s will be treated as language %s\n",
10560 mapping = extMaps.
next();
10566 s=expandAsDefinedList.
first();
10573 s=expandAsDefinedList.
next();
10581 Doxygen::spaces.
resize(tabSize+1);
10582 int sp;
for (sp=0;sp<tabSize;sp++) Doxygen::spaces.at(sp)=
' ';
10583 Doxygen::spaces.
at(tabSize)=
'\0';
10590 msg(
"Cleaning up...\n");
10591 if (!Doxygen::entryDBFileName.isEmpty())
10593 thisDir.
remove(Doxygen::entryDBFileName);
10595 if (!Doxygen::objDBFileName.isEmpty())
10597 thisDir.
remove(Doxygen::objDBFileName);
10607 if (generateTagFile.
isEmpty())
return;
10612 err(
"cannot open tag file %s for writing\n",
10613 generateTagFile.
data()
10618 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>" <<
endl;
10619 tagFile <<
"<tagfile>" <<
endl;
10636 for ( ; (cd=cli.current()) ; ++
cli )
10643 for ( ; (nd=nli.current()) ; ++nli )
10650 for (gli.toFirst();(gd=gli.current());++gli)
10657 for (pdi.toFirst();(pd=pdi.current());++pdi)
10661 if (Doxygen::mainPage) Doxygen::mainPage->
writeTagFile(tagFile);
10682 tagFile <<
"</tagfile>" <<
endl;
10690 msg(
"Exiting...\n");
10691 if (!Doxygen::entryDBFileName.isEmpty())
10693 thisDir.
remove(Doxygen::entryDBFileName);
10695 if (!Doxygen::objDBFileName.isEmpty())
10697 thisDir.
remove(Doxygen::objDBFileName);
10703 const char *formatDirOption,
10704 const char *defaultDirName)
10710 formatDirName = baseDirName + defaultDirName;
10712 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
10714 formatDirName.
prepend(baseDirName+
'/');
10716 QDir formatDir(formatDirName);
10717 if (!formatDir.
exists() && !formatDir.
mkdir(formatDirName))
10719 err(
"Could not create output directory %s\n", formatDirName.
data());
10723 return formatDirName;
10748 excludeNameDict.setAutoDelete(
TRUE);
10751 g_s.
begin(
"Searching for include files...\n");
10753 char *s=includePathList.
first();
10764 s=includePathList.
next();
10768 g_s.
begin(
"Searching for example files...\n");
10770 s=examplePathList.
first();
10777 s=examplePathList.
next();
10781 g_s.
begin(
"Searching for images...\n");
10783 s=imagePathList.
first();
10789 s=imagePathList.
next();
10793 g_s.
begin(
"Searching for dot files...\n");
10795 s=dotFileList.
first();
10801 s=dotFileList.
next();
10805 g_s.
begin(
"Searching for msc files...\n");
10807 s=mscFileList.
first();
10813 s=mscFileList.
next();
10817 g_s.
begin(
"Searching for dia files...\n");
10819 s=diaFileList.
first();
10825 s=diaFileList.
next();
10829 g_s.
begin(
"Searching for files to exclude\n");
10831 s=excludeList.
first();
10835 0,0,&excludeNameDict,
10838 s=excludeList.
next();
10846 g_s.
begin(
"Searching INPUT for files to process...\n");
10847 QDict<void> *killDict =
new QDict<void>(10007);
10850 s=inputList.first();
10858 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
10862 Doxygen::inputNameList,
10863 Doxygen::inputNameDict,
10873 s=inputList.next();
10889 if (outputDirectory.
isEmpty())
10899 if (!dir.
mkdir(outputDirectory))
10901 err(
"tag OUTPUT_DIRECTORY: Output directory `%s' does not " 10902 "exist and cannot be created\n",outputDirectory.
data());
10908 msg(
"Notice: Output directory `%s' does not exist. " 10909 "I have created it for you.\n", outputDirectory.
data());
10911 dir.
cd(outputDirectory);
10920 Doxygen::symbolStorage =
new Store;
10924 if (cacheSize<0) cacheSize=0;
10925 if (cacheSize>9) cacheSize=9;
10926 uint lookupSize = 65536 << cacheSize;
10935 Doxygen::objDBFileName.
sprintf(
"doxygen_objdb_%d.tmp",pid);
10936 Doxygen::objDBFileName.
prepend(outputDirectory+
"/");
10937 Doxygen::entryDBFileName.
sprintf(
"doxygen_entrydb_%d.tmp",pid);
10938 Doxygen::entryDBFileName.
prepend(outputDirectory+
"/");
10940 if (Doxygen::symbolStorage->
open(Doxygen::objDBFileName)==-1)
10942 err(
"Failed to open temporary file %s\n",Doxygen::objDBFileName.
data());
10959 if (generateDocbook)
10997 newFontPath+=curFontPath;
11015 bool defaultLayoutUsed =
FALSE;
11016 if (layoutFileName.
isEmpty())
11018 layoutFileName =
"DoxygenLayout.xml";
11019 defaultLayoutUsed =
TRUE;
11022 QFile layoutFile(layoutFileName);
11025 msg(
"Parsing layout file %s...\n",layoutFileName.
data());
11030 else if (!defaultLayoutUsed)
11032 warn_uncond(
"failed to open layout file '%s' for reading!\n",layoutFileName.
data());
11041 if (generateHtml) exclPatterns.append(htmlOutput);
11042 if (generateDocbook) exclPatterns.append(docbookOutput);
11043 if (generateXml) exclPatterns.append(xmlOutput);
11044 if (generateLatex) exclPatterns.append(latexOutput);
11045 if (generateRtf) exclPatterns.append(rtfOutput);
11046 if (generateMan) exclPatterns.append(manOutput);
11062 g_storage->
setName(Doxygen::entryDBFileName);
11065 err(
"Failed to create temporary storage file %s\n",
11066 Doxygen::entryDBFileName.
data());
11072 msg(
"Reading and parsing tag files\n");
11075 char *s=tagFileList.
first();
11080 s=tagFileList.
next();
11094 g_storage->
close();
11105 err(
"Failed to open temporary storage file %s for reading",
11106 Doxygen::entryDBFileName.
data());
11114 g_s.
begin(
"Building group list...\n");
11119 g_s.
begin(
"Building directory list...\n");
11124 g_s.
begin(
"Building namespace list...\n");
11129 g_s.
begin(
"Building file list...\n");
11134 g_s.
begin(
"Building class list...\n");
11138 g_s.
begin(
"Associating documentation with classes...\n");
11145 g_s.
begin(
"Computing nesting relations for classes...\n");
11154 Doxygen::lookupCache->
clear();
11158 g_s.
begin(
"Building example list...\n");
11162 g_s.
begin(
"Searching for enumerations...\n");
11170 g_s.
begin(
"Searching for documented typedefs...\n");
11174 g_s.
begin(
"Searching for members imported via using declarations...\n");
11181 g_s.
begin(
"Searching for included using directives...\n");
11185 g_s.
begin(
"Searching for documented variables...\n");
11189 g_s.
begin(
"Building interface member list...\n");
11192 g_s.
begin(
"Building member list...\n");
11196 g_s.
begin(
"Searching for friends...\n");
11200 g_s.
begin(
"Searching for documented defines...\n");
11204 g_s.
begin(
"Computing class inheritance relations...\n");
11209 g_s.
begin(
"Computing class usage relations...\n");
11215 g_s.
begin(
"Searching for tag less structs...\n");
11220 g_s.
begin(
"Flushing cached template relations that have become invalid...\n");
11224 g_s.
begin(
"Creating members for template instances...\n");
11228 g_s.
begin(
"Computing class relations...\n");
11239 g_s.
begin(
"Add enum values to enums...\n");
11244 g_s.
begin(
"Searching for member function documentation...\n");
11252 g_s.
begin(
"Building page list...\n");
11256 g_s.
begin(
"Search for main page...\n");
11261 g_s.
begin(
"Computing page relations...\n");
11266 g_s.
begin(
"Determining the scope of groups...\n");
11271 Doxygen::memberNameSDict->
sort();
11272 Doxygen::functionNameSDict->
sort();
11273 Doxygen::hiddenClasses->
sort();
11274 Doxygen::classSDict->
sort();
11277 msg(
"Freeing entry tree\n");
11279 g_storage->
close();
11284 thisDir.
remove(Doxygen::entryDBFileName);
11286 g_s.
begin(
"Determining which enums are documented\n");
11290 g_s.
begin(
"Computing member relations...\n");
11295 g_s.
begin(
"Building full member lists recursively...\n");
11299 g_s.
begin(
"Adding members to member groups.\n");
11305 g_s.
begin(
"Distributing member group documentation.\n");
11310 g_s.
begin(
"Computing member references...\n");
11316 g_s.
begin(
"Inheriting documentation...\n");
11323 g_s.
begin(
"Generating disk names...\n");
11327 g_s.
begin(
"Adding source references...\n");
11331 g_s.
begin(
"Adding xrefitems...\n");
11336 g_s.
begin(
"Sorting member lists...\n");
11342 g_s.
begin(
"Computing dependencies between directories...\n");
11350 g_s.
begin(
"Generating citations page...\n");
11354 g_s.
begin(
"Counting data structures...\n");
11358 g_s.
begin(
"Resolving user defined references...\n");
11362 g_s.
begin(
"Finding anchors and sections in the documentation...\n");
11366 g_s.
begin(
"Transferring function references...\n");
11370 g_s.
begin(
"Combining using relations...\n");
11374 g_s.
begin(
"Adding members to index pages...\n");
11411 bool generateEclipseHelp =
Config_getBool(
"GENERATE_ECLIPSEHELP");
11417 if (generateQhp) Doxygen::indexList->
addIndex(
new Qhp);
11443 err(
"USE_HTAGS is YES but htags(1) failed. \n");
11445 err(
"htags(1) ended normally but failed to load the filemap. \n");
11456 g_s.
begin(
"Generating style sheet...\n");
11462 static bool serverBasedSearch =
Config_getBool(
"SERVER_BASED_SEARCH");
11464 g_s.
begin(
"Generating search indices...\n");
11473 if (generateHtml && searchEngine)
11476 QDir searchDir(searchDirName);
11477 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName))
11479 err(
"Could not create search results directory '%s' $PWD='%s'\n",
11484 if (!serverBasedSearch)
11491 g_s.
begin(
"Generating example documentation...\n");
11497 g_s.
begin(
"Generating file sources...\n");
11502 g_s.
begin(
"Generating file documentation...\n");
11506 g_s.
begin(
"Generating page documentation...\n");
11510 g_s.
begin(
"Generating group documentation...\n");
11514 g_s.
begin(
"Generating class documentation...\n");
11518 g_s.
begin(
"Generating namespace index...\n");
11524 g_s.
begin(
"Generating graph info page...\n");
11529 g_s.
begin(
"Generating directory documentation...\n");
11533 if (Doxygen::formulaList->
count()>0 && generateHtml
11536 g_s.
begin(
"Generating bitmaps for formulas in HTML...\n");
11543 Doxygen::groupSDict->
sort();
11546 for (gli.toFirst();(gd=gli.current());++gli)
11552 if (g_outputList->
count()>0)
11557 g_s.
begin(
"finalizing index lists...\n");
11561 g_s.
begin(
"writing tag file...\n");
11577 g_s.
begin(
"Generating XML output...\n");
11585 g_s.
begin(
"Generating SQLITE3 output...\n");
11592 g_s.
begin(
"Generating Docbook output...\n");
11599 g_s.
begin(
"Generating AutoGen DEF output...\n");
11605 g_s.
begin(
"Generating Perl module output...\n");
11609 if (generateHtml && searchEngine && serverBasedSearch)
11611 g_s.
begin(
"Generating search index\n");
11621 if (searchDataFile.
isEmpty())
11623 searchDataFile=
"searchdata.xml";
11629 Doxygen::searchIndex->
write(searchDataFile);
11638 g_s.
begin(
"Combining RTF output...\n");
11641 err(
"An error occurred during post-processing the RTF files!\n");
11667 if (generateHtml &&
11671 g_s.
begin(
"Running html help compiler...\n");
11677 err(
"failed to run html help compiler on index.hhp\n");
11683 if ( generateHtml &&
11687 g_s.
begin(
"Running qhelpgenerator...\n");
11697 err(
"failed to run qhelpgenerator on index.qhp\n");
11705 msg(
"lookup cache used %d/%d hits=%d misses=%d\n",
11706 Doxygen::lookupCache->
count(),
11707 Doxygen::lookupCache->
size(),
11708 Doxygen::lookupCache->hits(),
11709 Doxygen::lookupCache->misses());
11713 msg(
"Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is %d at the cost of higher memory usage.\n",cacheParam);
11718 msg(
"Total elapsed time: %.3f seconds\n(of which %.3f seconds waiting for external tools to finish)\n",
11719 ((
double)Doxygen::runningTime.
elapsed())/1000.0,
11726 msg(
"finished...\n");
11737 Doxygen::symbolStorage->
close();
11739 thisDir.
remove(Doxygen::objDBFileName);
11740 Config::deleteInstance();
bool callGraph
do we need to draw the call graph?
static QDict< RefList > * xrefLists
static bool markdownSupport
Traverses directory structures and contents in a platform-independent way.
CompoundType compoundType() const
static void findGroupScope(EntryNav *rootNav)
static QString cleanDirPath(const QString &dirPath)
static CiteDict * citeDict
void addMembersToTemplateInstance(ClassDef *cd, const char *templSpec)
static GroupSDict * groupSDict
static MemberNameSDict * functionNameSDict
static SDict< DirRelation > dirRelations
QCString includeName
include name (3 arg of \class)
static void addVariable(EntryNav *rootNav, int isFuncPtr=-1)
bool portable_isAbsolutePath(const char *fileName)
void portable_sysTimerStop()
void preprocessFile(const char *fileName, BufStr &input, BufStr &output)
bool isDocsForDefinition() const
static void expandAliases()
ParserInterface * getParser(const char *extension)
static void transferFunctionReferences()
void begin(const char *name)
void setRelatedAlso(ClassDef *cd)
static QStrList includePathList
void writeTagFile(FTextStream &)
FileDef * getFileDef() const
void endFile(OutputList &ol, bool skipNavIndex, bool skipEndContents, const QCString &navPath)
EntryNav * parent() const
static ClassDef::CompoundType convertToCompoundType(int section, uint64 specifier)
virtual void startTranslationUnit(const char *fileName)=0
static const uint64 Published
static void addSourceReferences()
void setDefinition(const char *d)
void insertEnumField(MemberDef *md)
This class represents an function or template argument list.
void generateOutputViaTemplate()
bool isTypedefValCached() const
QCString stripWhiteSpace() const
bool isLinkableInProject() const
int readFileOrDirectory(const char *s, FileNameList *fnList, FileNameDict *fnDict, StringDict *exclDict, QStrList *patList, QStrList *exclPatList, StringList *resultList, StringDict *resultDict, bool recursive, bool errorIfNotExist, QDict< void > *killDict, QDict< void > *paths)
static QCString aliasName
void setFromAnonymousMember(MemberDef *m)
void setEnumBaseType(const QCString &type)
void setReimplements(MemberDef *md)
MemberDef * reimplements() const
bool matchArguments2(Definition *srcScope, FileDef *srcFileScope, ArgumentList *srcAl, Definition *dstScope, FileDef *dstFileScope, ArgumentList *dstAl, bool checkCV)
uint64 spec
class/member specifiers
static bool gatherDefines
void insertMember(MemberDef *md)
void combineDeclarationAndDefinition(MemberDef *mdec, MemberDef *mdef)
static void generateGroupDocs()
static void writeStyleSheetFile(QFile &f)
static void createTemplateInstanceMembers()
BaseClassList * subClasses() const
void addDirToGroups(Entry *root, DirDef *dd)
bool readInputFile(const char *fileName, BufStr &inBuf, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
bool openOutputFile(const char *outFile, QFile &f)
void setFromAnonymousScope(bool b)
void inSort(const char *key, const T *d)
void setName(const char *name)
static constexpr double g
static PageSDict * exampleSDict
virtual bool remove(const QString &fileName, bool acceptAbsPath=TRUE)
static void writeFooterFile(QFile &f)
void initFileMemberIndices()
static void mergeCategories()
void setTagInfo(TagInfo *i)
static void computeMemberReferences()
The QRegExp class provides pattern matching using regular expressions or wildcards.
void startFile(OutputList &ol, const char *name, const char *manName, const char *title, HighlightedItem hli, bool additionalIndices, const char *altSidebarName)
void addFileMemberNameToIndex(MemberDef *md)
void addUsedByClass(ClassDef *cd, const char *accessName, Protection prot)
static void buildExampleList(EntryNav *rootNav)
void msg(const char *fmt,...)
static void writeExtensionsFile(QFile &file)
static const uint64 Mutable
static void writeHeaderFile(QFile &f, const char *cssname)
void writeTagFile(FTextStream &)
static void writeExternalSearchPage()
static bool scopeIsTemplate(Definition *d)
static FileNameDict * includeNameDict
void setBodyDef(FileDef *fd)
static void sortMemberLists()
static ClassSDict * hiddenClasses
int contains(char c, bool cs=TRUE) const
void insertReimplementedBy(MemberDef *md)
void append(const type *d)
static void parseFiles(Entry *root, EntryNav *rootNav)
parse the list of input files
void mergeArguments(ArgumentList *srcAl, ArgumentList *dstAl, bool forceNameOverwrite)
static void organizeSubGroupsFiltered(EntryNav *rootNav, bool additional)
virtual void setPath(const QString &path)
const char * portable_getenv(const char *variable)
bool generateSourceFile() const
static void writeStyleSheetFile(QFile &f)
void addMemberToGroups(Entry *root, MemberDef *md)
Abstract interface for programming language parsers.
int guessSection(const char *name)
virtual void setName(const char *name)
Protection protection() const
QCString read
property read accessor
QList< ListItemInfo > * xrefListItems() const
static void buildFileList(EntryNav *rootNav)
static QCString htmlFileExtension
static void writeTabData()
Additional initialization after indices have been created.
bool generateDoc(const char *fileName, int startLine, Definition *ctx, MemberDef *md, const QCString &docStr, bool indexWords, bool isExample, const char *exampleName=0, bool singleLine=FALSE, bool linkFromIndex=FALSE)
static const uint64 ForwardDecl
bool isForwardDeclared() const
static Store * symbolStorage
Python Language parser using state-based lexical scanning.
double portable_getSysElapsedTime()
QCString inbodyDocumentation() const
void setLanguage(SrcLangExt lang)
void addClassMemberNameToIndex(MemberDef *md)
static void buildClassList(EntryNav *rootNav)
ArgumentList * templateArguments() const
static FormulaDict * formulaDict
static const uint64 Exception
const char * bitfieldString() const
virtual void addInnerCompound(Definition *d)
void setPageScope(Definition *d)
FileDef * getBodyDef() const
QCString listName() const
void setArtificial(bool b)
Tcl language parser using state-based lexical scanning.
QCString argListToString(ArgumentList *al, bool useCanonicalType, bool showDefVals)
void setTemplateSpecialization(bool b)
static void printFlags(void)
MemberNameInfoSDict * memberNameInfoSDict() const
int briefLine
line number at which the brief desc. was found
void addNamespaceToGroups(Entry *root, NamespaceDef *nd)
int open(const char *, int)
Opens a file descriptor.
virtual void setOuterScope(Definition *d)
void setTemplateBaseClassNames(QDict< int > *templateNames)
void writeTagFile(FTextStream &t)
void readFormulaRepository()
static DotManager * instance()
void findSectionsInDocumentation()
C-like language parser using state-based lexical scanning.
const QCString & name() const
void enableCallGraph(bool e)
QCString stripAnonymousNamespaceScope(const QCString &s)
bool isLinkableInProject() const
NamespaceSDict * getUsedNamespaces() const
static void resolveUserReferences()
int docLine
line number at which the documentation was found
static FileNameList * inputNameList
static void transferFunctionDocumentation()
void findSectionsInDocumentation()
void registerDefaultParser(ParserInterface *parser)
static LayoutDocManager & instance()
ArgumentList * argList
member arguments as a list
static OutputList * g_outputList
static constexpr double fs
static FormulaDict * formulaNameDict
void addSearchDir(const char *dir)
bool leftScopeMatch(const QCString &scope, const QCString &name)
MemberList * enumFieldList() const
bool isLinkableInProject() const
static bool preProcessFileInplace(const char *path, const char *name)
static void buildVarList(EntryNav *rootNav)
void setMemberGroupId(int id)
const std::string instance
static void dumpSymbol(FTextStream &t, Definition *d)
void writeSource(OutputList &ol, bool sameTu, QStrList &filesInSameTu)
int initLines
define/variable initializer lines to show
void distributeMemberGroupDocumentation()
static void flushCachedTemplateRelations()
Store implementation based on a file. Writing is linear, after that the file is re-opened for reading...
void parseSource(bool sameTu, QStrList &filesInSameTu)
bool copyFile(const QCString &src, const QCString &dest)
static QCString className
void checkConfiguration()
void setNamespace(NamespaceDef *nd)
#define Config_getList(val)
void enableCallerGraph(bool e)
static FileNameDict * inputNameDict
static int subpageNestingLevel
static void findDirDocumentation(EntryNav *rootNav)
QCString left(uint len) const
static Definition * findScopeFromQualifiedName(Definition *startScope, const QCString &n, FileDef *fileScope, TagInfo *tagInfo)
bool stripPrefix(const char *prefix)
The QString class provides an abstraction of Unicode text and the classic C null-terminated char arra...
void registerParser(const char *name, ParserInterface *parser)
static const char * getArg(int argc, char **argv, int &optind)
static void parseFile(ParserInterface *parser, Entry *root, EntryNav *rootNav, FileDef *fd, const char *fn, bool sameTu, QStrList &filesInSameTu)
static bool suppressDocWarnings
ClassDef * insertTemplateInstance(const QCString &fileName, int startLine, int startColumn, const QCString &templSpec, bool &freshInstance)
void setGroupScope(Definition *d)
void setPrototype(bool p)
virtual bool isReference() const
QCString getOverloadDocs()
bool protectionLevelVisible(Protection prot)
bool addClass(const ClassDef *def)
Simplified and optimized version of QTextStream.
static void resolveClassNestingRelations()
int find(char c, int index=0, bool cs=TRUE) const
NamespaceSDict * getUsedNamespaces() const
void setGroupTitle(const char *newtitle)
void setClassName(const char *name)
void setReadAccessor(const char *r)
void findSectionsInDocumentation()
static void stopDoxygen(int)
void findSectionsInDocumentation()
static bool findTemplateInstanceRelation(Entry *root, Definition *context, ClassDef *templateClass, const QCString &templSpec, QDict< int > *templateNames, bool isArtificial)
static void combineUsingRelations()
virtual QCString getOutputFileBase() const =0
const char * groupTitle() const
virtual void finishTranslationUnit()=0
void warn_undoc(const char *file, int line, const char *fmt,...)
void getAllIncludeFilesRecursively(QStrList &incFiles) const
#define RECURSE_ENTRYTREE(func, var)
bool hasCallerGraph() const
GroupList * partOfGroups() const
void append(const char *key, const T *d)
Fortran language parser using state-based lexical scanning.
void mergeCategory(ClassDef *category)
bool isObjCProperty() const
static FileNameDict * exampleNameDict
bool hidden
does this represent an entity that is hidden from the output
void setInheritsDocsFrom(MemberDef *md)
void resetCCodeParserState()
virtual QString absPath() const
TagInfo * tagInfo() const
void parse(QTextStream &t, const char *fileName)
int findRev(char c, int index=-1, bool cs=TRUE) const
void cleanUpPreprocessor()
static void copyLatexStyleSheet()
bool isBaseClass(ClassDef *bcd, bool followInstances, int level=0)
void removeDoxFont(const char *dir)
virtual void setInbodyDocumentation(const char *d, const char *docFile, int docLine)
int mGrpId
member group id
ClassSDict * getClassSDict()
QCString removeAnonymousScopes(const QCString &s)
void addMembersToMemberGroup()
void setExplicitExternal(bool b)
static void generateExampleDocs()
static int computeIdealCacheParam(uint v)
void writeDoxFont(const char *dir)
void initDefaultExtensionMapping()
static QDict< EntryNav > g_classEntries(1009)
void setFileName(const char *name)
static StringDict aliasDict
MemberSDict * getReferencesMembers() const
QCString getDefFileName() const
QListIterator< Argument > ArgumentListIterator
void writeMemberList(OutputList &ol)
QList< ArgumentList > * tArgLists
template argument declarations
static void inheritDocumentation()
static QDict< void > inputPaths
static void buildTypedefList(EntryNav *rootNav)
int startColumn
start column of entry in the source
void portable_sysTimerStart()
ClassDef * getClass(const char *n)
const QList< EntryNav > * children() const
void invalidateTypedefValCache()
QCString displayName(bool=TRUE) const
void adjustConfiguration()
const char * memberName() const
void setAutoDelete(bool val)
static const uint64 Explicit
static const uint64 Optional
static bool insideMainPage
static bool parseSourcesNeeded
#define Config_getEnum(val)
QString absFilePath() const
bool hasCallGraph() const
void writeDocumentation(OutputList &ol)
static void transferRelatedFunctionDocumentation()
void mergeMemberSpecifiers(uint64 s)
bool exists(std::string path)
#define Config_getInt(val)
FileDef * getFileDef() const
decltype(auto) constexpr size(T &&obj)
ADL-aware version of std::size.
static NamespaceSDict * namespaceSDict
static void copyExtraFiles(const QCString &filesOption, const QCString &outputOption)
void distributeMemberGroupDocumentation()
QCString substituteTemplateArgumentsInString(const QCString &name, ArgumentList *formalArgs, ArgumentList *actualArgs)
The QTime class provides clock time functions.
static NamespaceDef * globalScope
bool rightScopeMatch(const QCString &scope, const QCString &name)
static const uint64 Inline
static void buildNamespaceList(EntryNav *rootNav)
void computeDirDependencies()
static ParserManager * parserManager
void setBitfields(const char *s)
QCString stripTemplateSpecifiersFromScope(const QCString &fullName, bool parentOnly, QCString *pLastScopeStripped)
ClassDef * templateMaster() const
virtual DefType definitionType() const =0
void addNamespaceMemberNameToIndex(MemberDef *md)
QCString showFileDefMatches(const FileNameDict *fnDict, const char *n)
Specifier virtualness(int count=0) const
void writeDocumentation(OutputList &ol)
static const uint64 Strong
This class contains the information about the argument of a function or template. ...
const char * typeString() const
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
static void deleteAllCodecs()
static void readTagFile(Entry *root, const char *tl)
static SrcLangExt language
static StringDict tagDestinationDict
static void writeHeaderFile(QFile &f)
void setDefinitionTemplateParameterLists(QList< ArgumentList > *lists)
void makeImplementationDetail()
static void findMainPage(EntryNav *rootNav)
void distributeClassGroupRelations()
MemberSDict * getReferencedByMembers() const
bool findAndRemoveWord(QCString &s, const QCString &word)
const char * data() const
void copyArgumentNames(MemberDef *bmd)
virtual bool mkdir(const QString &dirName, bool acceptAbsPath=TRUE) const
virtual QCString trMainPage()=0
virtual bool needsPreprocessing(const QCString &extension)=0
static SearchIndexIntf * searchIndex
static void addSTLClasses(EntryNav *rootNav)
stat(const char *n, double el)
void insert(const QCString &key, ClassDef *cd)
static QCString funcTempList
void setClassSpecifier(uint64 spec)
Q_EXPORT uint qstrlen(const char *str)
static FormulaList * formulaList
static void findDefineDocumentation(EntryNav *rootNav)
static void findInheritedTemplateInstances()
static void addMembersToMemberGroup()
QCString includeFile
include file (2 arg of \class, must be unique)
void insertMember(MemberDef *)
bool subGrouping
automatically group class members?
static void findIncludedUsingDirectives()
const QCString & name() const
static QCString getQhpFileName()
static void computeClassRelations()
void readConfiguration(int argc, char **argv)
bool callerGraph
do we need to draw the caller graph?
void addMembersToMemberGroup()
static bool isRecursiveBaseClass(const QCString &scope, const QCString &name)
int qstricmp(const char *str1, const char *str2)
static void findEnumDocumentation(EntryNav *rootNav)
QList< Grouping > * groups
list of groups this entry belongs to
FileDef * fileDef() const
QGString initializer
initial value (for variables)
void combineUsingRelations()
void inSort(const type *d)
QCString inbodyFile
file in which the body doc was found
QCString inbodyFile() const
static void processTagLessClasses(ClassDef *rootCd, ClassDef *cd, ClassDef *tagParentCd, const QCString &prefix, int count)
static void findSectionsInDocumentation()
void createJavascriptSearchIndex()
QCString brief
brief description (doc block)
int endBodyLine
line number where the definition ends
QString dirPath(bool absPath=FALSE) const
void changeSection(int section)
void addMembersToMemberGroup()
ArgumentList * typeConstr
where clause (C#) for type constraints
static ClassDef * findClassWithinClassContext(Definition *context, ClassDef *cd, const QCString &name)
static void findMember(EntryNav *rootNav, QCString funcDecl, bool overloaded, bool isFunc)
static void writeSearchData(const char *dir)
static void findDocumentedEnumValues()
virtual void setFilter(int filterSpec)
bool isLinkableInProject() const
void setDocumentation(const char *d, const char *docFile, int docLine, bool stripWhiteSpace=TRUE)
The Store is a file based memory manager.
void setInbodyDocumentation(const char *d, const char *inbodyFile, int inbodyLine)
void insertNamespace(NamespaceDef *nd)
static ParserInterface * getParserForFile(const char *fn)
void generateDirDocs(OutputList &ol)
void setMemberClass(ClassDef *cd)
QCString briefDescription(bool abbr=FALSE) const
static MemberDef * addVariableToClass(EntryNav *rootNav, ClassDef *cd, MemberType mtype, const QCString &name, bool fromAnnScope, MemberDef *fromAnnMemb, Protection prot, Relationship related)
bool hasDocumentation() const
void setFile(const QString &file)
static QCString extractClassName(EntryNav *rootNav)
static void escapeAliases()
static void freeMappers()
ClassDef * relatedAlso() const
QCString right(uint len) const
QCString name
the name of the base class
void finializeSearchIndexer()
static const uint64 Interface
SrcLangExt getLanguage() const
void setProtection(Protection p)
Specifier virt
virtualness
static QCString objDBFileName
void writeTagFile(FTextStream &)
static const uint64 Alias
static void addListReferences()
static const uint64 Protocol
static int setFlag(const char *label)
static DirSDict * directories
static QString currentDirPath()
static void findUsedClassesForClass(EntryNav *rootNav, Definition *context, ClassDef *masterCd, ClassDef *instanceCd, bool isArtificial, ArgumentList *actualArgs=0, QDict< int > *templateNames=0)
virtual void write(const char *file)=0
FileDef * findFileDef(const FileNameDict *fnDict, const char *n, bool &ambig)
QList< SectionInfo > * anchors
list of anchors defined in this entry
static void findClassEntries(EntryNav *rootNav)
static void distributeMemberGroupDocumentation()
FindBaseClassRelation_Mode
bool setTranslator(const char *langName)
ArgumentList * getTemplateArgumentsFromName(const QCString &name, const QList< ArgumentList > *tArgLists)
void writeStyleInfo(int part)
void setTemplateArguments(ArgumentList *al)
QCString exception
throw specification
static void print(DebugMask mask, int prio, const char *fmt,...)
static QDict< DefinitionIntf > * symbolMap
int startLine
start line of entry in the source
static void generateFileDocs()
void stringToArgumentList(const char *argsString, ArgumentList *al, QCString *extraTypeChars)
QCString & prepend(const char *s)
virtual Definition * findInnerCompound(const char *name)
const char * currentKey() const
static QCString substituteTemplatesInString(const QList< ArgumentList > &srcTempArgLists, const QList< ArgumentList > &dstTempArgLists, ArgumentList *funcTempArgList, const QCString &src)
static void addSTLMember(EntryNav *rootNav, const char *type, const char *name)
void setTagLessReference(ClassDef *cd)
void disable(OutputGenerator::OutputType o)
QCString args
member argument string
static void generateFileSources()
void makePartOfGroup(GroupDef *gd)
QCString write
property write accessor
static SectionDict * sectionDict
void setProtection(Protection p)
void setFileName(const QCString &fn)
void addGroupToGroups(Entry *root, GroupDef *subGroup)
void addMembersToMemberGroup()
static bool generatingXmlOutput
bool updateLanguageMapping(const QCString &extension, const QCString &language)
Manages programming language parsers.
A bunch of utility functions.
static PageSDict * pageSDict
static void writeFooterFile(QFile &f)
QDict< int > * getTemplateBaseClassNames() const
void addSectionsToDefinition(QList< SectionInfo > *anchorList)
static QDict< void > g_pathsVisited(1009)
void writeDocumentation(OutputList &ol)
const char * data() const
bool isEmbeddedInOuterScope() const
static void generateXRefPages()
static void addInterfaceOrServiceToServiceOrSingleton(EntryNav *const rootNav, ClassDef *const cd, QCString const &rname)
char portable_pathListSeparator()
static void buildClassDocList(EntryNav *rootNav)
void addImageFile(const char *name)
static void copyStyleSheet()
#define Config_getString(val)
void setAccessorType(ClassDef *cd, const char *t)
static Definition * buildScopeFromQualifiedName(const QCString name, int level, SrcLangExt lang, TagInfo *tagInfo)
static StringList g_inputFiles
Protection protection
class protection
static QIntDict< MemberGroupInfo > memGrpInfoDict
void enable(OutputGenerator::OutputType o)
#define Config_getBool(val)
void setReference(const char *r)
void parseTagFile(Entry *root, const char *fullName)
const char * definition() const
ClassDef * getClassDef() const
static void generateClassList(ClassSDict &classSDict)
static bool isVarWithConstructor(EntryNav *rootNav)
static void usage(const char *name)
static void writeSearchPage()
static void writeTagFile()
QCString briefFile() const
static void addIncludeFile(ClassDef *cd, FileDef *ifd, Entry *root)
static FileNameDict * diaFileNameDict
void generatePage() const
void countDataStructures()
void printNavTree(EntryNav *rootNav, int indent)
uint64 getMemberSpecifiers() const
virtual QCString qualifiedName() const
QCString & insert(uint index, const char *s)
void distributeMemberGroupDocumentation()
void warn(const char *file, int line, const char *fmt,...)
static QCString getQchFileName()
void addUsingDeclaration(Definition *def)
ClassDef * getCachedTypedefVal() const
Protection prot
inheritance type
QCString groupname
name of the group
friend class IteratorDict
static void clearFlag(const char *label)
void err(const char *fmt,...)
static void buildPageList(EntryNav *rootNav)
static QDict< Definition > * clangUsrMap
static bool g_dumpSymbolMap
static FileNameDict * imageNameDict
void insertClass(ClassDef *cd)
static bool findClassRelation(EntryNav *rootNav, Definition *context, ClassDef *cd, BaseInfo *bi, QDict< int > *templateNames, FindBaseClassRelation_Mode mode, bool isArtificial)
MemberType memberType() const
static void computeMemberRelations()
virtual bool cd(const QString &dirName, bool acceptAbsPath=TRUE)
static void computeTemplateClassRelations()
static void addRelatedPage(EntryNav *rootNav)
QCString absFilePath() const
static FileStorage * g_storage
virtual QCString briefDescription(bool abbreviate=FALSE) const
void extractNamespaceName(const QCString &scopeName, QCString &className, QCString &namespaceName, bool allowEmptyClass)
QCString qualifiedNameWithTemplateParameters(QList< ArgumentList > *actualParams=0, int *actualParamIndex=0) const
void addUsedClass(ClassDef *cd, const char *accessName, Protection prot)
void addClassToGroups(Entry *root, ClassDef *cd)
void setCompoundType(CompoundType t)
static void exitDoxygen()
const char * declaration() const
void setTypeConstraints(ArgumentList *al)
static void generateTreeViewImages()
QCString removeRedundantWhiteSpace(const QCString &s)
int extractClassNameFromType(const QCString &type, int &pos, QCString &name, QCString &templSpec, SrcLangExt lang)
Buffer used to store strings.
static bool g_successfulRun
QCString mid(uint index, uint len=0xffffffff) const
static void substituteTemplatesInArgList(const QList< ArgumentList > &srcTempArgLists, const QList< ArgumentList > &dstTempArgLists, ArgumentList *src, ArgumentList *dst, ArgumentList *funcTempArgs=0)
static void buildGroupList(EntryNav *rootNav)
bool loadEntry(FileStorage *storage)
RelatesType relatesType
how relates is handled
static void organizeSubGroups(EntryNav *rootNav)
int match(const QCString &str, int index=0, int *len=0, bool indexIsStart=TRUE) const
The QFile class is an I/O device that operates on files.
virtual QCString trPage(bool first_capital, bool singular)=0
void setDocumentedEnumValues(bool value)
void setAutoDelete(bool enable)
void setDocsForDefinition(bool b)
static QCString resolveSymlink(QCString path)
void distributeMemberGroupDocumentation()
QCString & sprintf(const char *format,...)
static void findMemberDocumentation(EntryNav *rootNav)
bool checkIfTypedef(Definition *scope, FileDef *fileScope, const char *n)
static void buildInterfaceAndServiceList(EntryNav *const rootNav)
void setMemberSpecifiers(uint64 s)
void writeDefaultLayoutFile(const char *fileName)
static void findFriends()
static void filterMemberDocumentation(EntryNav *rootNav)
static void generateClassDocs()
static void buildListOfUsingDecls(EntryNav *rootNav)
void findSectionsInDocumentation()
void writeTagFile(FTextStream &)
QCString inbodyDocs
documentation inside the body of a function
void insertBaseClass(ClassDef *, const char *name, Protection p, Specifier s, const char *t=0)
The QTextStream class provides basic functions for reading and writing text using a QIODevice...
QCString doc
documentation block (partly parsed)
void initNamespaceMemberIndices()
QCString & setNum(short n)
void parseFuncDecl(const QCString &decl, bool objC, QCString &cl, QCString &t, QCString &n, QCString &a, QCString &ftl, QCString &exc)
bool isLinkableInProject() const
static void addClassToContext(EntryNav *rootNav)
void addFile(const FileDef *def)
static void addMemberDocs(EntryNav *rootNav, MemberDef *md, const char *funcDecl, ArgumentList *al, bool over_load, NamespaceSDict *nl=0)
Specifier virt
virtualness of the entry
static STLInfo g_stlinfo[]
void portable_setenv(const char *name, const char *value)
bool addNamespace(const NamespaceDef *def)
static ClassDef * findClassDefinition(FileDef *fd, NamespaceDef *nd, const char *scopeName)
virtual Definition * getOuterScope() const
void setRefItems(const QList< ListItemInfo > *sli)
QCString documentation() const
int getEndBodyLine() const
GroupDef * getGroupDef() const
void writeGraphInfo(OutputList &ol)
QCString getOutputFileBase() const
static void findMainPageTagFiles(EntryNav *rootNav)
void insertClass(ClassDef *cd)
void startTitle(OutputList &ol, const char *fileName, Definition *def)
static void addSTLIterator(EntryNav *classEntryNav, const char *name)
void insertSubClass(ClassDef *, Protection p, Specifier s, const char *t=0)
ArgumentList * argumentList() const
static void findUsingDeclarations(EntryNav *rootNav)
static void findTagLessClasses(ClassDef *cd)
static FileNameDict * dotFileNameDict
virtual Definition * findInnerCompound(const char *name)
NamespaceDef * getResolvedNamespace(const char *name)
void addCodeOnlyMappings()
static GenericsSDict * genericsDict
void setMaxInitLines(int lines)
QCString qualifiedName() const
int getStartBodyLine() const
static void findUsingDirectives(EntryNav *rootNav)
static QCString entryDBFileName
void addInnerCompound(Definition *d)
int initializerLines() const
static MemberNameSDict * memberNameSDict
QCString tempArgListToString(ArgumentList *al, SrcLangExt lang)
bool isSubClass(ClassDef *bcd, int level=0)
void addSourceReferences(MemberDef *d)
QDict< ClassDef > * getTemplateInstances() const
const QCString & type() const
bool artificial
Artificially introduced item.
GroupDocType groupDocType
static NamespaceDef * findUsedNamespace(NamespaceSDict *unl, const QCString &name)
static void buildGroupListFiltered(EntryNav *rootNav, bool additional, bool includeExternal)
static void findUsedTemplateInstances()
QCString resolveTypeDef(Definition *context, const QCString &qualifiedName, Definition **typedefContext)
int getMemberGroupId() const
static int findEndOfTemplate(const QCString &s, int startPos)
static void addMembersToIndex()
QCString expandAlias(const QCString &aliasName, const QCString &aliasValue)
void addSourceReferencedBy(MemberDef *d)
void writeDocumentation(OutputList &ol)
const QCString & initializer() const
void warn_simple(const char *file, int line, const char *text)
static void buildCompleteMemberLists()
void setId(const char *name)
void add(const OutputGenerator *)
void insertMember(MemberDef *md)
const char * excpString() const
static const uint64 Category
A model of a page symbol.
static bool isClassSection(EntryNav *rootNav)
virtual const QFileInfoList * entryInfoList(int filterSpec=DefaultFilter, int sortSpec=DefaultSort) const
static bool g_useOutputTemplate
void setEnumScope(MemberDef *md, bool livesInsideEnum=FALSE)
void setInitializer(const char *i)
void line(double t, double *p, double &x, double &y, double &z)
Cite database access class.
static void writeStyleSheetFile(QFile &f)
void replaceNamespaceAliases(QCString &scope, int i)
static QCString createOutputDirectory(const QCString &baseDirName, const char *formatDirOption, const char *defaultDirName)
virtual void setBriefDescription(const char *b, const char *briefFile, int briefLine)
static StringDict namespaceAliasDict
QCString convertNameToFile(const char *name, bool allowDots, bool allowUnderscore)
void initClassMemberIndices()
bool fill(char c, int len=-1)
QCString fileName
file this entry was extracted from
static void findBaseClassesForClass(EntryNav *rootNav, Definition *context, ClassDef *masterCd, ClassDef *instanceCd, FindBaseClassRelation_Mode mode, bool isArtificial, ArgumentList *actualArgs=0, QDict< int > *templateNames=0)
bool explicitExternal
explicitly defined as external?
static const char * latexStyleExtension
static MemberDef * addVariableToFile(EntryNav *rootNav, MemberType mtype, const QCString &scope, const QCString &name, bool fromAnnScope, MemberDef *fromAnnMemb)
static QDict< FileDef > g_usingDeclarations(1009)
ClassDef * find(const QCString &key)
QCString bitfields
member's bit fields
QCString inside
name of the class in which documents are found
static bool findGlobalMember(EntryNav *rootNav, const QCString &namespaceName, const char *type, const char *name, const char *tempArg, const char *, const char *decl)
void setEnumClassScope(ClassDef *cd)
QCString trailingReturnType
void writeDocumentation(OutputList &ol)
static QDict< int > * getTemplateArgumentsInName(ArgumentList *templateArguments, const QCString &name)
void invalidateCachedArgumentTypes()
NamespaceDef * getNamespaceDef() const
void addRefItem(const QList< ListItemInfo > *sli, const char *key, const char *prefix, const char *name, const char *title, const char *args, Definition *scope)
Translator * theTranslator
static void computeVhdlComponentRelations()
void setTypeConstraints(ArgumentList *al)
virtual QCString trDir(bool first_capital, bool singular)=0
QCString docFile
file in which the documentation was found
void insertUsedFile(FileDef *fd)
virtual void setDocumentation(const char *d, const char *docFile, int docLine, bool stripWhiteSpace=TRUE)
bool checkExtension(const char *fName, const char *ext)
static void generatePageDocs()
void endTitle(OutputList &ol, const char *fileName, const char *name)
void writeIndexHierarchy(OutputList &ol)
MethodTypes mtype
signal, slot, (dcop) method, or property?
virtual void parseInput(const char *fileName, const char *fileBuf, Entry *root, bool sameTranslationUnit, QStrList &filesInSameTranslationUnit)=0
static void generateConfigFile(const char *configFile, bool shortList, bool updateOnly=FALSE)
QCString normalizeNonTemplateArgumentsInString(const QCString &name, Definition *context, const ArgumentList *formalArgs)
void reclassifyMember(MemberDef *md, MemberType t)
void setIncludeFile(FileDef *fd, const char *incName, bool local, bool force)
static ClassDef * createTagLessInstance(ClassDef *rootCd, ClassDef *templ, const QCString &fieldName)
void getTemplateParameterLists(QList< ArgumentList > &lists) const
int readDir(QFileInfo *fi, FileNameList *fnList, FileNameDict *fnDict, StringDict *exclDict, QStrList *patList, QStrList *exclPatList, StringList *resultList, StringDict *resultDict, bool errorIfNotExist, bool recursive, QDict< void > *killDict, QDict< void > *paths)
void writeJavascriptSearchIndex()
int getScopeFragment(const QCString &s, int p, int *l)
void addUsingDeclaration(Definition *def)
static QCache< LookupInfo > * lookupCache
static QDict< void > expandAsDefinedDict
QCString relates
related class (doc block)
static const uint64 Struct
void addUsingDirective(NamespaceDef *nd)
void addIncludedUsingDirectives()
ClassSDict * getClassSDict() const
static void findObjCMethodDefinitions(EntryNav *rootNav)
void makeTemplateArgument(bool b=TRUE)
void setWriteAccessor(const char *w)
const char * argsString() const
bool isLinkableInProject() const
void insertUsedFile(FileDef *)
static bool isFlagSet(DebugMask mask)
static QDict< int > * htmlDirMap
void addSourceRef(int line, Definition *d, MemberDef *md)
static bool outputToWizard
The QFileInfo class provides system-independent file information.
static int findFunctionPtr(const QCString &type, int lang, int *pLength=0)
QCString getOutputFileBase() const
void createNavigationIndex(EntryNav *rootNav, FileStorage *storage, FileDef *fd)
void setFileDef(FileDef *fd)
void docify(const char *s)
unsigned long long uint64
bool remove(const char *k)
static const uint64 Union
Q_EXPORT int qstrcmp(const char *str1, const char *str2)
VHDL parser using state-based lexical scanning.
SrcLangExt lang
programming language in which this entry was found
static void findUsingDeclImports(EntryNav *rootNav)
static const uint64 Service
T * find(const char *key)
static bool isSpecialization(const QList< ArgumentList > &srcTempArgLists, const QList< ArgumentList > &dstTempArgLists)
virtual QCString documentation() const
bool patternMatch(const QFileInfo &fi, const QStrList *patList)
int inbodyLine
line number at which the body doc was found
ClassDef * getResolvedClass(Definition *scope, FileDef *fileScope, const char *n, MemberDef **pTypeDef, QCString *pTemplSpec, bool mayBeUnlinkable, bool mayBeHidden, QCString *pResolvedType)
void setSubGrouping(bool enabled)
void setNamespace(NamespaceDef *nd)
static void generateNamespaceDocs()
static void checkPageRelations()
static void addPageToContext(PageDef *pd, EntryNav *rootNav)
static void findDEV(const MemberNameSDict &mnsd)
static void findEnums(EntryNav *rootNav)
void setAutoDelete(bool enable)
static ClassSDict * classSDict
QCString getOutputFileBase() const
QCString mergeScopes(const QCString &leftScope, const QCString &rightScope)
void addIndex(IndexIntf *intf)
QCString stripFromIncludePath(const QCString &path)
void addTaggedInnerClass(ClassDef *cd)
void addTypeConstraints()
static PageDef * mainPage
static void addEnumValuesToEnums(EntryNav *rootNav)
void setBriefDescription(const char *b, const char *briefFile, int briefLine)
void addChild(EntryNav *)
std::string nl(std::size_t i=1)
bool hasGroupTitle() const
const QCString & docName() const
A list of index interfaces.
static void buildFunctionList(EntryNav *rootNav)
MemberList * getMemberList(MemberListType lt)
static void dumpSymbolMap()
void setFileDef(FileDef *fd)
virtual bool exists() const
const char * qPrint(const char *s)
QList< BaseInfo > * extends
list of base classes
static IndexList * indexList
static void addMethodToClass(EntryNav *rootNav, ClassDef *cd, const QCString &rname, bool isFriend)
Portable versions of functions that are platform dependent.
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
static void flushUnresolvedRelations()
static bool setCurrent(const QString &path)
void setPerlModDoxyfile(const QCString &qs)
static FileNameDict * mscFileNameDict
static QDict< void > g_compoundKeywordDict(7)
void combineUsingRelations()
QTextStream & endl(QTextStream &s)
static void computePageRelations(EntryNav *rootNav)
BaseClassList * baseClasses() const
GroupDef * getGroupDef() const
ArgumentList * templateArguments() const
int minClassDistance(const ClassDef *cd, const ClassDef *bcd, int level)
static const uint64 Singleton
int section
entry type (see Sections);
void warn_uncond(const char *fmt,...)
int portable_system(const char *command, const char *args, bool commandHasConsole)
int bodyLine
line number of the definition in the source
QCString briefFile
file in which the brief desc. was found
QList< ListItemInfo > * sli
special lists (test/todo/bug/deprecated/..) this entry is in
virtual void setHidden(bool b)
void writeDocumentationForInnerClasses(OutputList &ol)
void setBodySegment(int bls, int ble)