]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/HelpGen/src/HelpGen.cpp
Since this class is fully inline don't specify an import/export policy
[wxWidgets.git] / utils / HelpGen / src / HelpGen.cpp
index a038adc5ee4c0da57ddba3aa89bfcbfbf52dbc2a..3f8541a125f1295c8d6dfea6683190fc433c3643 100644 (file)
 // wxWindows
 #include "wx/wxprec.h"
 
-#if wxUSE_GUI
-    #error "This is a console program and can be only compiled using wxBase"
-#endif
-
 #ifndef WX_PRECOMP
     #include "wx/string.h"
     #include "wx/log.h"
     #include "wx/dynarray.h"
-    #include "wx/wx.h"
+    #include "wx/app.h"
 #endif // WX_PRECOMP
 
 #include "wx/file.h"
 #include "wx/regex.h"
+#include "wx/hash.h"
 
 // C++ parsing classes
 #include "cjparser.h"
 #undef GetCurrentTime
 #endif
 
-// -----------------------------------------------------------------------------
-// global vars
-// -----------------------------------------------------------------------------
-
-class HelpGenApp: public wxApp
-{
-public:
-    HelpGenApp() {};
-
-    // don't let wxWin parse our cmd line, we do it ourselves
-    virtual bool OnInit() { return TRUE; }
-
-    virtual int OnRun();
-};
-
-// IMPLEMENT_APP(HelpGenApp);
-
 // -----------------------------------------------------------------------------
 // private functions
 // -----------------------------------------------------------------------------
@@ -280,8 +260,10 @@ protected:
                                         IgnoreListEntry *second);
 
     // for efficiency, let's sort it
+public: // FIXME: macro requires it
     WX_DEFINE_SORTED_ARRAY(IgnoreListEntry *, ArrayNamesToIgnore);
 
+protected:
     ArrayNamesToIgnore m_ignore;
 
 private:
@@ -457,6 +439,8 @@ protected:
         wxString m_type;
     };
 
+    friend class ParamInfo; // for access to TypeInfo
+
     // info abotu a function parameter
     class ParamInfo
     {
@@ -478,6 +462,7 @@ protected:
         wxString m_value;     // default value
     };
 
+public: // FIXME: macro requires it
     WX_DEFINE_ARRAY(ParamInfo *, ArrayParamInfo);
 
     // info about a function
@@ -523,6 +508,7 @@ protected:
     WX_DEFINE_ARRAY(MethodInfo *, ArrayMethodInfo);
     WX_DEFINE_ARRAY(ArrayMethodInfo *, ArrayMethodInfos);
 
+private:
     // first array contains the names of all classes we found, the second has a
     // pointer to the array of methods of the given class at the same index as
     // the class name appears in m_classes
@@ -541,10 +527,12 @@ private:
 // implementation
 // =============================================================================
 
+static char **g_argv = NULL;
+
 // this function never returns
 static void usage()
 {
-    wxString prog = wxTheApp->argv[0];
+    wxString prog = g_argv[0];
     wxString basename = prog.AfterLast('/');
 #ifdef __WXMSW__
     if ( !basename )
@@ -580,8 +568,18 @@ static void usage()
     exit(1);
 }
 
