13#include "RConfigure.h" 
   43   class THtmlThreadInfo {
 
   45      THtmlThreadInfo(
THtml* html, 
bool force): fHtml(html), fForce(force) {}
 
   46      Bool_t GetForce()
 const {
return fForce;}
 
   47      THtml* GetHtml()
 const {
return fHtml;}
 
   74   if (fHtml && html && html != fHtml) {
 
   75      Error(
"SetOwner()", 
"Object already owned by an THtml instance!");
 
   76      fHtml->HelperDeleted(
this);
 
  106   out_modulename = 
"USER";
 
  107   if (!cl) 
return false;
 
  117   TString inputdir = GetOwner()->GetInputPath();
 
  136   while (out_modulename[0] == 
'.')
 
  137      out_modulename.
Remove(0, 1);
 
  139   while (out_modulename[0] == 
'/')
 
  140      out_modulename.
Remove(0, 1);
 
  141   while (out_modulename.
EndsWith(
"/"))
 
  144   if (!out_modulename[0])
 
  145      out_modulename = trailingInclude;
 
  147   if (!out_modulename[0])
 
  148      out_modulename = trailingInclude;
 
  158         pos = out_modulename.
Index(
"/inc/");
 
  160         out_modulename.
Remove(pos);
 
  163   while (out_modulename.
EndsWith(
"/"))
 
  167   if (out_modulename == 
"MATH/GENVECTOR")
 
  168      out_modulename = 
"MATHCORE";
 
  169   else if (out_modulename == 
"MATH/MATRIX")
 
  170      out_modulename = 
"SMATRIX";
 
  171   else if (!out_modulename.
Length()) {
 
  172      const char* cname= cl->
GetName();
 
  173      if (strstr(cname, 
"::SMatrix<") || strstr(cname, 
"::SVector<"))
 
  174         out_modulename = 
"SMATRIX";
 
  175      else if (strstr(cname, 
"::TArrayProxy<") || strstr(cname, 
"::TClaArrayProxy<")
 
  176               || strstr(cname, 
"::TImpProxy<") || strstr(cname, 
"::TClaImpProxy<"))
 
  177         out_modulename = 
"TREEPLAYER";
 
  185            out_modulename.
Remove(0,3);
 
  186         pos = out_modulename.
Index(
'.');
 
  190         if (!out_modulename.
Length()) {
 
  191            out_modulename = 
"USER";
 
  207   THtml* owner = GetOwner();
 
  240   while (clname.
Tokenize(token, from, 
"::") ) {
 
  264   return GetFileName(cl, 
true, out_filename, out_fsys, fse);
 
  281   return GetFileName(cl, 
false, out_filename, out_fsys, fse);
 
  290   static const char* delim[] = {
"/", 
"\\\\"};
 
  291   for (
int i = 0; i < 2; ++i) {
 
  292      const char* 
d = delim[i];
 
  318         filename = filesysname;
 
  319         if (!filename.
EndsWith(filesysname)) {
 
  326         if (fse) *fse = fsentry;
 
  353   NormalizePath(clfile);
 
  355   out_filename = clfile;
 
  362      if (clfile == 
"include/TMathBase.h") {
 
  363         clfile = 
"math/mathcore/inc/TMath.h";
 
  364         out_filename = clfile;
 
  373            longestMatch = inclDir.
Length();
 
  375      if (longestMatch != 
kNPOS) {
 
  376         clfile.
Remove(0, longestMatch);
 
  380         GetOwner()->GetPathDefinition().GetFileNameFromInclude(asincl, clfile);
 
  381         out_filename = clfile;
 
  384         filesysname = MatchFileSysName(out_filename, fse);
 
  385         if (filesysname[0]) {
 
  386            clfile = out_filename;
 
  392      int templateLevel = 0;
 
  395      for (; start >= 0 && (templateLevel || filesysname[start] != 
':'); --start) {
 
  396         if (filesysname[start] == 
'>')
 
  398         else if (filesysname[start] == 
'<') {
 
  404      filesysname = filesysname(start + 1, end - start - 1);
 
  408         filesysname += 
".cxx";
 
  409      out_filename = filesysname;
 
  410      filesysname = MatchFileSysName(out_filename, fse);
 
  411      if (filesysname[0]) {
 
  412         clfile = out_filename;
 
  416   if (!decl && !clfile.
Length()) {
 
  421      if (GetFileName(cl, 
true, filesysname, declSysFileName)) {
 
  425            filesysname.
Remove(posExt);
 
  426         filesysname += 
".cxx";
 
  427         out_filename = filesysname;
 
  428         filesysname = MatchFileSysName(out_filename, fse);
 
  429         if (filesysname[0]) {
 
  430            clfile = out_filename;
 
  435   if (clfile.
Length() && !decl) {
 
  441      static const char* vetoClasses[] = {
"math/mathcore/", 
"math/mathmore/", 
"math/genvector/",
 
  442                                          "math/minuit2/", 
"math/smatrix/"};
 
  443      for (
unsigned int i = 0; i < 
sizeof(vetoClasses) / 
sizeof(
char*); ++i) {
 
  444         if (clfile.
Contains(vetoClasses[i])) {
 
  447            if (strcmp(cl->
GetName(), 
"TComplex")
 
  448                && strcmp(cl->
GetName(), 
"TMath")
 
  449                && strncmp(cl->
GetName(), 
"TKDTree", 7)
 
  450                && strcmp(cl->
GetName(), 
"TVirtualFitter")
 
  451                && strncmp(cl->
GetName(), 
"TRandom", 7)) {
 
  469      SplitClassIntoDirFile(out_filename, possiblePath, possibleFileName);
 
  472      if (possibleFileName.
Length()) {
 
  474            possibleFileName += 
".h";
 
  476            possibleFileName += 
".cxx";
 
  478      if (possiblePath.
Length())
 
  481         possiblePath += 
"inc/";
 
  483         possiblePath += 
"src/";
 
  484      out_filename = possiblePath + 
"/" + possibleFileName;
 
  490   if (possiblePath.
Length())
 
  491      ExpandSearchPath(possiblePath);
 
  492   else possiblePath=
".";
 
  496      NormalizePath(out_fsys);
 
  515   if (!GetDocDir(module, moduledoc))
 
  524   while (macropath.
Tokenize(macrodirpart, pos, 
":")) {
 
  525      out_dir += moduledoc + 
"/" + macrodirpart + 
":";
 
  545      doc_dir = 
"$ROOTSYS";
 
  551      doc_dir += module + 
"/";
 
  552   doc_dir += GetOwner()->GetPathInfo().fDocPath;
 
  574   if (!cl || !GetOwner()) 
return false;
 
  581   bool includePathMatches = 
false;
 
  587         if (out_dir[0] == 
'/' || out_dir[0] == 
'\\')
 
  589         includePathMatches = 
true;
 
  592   if (!includePathMatches) {
 
  601      if (posInc == 
kNPOS) 
return true;
 
  602      hdr.
Remove(0, posInc + 5);
 
  606   return (out_dir.
Length());
 
  622   if (!included) 
return false;
 
  624   out_fsname = included;
 
  627   const TList* bucket = GetOwner()->GetLocalFiles()->
GetEntries().GetListForObject(incBase);
 
  628   if (!bucket) 
return false;
 
  632   TIter iEntry(bucket);
 
  635      if (incBase != entry->
GetName()) 
continue;
 
  638      for (
int i = arrSubDirs->
GetEntries() - 1; parent && i >= 0; --i) {
 
  640         if (!subdir.
Length() || subdir == 
".")
 
  642         if (subdir == parent->
GetName())
 
  663   if (
gDebug > 0 || GetLevel() < 2)
 
  664      Info(
"Recurse", 
"scanning %s...", path);
 
  668   const char* direntry = 0;
 
  670      if (!direntry[0] || direntry[0] == 
'.' || regexp.
Match(direntry)) 
continue;
 
  671      TString entryPath(dir + direntry);
 
  688            subdir->
Recurse(db, entryPath);
 
  690            int delen = strlen(direntry);
 
  692            if (strcmp(direntry + delen - 4, 
".cxx")
 
  693                && strcmp(direntry + delen - 2, 
".h")
 
  694                && strcmp(direntry + delen - 4, 
".hxx"))
 
  717         Warning(
"Fill", 
"Cannot read InputPath \"%s\"!", dir.
Data());
 
  725            Warning(
"Fill", 
"InputPath \"%s\" already present as \"%s\"!", dir.
Data(), prevroot->
GetName());
 
  736         Warning(
"Fill", 
"Cannot read InputPath \"%s\"!", dir.
Data());
 
  999// This is the description block.                             //
 
 1003<p>The environment variable Root.Html.Description
 
 1004(see: <a href="http://root.cern.ch/root/html/TEnv.html">TEnv</a>) contains
 
 1005the delimiter string (default value: <tt>//_________________</tt>). It means
 
 1006that you can also write your class description block like this:</p>
 
 1008   //_____________________________________________________________
 
 1009   // A description of the class starts with the line above, and
 
 1010   // will take place here !
 
 1013<p>Note that <b><i>everything</i></b> until the first non-commented line is considered
 
 1014as a valid class description block.</p>
 
 1016<h4><a name="syntax:classidx">III.2 Class index</a></h4>
 
 1018<p>All classes to be documented will have an entry in the ClassIndex.html,
 
 1019showing their name with a link to their documentation page and a miniature
 
 1020description. This discription for e.g. the class MyClass has to be given
 
 1021in MyClass's header as a comment right after ClassDef(MyClass, n).</p>
 
 1023<h4><a name="syntax:meth">III.3 Method documentation</a></h4>
 
 1024<p>A member function description block starts immediately after '{'
 
 1025and looks like this:</p>
 
 1027   void TWorld::HelloWorldFunc(string *text)
 
 1029      // This is an example of description for the
 
 1030      // TWorld member function
 
 1032      helloWorld.Print( text );
 
 1035Like in a class description block, <b><i>everything</i></b> until the first
 
 1036non-commented line is considered as a valid member function
 
 1039If the rootrc variable <tt>Root.Html.DescriptionStyle</tt> is set to
 
 1040<tt>Doc++</tt> THtml will also look for method documentation in front of
 
 1041the function implementation. This feature is not recommended; source code
 
 1042making use of this does not comply to the ROOT documentation standards, which
 
 1043means future versions of THtml might not support it anymore.
 
 1045<h4><a name="syntax:datamem">III.4 Data member documentation</a></h4>
 
 1047<p>Data members are documented by putting a C++ comment behind their
 
 1048declaration in the header file, e.g.</p>
 
 1050   int fIAmADataMember; // this is a data member
 
 1054<h3><a name="directive">IV. Documentation directives</a></h3>
 
 1055<em>NOTE that THtml does not yet support nested directives
 
 1056(i.e. latex inside html etc)!</em>
 
 1058<h4><a name="directive:html">IV.1 <tt>BEGIN<!-- -->_HTML</tt> <tt>END<!-- -->_HTML</tt>: include 'raw' HTML</a></h4>
 
 1060<p>You can insert pure html code into your documentation comments. During the
 
 1061generation of the documentation, this code will be inserted as is
 
 1062into the html file.</p>
 
 1063<p>Pure html code must be surrounded by the keywords
 
 1064<tt>BEGIN<!-- -->_HTML</tt> and <tt>END<!-- -->_HTML</tt>, where the
 
 1066An example of pure html code is this class description you are reading right now.
 
 1068<a href="http://root.cern.ch/root/html/TDocHtmlDirective.html">TDocHtmlDirective</a>
 
 1069object to process this directive.</p>
 
 1071<h4><a name="directive:macro">IV.2 <tt>BEGIN<!-- -->_MACRO</tt> <tt>END<!-- -->_MACRO</tt>: include a picture generated by a macro</a></h4>
 
 1073<p>THtml can create images from scripts. You can either call an external
 
 1074script by surrounding it by "begin_macro"/"end_macro", or include an unnamed
 
 1075macro within these keywords. The macro should return a pointer to an object;
 
 1076this object will then be saved as a GIF file.</p>
 
 1077<p>Objects deriving from
 
 1078<a href="http://root.cern.ch/root/html/TGObject.html">TGObject</a> (GUI elements)
 
 1079will need to run in graphics mode (non-batch). You must specify this as a parameter:
 
 1080"Begin_macro(GUI)...".
 
 1081To create a second tab that displays the source of the macro you can specify
 
 1082the argument "Begin_macro(source)...".
 
 1083Of course you can combine them,
 
 1084e.g. as "Begin_macro(source,gui)...".
 
 1086<a href="http://root.cern.ch/root/html/TDocMacroDirective.html">TDocMacroDirective</a>
 
 1087object to process this directive.</p>
 
 1088<p>This is an example:</p> END_HTML
 
 1091  TCanvas* macro_example_canvas = new TCanvas("macro_example_canvas", "", 150, 150);
 
 1092  macro_example_canvas->SetBorderSize(0);
 
 1093  macro_example_canvas->SetFillStyle(1001);
 
 1094  macro_example_canvas->SetFillColor(kWhite);
 
 1095  macro_example_canvas->cd();
 
 1096  TArc* macro_example_arc = new TArc(0.5,0.32,0.11,180,360);
 
 1097  macro_example_arc->Draw();
 
 1098  TEllipse* macro_example_ellipsis = new TEllipse(0.42,0.58,0.014,0.014,0,360,0);
 
 1099  macro_example_ellipsis->SetFillStyle(0);
 
 1100  macro_example_ellipsis->Draw();
 
 1101  macro_example_ellipsis = new TEllipse(0.58,0.58,0.014,0.014,0,360,0);
 
 1102  macro_example_ellipsis->SetFillStyle(0);
 
 1103  macro_example_ellipsis->Draw();
 
 1104  macro_example_ellipsis = new TEllipse(0.50,0.48,0.22,0.32,0,360,0);
 
 1105  macro_example_ellipsis->SetFillStyle(0);
 
 1106  macro_example_ellipsis->Draw();
 
 1107  TLine* macro_example_line = new TLine(0.48,0.53,0.52,0.41);
 
 1108  macro_example_line->Draw();
 
 1109  return macro_example_canvas;
 
 1114<h4><a name="directive:latex">IV.3 <tt>BEGIN<!-- -->_LATEX</tt> <tt>END<!-- -->_LATEX</tt>: include a latex picture</a></h4>
 
 1116<p>You can specify <a href="http://root.cern.ch/root/html/TLatex.html">TLatex</a>
 
 1117style text and let THtml convert it into an image by surrounding it by "Begin_Latex", "End_Latex".
 
 1118You can have multiple lines, and e.g. align each line at the '=' sign by passing
 
 1119the argument <tt>separator='='</tt>. You can also specify how to align these parts;
 
 1120if you want the part left of the separator to be right aligned, and the right part
 
 1121to be left aligned, you could specify <tt>align='rl'</tt>.
 
 1122THtml uses a <a href="http://root.cern.ch/root/html/TDocLatexDirective.html">TDocLatexDirective</a>
 
 1123object to process the directive.
 
 1124This is an example output with arguments <tt>separator='=', align='rl'</tt>:</p>
 
 1125END_HTML BEGIN_LATEX(separator='=', align='rl')#kappa(x)^{2}=sin(x)^{x}
 
 1130<h3><a name="index">V. Product and module index</a></h3>
 
 1132<p><a href="#THtml:MakeIndex">THtml::MakeIndex()</a> will generate index files for classes
 
 1133and types, all modules, and the product which you can set by
 
 1134<a href="#THtml:SetProductName">THtml::SetProductName()</a>.
 
 1135THtml will make use of external documentation in the module and product index,
 
 1136either by linking it or by including it.
 
 1137The files for modules are searched based on the source file directory of the
 
 1138module's classes.</p>
 
 1140<p>A filename starting with "index." will be included in the index page;
 
 1141all other files will be linked.
 
 1142Only files ending on <tt>.html</tt> or <tt>.txt</tt> will be taken into account;
 
 1143the text files will first be run through
 
 1144<a href="#THtml:Convert">THtml::Convert()</a>.
 
 1145You can see an example <a href="http://root.cern.ch/root/html/HIST_Index.html">here</a>;
 
 1146the part between "Index of HIST classes" and "Jump to" is created by parsing
 
 1147the module's doc directory.</p>
 
 1149<h3><a name="aux">VI. Auxiliary files: style sheet, JavaScript, help page</a></h3>
 
 1151<p>The documentation pages share a common set of javascript and CSS files. They
 
 1152are generated automatically when running <a href="#THtml:MakeAll">MakeAll()</a>;
 
 1153they can be generated on
 
 1154demand by calling <a href="#THtml:CreateAuxiliaryFiles">CreateAuxiliaryFiles()</a>.</p>
 
 1157<h3><a name="charts">VII. Class Charts</a></h3>
 
 1158THtml can generate a number of graphical representations for a class, which
 
 1159are displayed as a tabbed set of imaged ontop of the class description.
 
 1160It can show the inheritance, inherited and hidden members, directly and
 
 1161indirectly included files, and library dependencies.
 
 1163These graphs are generated using the <a href="http://www.graphviz.org/">Graphviz</a>
 
 1164package. You can install it from <a href="http://www.graphviz.org">http://www.graphviz.org</a>.
 
 1165You can either put it into your $PATH, or tell THtml where to find it by calling
 
 1166<a href="#THtml:SetDotDir">SetDotDir()</a>.
 
 1169<h3><a name="confvar">VIII. Configuration variables</a></h3>
 
 1171<p>Here is a list of all configuration variables that are known to THtml.
 
 1172You can set them in your .rootrc file, see
 
 1173<a href="http://root.cern.ch/root/html/TEnv.html">TEnv</a>.</p>
 
 1176  Root.Html.OutputDir    (default: htmldoc)
 
 1177  Root.Html.SourceDir    (default: .:src/:include/)
 
 1178  Root.Html.Author       (default: // Author:) - start tag for authors
 
 1179  Root.Html.LastUpdate   (default: // @(#)) - start tag for last update
 
 1180  Root.Html.Copyright    (default:  * Copyright) - start tag for copyright notice
 
 1181  Root.Html.Description  (default: //____________________ ) - start tag for class descr
 
 1182  Root.Html.HomePage     (default: ) - URL to the user defined home page
 
 1183  Root.Html.Header       (default: ) - location of user defined header
 
 1184  Root.Html.Footer       (default: ) - location of user defined footer
 
 1185  Root.Html.Root         (default: ) - URL of Root's class documentation
 
 1186  Root.Html.SearchEngine (default: ) - link to the search engine
 
 1187  Root.Html.Search       (defualt: ) - link to search by replacing "%s" with user input
 
 1188  Root.Html.ViewCVS      (default: ) - URL of ViewCVS base
 
 1189  Root.Html.XWho         (default: http://consult.cern.ch/xwho/people?) - URL of CERN's xWho
 
 1190  Root.Html.Charset      (default: ISO-8859-1) - HTML character set
 
 1193<h3><a name="how">IX. Behind the scene</a></h3>
 
 1195<p>Internally, THtml is just an API class that sets up the list of known
 
 1196classes, and forwards API invocations to the "work horses".
 
 1197<a href="http://root.cern.ch/root/html/TDocOutput.html">TDocOutput</a>
 
 1198generates the output by letting a
 
 1199<a href="http://root.cern.ch/root/html/TDocParser.html">TDocParser</a>
 
 1200object parse the sources, which in turn invokes objects deriving from
 
 1201<a href="http://root.cern.ch/root/html/TDocDirective.html">TDocDirective</a>
 
 1202to process directives.</p>
 
 1259   if (
gHtml == 
this) {
 
 1277   const char pathDelimiter =
 
 1391   if (lib && strlen(lib)) {
 
 1392      std::map<std::string, TString>::const_iterator iUrl = 
fLinkInfo.
fLibURLs.find(lib);
 
 1410   Info(
"HaveDot", 
"Checking for Graphviz (dot)...");
 
 1416      Info(
"HaveDot", 
"Running: %s", runDot.
Data());
 
 1433   for (
int i = 0; who && i < 3; ++i)
 
 1434      if (who == helpers[i])
 
 1435         helpers[i] = who = 0;
 
 1463                    const char *dirname , 
const char *relpath ,
 
 1464                    Int_t includeOutput ,
 
 1465                    const char* context )
 
 1484   char *cRealFilename =
 
 1487   if (!cRealFilename) {
 
 1488      Error(
"Convert", 
"Can't find file '%s' !", filename);
 
 1492   TString realFilename(cRealFilename);
 
 1493   delete[] cRealFilename;
 
 1497   std::ifstream sourceFile;
 
 1498   sourceFile.open(realFilename, std::ios::in);
 
 1500   if (!sourceFile.good()) {
 
 1501      Error(
"Convert", 
"Can't open file '%s' !", realFilename.
Data());
 
 1507            "Directory '%s' doesn't exist, or it's write protected !", dir);
 
 1518      Warning(
"Convert", 
"Output requested but cannot initialize graphics: GUI  and GL windows not be available");
 
 1519   output.Convert(sourceFile, realFilename, tmp1, title, relpath, includeOutput, context, 
fGClient);
 
 1532   module = 
"(UNKNOWN)";
 
 1550   Info(
"CreateListOfClasses", 
"Initializing - this might take a while...");
 
 1562   if (filter && (!filter[0] || !strcmp(filter, 
"*")))
 
 1567   bool skipROOTClasses = 
false;
 
 1568   std::set<std::string> rootLibs;
 
 1569   TList classesDeclFileNotFound;
 
 1570   TList classesImplFileNotFound;
 
 1573   for (
Int_t i = -1; i < totalNumberOfClasses; i++) {
 
 1576      const char *cname = 0;
 
 1577      if (i < 0) cname = 
"TObject";
 
 1582      if (i >= 0 && !strcmp(cname, 
"TObject")) {
 
 1588      if (strstr(cname, 
"__gnu_cxx::")) 
continue;
 
 1590      if (!strcmp(cname, 
"timespec")) 
continue;
 
 1592      if (!strncmp(cname, 
"tuple<", 6)) 
continue;
 
 1597      if (!classPtr) 
continue;
 
 1599      std::string shortName(
ShortType(cname));
 
 1600      cname = shortName.c_str();
 
 1627               skipROOTClasses = 
true;
 
 1628               Info(
"CreateListOfClasses", 
"Cannot find header file for TObject at %s given the input path %s.",
 
 1630               Info(
"CreateListOfClasses", 
"Assuming documentation is not for ROOT classes, or you need to pass " 
 1631                  "the proper directory to THtml::SetInputDir() so I can find %s.", classPtr->
GetDeclFileName());
 
 1656            if (skipROOTClasses) {
 
 1659                  size_t posSpace = lib.find(
' ');
 
 1660                  if (posSpace != std::string::npos)
 
 1661                     lib.erase(posSpace);
 
 1662                  if (rootLibs.find(lib) == rootLibs.end()) {
 
 1665                     if (sLib.
Index(
'.') == -1) {
 
 1673                        classesDeclFileNotFound.
AddLast(classPtr);
 
 1674                     else rootLibs.insert(lib);
 
 1678                  static const char* rootClassesToIgnore[] =
 
 1679                  { 
"ColorStruct_t", 
"CpuInfo_t", 
"Event_t", 
"FileStat_t", 
"GCValues_t", 
"MemInfo_t",
 
 1680                     "PictureAttributes_t", 
"Point_t", 
"ProcInfo_t", 
"ROOT", 
"ROOT::Fit",
 
 1681                     "Rectangle_t", 
"RedirectHandle_t", 
"Segment_t", 
"SetWindowAttributes_t",
 
 1682                     "SysInfo_t", 
"TCint", 
"UserGroup_t", 
"WindowAttributes_t", 
"timespec", 0};
 
 1683                  static const char* rootClassStemsToIgnore[] =
 
 1684                  { 
"ROOT::Math", 
"TKDTree", 
"TMatrixT", 
"TParameter", 
"vector", 0 };
 
 1685                  static size_t rootClassStemsToIgnoreLen[] = {0, 0, 0, 0, 0};
 
 1686                  static std::set<std::string> setRootClassesToIgnore;
 
 1687                  if (setRootClassesToIgnore.empty()) {
 
 1688                     for (
int ii = 0; rootClassesToIgnore[ii]; ++ii)
 
 1689                        setRootClassesToIgnore.insert(rootClassesToIgnore[ii]);
 
 1690                     for (
int ii = 0; rootClassStemsToIgnore[ii]; ++ii)
 
 1691                        rootClassStemsToIgnoreLen[ii] = strlen(rootClassStemsToIgnore[ii]);
 
 1694                  if (setRootClassesToIgnore.find(cname) == setRootClassesToIgnore.end()) {
 
 1695                     bool matched = 
false;
 
 1696                     for (
int ii = 0; !matched && rootClassStemsToIgnore[ii]; ++ii)
 
 1697                        matched = !strncmp(cname, rootClassStemsToIgnore[ii], rootClassStemsToIgnoreLen[ii]);
 
 1699                        classesDeclFileNotFound.
AddLast(classPtr);
 
 1708                  classesDeclFileNotFound.
AddLast(classPtr);
 
 1719         classesImplFileNotFound.
AddLast(classPtr);
 
 1722      if (!htmlfilename.
Length())
 
 1726         cdi = 
new TClassDocInfo(classPtr, htmlfilename, hdrFS, srcFS, hdr, src);
 
 1740      if (!modulename.
Length() || modulename == 
"USER")
 
 1749         if (parentModuleName.
Length() && parentModuleName != 
".") {
 
 1755               while (parentModuleName.
Tokenize(token, pos, 
"/")) {
 
 1756                  if (!token.
Length() || token == 
".") 
continue;
 
 1779         Info(
"CreateListOfClasses", 
"Adding class %s, module %s (%sselected)",
 
 1786   bool cannotFind = 
false;
 
 1787   if (!classesDeclFileNotFound.
IsEmpty()) {
 
 1788      Warning(
"CreateListOfClasses",
 
 1789         "Cannot find the header for the following classes [reason]:");
 
 1790      TIter iClassesDeclFileNotFound(&classesDeclFileNotFound);
 
 1792      while ((iClass = (
TClass*)iClassesDeclFileNotFound())) {
 
 1797            Warning(
"CreateListOfClasses", 
"   %s [header file is unknown]", iClass->
GetName());
 
 1802      Warning(
"CreateListOfClasses",
 
 1803         "Cannot find the source file for the following classes [reason]:");
 
 1804      TIter iClassesDeclFileNotFound(&classesImplFileNotFound);
 
 1806      while ((iClass = (
TClass*)iClassesDeclFileNotFound())) {
 
 1811            Info(
"CreateListOfClasses", 
"   %s [source file is unknown, add \"ClassImpl(%s)\" to source file if it exists]",
 
 1816      Warning(
"CreateListOfClasses", 
"THtml cannot find all headers and sources. ");
 
 1817      Warning(
"CreateListOfClasses",
 
 1818         "You might need to adjust the input path (currently %s) by calling THtml::SetInputDir()",
 
 1826   while ((dt = (
TDataType*) iTypedef())) {
 
 1827      if (dt->
GetType() != -1) 
continue;
 
 1832            Info(
"CreateListOfClasses", 
"Adding typedef %s to class %s",
 
 1835         bool inNamespace = 
true;
 
 1837         Ssiz_t posTemplate = surroundingNamespace.
Last(
'>');
 
 1838         inNamespace = inNamespace && (posTemplate == 
kNPOS);
 
 1840            Ssiz_t posColumn = surroundingNamespace.
Last(
':');
 
 1841            if (posColumn != 
kNPOS) {
 
 1842               surroundingNamespace.
Remove(posColumn - 1);
 
 1844               inNamespace = inNamespace && (!clSurrounding || 
IsNamespace(clSurrounding));
 
 1849            output.NameSpace2FileName(htmlfilename);
 
 1850            htmlfilename += 
".html";
 
 1875      Warning(
"CreateListOfClasses", 
"Product not set. You should call gHtml->SetProduct(\"MyProductName\");");
 
 1877      if (
GetViewCVS().Contains(
"http://root.cern.ch/"))
 
 1888   Info(
"CreateListOfClasses", 
"Initializing - DONE.");
 
 1898   output.CreateTypeIndex();
 
 1899   output.CreateClassTypeDefs();
 
 1916      Warning(
"CopyFileFromEtcDir", 
"Could not copy %s to %s", inFile.
Data(), outFile.
Data());
 
 1929   output.CreateHierarchy();
 
 1960      if (!candidate) 
continue;
 
 1963         TClass* currentBaseOfCandidate = candidate;
 
 1964         while (currentBaseOfCandidate != cl) {
 
 1966            if (!bases) 
continue;
 
 1973                  currentBaseOfCandidate = clBase;
 
 1977         derived[candidate] = level;
 
 1994   if (!classPtr) 
return;
 
 2006   const char *colon = strchr(cFilename, 
':');
 
 2009      libName = 
TString(cFilename, colon - cFilename);
 
 2019         if (posSpace != 
kNPOS)
 
 2023            libnameBase.
Remove(0, 3);
 
 2027         if (libnameBase.
Length())
 
 2028            libName = libnameBase;
 
 2031   filename = cFilename;
 
 2033   if (!filename.
Length() ||
 
 2035      htmlFileName = 
GetURL(libName);
 
 2037      htmlFileName = 
"./";
 
 2039   if (htmlFileName.
Length()) {
 
 2040      filename = htmlFileName;
 
 2043      output.NameSpace2FileName(className);
 
 2045      filename = className;
 
 2047      filename += 
".html";
 
 2048   } 
else filename.
Remove(0);
 
 2068   if(!name1 || !name1[0]) 
return 0;
 
 2070   if (strstr(name1,
"ROOT::")==name1) {
 
 2072      if (!strncmp(name1 + 6,
"Math", 4))   ret = 
kFALSE;
 
 2120   bool determine = (!cdi); 
 
 2122   if (!determine) determine |=  decl && !filesys && !cdi->
GetDeclFileName()[0];
 
 2124   if (!determine) determine |= !decl && !filesys && !cdi->
GetImplFileName()[0];
 
 2149      if (filesys) out_name = sysname;
 
 2150      else         out_name = 
name;
 
 2174      Long_t sId, sFlags, sModtime;
 
 2178      if (st || !(sFlags & 2)) {
 
 2180            Error(
"GetOutputDir", 
"output directory %s is an existing file",
 
 2220   if (numthreads == 1) {
 
 2233      if (numthreads == -1) {
 
 2236         numthreads = sysinfo.
fCpus;
 
 2242      THtmlThreadInfo hti(
this, force);
 
 2251      while (--numthreads >= 0) {
 
 2254         threads.
Add(thread);
 
 2257      TIter iThread(&threads);
 
 2261         while (wait && (thread = (
TThread*) iThread()))
 
 2268      while ((thread = (
TThread*) iThread()))
 
 2289         Error(
"MakeClass", 
"Unknown class '%s'!", className);
 
 2311   if (!currentClass) {
 
 2314         Error(
"MakeClass", 
"Class '%s' is known, but I cannot find its TClass object!", cdi->
GetName());
 
 2331      what += 
" (sources not found)";
 
 2344   const THtmlThreadInfo* hti = (
const THtmlThreadInfo*)info;
 
 2347   while ((classinfo = hti->GetHtml()->GetNextClass()))
 
 2348      hti->GetHtml()->MakeClass(classinfo, hti->GetForce());
 
 2365   output.CreateTypeIndex();
 
 2366   output.CreateClassTypeDefs();
 
 2367   output.CreateModuleIndex();
 
 2368   output.CreateClassIndex();
 
 2369   output.CreateProductIndex();
 
 2372   output.CreateHierarchy();
 
 2389      Error(
"MakeTree", 
"Unknown class '%s' !", className);
 
 2512   const char* tmplt = strchr(
name, 
'<');
 
 2513   if (!tmplt) 
return name;
 
 2514   tmplt = strrchr(tmplt, 
':');
 
 2515   if (tmplt > 
name && tmplt[-1] == 
':') {
 
R__EXTERN TClassTable * gClassTable
 
void Printf(const char *fmt,...)
 
R__EXTERN const char * gProgName
 
Bool_t R_ISDIR(Int_t mode)
 
R__EXTERN TSystem * gSystem
 
R__EXTERN TVirtualMutex * gGlobalMutex
 
#define R__LOCKGUARD(mutex)
 
Each class (see TClass) has a linked list of its base class(es).
 
TClass * GetClassPointer(Bool_t load=kTRUE)
Get pointer to the base class TClass.
 
const char * GetImplFileName() const
 
Bool_t HaveSource() const
 
const char * GetImplFileSysName() const
 
void SetDeclFileName(const char *name)
 
TModuleDocInfo * GetModule() const
 
void SetImplFileSysName(const char *fsname)
 
virtual const char * GetName() const
Returns name of object.
 
void SetImplFileName(const char *name)
 
void SetModule(TModuleDocInfo *module)
 
void SetSelected(Bool_t sel=kTRUE)
 
const char * GetHtmlFileName() const
 
void SetDeclFileSysName(const char *fsname)
 
Bool_t IsSelected() const
 
const char * GetDeclFileSysName() const
 
void SetHtmlFileName(const char *name)
 
TList & GetListOfTypedefs()
 
const char * GetDeclFileName() const
 
TDictionary * GetClass() const
 
void MakeTree(Bool_t force=kFALSE)
Create an output file with a graphical representation of the class inheritance.
 
void Class2Html(Bool_t force=kFALSE)
Create HTML files for a single class.
 
static char * Next()
Returns next class from sorted class table.
 
TClass instances represent classes, structs and namespaces in the ROOT type system.
 
const char * GetImplFileName() const
 
TList * GetListOfBases()
Return list containing the TBaseClass(es) of a class.
 
ClassInfo_t * GetClassInfo() const
 
Long_t Property() const
Set TObject::fBits and fStreamerType to cache information about the class.
 
const char * GetSharedLibs()
Get the list of shared libraries containing the code for class cls.
 
Bool_t InheritsFrom(const char *cl) const
Return kTRUE if this class inherits from a class with name "classname".
 
const char * GetDeclFileName() const
Return name of the file containing the declaration of this class.
 
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
 
virtual Int_t GetEntries() const
 
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
 
virtual Bool_t IsEmpty() const
 
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
 
Basic data type descriptor (datatype information is obtained from CINT).
 
const char * GetFullTypeName() const
Get full type description of typedef, e,g.: "class TDirectory*".
 
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
 
void Add(ULong64_t hash, Long64_t key, Long64_t value)
Add an (key,value) pair to the table. The key should be unique.
 
Long64_t GetValue(ULong64_t hash, Long64_t key)
Return the value belonging to specified key and hash value.
 
TObject * FindObject(const char *name) const
Find object using its name.
 
void Clear(Option_t *option="")
Remove all objects from the list.
 
void Add(TObject *obj)
Add object to the hash table.
 
TString MatchFileSysName(TString &filename, TFileSysEntry **fse=0) const
Find filename in the list of system files; return the system file name and change filename to the fil...
 
virtual bool GetDeclFileName(const TClass *cl, TString &out_filename, TString &out_fsys, TFileSysEntry **fse=0) const
Determine cl's declaration file name.
 
void NormalizePath(TString &path) const
Remove "/./" and collapse "/subdir/../" to "/".
 
void SplitClassIntoDirFile(const TString &clname, TString &dir, TString &filename) const
Given a class name with a scope, split the class name into directory part and file name: A::B::C beco...
 
virtual bool GetImplFileName(const TClass *cl, TString &out_filename, TString &out_fsys, TFileSysEntry **fse=0) const
Determine cl's implementation file name.
 
virtual bool GetFileName(const TClass *cl, bool decl, TString &out_filename, TString &out_fsys, TFileSysEntry **fse=0) const
Common implementation for GetDeclFileName(), GetImplFileName()
 
void ExpandSearchPath(TString &path) const
Create all permutations of path and THtml's input path: path being PP/ and THtml's input being .
 
const TString & GetIgnore() const
 
THashTable & GetEntries()
 
Int_t GetMaxLevel() const
 
void Fill()
Recursively fill entries by parsing the path specified in GetName(); can be a THtml::GetDirDelimiter(...
 
void Recurse(TFileSysDB *db, const char *path)
Recursively fill entries by parsing the contents of path.
 
const char * GetName() const
Returns name of object.
 
TFileSysDir * GetParent() const
 
virtual void GetFullName(TString &fullname, Bool_t asIncluded) const
 
virtual ~THelperBase()
Helper's destructor.
 
void SetOwner(THtml *html)
Set the THtml object owning this object; if it's already set to a different THtml object than issue a...
 
virtual bool GetModule(TClass *cl, TFileSysEntry *fse, TString &out_modulename) const
Set out_modulename to cl's module name; return true if it's valid.
 
virtual bool GetIncludeAs(TClass *cl, TString &out_include_as) const
Determine the path and filename used in an include statement for the header file of the given class.
 
virtual bool GetFileNameFromInclude(const char *included, TString &out_fsname) const
Set out_fsname to the full pathname corresponding to a file included as "included".
 
virtual bool GetMacroPath(const TString &module, TString &out_dir) const
Determine the path to look for macros (see TDocMacroDirective) for classes from a given module.
 
virtual bool GetDocDir(const TString &module, TString &doc_dir) const
Determine the module's documentation directory.
 
void SetModuleDefinition(const TModuleDefinition &md)
Set the module defining object to be used; can also be a user derived object (a la traits).
 
THtml()
Create a THtml object.
 
virtual void CreateStyleSheet() const
Write the default ROOT style sheet.
 
const TString & GetViewCVS() const
 
DocEntityInfo_t fDocEntityInfo
 
const char * ShortType(const char *name) const
Get short type name, i.e. with default templates removed.
 
void SetPathDefinition(const TPathDefinition &pd)
Set the path defining object to be used; can also be a user derived object (a la traits).
 
virtual TClass * GetClass(const char *name) const
Return pointer to class with name.
 
const TString & GetInputPath() const
 
static Bool_t IsNamespace(const TClass *cl)
Check whether cl is a namespace.
 
void CreateListOfClasses(const char *filter)
Create the list of all known classes.
 
void SetOutputDir(const char *dir)
Set the directory where the HTML pages shuold be written to.
 
const TString & GetProductName() const
 
TVirtualMutex * fMakeClassMutex
 
void SetInputDir(const char *dir)
Set the directory containing the source files.
 
virtual bool GetDeclImplFileName(TClass *cl, bool filesys, bool decl, TString &out_name) const
Combined implementation for GetDeclFileName(), GetImplFileName(): Return declaration / implementation...
 
static void * MakeClassThreaded(void *info)
Entry point of worker threads for multi-threaded MakeAll().
 
void SetImplFileName(TClass *cl, const char *filename)
Explicitly set a impl file name for TClass cl.
 
void AddMacroPath(const char *path)
Add path to the directories to be searched for macro files that are to be executed via the TDocMacroD...
 
void SetDeclFileName(TClass *cl, const char *filename)
Explicitly set a decl file name for TClass cl.
 
void MakeTree(const char *className, Bool_t force=kFALSE)
Make an inheritance tree.
 
Int_t fThreadedClassCount
 
const TModuleDefinition & GetModuleDefinition() const
Return the TModuleDefinition (or derived) object as set by SetModuleDefinition(); create and return a...
 
TFileDefinition * fFileDef
 
void CreateHierarchy()
Create the inheritance hierarchy diagram for all classes.
 
static void LoadAllLibs()
Load all libraries known to ROOT via the rootmap system.
 
Bool_t HaveDot()
Check whether dot is available in $PATH or in the directory set by SetDotPath()
 
virtual void CreateAuxiliaryFiles() const
copy CSS, javascript file, etc to the output dir
 
void SetFileDefinition(const TFileDefinition &fd)
Set the file defining object to be used; can also be a user derived object (a la traits).
 
void MakeAll(Bool_t force=kFALSE, const char *filter="*", int numthreads=1)
Produce documentation for all the classes specified in the filter (by default "*") To process all cla...
 
void SetLocalFiles() const
Fill the files available in the file system below fPathInfo.fInputPath.
 
void GetDerivedClasses(TClass *cl, std::map< TClass *, Int_t > &derived) const
fill derived with all classes inheriting from cl and their inheritance distance to cl
 
void MakeClass(const char *className, Bool_t force=kFALSE)
Make HTML files for a single class.
 
virtual ~THtml()
Default destructor.
 
virtual bool GetDeclFileName(TClass *cl, Bool_t filesys, TString &out_name) const
Return declaration file name; return the full path if filesys is true.
 
TModuleDefinition * fModuleDef
 
void Convert(const char *filename, const char *title, const char *dirname="", const char *relpath="../", Int_t includeOutput=kNoOutput, const char *context="")
It converts a single text file to HTML.
 
void CreateListOfTypes()
Create index of all data types and a page for each typedef-to-class.
 
const PathInfo_t & GetPathInfo() const
 
virtual void CreateJavascript() const
Write the default ROOT style sheet.
 
void SetFoundDot(Bool_t found=kTRUE)
Set whether "dot" (a GraphViz utility) is available.
 
void SetViewCVS(const char *url)
 
OutputStyle_t fOutputStyle
 
virtual const char * GetEtcDir() const
Get the directory containing THtml's auxiliary files ($ROOTSYS/etc/html)
 
const TString & GetMacroPath() const
 
static const char * GetDirDelimiter()
 
virtual void GetHtmlFileName(TClass *classPtr, TString &filename) const
Return real HTML filename.
 
void MakeIndex(const char *filter="*")
Create the index files for the product, modules, all types, etc.
 
TClassDocInfo * GetNextClass()
Return the next class to be generated for MakeClassThreaded.
 
virtual void GetModuleNameForClass(TString &module, TClass *cl) const
Return the module name for a given class.
 
const TString & GetOutputDir(Bool_t createDir=kTRUE) const
Return the output directory as set by SetOutputDir().
 
TVirtualMutex * GetMakeClassMutex() const
 
void HelperDeleted(THelperBase *who)
Inform the THtml object that one of its helper objects was deleted.
 
TPathDefinition * fPathDef
 
virtual bool GetImplFileName(TClass *cl, Bool_t filesys, TString &out_name) const
Return implementation file name.
 
TIter * fThreadedClassIter
 
const TPathDefinition & GetPathDefinition() const
Return the TModuleDefinition (or derived) object as set by SetModuleDefinition(); create and return a...
 
const TFileDefinition & GetFileDefinition() const
Return the TFileDefinition (or derived) object as set by SetFileDefinition(); create and return a TFi...
 
Bool_t CopyFileFromEtcDir(const char *filename) const
Copy a file from $ROOTSYS/etc/html into GetOutputDir()
 
const char * GetURL(const char *lib=0) const
Get the documentation URL for library lib.
 
virtual void Add(TObject *obj)
 
virtual TObject * At(Int_t idx) const
Returns the object at position idx. Returns 0 if idx is out of range.
 
virtual void AddLast(TObject *obj)
Add object at the end of the list.
 
virtual void Clear(Option_t *option="")
Remove all objects from the list.
 
virtual void Sort(Bool_t order=kSortAscending)
Sort linked list.
 
void SetSelected(Bool_t sel=kTRUE)
 
void AddClass(TClassDocInfo *cl)
 
The TNamed class is the base class for all named ROOT classes.
 
virtual const char * GetName() const
Returns name of object.
 
Int_t GetEntries() const
Return the number of objects in array (i.e.
 
Collectable string class.
 
Mother of all ROOT objects.
 
virtual const char * GetName() const
Returns name of object.
 
virtual TObject * Clone(const char *newname="") const
Make a clone of an object using the Streamer facility.
 
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
 
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
 
virtual const char * GetTitle() const
Returns title of object.
 
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
 
Wrapper for PCRE library (Perl Compatible Regular Expressions).
 
Int_t Match(const TString &s, UInt_t start=0)
Runs a match on s against the regex 'this' was created with.
 
Int_t Substitute(TString &s, const TString &replace, const TString &mods="", Int_t start=0, Int_t nMatchMax=10)
Substitute replaces the string s by a new string in which matching patterns are replaced by the repla...
 
static const TString & GetEtcDir()
Get the sysconfig directory in the installation. Static utility function.
 
static const TString & GetLibDir()
Get the library directory in the installation. Static utility function.
 
void ToLower()
Change string to lower-case.
 
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
 
Ssiz_t First(char c) const
Find first occurrence of a character c.
 
const char * Data() const
 
TString & ReplaceAll(const TString &s1, const TString &s2)
 
Ssiz_t Last(char c) const
Find last occurrence of a character c.
 
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
 
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
 
TString & Remove(Ssiz_t pos)
 
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
 
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
 
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
 
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
 
virtual UInt_t LoadAllLibraries()
Load all libraries known to ROOT via the rootmap system.
 
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
 
virtual const char * DirName(const char *pathname)
Return the directory name in pathname.
 
virtual void FreeDirectory(void *dirp)
Free a directory.
 
virtual void * OpenDirectory(const char *name)
Open a directory. Returns 0 if directory does not exist.
 
virtual int CopyFile(const char *from, const char *to, Bool_t overwrite=kFALSE)
Copy a file.
 
virtual char * ConcatFileName(const char *dir, const char *name)
Concatenate a directory and a file name. User must delete returned string.
 
virtual const char * FindFile(const char *search, TString &file, EAccessMode mode=kFileExists)
Find location of file in a search path.
 
virtual int MakeDirectory(const char *name)
Make a directory.
 
virtual Int_t Exec(const char *shellcmd)
Execute a command.
 
virtual int GetSysInfo(SysInfo_t *info) const
Returns static system info, like OS type, CPU type, number of CPUs RAM size, etc into the SysInfo_t s...
 
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
 
int GetPathInfo(const char *path, Long_t *id, Long_t *size, Long_t *flags, Long_t *modtime)
Get info about a file: id, size, flags, modification time.
 
virtual const char * PrependPathName(const char *dir, TString &name)
Concatenate a directory and a file name.
 
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
 
virtual const char * GetDirEntry(void *dirp)
Get a directory entry. Returns 0 if no more entries.
 
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
 
virtual Bool_t IsAbsoluteFileName(const char *dir)
Return true if dir is an absolute pathname.
 
virtual void Sleep(UInt_t milliSec)
Sleep milliSec milli seconds.
 
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
 
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
 
virtual const char * GetSoExt() const
Get the shared library extension.
 
Long_t Join(void **ret=0)
Join this thread.
 
Int_t Run(void *arg=0)
Start the thread.
 
virtual TVirtualMutex * Factory(Bool_t=kFALSE)=0
 
bool IsStdClass(const char *type)
return true if the class belongs to the std namespace
 
std::string ShortType(const char *typeDesc, int mode)
Return the absolute type of typeDesc.
 
static constexpr double s
 
THashList fShortClassNames
 
std::map< std::string, TString > fLibURLs
 
static void output(int code)