doxygen-users Mailing List for Doxygen (Page 574)
                
                Brought to you by:
                
                    dimitri
                    
                
            
            
        
        
        
    You can subscribe to this list here.
| 2001 | Jan | Feb | Mar | Apr (1) | May (118) | Jun (150) | Jul (115) | Aug (75) | Sep (92) | Oct (102) | Nov (139) | Dec (87) | 
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2002 | Jan (131) | Feb (60) | Mar (114) | Apr (83) | May (125) | Jun (82) | Jul (95) | Aug (98) | Sep (109) | Oct (97) | Nov (72) | Dec (70) | 
| 2003 | Jan (117) | Feb (122) | Mar (187) | Apr (114) | May (154) | Jun (131) | Jul (130) | Aug (98) | Sep (121) | Oct (107) | Nov (80) | Dec (54) | 
| 2004 | Jan (78) | Feb (71) | Mar (118) | Apr (56) | May (56) | Jun (64) | Jul (164) | Aug (104) | Sep (101) | Oct (69) | Nov (107) | Dec (98) | 
| 2005 | Jan (75) | Feb (77) | Mar (107) | Apr (114) | May (142) | Jun (106) | Jul (79) | Aug (108) | Sep (115) | Oct (140) | Nov (128) | Dec (63) | 
| 2006 | Jan (86) | Feb (71) | Mar (125) | Apr (55) | May (48) | Jun (143) | Jul (99) | Aug (91) | Sep (93) | Oct (82) | Nov (46) | Dec (45) | 
| 2007 | Jan (69) | Feb (97) | Mar (125) | Apr (112) | May (65) | Jun (80) | Jul (82) | Aug (84) | Sep (56) | Oct (74) | Nov (63) | Dec (74) | 
| 2008 | Jan (161) | Feb (115) | Mar (58) | Apr (73) | May (58) | Jun (79) | Jul (57) | Aug (115) | Sep (79) | Oct (62) | Nov (93) | Dec (37) | 
| 2009 | Jan (69) | Feb (115) | Mar (77) | Apr (85) | May (124) | Jun (58) | Jul (44) | Aug (85) | Sep (90) | Oct (80) | Nov (87) | Dec (48) | 
| 2010 | Jan (52) | Feb (71) | Mar (54) | Apr (37) | May (66) | Jun (86) | Jul (84) | Aug (68) | Sep (94) | Oct (66) | Nov (36) | Dec (53) | 
| 2011 | Jan (59) | Feb (77) | Mar (59) | Apr (67) | May (76) | Jun (54) | Jul (95) | Aug (92) | Sep (84) | Oct (72) | Nov (46) | Dec (60) | 
| 2012 | Jan (43) | Feb (77) | Mar (88) | Apr (121) | May (81) | Jun (69) | Jul (97) | Aug (64) | Sep (55) | Oct (55) | Nov (38) | Dec (60) | 
| 2013 | Jan (85) | Feb (70) | Mar (81) | Apr (83) | May (51) | Jun (65) | Jul (71) | Aug (39) | Sep (47) | Oct (32) | Nov (43) | Dec (28) | 
| 2014 | Jan (64) | Feb (22) | Mar (54) | Apr (20) | May (59) | Jun (20) | Jul (50) | Aug (17) | Sep (37) | Oct (56) | Nov (40) | Dec (24) | 
| 2015 | Jan (51) | Feb (29) | Mar (57) | Apr (31) | May (23) | Jun (50) | Jul (30) | Aug (66) | Sep (59) | Oct (21) | Nov (29) | Dec (12) | 
| 2016 | Jan (33) | Feb (30) | Mar (19) | Apr (23) | May (16) | Jun (31) | Jul (17) | Aug (19) | Sep (21) | Oct (20) | Nov (15) | Dec (6) | 
| 2017 | Jan (16) | Feb (13) | Mar (16) | Apr (23) | May (16) | Jun (5) | Jul (14) | Aug (13) | Sep (12) | Oct (11) | Nov (3) | Dec (6) | 
| 2018 | Jan (4) | Feb (6) | Mar (5) | Apr (11) | May (26) | Jun (5) | Jul (10) | Aug (7) | Sep (3) | Oct | Nov (3) | Dec (7) | 
| 2019 | Jan (17) | Feb (18) | Mar (5) | Apr (6) | May (3) | Jun | Jul (9) | Aug (19) | Sep (3) | Oct (1) | Nov (23) | Dec (5) | 
| 2020 | Jan (7) | Feb (1) | Mar (7) | Apr (11) | May (8) | Jun (7) | Jul (10) | Aug (3) | Sep (4) | Oct (7) | Nov (6) | Dec | 
| 2021 | Jan (3) | Feb | Mar (4) | Apr (4) | May | Jun | Jul (1) | Aug (3) | Sep | Oct | Nov (8) | Dec (3) | 
| 2022 | Jan (2) | Feb | Mar (1) | Apr | May (3) | Jun (1) | Jul | Aug (3) | Sep (9) | Oct (2) | Nov | Dec (2) | 
| 2023 | Jan (2) | Feb (5) | Mar (3) | Apr (7) | May (6) | Jun (2) | Jul (5) | Aug | Sep (4) | Oct (1) | Nov (5) | Dec (5) | 
| 2024 | Jan | Feb | Mar | Apr | May (3) | Jun (4) | Jul | Aug (3) | Sep | Oct | Nov (1) | Dec | 
| 2025 | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct (1) | Nov | Dec | 
| 
      
      
      From: Jac G. <ja...@ma...> - 2001-05-02 23:49:15
      
     | 