-int HelpGenApp::OnRun()
+int main(int argc, char **argv)
 {
+    g_argv = argv;
+
+    wxInitializer initializer;
+    if ( !initializer )
+    {
+        fprintf(stderr, "Failed to initialize the wxWindows library, aborting.");
+
+        return -1;
+    }
+
     enum
     {
         Mode_None,
@@ -787,21 +785,6 @@ int HelpGenApp::OnRun()
     return 0;
 }
 
-int main(int argc, char **argv)
-{
-    wxInitializer initializer;
-    if ( !initializer )
-    {
-        fprintf(stderr, "Failed to initialize the wxWindows library, aborting.");
-
-        return -1;
-    }
-       HelpGenApp app;
-       app.argc = argc;
-       app.argv = argv;
-       return app.OnRun();
-}
-
 // -----------------------------------------------------------------------------
 // HelpGenVisitor implementation
 // -----------------------------------------------------------------------------
@@ -893,13 +876,43 @@ void HelpGenVisitor::CloseFunction()
 
 void HelpGenVisitor::CloseClass()
 {
+       CloseFunction();
+
     if ( m_inClass ) {
         size_t count = m_arrayFuncDocs.GetCount();
         if ( count ) {
+                       size_t n;
             FunctionDocEntry::classname = m_classname;
+
             m_arrayFuncDocs.Sort(FunctionDocEntry::Compare);
 
-            for ( size_t n = 0; n < count; n++ ) {
+                       // Now examine each first line and if it's been seen, cut it
+                       // off (it's a duplicate \membersection)
+                       wxHashTable membersections(wxKEY_STRING);
+
+            for ( n = 0; n < count; n++ )
+                       {
+                wxString section(m_arrayFuncDocs[n].text);
+
+                               // Strip leading whitespace
+                               int pos = section.Find("\\membersection");
+                               if (pos > -1)
+                               {
+                                       section = section.Mid(pos);
+                               }
+
+                               wxString ms(section.BeforeFirst(wxT('\n')));
+                               if (membersections.Get(ms))
+                               {
+                                       m_arrayFuncDocs[n].text = section.AfterFirst(wxT('\n'));
+                               }
+                               else
+                               {
+                                       membersections.Put(ms, & membersections);
+                               }
+            }
+
+            for ( n = 0; n < count; n++ ) {
                 m_file.WriteTeX(m_arrayFuncDocs[n].text);
             }
 
@@ -1109,6 +1122,12 @@ void HelpGenVisitor::VisitClass( spClass& cl )
     }
     totalText << derived << "\n\n";
 
+    // include file section
+    wxString includeFile = "\\wxheading{Include files}\n\n";
+    includeFile << "<" << m_fileHeader << ">";
+
+    totalText << includeFile << "\n\n";
+
     // write all this to file
     m_file.WriteTeX(totalText);
 
@@ -1117,7 +1136,7 @@ void HelpGenVisitor::VisitClass( spClass& cl )
     InsertTypedefDocs();
     InsertEnumDocs();
 
-       m_file.Flush();
+       //m_file.Flush();
 }
 
 void HelpGenVisitor::VisitEnumeration( spEnumeration& en )
@@ -1259,21 +1278,24 @@ void HelpGenVisitor::VisitOperation( spOperation& op )
 
     // check for the special case of dtor
     wxString dtor;
-    if ( (funcname[0] == '~') && (m_classname == funcname.c_str() + 1) ) {
+    if ( (funcname[0u] == '~') && (m_classname == funcname.c_str() + 1) ) {
         dtor.Printf("\\destruct{%s}", m_classname.c_str());
         funcname = dtor;
     }
 
-    m_textFunc.Printf("\n"
-                      "\\membersection{%s::%s}\\label{%s}\n"
-                      "\n"
+       m_textFunc.Printf("\n"
+               "\\membersection{%s::%s}\\label{%s}\n",
+               m_classname.c_str(), funcname.c_str(),
+               MakeLabel(m_classname, funcname).c_str());
+
+       wxString func;
+       func.Printf("\n"
                       "\\%sfunc{%s%s}{%s}{",
-                      m_classname.c_str(), funcname.c_str(),
-                      MakeLabel(m_classname, funcname).c_str(),
                       op.mIsConstant ? "const" : "",
                       op.mIsVirtual ? "virtual " : "",
                       op.mRetType.c_str(),
                       funcname.c_str());
+       m_textFunc += func;
 }
 
 void HelpGenVisitor::VisitParameter( spParameter& param )
@@ -2113,7 +2135,7 @@ static void TeXUnfilter(wxString* str)
 
     // undo TeXFilter
     static wxRegEx reNonSpecialSpecials("\\\\([#$%&_{}])"),
-                   reAccents("\\\\verb|([~^])|");
+                   reAccents("\\\\verb\\|([~^])\\|");
 
     reNonSpecialSpecials.ReplaceAll(str, "\\1");
     reAccents.ReplaceAll(str, "\\1");
@@ -2163,6 +2185,31 @@ static const wxString GetVersionString()
 
 /*
    $Log$
+   Revision 1.27  2003/10/13 17:21:30  MBN
+     Compilation fixes.
+
+   Revision 1.26  2003/09/29 15:18:35  MBN
+     (Blind) compilation fix for Sun compiler.
+
+   Revision 1.25  2003/09/03 17:39:27  MBN
+     Compilation fixes.
+
+   Revision 1.24  2003/08/13 22:59:37  VZ
+   compilation fix
+
+   Revision 1.23  2003/06/13 17:05:43  VZ
+   quote '|' inside regexes (fixes dump mode); fixed crash due to strange HelpGenApp code
+
+   Revision 1.22  2002/01/21 21:18:50  JS
+   Now adds 'include file' heading
+
+   Revision 1.21  2002/01/04 11:06:09  JS
+   Fixed missing membersections bug and also bug with functions not being written
+   in the right class
+
+   Revision 1.20  2002/01/03 14:23:33  JS
+   Added code to make it not duplicate membersections for overloaded functions
+
    Revision 1.19  2002/01/03 13:34:12  JS
    Added FlushAll to CloseClass, otherwise text was only flushed right at the end,
    and appeared in one file.