| >Thanks for your reply.  If your {} trick works, it might be helpful,
>although I'd rather not split the class tag from the guts of the 
class.
I think it's possible to trick doxygen into it in another way:
#ifdef DOXYGEN
{
#endif
#include "your_file_with_complete_class_definition_here"
#ifdef DOXYGEN
} // balance the braces
#endif
If you want to do it in a legitimate way, you can also use namespaces, 
but I doubt if they are useful in your case because they are probably 
not documented by all compilers.
>Anyway, it sounds like you agree on the usefulness of telling Doxygen 
to
>document #included files.  Do you have any proposed syntax?
The syntax I had in mind was (replace the @ by any other character if 
you want):
//@scaninclude
This command directs doxygen to scan the file that is mentioned in the 
next
#include command.
//@dontscaninclude
This command directs doxygen to NOT scan the file that is mentioned in 
the next #include command, not even if it contains @ifinclude commands 
that would make doxygen scan the code otherwise
//@ifinclude[d] [[operator] value]
This command directs doxygen to scan the code that follows if the 
include-stack's depth corresponds to the specified operator and value. 
<operator> can be < or > or <= or >= or == or !=, if you don't mention 
the operator, == is used. The value is 0 if the file is being scanned 
as base file, 1 if it is included from the base file etc.
I included the patch in which these commands are implemented (and some 
other little goodies :-). It works partly: it will let Doxygen scan the 
included files as it's told to, and it will generate documentation for 
the classes and methods in the included file as it's supposed to. 
However it does NOT work 100%!!!
- doxygen does not generate code fragments for methods in included 
files
- doxygen does not generate hotlinks to code ("Definition in line %d of 
file %s") in included files
- the graphs are not generated correctly for my special case (where 
class definitions are divided over include files, yuck!).
If I would know what to do with the database in scanner.l when the 
preprocessor changes to a different sourcefile, those problems would be 
fixed.
 
By the way, in my opinion, it shouldn't be necessary to patch doxygen 
this way: doxygen should scan the code in the same way that a C/C++ 
preprocessor does. A while ago someone posted a message containing a 
link to a website where someone patched the gcc preprocessor so it 
generates an XML document from which a clever XML parser should be able 
to generate a database that can be used by doxygen.
>  If you don't
>have time to finish your patch for this, I could do it myself.  (I had
>already assumed I'd have to add it if I wanted it.)
Go ahead if you want (just mention me as the original inventor, ok? :-)
I'm sorry, I don't have time to comment this patch right now...
===Jac
cvs diff -u
# irrelevant lines and files truncated
Index: src/config.l
===================================================================
RCS file: /u/kp3softd/cvsroot/src/config.l,v
retrieving revision 1.54
diff -u -r1.54 config.l
--- src/config.l	2001/04/08 19:19:30	1.54
+++ src/config.l	2001/05/02 23:37:44
@@ -14,6 +14,8 @@
 
 %{
 
+//#define YY_USER_ACTION printf("<%d>%s", __LINE__ -2, yytext);
+
 /*
  *	includes
  */
@@ -323,8 +325,9 @@
 
 <*>\0x0d
 <Start,GetString,GetStrList,GetBool,SkipInvalid>"#"	 { 
BEGIN(SkipComment); }
-<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"="	 { QCString cmd=yytext;
-                                           cmd=cmd.left(cmd.length()-
1).stripWhiteSpace(); 
+<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*("="|"+=")	 { QCString cmd=yytext;
+                                           bool add=(cmd.right(2)=="+=
");
+                                           cmd=cmd.left(cmd.length()-
(1+(int)add)).stripWhiteSpace();
 					   ConfigOption *option = config->get(cmd);
 					   if (option==0) // oops not known
 					   {
@@ -334,6 +337,11 @@
 					   }
 					   else // known tag
 					   {
+					     if (add && option->kind()!=
ConfigOption::O_List)
+					     {
+					       err("Warning: '+=' cannot be used with 
option %s at line %d, file %s; using '='\n",
+					         cmd.data(), yyLineNr, yyFileName.data());
+					     }
 					     switch(option->kind())
 					     {
 					       case ConfigOption::O_Info:
@@ -342,7 +350,7 @@
 						 break;
 					       case ConfigOption::O_List:
 						 l = ((ConfigList *)option)->valueRef();
-					         l->clear();
+					         if (!add) l->clear();
 						 elemStr="";
 					         BEGIN(GetStrList);
 					         break;
@@ -365,39 +373,6 @@
 						 b = ((ConfigBool *)option)->valueRef();
 					         BEGIN(GetBool);
 						 break;
-					     }
-					   }
-					}
-<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"+="	{ QCString cmd=yytext;
-                                          cmd=cmd.left(cmd.length()-
2).stripWhiteSpace(); 
-					  ConfigOption *option = config->get(cmd);
-					  if (option==0) // oops not known
-					  {
-					    err("Warning: ignoring unsupported tag `%s' at 
line %d, file %s\n",
-						yytext,yyLineNr,yyFileName.data()); 
-					    BEGIN(SkipInvalid);
-					  }
-					  else // known tag
-					  {
-					    switch(option->kind())
-					    {
-					      case ConfigOption::O_Info:
-					        // shouldn't get here!
-					        BEGIN(SkipInvalid);
-						break;
-					      case ConfigOption::O_List:
-					        l = ((ConfigList *)option)->valueRef();
-						elemStr="";
-					        BEGIN(GetStrList);
-					        break;
-					      case ConfigOption::O_Enum:
-					      case ConfigOption::O_String:
-					      case ConfigOption::O_Int:
-					      case ConfigOption::O_Bool:
-					        err("Warning: operator += not supported for 
`%s'. Ignoring line at line %d, file %s\n",
-						    yytext,yyLineNr,yyFileName.data()); 
-					        BEGIN(SkipInvalid);
-						break;
 					     }
 					   }
 					}
Index: src/doxygen.cpp
===================================================================
RCS file: /u/kp3softd/cvsroot/src/doxygen.cpp,v
retrieving revision 1.66
diff -u -r1.66 doxygen.cpp
--- src/doxygen.cpp	2001/04/30 17:28:32	1.66
+++ src/doxygen.cpp	2001/05/02 23:37:45
@@ -2818,9 +2818,9 @@
       {
         warn(
              root->fileName,root->startLine,
-             "Warning: member %s belongs to two different groups. The 
second "
-             "one found here will be ignored.",
-             md->name().data()
+             "Warning: member %s belongs to two different groups.\n"
+             "The one that will be used is at %s:%d",
+             md->name().data(), md->getDefFileName().data(), md->
getDefLine()
             );
       }
     }
@@ -5493,16 +5493,6 @@
   {
     QCString fileName=*s;
 
-    int fileNameSize=fileName.length();
-
-    // add begin filename marker
-    output.addChar(0x06);
-    // copy filename
-    output.addArray(fileName.data(),fileNameSize);
-    
-    // add end filename marker
-    output.addChar(0x06);
-    output.addChar('\n');
     if (Config_getBool("ENABLE_PREPROCESSING"))
     {
       msg("Preprocessing %s...\n",s->data());
@@ -5510,6 +5500,18 @@
     }
     else
     {
+      // add begin filename marker
+      output.addChar(0x06);
+      // copy filename
+      output.addArray(fileName.data(),fileName.length());
+
+      // add line number
+      output.addChar(0x06);
+      output.addChar('1');
+      
+      // add end filename marker
+      output.addChar(0x06);
+
       msg("Reading %s...\n",s->data());
       copyAndFilterFile(fileName,output);
     }
Index: src/message.cpp
===================================================================
RCS file: /u/kp3softd/cvsroot/src/message.cpp,v
retrieving revision 1.25
diff -u -r1.25 message.cpp
--- src/message.cpp	2001/04/22 19:01:52	1.25
+++ src/message.cpp	2001/05/02 23:37:45
@@ -142,7 +142,7 @@
 {
   if (Config_getBool("WARN_IF_UNDOCUMENTED"))
   {
-    if (file==0) file="<unknwon>";
+    if (file==0) file="<unknown>";
     char text[4096];
     va_list args;
     va_start(args, fmt);
Index: src/pre.l
===================================================================
RCS file: /u/kp3softd/cvsroot/src/pre.l,v
retrieving revision 1.39
diff -u -r1.39 pre.l
--- src/pre.l	2001/04/08 19:19:31	1.39
+++ src/pre.l	2001/05/02 23:37:46
@@ -17,6 +17,8 @@
 
 %{
 
+//#define YY_USER_ACTION printf("<%d>%s", __LINE__ -2, yytext);
+
 /*
  *	includes
  */
@@ -53,15 +55,71 @@
 
 #define YY_NEVER_INTERACTIVE 1
   
-
+typedef enum
+{
+  ScanIncNA,	// we're not including (this is the base file)
+  ScanIncNone,  // no commands active
+  ScanIncYes,	// scaninclude given
+  ScanIncNo	// dontscaninclude given
+} ScanInclude;
+
+typedef enum
+{
+  IfIncNone,	// no ifinclude given
+  IfIncEQ,	// ifinclude == or =
+  IfIncNE,	// ifinclude != or <>
+  IfIncLT,	// ifinclude <
+  IfIncLE,	// ifinclude <=
+  IfIncGT,	// ifinclude >
+  IfIncGE	// ifinclude >=
+} IfIncComp;
+
+typedef enum
+{
+  PreNone,		// no preprocessor command found
+  PreScanInclude,	// scaninclude found
+  PreDontScanInclude,	// dontscaninclude found
+  PreIfInclude		// if[not]include[d]/endifinclude[d] found
+} PreProcessorCmd;
+ 
 struct FileState
 {
-  int lineNr;
-  FILE *filePtr;
-  YY_BUFFER_STATE bufState;
-  QCString fileName;
+  int                   lineNr;
+  FILE                 *filePtr;
+  YY_BUFFER_STATE       bufState;
+  QCString              fileName;
+  QCString              bareFileName;
+  int                   pathListIndex;
+  ScanInclude           parentScanInclude;
+  uint                  ifIncDepth;
+  IfIncComp             ifIncComp;
 };  
 
+// Extended version of QStack, which includes a next() operation.
+template<class type> class WalkableStack : private QGList
+{
+public:
+    WalkableStack()				{}
+    WalkableStack( const WalkableStack<type> &s ) : QGList(s) {}
+   ~WalkableStack()				{ clear(); }
+    WalkableStack<type> &operator=(const WalkableStack<type> &s)
+			{ return (WalkableStack<type>&)QGList::operator=(s); }
+    bool  autoDelete() const		{ return QCollection::autoDelete(); 
}
+    void  setAutoDelete( bool del )	{ 
QCollection::setAutoDelete(del); }
+    uint  count()   const		{ return QGList::count(); }
+    bool  isEmpty() const		{ return QGList::count() == 0; }
+    void  push( const type *d )		{ QGList::insertAt(0,Item(d)); 
}
+    type *pop()				{ return (type *)QGList::takeFirst(); }
+    bool  remove()			{ return QGList::removeFirst(); }
+    void  clear()			{ QGList::clear(); }
+    type *top()	    const		{ return (type *)QGList::cfirst(); 
}
+	  operator type *() const	{ return (type *)QGList::cfirst(); }
+    type *current() const		{ return (type *)QGList::cfirst(); }
+    type *next() 			{ return (type *)QGList::next(); }
+private:
+    void  deleteItem( Item d ) { if ( del_item ) delete (type *)d; }
+};
+
 /* -----------------------------------------------------------------
  *
  *	scanner's state
@@ -69,10 +127,12 @@
 
 static int                g_yyLineNr   = 1;
 static QCString           g_yyFileName;
+static QCString           g_bareFileName;
 static FileDef           *g_yyFileDef;
 static int                g_ifcount    = 0;
 static QStrList          *g_pathList = 0;  
-static QStack<FileState>  g_includeStack;
+static WalkableStack<FileState>  g_includeStack;
+static int                g_currentPathListIndex = -1;
 static QDict<int>        *g_argDict;
 static int                g_defArgs = -1;
 static QCString           g_defName;
@@ -83,6 +143,7 @@
 static int                g_level;
 static int                g_lastCContext;
 static int                g_lastCPPContext;
+static int		  g_nextCommentContext;
 static QArray<int>        g_levelGuard;
 static BufStr            *g_outputBuf;
 static int                g_roundCount;
@@ -92,10 +153,18 @@
 static int                g_findDefArgContext;
 static QCString           g_lastGuardName;
 static QCString           g_incName;
+static bool               g_incNext;
 static QCString           g_guardExpr;
 static int                g_curlyCount;
 static bool               g_nospaces; // add extra spaces during macro 
expansion
-
+static PreProcessorCmd    g_doxyCmd;
+static ScanInclude        g_parentScanInclude;
+static ScanInclude	  g_scanInclude;
+static IfIncComp	  g_ifIncComp;
+static uint		  g_ifIncDepth;
+static bool               g_scanEnabledCache=true;
+static bool               g_scanEnabledCacheChanged=true;
+static bool               g_fileNeedsMark=false;
 static bool               g_macroExpansion; // from the configuration
 static bool               g_expandOnlyPredef; // from the 
configuration
 
@@ -103,8 +172,21 @@
 static void setFileName(const char *name)
 {
   bool ambig;
+  Debug::print(Debug::Preprocessor,0,"opening %s\n",name);
   g_yyFileName=name;
   g_yyFileDef=findFileDef(Doxygen::inputNameDict,g_yyFileName,ambig);
+  g_fileNeedsMark=true;
+}
+
+static void outputFileMarker(void)
+{
+  g_outputBuf->addChar('\x06');
+  g_outputBuf->addArray(g_yyFileName.data(),g_yyFileName.length());
+  g_outputBuf->addChar('\x06');
+  QCString lineno;lineno.setNum(g_yyLineNr);
+  g_outputBuf->addArray(lineno.data(),lineno.length());
+  g_outputBuf->addChar('\x06');
+  g_fileNeedsMark=false;
 }
 
 static void incrLevel()
@@ -161,7 +243,7 @@
   return 0;
 }
 
-static FILE *checkAndOpenFile(const QCString &absName)
+static FILE *checkAndOpenFile(const QCString &absName, const QCString 
&bareName, int pathListIndex)
 {
   FILE *f = 0;
   QFileInfo fi(absName);
@@ -178,20 +260,30 @@
       f=fopen(absName,"r");
       if (!f) err("Error: could not open file %s for reading\
n",absName.data());
     }
+    if (f)
+    {
+      setFileName(absName);
+      g_yyLineNr=1;
+      g_parentScanInclude=g_scanInclude;
+      g_scanInclude=ScanIncNone;
+      g_ifIncComp=IfIncNone;
+      g_scanEnabledCacheChanged=true;
+      g_bareFileName=bareName;
+      g_currentPathListIndex=pathListIndex;
+      yy_switch_to_buffer(yy_create_buffer((preYYin=f), YY_BUF_SIZE));
+    }
   }
   return f;
 }
 
-static FILE *findFile(const char *fileName,bool localInclude)
+static FILE *findFile(const QCString &fileName,bool localInclude)
 {
   if (localInclude && g_yyFileDef)
   {
-    QCString absName = g_yyFileDef->getPath()+"/"+fileName;
-    FILE *f = checkAndOpenFile(absName);
+    QCString absName = g_yyFileDef->getPath()+fileName;
+    FILE *f = checkAndOpenFile(absName, fileName, 
g_currentPathListIndex);
     if (f)
     {
-      setFileName(absName);
-      g_yyLineNr=1;
       return f;
     }
   }
@@ -200,17 +292,30 @@
     return 0;
   }
   char *s=g_pathList->first();
+
+  int foundPathListIndex=0;
+  int startingIndex=0;
+  if (g_incNext && !strcmp(g_bareFileName.data(), fileName.data()))
+  {
+    // Get the current include-path index and search from there.
+    // Note that for the base filename, the current path list index is
+    // set to -1, so the search starts at 0.
+    startingIndex=g_currentPathListIndex+1;
+  }
+  
   while (s)
   {
-    QCString absName = (QCString)s+"/"+fileName;
-    FILE *f = checkAndOpenFile(absName);
-    if (f)
+    if (foundPathListIndex>=startingIndex)
     {
-      setFileName(absName);
-      g_yyLineNr=1;
-      return f;
-    }
+      QCString absName = (QCString)s+"/"+fileName;
+      FILE *f = checkAndOpenFile(absName, fileName, 
foundPathListIndex);
+      if (f)
+      {
+        return f;
+      }
 
+    }
+    foundPathListIndex++;
     s=g_pathList->next();
   } 
   return 0;
@@ -880,19 +985,123 @@
   //if ((d=defineDict[g_defName])==0) 
defineDict.insert(g_defName,newDefine()); 
 }
 
+static inline bool scanEnabled(void)
+{
+  if (g_scanEnabledCacheChanged)
+  {
+    // by defrault, scanning is enabled
+    bool b=true;
+
+    // check for dontscaninclude override
+    if (g_parentScanInclude==ScanIncNo)
+    {
+      // parent disallows scanning
+      b=false;
+    }
+    else
+    {
+      // we're not in an include or the parent allows/mandates 
scanning
+      uint depth=g_includeStack.count();
+      
+      // check for ifinclude override
+      switch (g_ifIncComp)
+      {
+      case IfIncNone:
+        // No ifinclude present. Check if parent mandates scanning
+        b=((depth==0) ||
+           (g_parentScanInclude==ScanIncYes) ||
+           ((depth!=0) && (g_curlyCount>0)));
+        break;
+      case IfIncEQ:
+        // include level must be equal to given number
+        b=(depth==g_ifIncDepth);
+        break;
+      case IfIncNE:
+        // include level must be unequal to given number
+        b=(depth!=g_ifIncDepth);
+        break;
+      case IfIncLT:
+        // include level must be less than given number
+        b=(depth<g_ifIncDepth);
+        break;
+      case IfIncLE:
+        // include level must be less or equal to given number
+        b=(depth<g_ifIncDepth);
+        break;
+      case IfIncGT:
+        // include level must be greater than given number
+        b=(depth>g_ifIncDepth);
+        break;
+      case IfIncGE:
+        // include level must be greater or equal to given number
+        b=(depth>=g_ifIncDepth);
+        break;
+      }
+    }
+    
+    // copy local to global
+    g_scanEnabledCache=b;
+    
+    // if scanning is enabled, mark the current position
+    if (g_scanEnabledCache && g_fileNeedsMark)
+    {
+      outputFileMarker();
+    }
+    g_scanEnabledCacheChanged=false;
+  }
+  return g_scanEnabledCache;
+}
+
 static inline void outputChar(char c)
 {
-  if (g_includeStack.isEmpty() || g_curlyCount>0) g_outputBuf->
addChar(c);
+  if (scanEnabled()) g_outputBuf->addChar(c);
 } 
 
 static inline void outputArray(const char *a,int len)
 {
-  if (g_includeStack.isEmpty() || g_curlyCount>0) g_outputBuf->
addArray(a,len);
+  if (scanEnabled()) g_outputBuf->addArray(a,len);
 }
 
+/*! this is called at the end of each source line and at the end of 
each
+ * C comment, to execute any preprocessor commands that were found.
+ * Note: We need to postpone processing the command until after the
+ * comment ends, because if scanning is enable or disabled by the 
command,
+ * the scanner would otherwise end up with an unclosed or unopened 
comment.
+ * We CAN postpone processing until the end of the comment because
+ * preprocessor commands need to be right after the beginning of
+ * the comment, so there can never be more than one command per 
comment.
+ */
+static void execPreProcCmd(void)
+{
+  switch (g_doxyCmd)
+  {
+  case PreScanInclude:
+    g_scanInclude=ScanIncYes;
+    g_scanEnabledCacheChanged=true;
+    break;
+  case PreDontScanInclude:
+    g_scanInclude=ScanIncNo;
+    g_scanEnabledCacheChanged=true;
+    break;
+  case PreIfInclude:
+    g_scanEnabledCacheChanged=true;
+    break;
+  case PreNone:
+  default:
+    ; // Nothing to do
+  }
+  
+  // reset the command, just in case
+  g_doxyCmd=PreNone;
+}
+
 static void readIncludeFile(const QCString &inc)
 {
-  if (!Config_getBool("SEARCH_INCLUDES")) return; // do not read 
include files
+  if (!Config_getBool("SEARCH_INCLUDES"))
+  {
+    Debug::print(Debug::Preprocessor,0,"SEARCH_INCLUDES is false; not 
including %s\n",inc.data());
+    return; // do not read include files
+  }
   uint i=0;
   
   // find the start of the include file name
@@ -913,16 +1122,26 @@
     QCString incFileName=inc.mid(s,i-s).stripWhiteSpace(); 
 
     FILE *f;
-    QCString oldFileName = g_yyFileName.copy();
     FileDef *oldFileDef  = g_yyFileDef;
-    int oldLineNr        = g_yyLineNr;
+
+    // store the state of the old file 
+    FileState *fs=new FileState;
+    fs->bufState=YY_CURRENT_BUFFER;
+    fs->lineNr=g_yyLineNr;
+    fs->fileName=g_yyFileName.copy();
+    fs->bareFileName=g_bareFileName;
+    fs->pathListIndex=g_currentPathListIndex;
+    fs->parentScanInclude=g_parentScanInclude;
+    fs->ifIncDepth=g_ifIncDepth;
+    fs->ifIncComp=g_ifIncComp;
+
     //printf("Searching for `%s'\n",incFileName.data());
     if ((f=findFile(incFileName,localInclude))) // see if the include 
file can be found
     {
       if (Debug::isFlagSet(Debug::Preprocessor))
       {
-        for (i=0;i<g_includeStack.count();i++) msg("  ");
-        msg("#include %s: parsing...\n",incFileName.data());
+        for (i=0;i<=g_includeStack.count();i++) msg("  ");
+        msg("#include%s %s: parsing...\n", g_incNext?"_next":"", 
incFileName.data());
       }
       if (oldFileDef) 
       {
@@ -934,26 +1153,19 @@
   	  g_yyFileDef->addIncludedByDependency(oldFileDef,oldFileDef->
name(),localInclude);
         }
       }
-      FileState *fs=new FileState;
-      fs->bufState=YY_CURRENT_BUFFER;
-      fs->lineNr=oldLineNr;
-      fs->fileName=oldFileName;
       fs->filePtr=f;
       // push the state on the stack
       g_includeStack.push(fs);
-      // set the scanner to the include file
 
       // TODO: Enable this to deal with file changes due to 
       // #include's within { .. } blocks
       //QCString lineStr;
       //lineStr.sprintf("# 1 \"%s\" 1\n",g_yyFileName.data());
       //outputArray(lineStr.data(),lineStr.length());
-      
-      preYYin=f;
-      yy_switch_to_buffer(yy_create_buffer(preYYin, YY_BUF_SIZE));
     } 
     else
     {
+      delete fs; // delete unused data
       if (oldFileDef) 
       {
 	bool ambig;
@@ -966,9 +1178,17 @@
   	  fd->addIncludedByDependency(oldFileDef,oldFileDef->
name(),localInclude);
         }
       }
-      if (Debug::isFlagSet(Debug::Preprocessor))
-      {
-        msg("#include %s: not found! skipping...\
n",incFileName.data());
+      // failing #include_next's are apparently not reported by gcc,
+      // so we won't complain about failed #include_next's either
+      if (!g_incNext)
+      {
+        warn(g_yyFileName.data(), g_yyLineNr, "#include %s: not found! 
skipping...", incFileName.data());
+        FileState *fs=g_includeStack.top();
+        while (fs)
+        {
+          warn_cont("  included from: %s:%d\n", fs->fileName.data(), 
fs->lineNr);
+          fs=g_includeStack.next();
+        }
         //printf("Error: include file %s not found\n",yytext);
       }
     }
@@ -977,11 +1197,14 @@
 
 /* ----------------------------------------------------------------- *
/
 
+#define DO_LINEFEED do { outputChar('\n'); g_yyLineNr++; 
execPreProcCmd(); } while(0)
+
 %}
 
 ID	[a-z_A-Z][a-z_A-Z0-9]*
 B       [ \t]
 BN	[ \t\r\n]
+CMD	[@]
 
 %option noyywrap
 
@@ -999,6 +1222,8 @@
 %x      SkipCPPBlock
 %x      Ifdef
 %x      Ifndef
+%x	DoxyCommand
+%x	IfIncludeParm
 %x	SkipCComment
 %x	SkipCPPComment
 %x	RemoveCComment
@@ -1044,12 +1269,18 @@
 
 <CopyLine>"{"				{ // count brackets inside the main file
   					  if (g_includeStack.isEmpty()) 
+  					  {
 					    g_curlyCount++;
+					    g_scanEnabledCacheChanged=true;
+					  }
 					  outputChar(*yytext);
   					}
 <CopyLine>"}"				{ // count brackets inside the main file
   					  if (g_includeStack.isEmpty()) 
+  					  {
 					    g_curlyCount--;
+					    g_scanEnabledCacheChanged=true;
+					  }
 					  outputChar(*yytext);
 					  // This should hold otherwise the preprocessor is 
confused
 					  //ASSERT(g_curlyCount>=0); 
@@ -1132,9 +1363,8 @@
   					  outputChar(*yytext);
   					}
 <CopyLine>\n				{
-  					  outputChar('\n');
+  					  DO_LINEFEED;
 					  BEGIN(Start);
-					  g_yyLineNr++;
   					}
 <FindDefineArgs>"("			{
   					  g_defArgsStr+='(';
@@ -1170,8 +1400,7 @@
   					  BEGIN(ReadString);
   					}
 <FindDefineArgs>\n			{
-  					  g_yyLineNr++;
-					  outputChar('\n');
+  					  DO_LINEFEED;
   					}
 <FindDefineArgs>"@"			{
   					  g_defArgsStr+="@@";
@@ -1192,7 +1421,20 @@
 <ReadString>.				{
   					  g_defArgsStr+=*yytext;
   					}
+<Command>"include_next"{B}+/{ID}	{
+                                          g_incNext=true;
+  					  if (g_macroExpansion) 
+					    BEGIN(IncludeID);
+  					}
+<Command>"include_next"{B}*[<"]		{ 
+					  char c[2];
+					  c[0]=yytext[yyleng-1];c[1]='\0';
+					  g_incName=c;
+					  g_incNext=true;
+  					  BEGIN(Include); 
+					}
 <Command>"include"{B}+/{ID}		{
+					  g_incNext=false;
   					  if (g_macroExpansion) 
 					    BEGIN(IncludeID);
   					}
@@ -1200,6 +1442,7 @@
 					  char c[2];
 					  c[0]=yytext[yyleng-1];c[1]='\0';
 					  g_incName=c;
+					  g_incNext=false;
   					  BEGIN(Include); 
 					}
 <Command>"define"{B}+			{ 
@@ -1272,16 +1515,15 @@
   					  decrLevel();
   					}
 <Command,IgnoreLine>\n			{
-  					  outputChar('\n');
+
+  					  DO_LINEFEED;
   					  BEGIN(Start);
-					  g_yyLineNr++;
   					}
 <Command>{ID}				{ // unknown directive
 					  BEGIN(IgnoreLine);
 					}
 <IgnoreLine>\\[\r]?\n			{
-  					  outputChar('\n');
-					  g_yyLineNr++;
+  					  DO_LINEFEED;
 					}
 <IgnoreLine>.
 <Command>.
@@ -1295,9 +1537,8 @@
 					  BEGIN(Start);
   					}
 <Guard>\\[\r]?\n			{
-  					  outputChar('\n');
+  					  DO_LINEFEED;
   					  g_guardExpr+=' ';
-					  g_yyLineNr++;
   					}
 <Guard>"defined"/{B}*"("		{
     					  BEGIN(DefinedExpr2);
@@ -1307,8 +1548,7 @@
     					}
 <Guard>.				{ g_guardExpr+=*yytext; }
 <Guard>\n				{
-  					  outputChar('\n');
-					  g_yyLineNr++;
+  					  DO_LINEFEED;
   					  //printf("Guard: `%s'\n",
 					  //    g_guardExpr.data());
 					  bool guard=computeExpression(g_guardExpr);
@@ -1324,7 +1564,7 @@
 					    BEGIN(SkipCPPBlock);
 					  }
   					}
-<DefinedExpr1,DefinedExpr2>\\\n		{ g_yyLineNr++; outputChar('\
n'); }
+<DefinedExpr1,DefinedExpr2>\\\n		{ DO_LINEFEED; }
 <DefinedExpr1>{ID}			{
   					  if (isDefined(yytext))
 					    g_guardExpr+=" 1L ";
@@ -1389,8 +1629,7 @@
 					  }
 					}
 <SkipCommand>\n				{ 
-  					  outputChar('\n');
-  					  g_yyLineNr++; 
+  					  DO_LINEFEED;
 					  BEGIN(SkipCPPBlock);
 					}
 <SkipCommand>{ID}			{ // unknown directive 
@@ -1408,8 +1647,7 @@
   					  BEGIN(RemoveCComment);
   					}
 <SkipLine>\n				{
-  					  outputChar('\n');
-					  g_yyLineNr++;  
+  					  DO_LINEFEED;
 					  BEGIN(SkipCPPBlock);
 					}
 <IncludeID>{ID}{B}*/"("			{
@@ -1530,16 +1768,99 @@
 					  g_defText+=' ';
 					  g_defLitText+=' ';
 					  g_lastCContext=YY_START;
-  					  BEGIN(SkipCComment);
+					  g_nextCommentContext=SkipCComment;
+  					  BEGIN(DoxyCommand);
   					}
 <DefineText>"//"			{
   				          outputChar('/');outputChar('/');
   					  g_lastCPPContext=YY_START;
 					  g_defLitText+=' ';
-  					  BEGIN(SkipCPPComment);
+					  g_nextCommentContext=SkipCPPComment;
+  					  BEGIN(DoxyCommand);
   					}
+<DoxyCommand>{B}*{CMD}"scaninclude"     {
+                                          g_doxyCmd=PreScanInclude;
+                                          BEGIN(g_nextCommentContext);
+                                        }
+<DoxyCommand>{B}*{CMD}"dontscaninclude" {
+                                          g_doxyCmd=
PreDontScanInclude;
+                                          BEGIN(g_nextCommentContext);
+                                        }
+<DoxyCommand>{B}*{CMD}"ifinclude"[d]{B}* {
+                                          g_doxyCmd=PreIfInclude;
+                                          g_ifIncDepth=0;
+                                          g_ifIncComp=IfIncGT;
+                                          BEGIN(IfIncludeParm);
+                                        }
+<IfIncludeParm>("<="|"<"|"="|"=="|"!="|"<>"|">"|">="){B}*/[0-9] {
+					  switch (yytext[0])
+					  {
+					  case '<':
+					    switch (yytext[1])
+					    {
+					    case '=':
+					      g_ifIncComp=IfIncLE;
+					      break;
+					    case '>':
+					      g_ifIncComp=IfIncNE;
+					      break;
+					    default:
+					      g_ifIncComp=IfIncLT;
+					    }
+					    break;
+					  case '=': // '=' or '=='
+					    g_ifIncComp=IfIncEQ;
+					    break;
+					  case '!':
+					    g_ifIncComp=IfIncNE;
+					    break;
+					  case '>':
+					    switch (yytext[1])
+					    {
+					    case '=':
+					      g_ifIncComp=IfIncGE;
+					      break;
+					    default:
+					      g_ifIncComp=IfIncGT;
+					    }
+					    break;
+					  default:
+					    ; // never happens
+					  }
+					}
+<IfIncludeParm>[0-9]+			{
+					  g_ifIncDepth=0;
+					  int i=0;
+					  while (yytext[i])
+					  {
+					    g_ifIncDepth=g_ifIncDepth*10+(yytext[i]-'0');
+					    i++;
+					  }
+					  BEGIN(g_nextCommentContext);
+					}
+<IfIncludeParm>"//"|"/*"|.|\n		{
+					  yyless(0);
+					  BEGIN(g_nextCommentContext);
+					}
+<DoxyCommand>{B}*{CMD}"ifnotinclude"[d] {
+                                          g_doxyCmd=PreIfInclude;
+                                          g_ifIncDepth=0;
+                                          g_ifIncComp=IfIncEQ;
+                                          BEGIN(g_nextCommentContext);
+                                        }
+<DoxyCommand>{B}*{CMD}"endifinclude"[d] {
+                                          g_doxyCmd=PreIfInclude;
+                                          g_ifIncComp=IfIncNone;
+                                          BEGIN(g_nextCommentContext);
+                                        }
+<DoxyCommand>"//"|"/*"|.|\n             {
+                                          g_doxyCmd=PreNone;
+                                          yyless(0);
+                                          BEGIN(g_nextCommentContext);
+   					}
 <SkipCComment>"*/"			{
   					  outputChar('*');outputChar('/');
+  					  execPreProcCmd();
   					  BEGIN(g_lastCContext);  
   					}
 <SkipCComment>"//"			{
@@ -1552,8 +1873,7 @@
   					  outputArray(yytext,yyleng);
   					}
 <SkipCComment>\n			{ 
-  					  g_yyLineNr++;
-  					  outputChar('\n');
+  					  DO_LINEFEED;
   					}
 <SkipCComment>.				{
   					  outputChar(*yytext);
@@ -1562,7 +1882,7 @@
 <RemoveCComment>"//"			
 <RemoveCComment>"/*"
 <RemoveCComment>[^*\n]+
-<RemoveCComment>\n			{ g_yyLineNr++; outputChar('\n'); }
+<RemoveCComment>\n			{ DO_LINEFEED; }
 <RemoveCComment>.			
 <SkipCPPComment,RemoveCPPComment>\n	{
   					  unput(*yytext);
@@ -1623,12 +1943,11 @@
   					}
 <DefineText>\\[\r]?\n			{ 
 					  g_defLitText+=yytext;
-  					  outputChar('\n');
-  					  g_defText += ' '; g_yyLineNr++; 
+  					  DO_LINEFEED;
+  					  g_defText += ' ';
 					}
 <DefineText>\n				{
 					  g_defLitText+=yytext;
-  					  outputChar('\n');
   					  Define *def=0;
 					  //printf("Define name=`%s' text=`%s' litTexti=
`%s'\n",g_defName.data(),g_defText.data(),g_defLitText.data());
 					  if (g_includeStack.isEmpty() || g_curlyCount>0) 
@@ -1660,7 +1979,7 @@
 					    }
 					  }
 					  delete g_argDict; g_argDict=0;
-					  g_yyLineNr++;
+					  DO_LINEFEED;
 					  g_lastGuardName.resize(0);
 					  BEGIN(Start);
   					}
@@ -1712,6 +2031,13 @@
 					    yy_delete_buffer( oldBuf );
 					    g_yyLineNr=fs->lineNr;
 					    setFileName(fs->fileName.copy());
+					    g_currentPathListIndex=fs->pathListIndex;
+					    g_scanInclude=ScanIncNone; // Reset, don't use 
fs->scanInclude!
+					    g_parentScanInclude=fs->parentScanInclude;
+					    g_ifIncDepth=fs->ifIncDepth;
+					    g_ifIncComp=fs->ifIncComp;
+                                            g_scanEnabledCacheChanged=
true;
+                                            g_bareFileName=fs->
bareFileName;
 					    //printf("######## FileName %s\
n",g_yyFileName.data());
 					    
                                             // TODO: Enable this to 
deal with file changes due to 
@@ -1728,16 +2054,17 @@
 <*>"/*"					{
 					  outputChar('/');outputChar('*');
   					  g_lastCContext=YY_START;
-					  BEGIN(SkipCComment);
+  					  g_nextCommentContext=SkipCComment;
+					  BEGIN(DoxyCommand);
   					}
 <*>"//"					{
 					  outputChar('/');outputChar('/');
   					  g_lastCPPContext=YY_START;
-					  BEGIN(SkipCPPComment);
+  					  g_nextCommentContext=SkipCPPComment;
+					  BEGIN(DoxyCommand);
 					}
 <*>\n					{ 
-  					  outputChar('\n');
-  					  g_yyLineNr++; 
+  					  DO_LINEFEED;
 					}
 <*>.				        {
   					  outputChar(*yytext);
@@ -1971,10 +2298,17 @@
       return;
     }
   }
-  g_yyLineNr = 1;
   g_level    = 0;
   g_ifcount  = 0;
+  g_currentPathListIndex=-1;
+  g_parentScanInclude=ScanIncNA;
+  g_scanInclude=ScanIncNone;
+  g_ifIncComp=IfIncNone;
+  g_scanEnabledCacheChanged=true;
+  g_yyLineNr = 0; // indicate to scanner that this is a base file
   setFileName(fileName);
+  outputFileMarker();
+  g_yyLineNr = 1;
   BEGIN( Start );
   
   g_lastGuardName.resize(0);
@@ -1993,10 +2327,19 @@
     msg("Preprocessor output (size: %d bytes):\n",newPos-orgPos);
     int line=1;
     msg("---------\n00001 ");
+    int markercount=0;
     while (orgPos<newPos) 
     {
+      if (*orgPos==6)
+      {
+        if (++markercount==3)
+          markercount=0;
+      }
+      else if (markercount==0)
+      {
       putchar(*orgPos);
       if (*orgPos=='\n') printf("%05d ",++line);
+      }
       orgPos++;
     }
     msg("\n---------\n");
Index: src/scanner.l
===================================================================
RCS file: /u/kp3softd/cvsroot/src/scanner.l,v
retrieving revision 1.62
diff -u -r1.62 scanner.l
--- src/scanner.l	2001/04/30 17:28:33	1.62
+++ src/scanner.l	2001/05/02 23:37:47
@@ -17,6 +17,8 @@
   
 %{
 
+//#define YY_USER_ACTION printf("<%d>%s", __LINE__ -2, yytext);
+
 /*
  *	includes
  */
@@ -101,6 +103,7 @@
 static int              anonCount    = 0 ;        
 static char		yyFileName[4096] ;
 static int              lastMemberGroupLine;
+static QCString		lastMemberGroupFile;
 static MethodTypes 	mtype;
 static bool    		gstat;
 static bool             removeSlashes;
@@ -532,31 +535,32 @@
 
 %%
 
-<*>\x06[^\x06]*\x06			{ // new file
-  					  if (memberGroupId!=NOGROUP)
-					  {
-					    warn(yyFileName,yyLineNr,"Warning: Missing //
@}");
-					    memberGroupId=NOGROUP;
-					  }
-  					  yyLineNr= 0 ; // there is always an extra newline 
at the start of the file
+<*>\x06[^\x06]*\x06[0-9]+\x06		{ // new file
 					  int i; 
 					  for( i = 0 ; yytext[i+1] != 6 ; i++ )
 					    yyFileName[i] = yytext[i+1] ;
 					  yyFileName[i] = 0 ;
 					  setContext();
-					  msg("Parsing file %s...\n",yyFileName);
-					  current_root  = global_root ;
-					  initParser();
-					  current->reset();
-					  int sec=guessSection(yyFileName);
-					  if (sec)
-					  {
-					    current->name    = yyFileName;
-					    current->section = sec;
-					    current_root->addSubEntry(current);
-					    current          = new Entry;
+					  // parse line number
+  					  for (yyLineNr=0, i++;yytext[i+1]!=6;i++)
+  					    yyLineNr=yyLineNr*10+(yytext[i+1]-'0');
+					  if (yyLineNr==0) // start of a new base file
+					  {
+					    yyLineNr=1;
+					    msg("Parsing file %s ...\n",yyFileName);
+					    current_root  = global_root ;
+					    initParser();
+					    current->reset();
+					    int sec=guessSection(yyFileName);
+					    if (sec)
+					    {
+					      current->name    = yyFileName;
+					      current->section = sec;
+				      	      current_root->addSubEntry(current);
+					      current          = new Entry;
+					    }
+    					    BEGIN( FindMembers );
 					  }
-					  BEGIN( FindMembers );
 					}
 <*>\x0d
 <NextSemi>"{"				{
@@ -705,6 +709,9 @@
 <PackageName>";"			{
   					  BEGIN(FindMembers);
   					}
+<FindMembers>{B}*"friend"{BN}+[^;]*";"  { // ignore friend 
declarations (TODO: parse these and generate references for them)
+                                          lineCount();
+                                        }
 <FindMembers>{B}*"static"{BN}+     	{ //current->type += " static 
";
   					  current->stat = TRUE;
 					  lineCount();
@@ -3252,6 +3259,7 @@
 					                    memberGroupId = 
newMemberGroupId();
 					                    current->mGrpId = 
memberGroupId;
 					                    lastMemberGroupLine = yyLineNr;
+					                    lastMemberGroupFile = 
yyFileName;
 							  }
 							  else
 							  {
@@ -3744,7 +3752,7 @@
   if (memberGroupId!=NOGROUP)
   {
     warn(yyFileName,yyLineNr,"Warning: ignoring nested member group. "
-	"Previous command was found at line %d.",lastMemberGroupLine);
+	"Previous command was found at file %s line 
%d.",lastMemberGroupFile.data(),lastMemberGroupLine);
   }
   else if (!lastDefGroup.isEmpty())
   {
@@ -3763,6 +3771,7 @@
     memberGroupId = newMemberGroupId();
     current->mGrpId = memberGroupId;
     lastMemberGroupLine = yyLineNr;
+    lastMemberGroupFile = yyFileName;
   }
 }
 | 
| 
      
      
      From: Trevor R. <Tre...@pe...> - 2001-05-02 22:00:52
      
     | 
| Jac,
Thanks for your reply.  If your {} trick works, it might be helpful,
although I'd rather not split the class tag from the guts of the class.
The main problem with your macro-hack variation is that I can't include
inline documentation for the class.  I'd have to use \fn style of
documentation, which I find unacceptably hard to maintain due to the
redundancy.  (In addition to my abstract buffer class, I have 3 derived
classes that need to use the same template emulation.)  A couple more
reasons: 1) It's no fun to remember to put backslashes at the end of every
line.  2) The entire class is now a big text blob that editors and other
tools don't understand, so they won't do things like syntax highlight, match
parentheses, or auto-generate doc comments.  3) I might eventually hit some
sort of maximum macro length in one of the six preprocessors I'm using.  (We
use 5 compilers on 4 platforms, plus an additional make-dependency
preprocessor on Windows since VC++ doesn't generate make dependencies.)
Anyway, it sounds like you agree on the usefulness of telling Doxygen to
document #included files.  Do you have any proposed syntax?  If you don't
have time to finish your patch for this, I could do it myself.  (I had
already assumed I'd have to add it if I wanted it.)
-Trevor
-----Original Message-----
From: Jac Goudsmit [mailto:ja...@ma...]
Sent: Wednesday, May 02, 2001 4:25 PM
To: dox...@li...
Subject: Re: [Doxygen-users] Documenting #included files
>Could anyone (Dimitri?) tell me if it is possible to get Doxygen to 
document
>the contents of a file that is #included inside another file?
Currently, the only way to force include files to get documented is by 
opening them inside a curly-brace '{}' pair. My guess is that this 
should work, but I didn't actually test it:
class class1
{
#include "the_rest_of_the_class_declaration"
};
class class2
{
#include "the_rest_of_the_class_declaration"
};
I have been working on a few new doxygen commands to force it to 
preprocess include-files, but I'm so busy that the project is on hold 
for now.
By the way, if you want to macro-hack templates, why don't you try 
something like this (doxygen will understand this I think):
#define DECLARE_ARRAY_CLASS(type) \
class type##_array \
{ \
	type##_array() { ... } \
     ~type##_array() { ... } \
\
	type operator[](int index) { ... } \
	...etc... \
};
DECLARE_ARRAY_CLASS(int) // declare int_array and all its methods
DECLARE_ARRAY_CLASS(char) // declare char_array and all its methods
===Jac
_______________________________________________
Doxygen-users mailing list
Dox...@li...
http://lists.sourceforge.net/lists/listinfo/doxygen-users
 | 
| 
      
      
      From: Jac G. <ja...@ma...> - 2001-05-02 21:27:51
      
     | 
| >Could anyone (Dimitri?) tell me if it is possible to get Doxygen to 
document
>the contents of a file that is #included inside another file?
Currently, the only way to force include files to get documented is by 
opening them inside a curly-brace '{}' pair. My guess is that this 
should work, but I didn't actually test it:
class class1
{
#include "the_rest_of_the_class_declaration"
};
class class2
{
#include "the_rest_of_the_class_declaration"
};
I have been working on a few new doxygen commands to force it to 
preprocess include-files, but I'm so busy that the project is on hold 
for now.
By the way, if you want to macro-hack templates, why don't you try 
something like this (doxygen will understand this I think):
#define DECLARE_ARRAY_CLASS(type) \
class type##_array \
{ \
	type##_array() { ... } \
     ~type##_array() { ... } \
\
	type operator[](int index) { ... } \
	...etc... \
};
DECLARE_ARRAY_CLASS(int) // declare int_array and all its methods
DECLARE_ARRAY_CLASS(char) // declare char_array and all its methods
===Jac
 | 
| 
      
      
      From: Trevor R. <Tre...@pe...> - 2001-05-02 21:02:24
      
     | 
| Hello,
Could anyone (Dimitri?) tell me if it is possible to get Doxygen to document
the contents of a file that is #included inside another file?
Specifically, I need to include a header multiple times, but with different
#defined placeholders.  Basically, I'm trying to emulate a class template
with a macro "hack" (as in the pre-template days).  I know it's evil, but
I'm writing a portability library, and many of our tools are deficient in
handling templates.  For example, Visual C++ 6 has so many caveats (some
documented, some not) on exporting template instantiations through a DLL
that it's effectively incapable of it.  Also, the Visual Studio debugger
apparently doesn't understand polymorphic templates.  (It will show you the
derived class of an object through a base class pointer for a normal class,
but not for template classes.)
Anyway, here's an example.  I want to see both CPSAbstractByteBuffer and
CPSAbstractCharBuffer documented, but not PS_ABSTRACT_T_BUFFER.
psabstractbuffer.h:
/**
 * Abstract dynamic buffer class.
 */
class PSCL_IMPEXP PS_ABSTRACT_T_BUFFER : public CPSObject
{
public:
    virtual const T* GetData() const = 0;
...
};
psbuffer.h:
#define T                               PS_BYTE
#define PS_ABSTRACT_T_BUFFER            CPSAbstractByteBuffer
#include "psabstractbuffer.h"
#undef T
#undef PS_ABSTRACT_T_BUFFER
#define T                               PS_CHAR
#define PS_ABSTRACT_T_BUFFER            CPSAbstractCharBuffer
#include "psabstractbuffer.h"
#undef T
#undef PS_ABSTRACT_T_BUFFER
If Doxygen doesn't do this now, does anyone agree that it would be nice to
have some way of doing this?  Maybe a \docinclude special command?  Not
because you want to emulate class templates necessarily, but because you
might like to make it appear that a header contains definitions that it
incidentally #includes from other files.  The end user only cares about what
header he should include to get those definitions, and should be insulated
from how the designer chooses to divide up his files.  Of course, the way
Doxygen works now is the best default.
Thanks,
Trevor
 | 
| 
      
      
      From: Prikryl,Petr <PRI...@sk...> - 2001-05-02 10:43:08
      
     | 
| The reason is that Makefile.libdoxygen assumes the existence of config.cpp, but the file is to be generated later via Makefile.libdoxycfg. I have solved the problem by switching the order of lines 18 and 19 in doxygen/src/Makefile.in. Then, you have to start make from the root (to let the perl generate real makefiles). I have already sent this directly to Dimitri. Petr -- Petr Prikryl, SKIL, spol. s r.o., pri...@sk... > -----Original Message----- > From: Walter F.J. Mueller [SMTP:W.F...@gs...] > Sent: Wednesday, May 02, 2001 11:06 AM > To: dox...@li... > Subject: [Doxygen-users] CVS snapshot of doxygen-1.2.7 and config.cpp > > Hi, > > using the newest CVS snapshot (now doxygen-1.2.7) under Linux I get after > a > > ./configure --prefix ... > make > > the error > > gmake[1]: *** No rule to make target `config.cpp', > needed by `../objects/config.o'. Stop. > > > Looking into Makefile.libdoxygen I see that there is no rule > to produce config.cpp from config.l . Doing manually a > > lex -PconfigYY -t config.l > config.cpp > > in the src directory fixed this and I could successfully build doxygen. > > I guess that there is a glitch in one files steering the Makefile > creation. > > > Cheers, Walter > > -- > Walter F.J. Mueller Mail: W.F...@gs... > GSI, Abteilung KP3 Phone: +49-6159-71-2766 > D-64291 Darmstadt FAX: +49-6159-71-2989 > WWW: http://www-kp3.gsi.de/www/kp3/people/mueller.html > > _______________________________________________ > Doxygen-users mailing list > Dox...@li... > http://lists.sourceforge.net/lists/listinfo/doxygen-users | 
| 
      
      
      From: Roberto B. <ba...@cs...> - 2001-05-02 09:34:11
      
     | 
| Hi there,
I have just upgraded from 1.2.6 to 1.2.7.
A first observation is that all the diagrams have disappeared:
the caption is there, i.e., "Collaboration diagram for A:",
the graph legend is there, but the collaboration diagram
is missing (I have also checked the HTML source: it is not there).
What am I missing?
All the best,
     Roberto
-- 
Roberto Bagnara
Computer Science Group
Department of Mathematics, University of Parma, Italy
http://www.cs.unipr.it/~bagnara/
mailto:ba...@cs...
 | 
| 
      
      
      From: Walter F.J. M. <W.F...@gs...> - 2001-05-02 09:06:02
      
     | 
| Hi, using the newest CVS snapshot (now doxygen-1.2.7) under Linux I get after a ./configure --prefix ... make the error gmake[1]: *** No rule to make target `config.cpp', needed by `../objects/config.o'. Stop. Looking into Makefile.libdoxygen I see that there is no rule to produce config.cpp from config.l . Doing manually a lex -PconfigYY -t config.l > config.cpp in the src directory fixed this and I could successfully build doxygen. I guess that there is a glitch in one files steering the Makefile creation. Cheers, Walter -- Walter F.J. Mueller Mail: W.F...@gs... GSI, Abteilung KP3 Phone: +49-6159-71-2766 D-64291 Darmstadt FAX: +49-6159-71-2989 WWW: http://www-kp3.gsi.de/www/kp3/people/mueller.html | 
| 
      
      
      From: Dimitri v. H. <di...@st...> - 2001-04-30 18:42:53
      
     | 
| Hi,
Here what has changed since last CVS update:
------------------------------------------------------------------------------
+ CHG: Changed the way the translators work internally (thanks to Petr
       Prikryl for ideas and code) and updated the documentation regarding
       language support and maintenance.
       Users of languages other than English will get a warning message if
       the translation for their language is not up to date.
+ ADD: Included language updates for Croatian and Czech.
+ ADD: Added new command \addtogroup that can be used to extend a group
       defined with \defgroup with extra members and/or documentation.
+ BUG: Email addresses in the docs starting with an "a" and put inside sharp
       brackets were not properly displayed (thanks to Abramo Bagnara for
       the fix).
+ BUG: Merged man page generator patch send by Patrick Ohly. It fixes:
       - Font changes reset the font with \fR to roman,
         which is often not correct - using \fP for the
         previous font is better.
       - The arguments of .SS and .SH were not quoted,
         which seemed to work under Linux with groff,
         but not under Solaris.
       - Using a double quotation mark within the text
         broke the quotation used in the man page markup.
         I found no way to correctly escape the double
         quotes, so I replace them with single quotes.
------------------------------------------------------------------------------
Enjoy,
  Dimitri
 |