]> git.saurik.com Git - wxWidgets.git/commitdiff
Made HelpGen into a wxWin app (still uses command-line args); moved includes
authorJulian Smart <julian@anthemion.co.uk>
Mon, 13 Sep 1999 14:29:41 +0000 (14:29 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Mon, 13 Sep 1999 14:29:41 +0000 (14:29 +0000)
into src for simplicity; added VC++ 5 project file

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3642 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

24 files changed:
utils/HelpGen/include/cjparser.h [deleted file]
utils/HelpGen/include/docripper.h [deleted file]
utils/HelpGen/include/ifcontext.h [deleted file]
utils/HelpGen/include/markup.h [deleted file]
utils/HelpGen/include/scriptbinder.h [deleted file]
utils/HelpGen/include/sourcepainter.h [deleted file]
utils/HelpGen/include/srcparser.h [deleted file]
utils/HelpGen/include/wxstlac.h [deleted file]
utils/HelpGen/include/wxstllst.h [deleted file]
utils/HelpGen/include/wxstlvec.h [deleted file]
utils/HelpGen/src/HelpGen.cpp
utils/HelpGen/src/HelpGen.rc
utils/HelpGen/src/cjparser.h [new file with mode: 0644]
utils/HelpGen/src/docripper.h [new file with mode: 0644]
utils/HelpGen/src/ifcontext.h [new file with mode: 0644]
utils/HelpGen/src/makefile.nt [deleted file]
utils/HelpGen/src/markup.h [new file with mode: 0644]
utils/HelpGen/src/scriptbinder.h [new file with mode: 0644]
utils/HelpGen/src/sourcepainter.cpp
utils/HelpGen/src/sourcepainter.h [new file with mode: 0644]
utils/HelpGen/src/srcparser.h [new file with mode: 0644]
utils/HelpGen/src/wxstlac.h [new file with mode: 0644]
utils/HelpGen/src/wxstllst.h [new file with mode: 0644]
utils/HelpGen/src/wxstlvec.h [new file with mode: 0644]

diff --git a/utils/HelpGen/include/cjparser.h b/utils/HelpGen/include/cjparser.h
deleted file mode 100644 (file)
index 384b2b1..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name:        No names yet.
-// Purpose:     Implementation of C++/Java parser
-//              compatible with SourceParserBase interface
-// Author:      Aleksandras Gluchovas
-// Modified by:
-// Created:     22/09/98
-// RCS-ID:      $Id$
-// Copyright:   (c) Aleskandars Gluchovas
-// Licence:       wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef __CJPARSESR_G__
-#define __CJPARSESR_G__
-
-#include "srcparser.h"
-
-#include <iostream.h>
-#include <memory.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-// class parses given "memory-resident" Java or C++ source code
-// and captures information about classes/attrubutes/methods/
-// arguments/etc into structures. Conforms with SourceParserBase
-// interface requirements.
-
-class CJSourceParser : public SourceParserBase
-{
-protected:
-    // begining of the full-text area of the source file
-    char* mpStart;
-
-    // points to first character after the end
-    // of teh full-text area
-    char* mpEnd;
-
-    // current "privacy level"
-    int   mCurVis;
-
-    // current parsing position int full-text area
-    char*  cur;
-
-    // about the current class
-    bool   mIsVirtual;
-    bool   mIsTemplate;
-    size_t mNestingLevel;
-
-    // context data for which is currently being collected
-    spContext* mpCurCtx;
-
-    int mCurCtxType; // type of the current context
-
-    bool mCommentsOn;
-    bool mMacrosOn;
-
-protected:
-
-    void AttachComments( spContext& ctx, char* cur );
-    void ParseKeyword( char*& cur );
-    bool ParseNameAndRetVal( char*& cur, bool& isAMacro );
-    bool ParseArguments( char*& cur );
-    void ParseMemberVar( char*& cur );
-    void SkipFunction( char*& cur );
-    void SkipFunctionBody( char*& cur );
-    bool CheckVisibilty( char*& cur );
-
-    void AddClassNode( char*& cur );
-    void AddMacroNode( char*& cur );
-    void AddEnumNode( char*& cur );
-    void AddTypeDefNode( char*& cur );
-
-    void DumpOperationInfo( spOperation& info, const string& tab, ostream& os );
-    void DumpClassHeader( spClass& info, ostream& os );
-    void DumpClassBody( spClass& info, ostream& os );
-
-public:
-
-    // NOTE:: discarding of macros or comments improves performance and
-    //          decreases memory usage
-
-    CJSourceParser(bool collectCommnets = 1,
-                   bool collectMacros   = 1);
-
-    // returns the root-node of the created context tree
-    // (user is responsible for releasing it from the heep)
-    // "end" should point to the last (character + 1) of the
-    // source text
-
-    virtual spFile* Parse( char* start, char* end );
-};
-
-// inline'ed helpers used (just info):
-/*
-static inline void skip_to_eol( char*& cur );
-static inline void skip_eol( char*& cur );
-static inline bool skip_to_next_comment_in_the_line( char*& cur );
-static void skip_to_prev_line( char*& cur );
-static inline void skip_comments( char*& cur );
-static inline void clear_commets_queue();
-static inline void skip_quoted_string( char*& cur );
-static inline bool get_next_token( char*& cur );
-static inline void skip_preprocessor_dir( char*& cur );
-static void skip_token( char*& cur );
-static inline size_t get_token_len( char* tok );
-static inline bool cmp_tokens( char* tok1, char* tok2 );
-static inline bool cmp_tokens_fast( char* tok1, char* tok2, size_t len );
-static inline void skip_tempalate_statement( char*& cur );
-static inline void skip_statement( char*& cur );
-static inline void skip_token_back( char*& cur );
-static inline void skip_next_token_back( char*& cur );
-static string get_token_str( char* cur );
-static size_t skip_block( char*& cur );
-static inline bool skip_imp_block( char*& cur );
-static bool is_class_token( char*& cur );
-inline static bool is_forward_decl( char* cur );
-inline static bool is_function( char* cur, bool& isAMacro );
-static inline void skip_scope_block( char*& cur );
-static void arrange_indirection_tokens_between( string& type, string& identifier );
-static bool is_keyword( char* cur );
-static inline void get_string_between( char* start, char* end, string* pStr );
-static char* set_comment_text( string& text, char* start );
-*/
-
-#endif
diff --git a/utils/HelpGen/include/docripper.h b/utils/HelpGen/include/docripper.h
deleted file mode 100644 (file)
index 23ae9ac..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name:        No names yet.
-// Purpose:     Contrib. demo
-// Author:      Aleksandras Gluchovas
-// Modified by:
-// Created:     22/09/98
-// RCS-ID:      $Id$
-// Copyright:   (c) Aleskandars Gluchovas
-// Licence:    wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef __DOCRIPPER_G__
-#define __DOCRIPPER_G__
-
-#include "scriptbinder.h"
-#include "srcparser.h"
-#include "sourcepainter.h"
-
-#if defined( wxUSE_TEMPLATE_STL )
-               
-       #include <vector>
-
-       typedef vector<ScriptTemplate*> STemplateListT;
-
-#else
-
-       #include "wxstlvec.h"
-
-       typedef ScriptTemplate* ScriptTemplatePtrT; 
-       typedef WXSTL_VECTOR_SHALLOW_COPY(ScriptTemplatePtrT) STemplateListT;
-
-#endif
-
-
-// specific DocGenerator class for "Ripper", 
-// also acts as source code visitor
-
-class RipperDocGen : public DocGeneratorBase, public spVisitor
-{
-protected:
-       // templates for various sections
-       ScriptTemplate mTopTempl;
-       ScriptTemplate mContentIdxTempl;
-       ScriptTemplate mSuperContentTempl;
-       ScriptTemplate mSubContentTempl;
-       ScriptTemplate mOutLineTempl;
-       ScriptTemplate mOutLine1Templ;
-
-       // template used for corss-references
-       ScriptTemplate mRefTempl;
-
-       // template used to show not-existing sections
-       ScriptTemplate mDeadRefTempl;
-
-       // template collection for generation of class-tree
-       STemplateListT mTreeTemplates;
-
-       // pointers to all major index sections
-       ScriptSection* mpTopIdx;
-       ScriptSection* mpClassIdx;
-       ScriptSection* mpEnumIdx;
-       ScriptSection* mpTypeDefIdx;
-       ScriptSection* mpMacroIdx;
-       ScriptSection* mpGlobalVarsIdx;
-       ScriptSection* mpGlobalFuncIdx;
-       ScriptSection* mpConstIdx;
-
-       // parser set up from user-code for sepcific language
-       SourceParserBase* mpParser;
-
-       // class section, which is currently being
-       // assembled
-       ScriptSection*    mpCurClassSect;
-       
-       // source syntax heighlighter object
-       SourcePainter  mSrcPainter;
-
-       // context, to which all file contexts
-       // are assembled
-       spContext*     mpFileBinderCtx;
-
-       // script tags set up from usesr code
-       MarkupTagsT    mTags;
-
-protected:
-       // helpers
-       void AppendComments( spContext& fromContext, string& str );
-
-       void AppendMulitilineStr( string& st, string& mlStr );
-
-       void AppendHighlightedSource( string& st, string source );
-
-       // returns TRUE, if no comments found in the context,
-       // plus, creates dummy(empty) section, and puts a 
-       // reference woth "dead-link" template to it in the 
-       // given index-section "toSect"
-
-       bool CheckIfUncommented( spContext& ctx, ScriptSection& toSect );
-
-       // checks if context has any comments, then returns
-       // template of normal reference, otherwise of dead reference
-
-       ScriptTemplate* GetRefTemplFor( spContext& ctx );
-
-       // adds "someClass::" perfix to the context name,
-       // if it's not in the file scope (i.e. if it's not global)
-
-       string GetScopedName( spContext& ofCtx );
-
-       // adds section to currently assembled class section
-       // and places references to it from "public", "protected"
-       // or "private" indexing-subsections of the class, depending
-       // on the visibility of the context
-
-       void AddToCurrentClass( ScriptSection* pSection, spContext& ctx, 
-                                                       const char* subSectionName );
-
-       // called, after all files are processed, to
-       // resolve possible super/derived class relations,
-       // and put cross references to them - where resolution was
-       // successful
-       void LinkSuperClassRefs();
-
-       // implementations of "visiting procedures", declared in spVisitor
-
-       virtual void VisitClass( spClass& cl );
-       virtual void VisitEnumeration( spEnumeration& en );
-       virtual void VisitTypeDef( spTypeDef& td );
-       virtual void VisitPreprocessorLine( spPreprocessorLine& pd );
-       virtual void VisitAttribute( spAttribute& attr );
-       virtual void VisitOperation( spOperation& op );
-
-       // overriden member of DocGernatorBase
-
-       virtual bool OnSaveDocument( ScriptStream& stm );
-
-       virtual ScriptSection* GetTopSection() 
-               { return mpTopIdx; }
-
-public:
-       RipperDocGen();
-       ~RipperDocGen();
-
-       // should be called onece to set user-code provided,
-       // parser for specific source code language
-       // (NOTE:: it's the user-code's responsibility to
-       //  relseas memory of pParser)
-
-       void Init( SourceParserBase* pParser );
-       
-       // should be called on each file
-       
-       void ProcessFile( const char* sourceFile );
-};
-
-
-#endif
\ No newline at end of file
diff --git a/utils/HelpGen/include/ifcontext.h b/utils/HelpGen/include/ifcontext.h
deleted file mode 100644 (file)
index 80014c8..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name:        No names yet.
-// Purpose:     Contrib. demo
-// Author:      Aleksandras Gluchovas
-// Modified by:
-// Created:     27/12/98
-// RCS-ID:      $Id$
-// Copyright:   (c) Aleskandars Gluchovas
-// Licence:    wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef __IFCONTEXT_G__
-#define __IFCONTEXT_G__
-
-#include "srcparser.h"
-#include "cjparser.h"
-
-class spBookmark
-{
-public:
-       size_t mFrom;
-       size_t mLen;
-       size_t mFileNo;
-
-       inline spBookmark() {}
-
-       inline spBookmark( int from, int len, int fileNo )
-               : mFrom( from ), mLen( len ), mFileNo( fileNo )
-       {}
-};
-
-#if defined( wxUSE_TEMPLATE_STL )
-
-       typedef vector<spBookmark) BookmarkListT
-
-#else
-
-       typedef WXSTL_VECTOR_SHALLOW_COPY(spBookmark) BookmarkListT;
-
-#endif
-
-
-class spInterFileContext : public spContext
-{
-protected:
-
-       BookmarkListT  mDeletionMarks;
-
-       BookmarkListT  mFiltered;
-
-       size_t         mCurFileNo;
-
-       CJSourceParser mParser;
-
-protected:
-
-       size_t GetFileNoOfContext( spContext& ctx );
-       size_t GetFileNo( const string& fname );
-
-       void InsertBookmarkSorted( BookmarkListT& lst, spBookmark& mark );
-
-       void DoAppendSourceFragment( string& source, 
-                                                                string& result, 
-                                                        size_t  pos, size_t len );
-
-       void GenerateContextBody( spContext& ctx, 
-                                                         string&    source,
-                                                         string&    result, 
-                                                         size_t& lastSavedPos,
-                                                         size_t& lastKnownPos );
-
-public:
-
-       StrListT       mFiles;
-       StrListT       mContents;
-
-public:
-
-       spInterFileContext();
-       ~spInterFileContext();
-
-       void AddFile( const string& fname, const string& content );
-
-       void RemoveContext( spContext& ctx );
-
-       void GenrateContents();
-
-       void ParseContents( SourceParserPlugin* pPlugin = NULL );
-
-       void WriteToFiles();
-
-       // overriden method of the base class (finds out the source fragment)
-
-       virtual string GetBody( spContext* pCtx = NULL );
-
-       virtual string GetHeader( spContext* pCtx = NULL );
-};
-
-
-#endif
\ No newline at end of file
diff --git a/utils/HelpGen/include/markup.h b/utils/HelpGen/include/markup.h
deleted file mode 100644 (file)
index 13e43a0..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name:        No names yet.
-// Purpose:     Contrib. demo
-// Author:      Aleksandras Gluchovas
-// Modified by:
-// Created:     22/09/98
-// RCS-ID:      $Id$
-// Copyright:   (c) Aleskandars Gluchovas
-// Licence:    wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef __MARKUP_G__
-#define __MARKUP_G__
-
-// indicies for the MarkupTagsT array
-
-#define TAG_BOLD        0
-#define TAG_ITALIC             1
-
-#define TAG_FIXED_FONT  2
-#define TAG_BLACK_FONT 3
-#define TAG_RED_FONT   4
-#define TAG_GREEN_FONT 5
-#define TAG_BLUE_FONT  6
-
-#define TAG_PARAGRAPH  7
-#define TAG_NEW_LINE   8
-#define TAG_HEADING_1  9
-#define TAG_HEADING_2  10
-#define TAG_HEADING_3   11
-
-#define TAG_ITEM_LIST   12
-#define TAG_LIST_ITEM   13 
-
-struct TagStructT
-{
-       char* start; // tag that starts style
-       char* end;   // tag that finishes style
-};
-
-// tag array
-typedef TagStructT* MarkupTagsT;
-
-// returns array of TagStructT with tag strings for HTML
-
-MarkupTagsT get_HTML_markup_tags();
-
-// MarkupTagsT get_PostScript_markup_tags();
-// MarkupTagsT get_Latex_markup_tags();
-
-#endif
\ No newline at end of file
diff --git a/utils/HelpGen/include/scriptbinder.h b/utils/HelpGen/include/scriptbinder.h
deleted file mode 100644 (file)
index 17c52ff..0000000
+++ /dev/null
@@ -1,377 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name:        No names yet.
-// Purpose:     Contrib. demo
-// Author:      Aleksandras Gluchovas
-// Modified by:
-// Created:     22/09/98
-// RCS-ID:      $Id$
-// Copyright:   (c) Aleskandars Gluchovas
-// Licence:    wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef __SCRIPTBINDER_G__
-#define __SCRIPTBINDER_G__
-
-#if defined( wxUSE_TEMPLATE_STL )
-
-       #include <vector>
-
-       #ifdef WIN32
-               #include <bstring.h>
-       #else
-               #include <strclass.h>
-               #include <string.h>
-       #endif
-
-#else
-
-       #include "wxstlvec.h"
-       #include "wx/string.h"
-       
-       // FIXME:: dirty!
-       typedef wxString string;
-
-#endif
-
-#ifndef ASSERT
-// assert yourself
-#define ASSERT(x) if (!(x) ) throw;
-#endif
-
-#include "markup.h"
-
-// just another portable stream class...
-
-class ScriptStream
-{
-protected:
-       char*  mpBuf;
-       size_t mSize;
-       size_t mCapacity;
-public:
-       ScriptStream();
-       ~ScriptStream();
-
-       void WriteBytes( const void* srcBuf, size_t count );
-
-       ScriptStream& operator<<( const char* str );
-       ScriptStream& operator<<( const string& str );
-       ScriptStream& operator<<( char ch );
-
-       void endl();
-
-       inline char*  GetBuf() { return mpBuf; }
-       inline size_t GetBufSize() { return mSize; }
-
-       // clears current contents of the stream
-       void Reset() { mSize = 0; }
-};
-
-
-class ScriptTemplate;
-
-// used internally by ScriptTemplate
-
-enum TEMPLATE_VARIABLE_TYPES
-{
-       TVAR_INTEGER,
-       TVAR_STRING,
-       TVAR_DOUBLE,
-       TVAR_REF_ARRAY
-};
-
-// helper structures used only by ScriptTemplate
-
-struct TVarInfo
-{
-public:
-       const char*             mName;
-       int                     mType;
-       int                     mOfs;
-
-       TVarInfo( const char* name, int ofs, int varType )
-               : mName(name),
-                 mType( varType ),
-                 mOfs( ofs )
-       {}
-};
-
-struct TArrayInfo : public TVarInfo
-{
-public:
-       int mRefOfs;
-       int mSizeIntOfs;
-       int mObjRefTemplOfs;
-
-       TArrayInfo( const char* name )
-               : TVarInfo( name, 0, TVAR_REF_ARRAY )
-       {}
-};
-
-// stores offset of the given member (of the given class)
-// to (*pOfs), though the use of template classes would have 
-// solved this problem in much clearer fashion
-
-// FOR NOW:: obtaining physical offset of class member
-//           does not appeare to be protable across compilers?
-// FIXME::   +/- 1 problem
-
-#ifdef __UNIX__
-       #define WEIRD_OFFSET 1
-#else
-       #define WEIRD_OFFSET 0
-
-#endif
-
-#define GET_VAR_OFS( className, varName, pOfs )          \
-       {                                                                                                        \
-               int* className::* varPtr;                                                \
-               varPtr = (int* className::*)&className::varName; \
-                                                                                                                \
-               (*pOfs) = int(*(int*)&varPtr)-WEIRD_OFFSET;                                      \
-       }
-
-class ScriptSection;
-
-#if defined( wxUSE_TEMPLATE_STL )
-
-       typedef vector<TVarInfo*> TVarListT;
-
-       // container class for sections
-       typedef vector<ScriptSection*> SectListT;
-
-#else
-
-       typedef TVarInfo*      TVarInfoPtrT;
-       typedef ScriptSection* ScriptSectionPtrT;
-
-       typedef WXSTL_VECTOR_SHALLOW_COPY(TVarInfoPtrT) TVarListT;
-
-       // container class for sections
-       typedef WXSTL_VECTOR_SHALLOW_COPY(ScriptSectionPtrT) SectListT;
-
-#endif
-
-// class performs preprocessing of arbitrary scripts,
-// replaces identifiers enclosed in $(..) tag, whith
-// values of the corresponding class member variables
-
-class ScriptTemplate
-{
-protected:
-       // do not use string object here - parsing of
-       // C string can be much faster (in debug v.)
-       char*     mTText; 
-                                     
-
-       TVarListT mVars;
-
-       inline void PrintVar( TVarInfo*  pInfo, 
-                                                 void*       dataObj, 
-                                                 ScriptStream& stm );
-       
-public:
-       ScriptTemplate( const string& templateText );
-       virtual ~ScriptTemplate();
-       
-       bool HasVar( const char* name );
-
-       // Member variables registration methods.
-
-       // NOTE:: GET_VAR_OFS() macro should be used
-       // to get offset of the class member (see #define above)
-       void AddStringVar ( const char* name, int ofs );
-       void AddIntegerVar( const char* name, int ofs );
-       void AddDoubleVar ( const char* name, int ofs );
-
-       void AddObjectRefArray( const char*     name,
-                                                       int                         ofsRefToFirstObj,
-                                   int                     ofsObjSizeInt,
-                                                       int                         ofsObjRefTempl
-                                                 );
-
-       // reads the script, replaces $(..) tags with values
-       // of registered members of dataObj object, and outputs
-       // the result to given text stream
-
-       void PrintScript( void* dataObj, ScriptStream& stm );
-};
-
-class ScriptSection;
-
-// class manages section and aggregated sections of
-// inter-linked documents
-
-class ScriptSection
-{
-protected:
-
-       // NOTE:: "$(NAME)", $(ID), "$(BODY)" and "$(REFLIST)" aree 
-       //        reseved template variables of ScriptSection 
-
-       // the below there members are registered to ScriptTemplate,
-       // GUID within the section tree (numeric)
-
-       ScriptSection*  mpParent;
-       string          mId;   // $(ID)      
-       string          mName; // $(NAME)      
-       string          mBody; // $(BODY)
-
-       // NULL, if this section is not aggregated anywhere
-
-       SectListT       mSubsections; // aggregated sectons
-       SectListT       mReferences;  // registered as $(REFLIST)
-
-       bool            mAutoHide;  // see autoHide arg, in constructor
-       bool            mSortOn;    // TRUE, if sort subsectons by naem
-
-       // tempalte for this section
-       ScriptTemplate* mpSectTempl;
-
-       // template used for links (or references) to this section
-       ScriptTemplate* mpRefTempl;
-       
-       // do not call destructor of this object,
-       // call RemoveRef() instead
-       int             mRefCount;
-
-       static int      mIdCounter;  // generator of GUIDs
-
-       // fields registered and used by ScriptTemplate object
-       void*           mRefFirst;
-       int             mArrSize;
-
-protected:
-       virtual void AddRef();
-       virtual void RemoveRef();
-       void DoRemoveEmptySections(int& nRemoved, SectListT& removedLst);
-       void DoRemoveDeadLinks( SectListT& removedLst);
-
-public:
-
-       // NOTE:: pass NULL to certain template, if your sure
-       //        this kind of template will never be used,
-       //        e.g. if section is contained but never referrenced,
-       //        then pReferenceTemplate can be NULL
-
-       // if autoHide option is TRUE, the section will be automatically
-       // collapsed (not shown) if it doesn't contain any references
-       // to other sections (e.g. could be usefull for autoamically 
-       // hiding empty index-sections). 
-
-       ScriptSection( const string&   name = "",
-                                  const string&   body = "",
-                                  ScriptTemplate* pSectionTemplate   = NULL,
-                                  ScriptTemplate* pReferenceTemplate = NULL,                      
-                                  bool            autoHide           = FALSE,
-                                  bool            sorted             = FALSE
-                                );
-
-       // calls RemoveRef() to all aggreagated sections first,
-       // then to all referenced section - this way all
-       // sections (even not aggregated ones) become "garbage-collected"
-
-       // NOTE:: do not call destructor directlly, call RemoveRef()
-       //        instead
-       virtual ~ScriptSection();
-
-
-       // if addToReferencesToo is TRUE, section is aggregated and
-       // also added to reference list of this section
-
-       void AddSection( ScriptSection* pSection, bool addToReferencesToo = FALSE );
-
-       // add cross-reference to this given section
-       void AddReference( ScriptSection* pReferredSection );
-
-       // subsection may be given of variable depth level,
-       // e.g. "publications/reviews/software"
-
-       ScriptSection* GetSubsection( const char* name );
-
-       // returns list aggregated sections
-       SectListT& GetSubsections();
-
-       // binds reserved template names ( $(..) ) to member 
-       // vairalbes in the ScriptSection class, should be called 
-       // to initialize each user-code provided script template
-
-       static void RegisterTemplate( ScriptTemplate& sectionTempalte );
-
-       // prints out section tree to the stream, starting from
-       // this section as a root node
-       virtual void Print( ScriptStream& stm );        
-
-       // searches empty sections which has autoHide == TRUE,
-       // and colapses them (this method should be called )
-       // on the root-section of the sections tree
-
-       // NOTE:: does not work properly, yet!
-       void RemoveEmptySections();
-};
-
-// base class for documnetation generators
-// (allows user code set up target script type,
-//  independently of documentation type)
-
-class DocGeneratorBase
-{
-protected:
-       MarkupTagsT    mTags;
-
-       // override this method to do some post processing
-       // after generation of document, or even write some
-       // data into output stream, before the section tree
-       // is flushed into it.
-
-       // return FALSE, if something has gone wrong and
-       // document cannot be saved now
-
-       virtual bool OnSaveDocument( ScriptStream& stm ) 
-               { return 1; }
-
-       // override this method to provide reference to
-       // the top section of the document (used as default
-       // starting section when saving a document)
-
-       virtual ScriptSection* GetTopSection() 
-               { return 0; }
-
-public:
-
-       DocGeneratorBase() 
-               : mTags(0) // no defaul script
-       {}
-
-       // dectrouctors of polymorphic classes SHOULD be virtual
-       virtual ~DocGeneratorBase() {}
-
-       // returns tags, being used for specific target script
-       MarkupTagsT GetScriptMarkupTags() { return mTags; }
-
-       // sets tag array for specific script
-
-       // NOTE:: Why virtual? since approach with MarkupTagsT is 
-       //        "flowless" only in theory. Overriding this method
-       //        allows document generators to check the type of the
-       //        target script, and perhaps make some modifications
-       //        to generator's tamplates, to match the specific script
-
-       virtual void SetScriptMarkupTags( MarkupTagsT tags )
-               { mTags = tags; }
-
-       // seves document to file starting from the root-node of
-       // the document (provided by GetTopSection() method),
-       // or from "pFromSection" if it's not NULL.
-
-       // fopenOptions arg. is string passed to fopen() method,
-       // returns TRUE, if saving was successfull
-
-       virtual bool SaveDocument( const char*    fname, 
-                                                          const char*    fopenOptions = "w",
-                                                          ScriptSection* pFromSection = NULL
-                                                          );
-                    
-};
-
-#endif
diff --git a/utils/HelpGen/include/sourcepainter.h b/utils/HelpGen/include/sourcepainter.h
deleted file mode 100644 (file)
index 333059a..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name:        No names yet.
-// Purpose:     Contrib. demo
-// Author:      Aleksandras Gluchovas
-// Modified by:
-// Created:     22/09/98
-// RCS-ID:      $Id$
-// Copyright:   (c) Aleskandars Gluchovas
-// Licence:    wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef __SOURCEPAINTER_G__
-#define __SOURCEPAINTER_G__
-
-#ifndef ASSERT
-#define ASSERT(x) if (!(x)) throw
-#endif
-
-#if defined( wxUSE_TEMPLATE_STL )
-
-       #include <vector.h>
-       typedef vector<int> SPBlockListT;
-
-       #ifdef WIN32
-               #include <bstring.h>
-       #else
-               #include <strclass.h>
-               #include <string.h>
-       #endif
-#else
-
-       #include "wxstlvec.h"
-       #include "wx/string.h"
-       
-       // FIXME:: dirty!
-       #define  string wxString
-
-       typedef WXSTL_VECTOR_SHALLOW_COPY(int) SPBlockListT;
-
-#endif
-
-#include "markup.h" // import MarkupTagsT definition
-
-// "colored" codes for highlighted blocks
-
-#define RANK_BLACK  0 // common source fragments
-#define RANK_BLUE   1 // basic types
-#define RANK_RED    2 // reserved words
-#define RANK_GREEN  3 // comments
-
-// colored block description format :
-// int( ( rank << 16 ) | ( source_range_len ) )
-
-
-// FOR NOW:: no lagnguage-map selection
-
-// source code syntax heighlighter (CPP+JAVA+VB+PASCAL)
-
-class SourcePainter
-{
-protected:
-       string            mResultStr;
-       SPBlockListT  mBlocks;
-       bool          mCollectResultsOn;
-
-       // state variables
-       bool        mIsInComment;
-       bool        mCommentIsMultiline;
-public:
-
-       // assembleResultString == TRUE - instructs painter
-       // to collect each chunk of srouce passed to ProcessSource(),
-       // so that results cann be futher obtained in a single string 
-       // instead of vector of block descriptions
-
-       SourcePainter( bool assembleResultString = TRUE );
-       virtual ~SourcePainter() {}
-
-       // can be called multiple times (e.g. on each source line)
-       void ProcessSource( char* src, int srcLen );
-
-       // method, for manually adjusting state of source painter
-       void SetState( bool isInComment,
-                          bool commentIsMultiline );
-
-       // reinitializes object - clears results of previouse processing
-       void Init( bool assembleResultString = TRUE );
-
-       // generates string of highlighted source for the scipting
-       // language given by "tags" argument
-       
-       virtual void GetResultString(string& result, MarkupTagsT tags);
-
-       // returns vector of block descriptors, see SPBlockListT definition
-       // (block descriptors can be used for fast custom hightlighted text generation)
-
-       SPBlockListT& GetBlocks();
-
-       // NOTE:: static method
-       // returns if the given word is a reserved word or basic type identifier
-       static bool IsKeyword( char* word, int wordLen );
-};
-
-#endif
diff --git a/utils/HelpGen/include/srcparser.h b/utils/HelpGen/include/srcparser.h
deleted file mode 100644 (file)
index 9eb017a..0000000
+++ /dev/null
@@ -1,769 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name:        No names yet.
-// Purpose:     To provide a simple _framework_
-//              for series of source code parsers with
-//              compatible interfaces
-// Author:      Aleksandras Gluchovas
-// Modified by: AG on 28/12/98
-// Created:     22/09/98
-// RCS-ID:      $Id$
-// Copyright:   (c) Aleskandars Gluchovas
-// Licence:       wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef __SRCPARSER_G__
-#define __SRCPARSER_G__
-
-#if defined( wxUSE_TEMPLATE_STL )
-    #include <vector>
-
-    #ifdef WIN32
-    #include <bstring.h>
-    #else
-
-    #include <strclass.h>
-    #include <string.h>
-
-    #endif
-
-#else
-    #include "wx/string.h"
-    #include "wxstlvec.h"
-
-    // FOR NOW:: quick n' dirty:
-
-    #define  string wxString
-
-#endif
-
-#include "markup.h" // markup tags used in spOperator::GetFullName()
-
-// these methods are used for debugging only and disappear in the release build
-#ifdef __WXDEBUG__
-    #define DECLARE_DUMP virtual void DumpThis(const wxString& indent) const;
-#else
-    #define DECLARE_DUMP
-#endif
-
-// context class list in "inside-out" order :
-
-class spContext;
-
-class spParameter;
-class spAttribute;
-class spOperation;
-class spEnumeration;
-class spTypeDef;
-class spPreprocessorLine;
-class spClass;
-class spNameSpace;
-class spFile;
-
-// source context visibilities
-enum SRC_VISIBLITY_TYPES
-{
-    SP_VIS_PUBLIC,
-    SP_VIS_PROTECTED,
-    SP_VIS_PRIVATE
-};
-
-// class types
-enum SP_CLASS_TYPES
-{
-    SP_CLTYPE_INVALID,
-    SP_CLTYPE_CLASS,
-    SP_CLTYPE_TEMPLATE_CLASS,
-    SP_CLTYPE_STRUCTURE,
-    SP_CLTYPE_UNION,
-    SP_CLTYPE_INTERFACE
-};
-
-// inheritance types
-enum SP_INHERITANCE_TYPES
-{
-    SP_INHERIT_VIRTUAL,
-    SP_INHERIT_PUBLIC,
-    SP_INHERIT_PRIVATE
-};
-
-// proprocessor definitions types (specific to C++ code)
-
-enum SP_PREP_DEFINITION_TYPES
-{
-    SP_PREP_DEF_DEFINE_SYMBOL,
-    SP_PREP_DEF_REDEFINE_SYMBOL,
-    SP_PREP_DEF_INCLUDE_FILE,
-    SP_PREP_DEF_OTHER
-};
-
-// common context types
-
-#define SP_CTX_UNKNOWN       0x000
-#define    SP_CTX_FILE          0x001
-#define    SP_CTX_NAMESPACE     0x002
-#define    SP_CTX_CLASS         0x004
-#define SP_CTX_TYPEDEF       0x008
-#define SP_CTX_PREPROCESSOR  0x010
-#define SP_CTX_ENUMERATION   0x020
-#define    SP_CTX_ATTRIBUTE     0x040
-#define    SP_CTX_OPERATION     0x080
-#define    SP_CTX_PARAMETER     0x100
-
-// other (custom) context codes may be defined elsewere, however they should
-// not clash with above codes for common type and also should not
-// exceed 16-bits of in value
-
-// masks all context types (up to 16 custom context can be defined)
-
-#define SP_CTX_ANY           0xFFFF
-
-class spComment;
-
-
-
-#if defined( wxUSE_TEMPLATE_STL )
-
-    // context members
-    typedef vector<spContext*> MMemberListT;
-    // comments list
-    typedef vector<spComment*> MCommentListT;
-    // list of parameters
-    typedef vector<spParameter*> MParamListT;
-    // string list
-    typedef vector<string>     StrListT;
-
-#else
-
-    typedef spContext*   spContextPtrT;
-    typedef spComment*   spCommentPtrT;
-    typedef spParameter* spParameterPtrT;
-    typedef WXSTL_VECTOR_SHALLOW_COPY(spContextPtrT)   MMemberListT;
-    typedef WXSTL_VECTOR_SHALLOW_COPY(spCommentPtrT)   MCommentListT;
-    typedef WXSTL_VECTOR_SHALLOW_COPY(spParameterPtrT) MParamListT;
-    typedef WXSTL_VECTOR_SHALLOW_COPY(string)          StrListT;
-
-#endif;
-// base class for all visitors of source code contents
-
-class spVisitor
-{
-protected:
-    bool mSiblingSkipped;
-    bool mChildSkipped;
-    int  mContextMask;
-
-    spContext* mpCurCxt;
-
-public:
-    // methods invoked by context
-
-    // method invoked from user's controling code
-    // to visit all nodes staring at the given context.
-    // Content is sorted if requrired, see comments
-    // spClass on sorting the class members
-
-    void VisitAll( spContext& atContext,
-                   bool sortContent = TRUE
-                 );
-
-    // methods invoked by visitor
-
-    // goes to the next context in the outter scope
-    // NOTE:: should not be invoked more than once while
-    //        visiting certain context
-
-    void SkipSiblings();
-
-    // prevents going down into the contexts contained by
-    // the current context
-    // NOTE:: the same as above
-
-    void SkipChildren();
-
-    // can be called only in from visiting procedure
-    void RemoveCurrentContext();
-
-    // method enables fast filtered traversal
-    // of source content, e.g. collecting only classes,
-    // or only global functions
-
-    // arg. context - can contain combination of contexts concatinated
-    //           with bitwise OR, e.g. SP_CTX_CLASS | SP_CTX_NAMESPACE
-    //
-    // method can be invoked from the user's controling as well as
-    // from within the visting procedure
-
-    void SetFilter( int contextMask );
-
-    // methods should be implemneted by specific visitor:
-
-    // NOTE:: Do not confuse visiting with parsing, first
-    //        the source is parsed, and than can be visited
-    //        multiple times by variouse visitors (there can
-    //        be more the one visitor visiting content at a time)
-
-    virtual void VisitFile( spFile& fl ) {}
-
-    virtual void VisitNameSpace( spNameSpace& ns ) {}
-
-    virtual void VisitClass( spClass& cl ) {}
-
-    virtual void VisitEnumeration( spEnumeration& en ) {}
-
-    virtual void VisitTypeDef( spTypeDef& td ) {}
-
-    virtual void VisitPreprocessorLine( spPreprocessorLine& pd ) {}
-
-    virtual void VisitAttribute( spAttribute& attr ) {}
-
-    virtual void VisitOperation( spOperation& op ) {}
-
-    virtual void VisitParameter( spParameter& param ) {}
-
-    virtual void VisitCustomContext( spContext& ctx ) {}
-};
-
-// stores one section of comments,
-// multiple sections can be put to geather
-// and attached to some context
-
-class spComment
-{
-public:
-    string mText;
-    bool   mIsMultiline; // multiline comments ar those with /**/'s
-
-    // TRUE, if these was an empty empty
-    // line above single line comment
-
-    bool   mStartsPar;
-
-public:
-
-    bool    IsMultiline() const;
-    bool    StartsParagraph() const;
-
-    string& GetText();
-
-    // contstant version of GetText()
-    string  GetText() const;
-};
-
-// abstract base class for common (to most languages) code
-// contexts (constructs), e.g file, namespace, class, operation,
-// etc
-
-class spContext
-{
-protected:
-    // "linked" list of comments belonging to this context
-    MCommentListT mComments;
-
-    // NULL, if this is file context
-    MMemberListT   mMembers;
-
-    // NULL, if this is top-most context
-    spContext*    mpParent;
-
-    // points to context object, where the this context
-    // was originally declared, meaning that this object
-    // is redeclaration (or if in the case of operation
-    // this context object most probably referres to the
-    // implemnetation in .cpp file for example)
-
-    // is NULL, if this object referres to the first occurence
-    // of the context
-
-    spContext*    mpFirstOccurence;
-
-    // used, to avoid excessive sorting of context's agreggates
-    bool          mAlreadySorted;
-
-public:
-
-    // source line number, (-1) if unknown
-    int           mSrcLineNo;
-
-    // offset of context in the source file, (-1) if unknown
-    int           mSrcOffset;
-
-    // lentgh of the context in characters, (-1) if unknown
-    int           mContextLength;
-
-    // source line number, in which this cotext ends, (-1) if unknown
-    int           mLastScrLineNo;
-
-    // fields are valid, if the may contain other contexts nested inside
-    int           mHeaderLength;
-    int           mFooterLength;
-
-    // zero-based index of the first character of
-    // this context in the source line, (-1) if unknown
-    int           mFirstCharPos;
-
-    // zero-based index of the first character of
-    // this context in the last source line of this context, (-1) if unknown
-    int           mLastCharPos;
-
-    // see SRC_VISIBLITY_TYPES enumeration
-    int           mVisibility;
-
-    // TRUE, if context does not really exist in the source
-    //       but was created by external tools (e.g. forward engineering)
-
-    bool         mIsVirtualContext;
-    bool         mVirtualContextHasChildren;
-
-    // body of the context in case (mIsVirtual == TRUE)
-    string       mVirtualContextBody;
-    string       mVittualContextFooter;
-
-    // e.g. can be used by documentation generator to store
-    // reference to section object
-    void*         mpUserData;
-
-public:
-    // universal identifier of the context (e.g. class name)
-    string        mName;
-
-public:
-    // default constructor
-    spContext();
-
-    // automatically destorys all aggregated contexts
-    // (thus, it's enought to call destructor of root-context)
-    virtual ~spContext();
-
-    // see mUererData member;
-    void* GetUserData() { return mpUserData; }
-
-    // sets untyped pointer to user data
-    void SetUserData( void* pUserData )
-        { mpUserData = pUserData; }
-
-    // searches the whole context tree for the cotnexts
-    // which match given masks, pust results into lst array
-    void GetContextList( MMemberListT& lst, int contextMask );
-
-    // used by default visitor's implementation
-    bool IsSorted();
-
-    /*** forward/reverse ingineering fecilities ***/
-
-    bool PositionIsKnown();
-
-    bool IsVirtualContext();
-
-    bool VitualContextHasChildren();
-
-    void SetVirtualContextBody( const string& body,
-                                bool  hasChildren = FALSE,
-                                const string& footer = "" );
-
-    string GetVirtualContextBody();
-    string GetFooterOfVirtualContextBody();
-
-    // can be overriden by top-level context classes
-    // to find-out ot the source-fragment of this
-    // context using it's position information
-    virtual string GetBody( spContext* pCtx = NULL );
-
-    virtual string GetHeader( spContext* pCtx = NULL );
-
-    // TRUE, if there is at least one entry
-    // in the comment list of this context
-    bool HasComments();
-    MCommentListT& GetCommentList() { return mComments; }
-    const MCommentListT& GetCommentList() const { return mComments; }
-
-    // should be overriden, if the context supports sorting
-    // of it's members
-    virtual void SortMembers() {}
-
-    // returns identifier of this context
-    inline string& GetName() { return mName; }
-
-    // returns -1, if souce line # is unknow
-    inline int GetSourceLineNo() { return mSrcLineNo; }
-
-    // see comments on mpFirstOccurence member variable
-    bool IsFirstOccurence();
-    spContext* GetFirstOccurence();
-
-    // returns not-NULL value if this context
-    // is aggregated by another cotnext
-    spContext* GetOutterContext();
-
-    // perhaps more intuitive alias for `GetOutterContext()'
-    inline spContext* GetParent() { return mpParent; }
-
-    bool HasOutterContext();
-
-    // add one aggregate (or child) into this context
-    void AddMember ( spContext* pMember );
-    MMemberListT& GetMembers();
-
-    // append comment to the comment list decribing
-    // this context
-    void AddComment( spComment* pComment );
-
-    // returns NULL, if the context with the given
-    // name and type is not contained by this context
-    // and it's children. Children's children are not
-    // searched recursivelly if searchSubMembers is FALSE
-
-    spContext* FindContext( const string& identifier,
-                            int   contextType      = SP_CTX_ANY,
-                            bool  searchSubMembers = TRUE
-                          );
-
-    // removes this context from it's parent
-    // (NOTE:: context should have an outter cotnext
-    //  to when this method is called, otherwise removal
-    //  will result assertion failure)
-    void RemoveThisContext();
-
-    // returns TRUE, if this object is aggregated in the file
-    bool IsInFile();
-
-    // TRUE, if outter context is a namespace
-    bool IsInNameSpace();
-
-    // TRUE, if outter context is a class
-    bool IsInClass();
-
-    // TRUE, if outter cotext is an operation (TRUE for "spParameter"s)
-    bool IsInOperation();
-
-    // TRUE if the context is public
-    bool IsPublic() const { return mVisibility == SP_VIS_PUBLIC; }
-
-    // NOTE:: method returns not the type of this object
-    //          but the file/namespace/class/operation or file in which this
-    //          attribute is contained. First, check for the type of
-    //        context using the above method.
-
-    //          Requiering container which does not exist, will result
-    //        in assertion failure
-
-    spClass&     GetClass();
-    spFile&      GetFile();
-    spNameSpace& GetNameSpace();
-    spOperation& GetOperation();
-
-    // each new context should override this method
-    // to return it's specific type
-    virtual int GetContextType() const { return SP_CTX_UNKNOWN; }
-
-    // perhaps more intuitive short-cut
-    inline int GetType() { return GetContextType(); }
-
-    // cast this context to the desired type - returns NULL if type is wrong
-    spAttribute *CastToAttribute()
-    {
-        return GetContextType() == SP_CTX_ATTRIBUTE ? (spAttribute *)this
-                                                    : NULL;
-    }
-
-    // derived classes override this to invoke VisitXXX method
-    // which corresponds to the class of specific context,
-    // - this is what the "Visitor" pattern told us ^)
-
-    // if method is not overriden, then it's probably user-defined
-    // custom context
-
-    virtual void AcceptVisitor( spVisitor& visitor )
-
-        { visitor.VisitCustomContext( *this );    };
-
-    // called by visitors, to remove given subcontext
-    // of this context object
-    void RemoveChild( spContext* pChild );
-
-    void RemoveChildren();
-
-    spContext* GetEnclosingContext( int mask = SP_CTX_ANY );
-
-#ifdef __WXDEBUG__
-    virtual void Dump(const wxString& indent) const;
-#endif  // __WXDEBUG__
-
-    DECLARE_DUMP
-};
-
-// stores information about single argument of operation
-
-class spParameter : public spContext
-{
-public:
-    // type of argument (parameter)
-    string mType;
-
-    // "stringified" initial value
-    string mInitVal;
-
-public:
-    virtual int GetContextType() const { return SP_CTX_PARAMETER; }
-
-    virtual void AcceptVisitor( spVisitor& visitor )
-        { visitor.VisitParameter( *this ); }
-
-    DECLARE_DUMP
-};
-
-
-// stores information about member(or global) variable
-
-class spAttribute : public spContext
-{
-public:
-    // type of the attribute
-    string mType;
-
-    // it's initial value
-    string mInitVal;
-
-    // constantness
-    bool   mIsConstant;
-public:
-
-    virtual int GetContextType() const { return SP_CTX_ATTRIBUTE; }
-
-    virtual void AcceptVisitor( spVisitor& visitor )
-        { visitor.VisitAttribute( *this ); }
-
-    DECLARE_DUMP
-};
-
-class spOperation : public spContext
-{
-public:
-    // type of return value
-    string      mRetType;
-
-    // argument list
-    //MParamListT mParams;
-
-    // TRUE, if operation does not modify
-    // the content of the object
-    bool        mIsConstant;
-
-    // flag, specific to C++
-    bool        mIsVirtual;
-
-    // TRUE, if definition follows the declaration immediatelly
-    bool        mHasDefinition;
-
-    // scope if any (e.g. MyClass::MyFunction(), scope stirng is "MyClass" )
-    // usually found along with implementation of the method, which is now skipped
-
-    string      mScope;
-
-public:
-    spOperation();
-
-    // returns full declaration of the operations
-    // (ret val., identifier, arg. list),
-
-    // arguments are marked up with italic,
-    // default values marked up with bold-italic,
-    // all the rest is marked as bold
-
-    // NOTE:: this method may be overriden by class
-    //        specific to concrete parser, to provide
-    //        language-dependent reperesnetation of
-    //        operation and it's argumetn list
-    //
-    // the default implementation outputs name in
-    // C++/Java syntax
-
-    virtual string GetFullName(MarkupTagsT tags);
-
-    virtual int GetContextType() const { return SP_CTX_OPERATION; }
-
-    virtual void AcceptVisitor( spVisitor& visitor )
-        { visitor.VisitOperation( *this ); }
-
-    DECLARE_DUMP
-};
-
-// stores infromation about preprocessor directive
-
-class spPreprocessorLine : public spContext
-{
-
-public:
-
-    // prepocessor statement including '#' and
-    // attached multiple lines with '\' character
-    string mLine;
-
-    int    mDefType; // see SP_PREP_DEFINITION_TYPES enumeration
-
-public:
-
-    virtual int GetContextType() const { return SP_CTX_PREPROCESSOR; }
-
-    virtual int GetStatementType() const { return mDefType; }
-
-    string CPP_GetIncludedFileNeme() const;
-
-    virtual void AcceptVisitor( spVisitor& visitor )
-        { visitor.VisitPreprocessorLine( *this ); }
-
-    DECLARE_DUMP
-};
-
-// stores information about the class
-
-class spClass : public spContext
-{
-public:
-    // list of superclasses/interfaces
-    StrListT     mSuperClassNames;
-
-    // see SP_CLASS_TYPES enumeration
-    int          mClassSubType;
-
-    // see SP_INHERITANCE_TYPES enumeration
-    int          mInheritanceType;
-
-    // valid if mClassSubType is SP_CLTYPE_TEMPLATE_CLASS
-    string       mTemplateTypes;
-
-    // TRUE, if it's and interface of abstract base class
-    bool         mIsAbstract;
-
-public:
-    // sorts class members in the following order:
-    //
-    // (by "privacy level" - first private, than protected, public)
-    //
-    //     within above set
-    //
-    //       (by member type - attributes first, than methods, nested classes)
-    //
-    //          within above set
-    //
-    //             (by identifier of the member)
-
-    virtual void SortMembers();
-
-    virtual int GetContextType() const { return SP_CTX_CLASS; }
-
-    virtual void AcceptVisitor( spVisitor& visitor )
-        { visitor.VisitClass( *this ); }
-
-    DECLARE_DUMP
-};
-
-// stores information about enum statement
-
-class spEnumeration  : public spContext
-{
-public:
-    string mEnumContent; // full-text content of enumeration
-
-public:
-    virtual int GetContextType() const { return SP_CTX_ENUMERATION; }
-
-    virtual void AcceptVisitor( spVisitor& visitor )
-        { visitor.VisitEnumeration( *this ); }
-
-    DECLARE_DUMP
-};
-
-class spTypeDef  : public spContext
-{
-public:
-    // the original type which is redefined
-    // by this type definition
-    string mOriginalType;
-
-public:
-    virtual int GetContextType() const { return SP_CTX_TYPEDEF; }
-
-    virtual void AcceptVisitor( spVisitor& visitor )
-        { visitor.VisitTypeDef( *this ); }
-
-    DECLARE_DUMP
-};
-
-// NOTE:: files context may be put to other
-//        file context, resulting in a collection
-//        of parsed file contexts, with a virtual "superfile"
-
-class spFile : public spContext
-{
-public:
-    // since file name cannot be determined from
-    // source code, filling in this field is optional
-    string mFileName;
-
-public:
-    virtual int GetContextType() const { return SP_CTX_FILE; }
-
-    virtual void AcceptVisitor( spVisitor& visitor )
-        { visitor.VisitFile( *this ); }
-
-    DECLARE_DUMP
-};
-
-//TODO:: comments.
-
-class SourceParserPlugin
-{
-public:
-    virtual bool CanUnderstandContext( char* cur, char* end, spContext* pOuttterCtx ) = 0;
-    virtual void ParseContext( char* start, char*& cur, char* end, spContext* pOuttterCtx ) = 0;
-};
-
-// abstract interface for source parsers
-// which can output parsing results in the
-// form of context-tree, where each node
-// should be derivative of spContext, (see
-// above classes)
-
-class SourceParserBase
-{
-private:
-    // auto-resizing file buffer, created in ParseFile()
-    // to reuse large heap block for multiple parsings
-
-    char* mpFileBuf;
-    int   mFileBufSz;
-
-protected:
-    SourceParserPlugin* mpPlugin;
-
-protected:
-    // value is set in the derived parser classes
-    int mParserStatus;
-
-public:
-    SourceParserBase();
-    virtual ~SourceParserBase();
-
-    // loads entier source file(as text) into memory,
-    // and passes it's contents to ParseAll() method,
-    // memory occupied by source text is released after
-    // parsing is done
-    //
-    // (NOTE:: this is the default implementation),
-
-    virtual spFile* ParseFile( const char* fname );
-
-    // should returns the root-node of the created context tree
-    // (user is responsible for releasing it from the heep)
-    // "end" should point to the (last character + 1) of the
-    // source text area
-
-    virtual spFile* Parse( char* start, char* end ) = 0;
-
-    // returns parser "status word" (specific to concrete parser)
-    int GetParserStatus() { return mParserStatus; }
-
-    void SetPlugin( SourceParserPlugin* pPlugin );
-};
-
-#endif
diff --git a/utils/HelpGen/include/wxstlac.h b/utils/HelpGen/include/wxstlac.h
deleted file mode 100644 (file)
index 9f69f1f..0000000
+++ /dev/null
@@ -1,667 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name:        No names yet.
-// Purpose:     Contrib. demo
-// Author:      Aleksandras Gluchovas
-// Modified by:
-// Created:     27/09/98
-// RCS-ID:      $Id$
-// Copyright:   (c) Aleskandars Gluchovas
-// Licence:    wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef __WXSTLAC_G__
-#define __WXSTLAC_G__
-
-#ifdef new
-#undef new
-#endif
-
-#include <stddef.h>
-#include <sys/types.h>
-#include <memory.h>
-#include <limits.h>
-#include <new.h>
-
-// the below macro used internally (see actual interface after this macro)
-
-// arguments:
-//
-//         ARG_IS_UNIQUE
-//             ASSOC_CONT_CLASS_NAME
-//
-//         ARG_VALUE_TYPE
-//      ARG_KEY_TYPE
-//      ARG_ACTUAL_VALUE_TYPE
-//      
-//      _KEY_NAME
-//      _VALUE_NAME
-//
-//             _X_KEY_NAME
-//             _X_VALUE_NAME
-//
-//      _INSERT_METHOD_DEFINITION
-
-#define __DEFINE_ASOC_CLASS( ARG_IS_UNIQUE, \
-FUNCTOR,\
-ASSOC_CONT_CLASS_NAME, \
-ARG_VALUE_TYPE, \
-ARG_KEY_TYPE, \
-ARG_ACTUAL_VALUE_TYPE, \
-_KEY_NAME, \
-_VALUE_NAME, \
-_X_KEY_NAME, \
-_X_VALUE_NAME, \
-_INSERT_METHOD_DEFINITION \
-) class \
-ASSOC_CONT_CLASS_NAME\
-{\
-protected:\
-\
-public:\
-       typedef ARG_VALUE_TYPE        value_type;\
-       typedef ARG_KEY_TYPE          key_type;\
-       typedef ARG_ACTUAL_VALUE_TYPE actual_value_type;\
-\
-       typedef value_type*                       pointer;\
-       typedef value_type&                       reference;\
-\
-       typedef const value_type&         const_reference;\
-\
-       typedef FUNCTOR                           key_compare;\
-       typedef key_compare           Compare;\
-\
-protected:\
-\
-       struct tree_node \
-       {\
-               tree_node*  mpParent;\
-               tree_node*  mpLeft;\
-               tree_node*  mpRight;\
-\
-               value_type  mData;\
-       };\
-\
-       typedef tree_node* node_ref_type;\
-\
-       node_ref_type   mpRoot;\
-       node_ref_type   mpLeftMost;\
-       node_ref_type   mpRightMost;\
-\
-       node_ref_type   mpFreeListHead;\
-       int             mKeyIsUnique;\
-\
-       key_compare     mCmpFunctorObj;\
-\
-public:\
-\
-       static inline node_ref_type next( node_ref_type pNode )\
-       {\
-               if ( pNode->mpRight ) \
-               {\
-                       pNode = pNode->mpRight;\
-\
-                       while ( pNode->mpLeft ) pNode = pNode->mpLeft;\
-\
-                       return pNode;\
-               }\
-               else\
-               if ( pNode->mpParent )\
-               {\
-                       if ( pNode == pNode->mpParent->mpLeft )\
-\
-                               return pNode->mpParent;\
-\
-                       pNode = pNode->mpParent;\
-\
-                       node_ref_type prevNode = pNode;\
-                       pNode = pNode->mpParent;\
-\
-                       while(pNode)\
-                       {\
-                               if ( pNode->mpRight &&\
-                                        pNode->mpRight != prevNode\
-                                  ) return pNode;\
-\
-                               prevNode = pNode;\
-                               pNode= pNode->mpParent;\
-                       }\
-\
-                       return 0;\
-               }\
-               else\
-                       return 0;\
-       }\
-\
-       static inline node_ref_type prev( node_ref_type pNode )\
-       {\
-               if ( pNode->mpLeft ) \
-               {\
-                       pNode = pNode->mpLeft;\
-\
-                       while ( pNode->mpRight ) pNode = pNode->mpRight;\
-\
-                       return pNode;\
-               }\
-               else\
-               if ( pNode->mpParent )\
-               {\
-                       if ( pNode == pNode->mpParent->mpRight )\
-                               return pNode->mpParent;\
-\
-                       pNode = pNode->mpParent;\
-\
-                       node_ref_type prevNode = pNode;\
-                       pNode = pNode->mpParent;\
-\
-                       while(pNode)\
-                       {\
-                               if ( pNode->mpLeft &&\
-                                        pNode->mpLeft != prevNode\
-                                  ) return pNode;\
-\
-                               prevNode = pNode;\
-                               pNode= pNode->mpParent;\
-                       }\
-\
-                       return 0;\
-               }\
-               else \
-                       return 0;\
-       }\
-\
-protected:\
-\
-       inline int are_equel( const key_type& x, const key_type& y )\
-       {\
-               return ( !mCmpFunctorObj(x,y) && !mCmpFunctorObj(y,x) );\
-       }\
-\
-       inline int is_less( const key_type& x, const key_type& y )\
-       {\
-               return mCmpFunctorObj(x,y);\
-       }\
-\
-       static inline const actual_value_type& value( node_ref_type pNode )\
-       {\
-               return pNode->_VALUE_NAME;\
-       }\
-\
-       static inline const key_type& key( node_ref_type pNode )\
-       {\
-               return pNode->_KEY_NAME;\
-       }\
-\
-       inline node_ref_type AllocNode() \
-       { \
-               if ( mpFreeListHead ) \
-               {\
-                       node_ref_type pFreeNode = mpFreeListHead;\
-                       mpFreeListHead = mpFreeListHead->mpLeft;\
-\
-                       return pFreeNode;\
-               }\
-               else\
-               {\
-                       char* pHeapBlock = new char[sizeof(tree_node)];\
-\
-                       return (node_ref_type)pHeapBlock;\
-               }\
-       }\
-\
-       inline void DestroyFreeList()\
-       {\
-               while ( mpFreeListHead )\
-               {\
-                       node_ref_type tmp = mpFreeListHead;\
-                       mpFreeListHead = mpFreeListHead->mpLeft;\
-\
-                       delete [](char*)tmp;\
-               }\
-       }\
-\
-       inline void RecycleNode( node_ref_type pNode ) \
-       {\
-               pNode->mpLeft = mpFreeListHead;\
-               mpFreeListHead = pNode;\
-       }\
-\
-       inline node_ref_type do_insert(const value_type& x = value_type() )\
-       {\
-               node_ref_type pNewNode = AllocNode();\
-\
-               pNewNode->mpParent = \
-                       pNewNode->mpLeft =\
-                               pNewNode->mpRight = 0;\
-\
-           node_ref_type pCurrent = mpRoot;\
-               node_ref_type pParent = 0;\
-    \
-               while (pCurrent) \
-               {\
-                       if ( mKeyIsUnique && are_equel( _X_KEY_NAME, value(pCurrent) ) )\
-                       {\
-                               RecycleNode(pNewNode);\
-                               return 0;\
-                       }\
-\
-                       pParent = pCurrent;\
-\
-                       pCurrent = is_less( _X_KEY_NAME, value(pCurrent) ) \
-                               ? pCurrent->mpLeft \
-                               : pCurrent->mpRight;\
-               }\
-    \
-               pNewNode->mpParent = pParent;\
-\
-           if(pParent)\
-\
-                       if( is_less(_X_KEY_NAME, value(pParent) ) )\
-            \
-                               pParent->mpLeft = pNewNode;\
-                       else\
-                               pParent->mpRight = pNewNode;\
-                       else\
-                               mpRoot = pNewNode;\
-\
-               new ( &pNewNode->_KEY_NAME   ) key_type(_X_KEY_NAME);\
-               new ( &pNewNode->_VALUE_NAME ) actual_value_type(_X_VALUE_NAME);\
-\
-               if ( prev(pNewNode) == 0 ) mpLeftMost = pNewNode;\
-               if ( next(pNewNode) == 0 ) mpRightMost = pNewNode;\
-\
-               return pNewNode;\
-       }\
-\
-       friend class iterator;\
-\
-public:\
-\
-       class iterator;\
-       class const_iterator;\
-\
-       class iterator \
-       {\
-       public:\
-               node_ref_type mpNode;\
-               friend class CONT_CLASS_NAME;\
-               friend class const_iterator;\
-               friend class const_reverse_iterator;\
-\
-               inline iterator( node_ref_type pNode )\
-               {\
-                       mpNode = pNode;\
-               }\
-       \
-       public:\
-               inline iterator() {}\
-               inline int operator==( const iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
-               inline int operator!=( const iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
-\
-               inline iterator( const iterator& other )\
-               {\
-                       mpNode = other.mpNode;\
-               }\
-\
-               inline const iterator& operator=( const iterator& other )\
-               {\
-                       mpNode = other.mpNode;\
-                       return *this;\
-               }\
-\
-               inline const iterator& operator--() \
-               {\
-                       mpNode = ASSOC_CONT_CLASS_NAME::prev(mpNode);\
-                       return *this;\
-               }\
-\
-               inline iterator operator--(int)\
-               {\
-                       iterator tmp = *this;\
-                       mpNode = ASSOC_CONT_CLASS_NAME::prev(mpNode);\
-                       return tmp;\
-               }\
-\
-               inline const iterator& operator++() \
-               {\
-                       mpNode = ASSOC_CONT_CLASS_NAME::next(mpNode);\
-                       return *this;\
-               }\
-\
-               inline iterator operator++(int)\
-               {\
-                       iterator tmp = *this;\
-                       mpNode = ASSOC_CONT_CLASS_NAME::next(mpNode);\
-                       return tmp;\
-               }\
-\
-               inline reference operator*() const { return mpNode->mData; }\
-       };\
-\
-\
-       class const_iterator \
-       {\
-       public:\
-               node_ref_type mpNode;\
-               friend class CONT_CLASS_NAME;\
-               friend class const_reverse_iterator;\
-\
-               inline const_iterator( node_ref_type pNode )\
-               {\
-                       mpNode = pNode;\
-               }\
-       \
-       public:\
-               inline const_iterator() {}\
-\
-               inline int operator==( const const_iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
-               inline int operator!=( const const_iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
-\
-               inline const_iterator( const iterator& other )\
-               {\
-                       mpNode = other.mpNode;\
-               }\
-\
-               inline const_iterator( const const_iterator& other )\
-               {\
-                       mpNode = other.mpNode;\
-               }\
-\
-               inline const const_iterator& operator=( const const_iterator& other )\
-               {\
-                       mpNode = other.mpNode;\
-                       return *this;\
-               }\
-\
-               inline const const_iterator& operator--() \
-               {\
-                       mpNode = ASSOC_CONT_CLASS_NAME::prev(mpNode);\
-                       return *this;\
-               }\
-\
-               inline const_iterator operator--(int)\
-               {\
-                       const_iterator tmp = *this;\
-                       mpNode = ASSOC_CONT_CLASS_NAME::prev(mpNode);\
-                       return tmp;\
-               }\
-\
-               inline const const_iterator& operator++() \
-               {\
-                       mpNode = ASSOC_CONT_CLASS_NAME::next(mpNode);\
-                       return *this;\
-               }\
-\
-               inline const_iterator operator++(int)\
-               {\
-                       const_iterator tmp = *this;\
-                       mpNode = ASSOC_CONT_CLASS_NAME::next(mpNode);\
-                       return tmp;\
-               }\
-\
-               inline const_reference operator*() const { return mpNode->mData; }\
-       };\
-\
-public:\
-\
-       inline ASSOC_CONT_CLASS_NAME( key_compare cmpFunctorObj = key_compare(),\
-                                                                 int keyIsUnique = ARG_IS_UNIQUE )\
-                       : mpFreeListHead( 0 ),\
-                         mKeyIsUnique( keyIsUnique ),\
-                         mCmpFunctorObj( cmpFunctorObj )\
-       {\
-               mpLeftMost = 0;\
-               mpRightMost = 0;\
-               mpRoot = 0;\
-       }\
-\
-       inline ~ASSOC_CONT_CLASS_NAME() \
-       { \
-               erase( begin(), end() ); \
-\
-               DestroyFreeList();\
-       }\
-\
-       inline iterator begin() { return mpLeftMost; }\
-       inline iterator end()   { return 0; }\
-\
-       inline const_iterator begin() const { return mpLeftMost; }\
-       inline const_iterator end()   const { return 0; }\
-\
-       inline iterator lower_bound( const key_type& x )\
-       { \
-               node_ref_type pCurrent = mpRoot;\
-    \
-               while( pCurrent )\
-               {\
-                       node_ref_type pParent = pCurrent;\
-\
-                       if( are_equel( x, key(pCurrent) ) )\
-                               \
-                               return (pCurrent);\
-                       else\
-                               pCurrent = is_less( x, key(pCurrent) ) \
-                                       ? pCurrent->mpLeft \
-                                       : pCurrent->mpRight;\
-\
-                       if ( !pCurrent ) return (pParent);\
-               }\
-\
-               return begin();\
-       }\
-\
-       inline const_iterator lower_bound( const key_type& x ) const\
-\
-               { return const_iterator( lower_bound(x).mpNode ); }\
-\
-       inline iterator upper_bound( const key_type& x )\
-       {\
-               node_ref_type pCurrent = mpRoot;\
-    \
-               while( pCurrent )\
-               {\
-                       node_ref_type pParent = pCurrent;\
-\
-                       if( are_equel( x, key(pCurrent) ) )\
-                               \
-                               return (pCurrent);\
-                       else\
-                               pCurrent = is_less( x, key(pCurrent) ) \
-                                       ? pCurrent->mpLeft \
-                                       : pCurrent->mpRight;\
-\
-                       if ( !pCurrent ) return next(pParent);\
-               }\
-\
-               return end();\
-       }\
-\
-       inline const_iterator upper_bound( const key_type& x ) const\
-\
-               { return const_iterator( upper_bound(x).mpNode ); }\
-\
-       inline iterator find( const key_type& x )\
-       {\
-               node_ref_type pCurrent = mpRoot;\
-    \
-               while( pCurrent )\
-               {\
-                       if( are_equel( x, key(pCurrent) ) )\
-                               \
-                               return (pCurrent);\
-                       else\
-                               pCurrent = is_less( x, key(pCurrent) ) \
-                                       ? pCurrent->mpLeft \
-                                       : pCurrent->mpRight;\
-               }\
-\
-               return end();\
-       }\
-\
-       inline const_iterator find( const key_type& x ) const\
-\
-               { return const_iterator( find(x).mpNode ); }\
-\
-       inline void erase(iterator first, iterator last)\
-       {\
-               if ( first.mpNode == 0 ) return;\
-\
-               while( first != last ) \
-               {\
-                       iterator next = first;\
-                       ++next;\
-                       erase( first );\
-                       first = next;\
-               }\
-       }\
-\
-       inline void erase(iterator position)\
-       {\
-               if ( position.mpNode == 0 ) return;\
-\
-               node_ref_type pZ = position.mpNode;\
-               node_ref_type pX, pY;\
-\
-               if ( pZ == mpLeftMost ) mpLeftMost   = next(pZ);\
-               if ( pZ == mpRightMost ) mpRightMost = prev( pZ );\
-\
-        if ( !pZ->mpLeft || !pZ->mpRight )\
-           \
-            pY = pZ;\
-        else \
-               {\
-            pY = pZ->mpRight;\
-           \
-            while (pY->mpLeft) \
-                               \
-                               pY = pY->mpLeft;\
-        }\
-           \
-        if ( pY->mpLeft)\
-           \
-            pX = pY->mpLeft;\
-        else\
-            pX = pY->mpRight;\
-           \
-        if ( pX ) pX->mpParent = pY->mpParent;\
-           \
-        if (pY->mpParent)\
-           \
-            if (pY == pY->mpParent->mpLeft )\
-           \
-                pY->mpParent->mpLeft = pX;\
-                   else\
-                pY->mpParent->mpRight = pX;\
-        else\
-            mpRoot = pX;\
-           \
-               node_ref_type toRemove = 0;\
-               \
-        if (pY != pZ) {\
-           \
-            pY->mpLeft = pZ->mpLeft;\
-           \
-            if (pY->mpLeft) pY->mpLeft->mpParent = pY;\
-           \
-            pY->mpRight = pZ->mpRight;\
-           \
-            if ( pY->mpRight ) \
-                               \
-                               pY->mpRight->mpParent = pY;\
-           \
-            pY->mpParent = pZ->mpParent;\
-           \
-            if (pZ->mpParent)\
-           \
-                if (pZ == pZ->mpParent->mpLeft)\
-           \
-                    pZ->mpParent->mpLeft = pY;\
-                else\
-                    pZ->mpParent->mpRight = pY;\
-            else\
-                mpRoot = pY;\
-           \
-            toRemove = pZ;\
-        } \
-               else \
-            toRemove = pY;\
-           \
-               value(toRemove).~actual_value_type();\
-               key(toRemove).~actual_value_type();\
-\
-               RecycleNode( toRemove );\
-       }\
-\
-       _INSERT_METHOD_DEFINITION\
-}
-
-// do not undefine ___WXSTL_COMMA, where associated containers are defined!
-// (it is used as workaround for constraints of C-Preprocessor's nested macros)
-
-#define ___WXSTL_COMMA ,
-
-#define __DEFINE_MAP(ARG_IS_UNIQUE, KEY_TYPE, VAL_TYPE, FUNCTOR ) __DEFINE_ASOC_CLASS( ARG_IS_UNIQUE,\
-FUNCTOR,\
-__WXSTLMAP_##KEY_TYPE##VAL_TYPE##ARG_IS_UNIQUE, \
-struct key_value_pair   { KEY_TYPE first ; \
-                                                 VAL_TYPE second;\
-                                                 key_value_pair() {}\
-                                                 key_value_pair( const KEY_TYPE& key ___WXSTL_COMMA const VAL_TYPE& value ) \
-                                                       : first(key) ___WXSTL_COMMA second( value ) {} \
-                                               } , \
-KEY_TYPE,\
-VAL_TYPE,\
-mData.first, mData.second, x.first, x.second, \
-struct insert_result_iterator\
-{\
-       iterator first;\
-       int      second;\
-};\
-inline insert_result_iterator insert( const value_type& x )\
-{\
-       insert_result_iterator result;\
-\
-       result.first = do_insert(x);\
-       result.second  = ( result.first == end() ) ? 0 : 1;\
-\
-       return result;\
-} )
-
-#define __DEFINE_SET(ARG_IS_UNIQUE, KEY_TYPE, FUNCTOR ) __DEFINE_ASOC_CLASS( ARG_IS_UNIQUE,\
-FUNCTOR,\
-__WXSTLSET_##TYPE##ARG_IS_UNIQUE, \
-KEY_TYPE,\
-KEY_TYPE,\
-KEY_TYPE,\
-mData, mData, x, x, \
-struct insert_result_iterator\
-{\
-       iterator first;\
-       int      second;\
-};\
-inline insert_result_iterator insert( const value_type& x )\
-{\
-       insert_result_iterator result;\
-\
-       result.first = do_insert(x);\
-       result.second  = ( result.first == end() ) ? 0 : 1;\
-\
-       return result;\
-} )
-
-// helper macros to create functor objects for associative containers of the given type
-
-#define LESS_THEN_FUNCTOR(TYPE) struct \
-{ inline int operator()(const TYPE& x, const TYPE& y ) const { return x < y; } }
-
-#define GREATER_THEN_FUNCTOR(TYPE) struct \
-{ inline int operator()(const TYPE& x, const TYPE& y ) const { return x > y; } }
-
-// functor argument should be created using the two above macros 
-// or passing own class with method "operator()(const TYPE&,cosnt TYPE&)" defined in it
-
-#define WXSTL_MAP( KEY_TYPE, VALUE_TYPE, FUNCTOR )      __DEFINE_MAP( 1 ,KEY_TYPE, VALUE_TYPE, FUNCTOR)
-#define WXSTL_MULTIMAP( KEY_TYPE, VALUE_TYPE, FUNCTOR ) __DEFINE_MAP( 0 ,KEY_TYPE, VALUE_TYPE, FUNCTOR)
-#define WXSTL_SET( KEY_TYPE, FUNCTOR )                  __DEFINE_SET( 1 ,KEY_TYPE, FUNCTOR )
-#define WXSTL_MULTISET( KEY_TYPE, FUNCTOR )             __DEFINE_SET( 0 ,KEY_TYPE, FUNCTOR )
-
-#endif
diff --git a/utils/HelpGen/include/wxstllst.h b/utils/HelpGen/include/wxstllst.h
deleted file mode 100644 (file)
index 5a1d1bc..0000000
+++ /dev/null
@@ -1,559 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name:        No names yet.
-// Purpose:     Contrib. demo
-// Author:      Aleksandras Gluchovas
-// Modified by:
-// Created:     27/09/98
-// RCS-ID:      $Id$
-// Copyright:   (c) Aleskandars Gluchovas
-// Licence:    wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef __WXSTLLST_G__
-#define __WXSTLLST_G__
-
-#ifdef new
-#undef new
-#endif
-
-#include <stddef.h>
-#include <sys/types.h>
-#include <memory.h>
-#include <limits.h>
-#include <new.h>
-
-// VERSION:: 0.2 (copy-constructor/adign-op added)
-
-// FOR NOW:: class-member operators "new" and "delete"
-//           are ignored by list class, memory allocated 
-//           and freed using global operators
-
-typedef int Type;
-
-
-// the below macro used internally (see actual interface after this macro)
-
-#define __DEFINE_STL_LIST(listClass,Type) class \
- listClass \
-{\
-public:\
-\
-       typedef Type                      value_type;\
-       typedef value_type*           pointer;\
-       typedef const value_type* const_pointer;\
-       typedef value_type&       reference;\
-       typedef const value_type& const_reference;\
-       typedef size_t                    size_type;\
-       typedef ptrdiff_t                 difference_type;\
-\
-protected:\
-       struct list_node\
-       {\
-               list_node* mpNext;\
-               list_node* mpPrev;\
-               value_type mData;\
-       };\
-\
-       typedef list_node* node_ref_type;\
-\
-       node_ref_type mpFreeListHead;\
-       node_ref_type mpTerminator;\
-       size_type     mSize;\
-\
-       inline node_ref_type AllocNode() \
-       { \
-               if ( mpFreeListHead ) \
-               {\
-                       node_ref_type pFreeNode = mpFreeListHead;\
-                       mpFreeListHead = mpFreeListHead->mpPrev;\
-\
-                       return pFreeNode;\
-               }\
-               else\
-               {\
-                       char* pHeapBlock = new char[sizeof(list_node)];\
-\
-                       return (node_ref_type)pHeapBlock;\
-               }\
-       }\
-\
-       inline void DestroyFreeList()\
-       {\
-               while ( mpFreeListHead )\
-               {\
-                       node_ref_type tmp = mpFreeListHead;\
-                       mpFreeListHead = mpFreeListHead->mpPrev;\
-\
-                       delete [](char*)tmp;\
-               }\
-       }\
-\
-       inline void RecycleNode( node_ref_type pNode ) \
-       {\
-               pNode->mpPrev = mpFreeListHead;\
-               mpFreeListHead = pNode;\
-       }\
-\
-public:\
-\
-       class iterator \
-       {\
-       public:\
-               node_ref_type mpNode;\
-               friend class listClass;\
-               friend class const_iterator;\
-               friend class const_reverse_iterator;\
-\
-       protected:\
-               iterator( node_ref_type pNode )\
-               {\
-                       mpNode = pNode;\
-               }\
-       \
-       public:\
-               iterator() {}\
-               int operator==( const iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
-               int operator!=( const iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
-\
-               inline iterator( const iterator& other )\
-               {\
-                       mpNode = other.mpNode;\
-               }\
-\
-               inline const iterator& operator--() \
-               {\
-                       mpNode = mpNode->mpPrev;\
-                       return *this;\
-               }\
-\
-               inline iterator operator--(int)\
-               {\
-                       iterator tmp = *this;\
-                       mpNode = mpNode->mpPrev;\
-                       return tmp;\
-               }\
-\
-               inline const iterator& operator++() \
-               {\
-                       mpNode = mpNode->mpNext;\
-                       return *this;\
-               }\
-\
-               inline iterator operator++(int)\
-               {\
-                       iterator tmp = *this;\
-                       mpNode = mpNode->mpNext;\
-                       return tmp;\
-               }\
-\
-               inline reference operator*()       const { return mpNode->mData; }\
-       };\
-\
-\
-       class const_iterator \
-       {\
-       protected:\
-               node_ref_type mpNode;\
-               friend class listClass;\
-\
-       protected:\
-               const_iterator( node_ref_type pNode )\
-               {\
-                       mpNode = pNode;\
-               }\
-       \
-       public:\
-               \
-               const_iterator() {}\
-               int operator==( const const_iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
-               int operator!=( const const_iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
-\
-\
-               inline const_iterator( const iterator& other )\
-               {\
-                       mpNode = other.mpNode;\
-               }\
-\
-               inline const const_iterator& operator--() \
-               {\
-                       mpNode = mpNode->mpPrev;\
-                       return *this;\
-               }\
-\
-               inline const_iterator operator--(int)\
-               {\
-                       const_iterator tmp = *this;\
-                       mpNode = mpNode->mpPrev;\
-                       return tmp;\
-               }\
-\
-               inline const const_iterator& operator++() \
-               {\
-                       mpNode = mpNode->mpNext;\
-                       return *this;\
-               }\
-\
-               inline const_iterator operator++(int)\
-               {\
-                       const_iterator tmp = *this;\
-                       mpNode = mpNode->mpNext;\
-                       return tmp;\
-               }\
-\
-               inline const_reference operator*() const { return mpNode->mData; }\
-       };\
-\
-       typedef iterator       OutputIterator;\
-       typedef const_iterator InputIterator;\
-\
-       class reverse_iterator \
-       {\
-       public:\
-               node_ref_type mpNode;\
-               friend class listClass;\
-               friend class const_reverse_iterator;\
-\
-       protected:\
-               reverse_iterator ( node_ref_type pNode )\
-               {\
-                       mpNode = pNode;\
-               }\
-       \
-       public:\
-\
-               reverse_iterator() {}\
-               int operator==( const reverse_iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
-               int operator!=( const reverse_iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
-\
-               inline reverse_iterator( const reverse_iterator& other )\
-               {\
-                       mpNode = other.mpNode;\
-               }\
-\
-               inline const reverse_iterator& operator--() \
-               {\
-                       mpNode = mpNode->mpNext;\
-                       return *this;\
-               }\
-\
-               inline reverse_iterator operator--(int)\
-               {\
-                       reverse_iterator tmp = *this;\
-                       mpNode = mpNode->mpPrev;\
-                       return tmp;\
-               }\
-\
-               inline const reverse_iterator & operator++() \
-               {\
-                       mpNode = mpNode->mpNext;\
-                       return *this;\
-               }\
-\
-               inline reverse_iterator  operator++(int)\
-               {\
-                       reverse_iterator tmp = *this;\
-                       mpNode = mpNode->mpPrev;\
-                       return tmp;\
-               }\
-\
-               inline const_reference operator*() const { return mpNode->mData; }\
-       };\
-\
-\
-       class const_reverse_iterator \
-       {\
-       protected:\
-               node_ref_type mpNode;\
-               friend class listClass;\
-\
-       protected:\
-               const_reverse_iterator( node_ref_type pNode )\
-               {\
-                       mpNode = pNode;\
-               }\
-       \
-       public:\
-\
-               const_reverse_iterator() {}\
-               int operator==( const const_reverse_iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
-               int operator!=( const const_reverse_iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
-\
-               inline const_reverse_iterator( const reverse_iterator& other )\
-               {\
-                       mpNode = other.mpNode;\
-               }\
-\
-               inline const const_reverse_iterator& operator--() \
-               {\
-                       mpNode = mpNode->mpNext;\
-                       return *this;\
-               }\
-\
-               inline const_reverse_iterator operator--(int)\
-               {\
-                       const_reverse_iterator tmp = *this;\
-                       mpNode = mpNode->mpNext;\
-                       return tmp;\
-               }\
-\
-               inline const const_reverse_iterator& operator++() \
-               {\
-                       mpNode = mpNode->mpPrev;\
-                       return *this;\
-               }\
-\
-               inline const_reverse_iterator operator++(int)\
-               {\
-                       const_reverse_iterator tmp = *this;\
-                       mpNode = mpNode->mpPrev;\
-                       return tmp;\
-               }\
-\
-               inline const_reference operator*() const { return mpNode->mData; }\
-       };\
-\
-public:\
-\
-    inline listClass()\
-                       : mpFreeListHead( 0 ),\
-                         mSize(0)\
-       {\
-               mpTerminator = AllocNode();\
-               mpTerminator->mpPrev = mpTerminator->mpNext = mpTerminator;\
-       }\
-\
-       listClass( const listClass& other )\
-       {\
-               mpTerminator = AllocNode();\
-               mpTerminator->mpPrev = mpTerminator->mpNext = mpTerminator;\
-\
-               for( listClass::const_iterator i = other.begin(); i != other.end(); ++i )\
-\
-                       push_back( (*i) );\
-       }\
-\
-       inline const listClass& operator=( const listClass& rhs ) \
-       {\
-               erase( begin(), end() );\
-\
-               for( listClass::const_iterator i = rhs.begin(); i != rhs.end(); ++i )\
-\
-                       push_back( (*i) );\
-\
-               return *this;\
-       }\
-\
-       inline listClass(const_iterator first, const_iterator last)\
-                       : mpFreeListHead( 0 ),\
-                         mSize(0)\
-       \
-               { while( first != last ) push_back( *first++ ); }\
-\
-       inline listClass( size_type n, const value_type& value = value_type() )\
-       \
-               { for( size_t i = 0; i != n; ++n ) push_back( value ); }\
-\
-       inline ~listClass() \
-       { \
-               erase( begin(), end() ); \
-\
-               RecycleNode( mpTerminator );\
-               DestroyFreeList();\
-       }\
-\
-       inline iterator begin() { return iterator(mpTerminator->mpNext); }\
-       \
-       inline const_iterator begin() const \
-               { return const_iterator(mpTerminator->mpNext); }\
-       \
-       inline iterator end() { return iterator(mpTerminator); }\
-\
-       inline const_iterator end() const { return const_iterator(mpTerminator); }\
-\
-       inline reverse_iterator rbegin() \
-               { return reverse_iterator(mpTerminator->mpPrev); }\
-\
-       inline reverse_iterator rend() \
-               { return reverse_iterator(mpTerminator); }\
-\
-       inline const_reverse_iterator rbegin() const\
-               { return const_reverse_iterator(mpTerminator->mpPrev); }\
-\
-       inline const_reverse_iterator  rend() const\
-               { return const_reverse_iterator(mpTerminator); }\
-\
-       inline int empty() const { return (mSize == 0); }\
-\
-       inline size_type size() const { return mSize; }\
-\
-       inline size_type max_size() const { return UINT_MAX/sizeof(list_node); }\
-\
-       inline reference front() { return mpTerminator->mData; }\
-\
-       inline const_reference front() const { return mpTerminator->mData; }\
-\
-       inline reference back() { return mpTerminator->mpPrev->mData; }\
-\
-       inline const_reference back() const { return mpTerminator->mpPrev->mData; }\
-\
-       inline void push_front(const value_type& x) { insert( begin(), x ); }\
-\
-       inline void push_back(const value_type& x) { insert( end(), x ); }\
-\
-       iterator insert(iterator position, const value_type& x = value_type())\
-       {\
-               node_ref_type pNew = AllocNode();\
-\
-               node_ref_type pos = *((node_ref_type*)&position);\
-\
-               pNew->mpNext = pos;\
-               pNew->mpPrev = pos->mpPrev;\
-               pos->mpPrev->mpNext = pNew;\
-               pos->mpPrev  = pNew;\
-\
-               new (&pNew->mData) value_type(x);\
-\
-               ++mSize;\
-\
-               return iterator(pNew);\
-       }\
-\
-       inline void insert(iterator position, const_iterator first, const_iterator last )\
-       {\
-               while( first != last ) insert( position, *first++ );\
-       }\
-\
-       inline void splice( iterator position, listClass& other )\
-       {\
-               if ( other.begin() == other.end() ) return;\
-\
-               node_ref_type pTill = other.mpTerminator->mpPrev;\
-               node_ref_type pFrom = other.begin().mpNode;\
-\
-               mpTerminator->mpPrev->mpNext = pFrom;\
-               pFrom->mpPrev = mpTerminator->mpPrev->mpNext;\
-\
-               pTill->mpNext = mpTerminator;\
-               mpTerminator->mpPrev = pTill;\
-\
-               other.mpTerminator->mpNext = \
-                       other.mpTerminator->mpPrev = other.mpTerminator;\
-\
-               mSize += other.mSize;\
-               other.mSize = 0;\
-       }\
-\
-       inline void splice( iterator position, listClass& other, iterator first, iterator last )\
-       {\
-               if ( first == last ) return;\
-\
-               size_type sz = 0;\
-               iterator tmp = first;\
-               while( tmp != last ) \
-               {\
-                       ++tmp;\
-                       ++sz;\
-               }\
-\
-               mSize += sz;\
-               other.mSize -= sz;\
-\
-               node_ref_type pPos   = position.mpNode;\
-               node_ref_type pFirst = first.mpNode;\
-               node_ref_type pLast  = last.mpNode;\
-               node_ref_type pTill  = last.mpNode->mpPrev;\
-\
-               pPos->mpPrev->mpNext = pFirst;\
-               pPos->mpPrev = pTill;\
-\
-               pFirst->mpPrev->mpNext = last.mpNode;\
-               pLast->mpPrev = pTill;\
-\
-               pFirst->mpPrev = pPos->mpPrev;\
-               pTill->mpNext = pPos;\
-       }\
-\
-       inline void pop_front() { erase( begin() ); }\
-       inline void pop_back()  { erase( --end() );   }\
-       \
-       inline void erase(iterator position)\
-       {\
-               erase( position, ++position );\
-       }\
-       \
-       inline void erase(iterator first, iterator last)\
-       {\
-               node_ref_type firstNode = *((node_ref_type*)&first);\
-               node_ref_type lastNode = *((node_ref_type*)&last);\
-\
-               firstNode->mpPrev->mpNext = lastNode;\
-               lastNode->mpPrev = firstNode->mpPrev;\
-\
-               while( firstNode != lastNode )\
-               {\
-                       node_ref_type next = firstNode->mpNext;\
-\
-                       typedef value_type value_type_local;\
-                       firstNode->mData.value_type_local::~value_type_local();\
-\
-                       RecycleNode( firstNode );\
-\
-                       firstNode = next;\
-\
-                       --mSize;\
-               }\
-       }\
-\
-       inline void remove(const value_type& value)\
-       {\
-               for( iterator i = begin(); i != end(); ++i )\
-               \
-                       if ( (*i) == value ) \
-                       {\
-                               erase( i ); break;\
-                       }\
-       }\
-\
-       void sort()\
-       {\
-               if ( mSize < 2 ) return;\
-\
-               iterator from = begin();\
-               iterator other_end = end();\
-               --other_end;\
-\
-               for( size_type i = 0; i != mSize; ++i )\
-               {\
-                       size_type nSwaps = 0;\
-\
-                       iterator next = begin();\
-                       ++next;\
-\
-                       for( iterator j = begin(); j != other_end;  ++j )\
-                       {\
-\
-                               if ( (*next) < (*j) )\
-                               {\
-                                       value_type tmp = (*j);\
-                                       (*j) = (*next);\
-                                       (*next) = tmp;\
-\
-                                       ++nSwaps;\
-                               }\
-\
-                               ++next;\
-                       }\
-\
-                       if ( !nSwaps) break;\
-\
-                       --other_end;\
-               }\
-       }\
-}
-
-// defines list class with the given element type
-#define WXSTL_LIST(ELEMENT_CLASS)  __DEFINE_STL_LIST(\
-\
-_WXSTL_LIST_##ELEMENT_CLASS, ELEMENT_CLASS )
-
-#endif
\ No newline at end of file
diff --git a/utils/HelpGen/include/wxstlvec.h b/utils/HelpGen/include/wxstlvec.h
deleted file mode 100644 (file)
index 6658b07..0000000
+++ /dev/null
@@ -1,781 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name:        No names yet.
-// Purpose:     Contrib. demo
-// Author:      Aleksandras Gluchovas
-// Modified by:
-// Created:     27/09/98
-// RCS-ID:      $Id$
-// Copyright:   (c) Aleskandars Gluchovas
-// Licence:    wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef __WXSTLVEC_G__
-#define __WXSTLVEC_G__
-
-#ifdef new
-#undef new
-#endif
-
-#include <memory.h>
-#include <string.h>  // imports memmove()
-#include <stddef.h>
-#include <sys/types.h>
-#include <limits.h>
-#include <new>
-
-// the below macro used internally (see actual interface after this macro)
-
-#define __DEFINE_STL_VECTOR_DEEP( vectorClass, Type ) class vectorClass {\
-\
-public:\
-       typedef Type              value_type;\
-       typedef value_type*           iterator;\
-       typedef const value_type* const_iterator;\
-       typedef iterator                  pointer;\
-       typedef const iterator    const_pointer;\
-       typedef value_type&       reference;\
-       typedef const value_type& const_reference;\
-       typedef size_t            size_type;\
-       typedef ptrdiff_t         difference_type;\
-\
-       typedef iterator       OutputIterator;\
-       typedef const_iterator InputIterator;\
-\
-protected:\
-\
-       inline void PlacementCopy( const_iterator first, const_iterator last, iterator result )\
-       {\
-               while ( first != last ) \
-                       new (result++) value_type(*first++);\
-       }\
-\
-       inline void ConstructObjects( iterator first, iterator last, const value_type& pattern )\
-       {\
-               while( first != last ) \
-                       new (first++) value_type(pattern);\
-       }\
-\
-       inline void CopyObjects( iterator first, iterator last, iterator result )\
-       {\
-               while( first != last ) \
-                       *result++ = *first++;\
-       }\
-\
-       inline void CopyObjectsBack( iterator first, iterator last, iterator result )\
-       {\
-               result += difference_type(last,first);\
-\
-               while( first != last ) \
-                       *(--result) = *(--last);\
-       }\
-\
-public:\
-\
-       class reverse_iterator \
-       {\
-               friend class vectorClass;\
-               friend class const_reverse_iterator;\
-\
-       public:\
-               iterator mpPos;\
-\
-       public:\
-\
-               reverse_iterator() {}\
-\
-               reverse_iterator ( iterator pPos )\
-               {\
-                       mpPos = pPos;\
-               }\
-       \
-               int operator==( const reverse_iterator& rhs ) const { return (mpPos == rhs.mpPos); }\
-               int operator!=( const reverse_iterator& rhs ) const { return (mpPos != rhs.mpPos); }\
-\
-               inline reverse_iterator( const reverse_iterator& other )\
-               {\
-                       mpPos = other.mpPos;\
-               }\
-\
-               inline const reverse_iterator& operator--() \
-               {\
-                       --mpPos;\
-                       return *this;\
-               }\
-\
-               inline reverse_iterator operator--(int)\
-               {\
-                       reverse_iterator tmp = *this;\
-                       --mpPos;\
-                       return tmp;\
-               }\
-\
-               inline const reverse_iterator & operator++() \
-               {\
-                       ++mpPos;\
-                       return *this;\
-               }\
-\
-               inline reverse_iterator  operator++(int)\
-               {\
-                       reverse_iterator tmp = *this;\
-                       ++mpPos;\
-                       return tmp;\
-               }\
-\
-               inline const_reference operator*() const { return *mpPos; }\
-       };\
-\
-\
-       class const_reverse_iterator \
-       {\
-       protected:\
-               iterator mpPos;\
-       public:\
-\
-               const_reverse_iterator() {}\
-\
-               const_reverse_iterator( const iterator pPos )\
-               {\
-                       mpPos = pPos;\
-               }\
-       \
-               int operator==( const const_reverse_iterator& rhs ) const { return (mpPos == rhs.mpPos); }\
-               int operator!=( const const_reverse_iterator& rhs ) const { return (mpPos != rhs.mpPos); }\
-\
-               inline const_reverse_iterator( const reverse_iterator& other )\
-               {\
-                       mpPos = other.mpPos;\
-               }\
-\
-               inline const const_reverse_iterator& operator--() \
-               {\
-                       --mpPos;\
-                       return *this;\
-               }\
-\
-               inline const_reverse_iterator operator--(int)\
-               {\
-                       const_reverse_iterator tmp = *this;\
-                       --mpPos;\
-                       return tmp;\
-               }\
-\
-               inline const const_reverse_iterator & operator++() \
-               {\
-                       ++mpPos;\
-                       return *this;\
-               }\
-\
-               inline const_reverse_iterator operator++(int)\
-               {\
-                       const_reverse_iterator tmp = *this;\
-                       ++mpPos;\
-                       return tmp;\
-               }\
-\
-               inline const_reference operator*() const { return *mpPos; }\
-       };\
-\
-protected:\
-       \
-       pointer mpStart;\
-       pointer mpEnd;\
-       pointer mpEndOfBuf;\
-\
-protected:\
-\
-       inline void quick_sort(int low, int hi) \
-       {\
-       }\
-\
-       inline void DestructRange( iterator first, iterator last )\
-       {\
-               typedef value_type value_type_local;\
-\
-               while ( first != last ) \
-               {\
-                       first->value_type_local::~value_type_local();\
-                       ++first;\
-               }\
-       }\
-\
-       inline iterator DoInsert(iterator position, const value_type& x)\
-       {\
-               if ( mpEnd < mpEndOfBuf )\
-               {\
-                       new (mpEnd) value_type(*(mpEnd-1) );\
-           \
-                       CopyObjectsBack( position, mpEnd, position + 1 );\
-           \
-                       *position = x;\
-           \
-                       ++mpEnd;\
-           \
-                       return position;\
-               }\
-           \
-               size_type minBufLen = WXSTL_VECTOR_MIN_BUF_SIZE/sizeof(value_type);\
-           \
-               size_type doubledSize = size()*2;\
-           \
-               size_type newLen = ( doubledSize < minBufLen ) ? minBufLen : doubledSize;\
-           \
-               iterator pNewStart = (iterator)( new char[newLen*sizeof(value_type)] );\
-           \
-               PlacementCopy( mpStart, position, pNewStart );\
-           \
-               iterator atPosition = pNewStart + difference_type( position - mpStart );\
-           \
-               new (atPosition) value_type(x);\
-           \
-               iterator newPos = atPosition;\
-           \
-               ++atPosition;\
-           \
-               if ( mpStart ) \
-               {\
-                       PlacementCopy( position, mpEnd, atPosition );\
-                       DestructRange( mpStart, mpEnd );\
-                       delete [](char*)mpStart;\
-               }\
-           \
-               mpEnd = atPosition + difference_type( mpEnd - position );\
-           \
-               mpStart    = pNewStart;\
-               mpEndOfBuf = pNewStart + newLen;\
-           \
-               return newPos;\
-       }\
-\
-public:\
-\
-       inline vectorClass() : mpStart(0), \
-                                                  mpEnd(0),\
-                                                  mpEndOfBuf(0)\
-       {}\
-\
-       inline vectorClass( const_iterator first, const_iterator last )\
-               : mpStart(0),\
-                 mpEnd(0),\
-                 mpEndOfBuf(0)\
-               \
-               { while( first != last ) push_back( *first++ ); }\
-\
-       inline vectorClass( size_type n, const value_type& value = value_type() )\
-               : mpStart(0),\
-                 mpEnd(0),\
-                 mpEndOfBuf(0)\
-               \
-               { for( size_type i = 0; i != n; ++i ) push_back( value ); }\
-\
-       inline const vectorClass& operator=( const vectorClass& other )\
-       {\
-               if (mpStart) \
-               {\
-                       DestructRange( begin(), end() );\
-                       delete [](char*)mpStart; \
-               }\
-\
-               size_t newLen = difference_type( other.mpEndOfBuf - other.mpStart );\
-\
-               mpStart = (iterator)( new char[newLen*sizeof(value_type)] );\
-\
-               PlacementCopy( other.begin(), other.end(), mpStart );\
-\
-               mpEnd = mpStart + other.size();\
-\
-               mpEndOfBuf = mpStart + newLen;\
-\
-               return *this;\
-       }\
-\
-       inline vectorClass( const vectorClass& other )\
-               : mpStart(0),\
-                 mpEnd(0),\
-                 mpEndOfBuf(0)\
-       {\
-               this->operator=( other );\
-       }\
-\
-       inline ~vectorClass() \
-       { \
-               if (mpStart) \
-               {\
-                       DestructRange( begin(), end() );\
-                       delete [](char*)mpStart; \
-               }\
-       }\
-\
-       inline iterator begin() { return mpStart; }\
-\
-       inline const_iterator begin() const { return mpStart; }\
-\
-       inline iterator end() { return mpEnd; }\
-\
-       inline const_iterator end() const { return mpEnd; }\
-\
-       inline size_type size() const { return (size_type)difference_type(mpEnd-mpStart); }\
-\
-       inline size_type max_size() const { return UINT_MAX/sizeof(value_type); }\
-\
-       inline size_type capacity() const \
-                       { return difference_type(mpEndOfBuf-mpStart)/sizeof(value_type); }\
-\
-       inline int empty() const { return mpStart == mpEnd; }\
-\
-       inline reference operator[](size_type n) { return *(mpStart+n); }\
-\
-       inline const_reference operator[](size_type n) const { return *(mpStart+n); }\
-\
-       inline reference front() { return (*mpStart); }\
-       \
-       inline const_reference front() const { return (*mpStart); }\
-\
-       inline reference back() { return (*(mpEnd-1)); }\
-\
-       inline const_reference back() const { return (*(mpEnd-1)); }\
-\
-       inline void reserve(size_type n) {}\
-\
-       inline void push_back(const value_type& x)\
-       {\
-               if ( mpEnd != mpEndOfBuf ) \
-               {\
-                       new (mpEnd) value_type(x);\
-                       ++mpEnd;\
-               }\
-               else\
-                       DoInsert( mpEnd, x );\
-       }\
-\
-       inline iterator insert(iterator position, const value_type& x = value_type())\
-       {\
-               if ( position == mpEnd && mpEnd != mpEndOfBuf )\
-               {\
-                       new (mpEnd) value_type(x);\
-                       ++mpEnd;\
-                       return (mpEnd-1);\
-               }\
-               else return DoInsert( position, x );\
-       }\
-\
-       inline void pop_back()\
-       {\
-               DestructRange( mpEnd-1, mpEnd );\
-\
-               --mpEnd;\
-       }\
-\
-       inline void erase(iterator first, iterator last)\
-       {\
-               if ( last == mpEnd )\
-               {\
-                       DestructRange( first, last );\
-                       mpEnd = first;\
-                       return;\
-               }\
-           \
-               CopyObjects( last, last + difference_type( mpEnd - last ), first );\
-           \
-               iterator newEnd = mpEnd - difference_type( last - first );\
-               DestructRange( newEnd, mpEnd );\
-           \
-               mpEnd = newEnd;\
-       }\
-\
-       inline void erase( iterator position )\
-       {\
-               erase( position, position + 1 );\
-       }\
-\
-       inline void sort()\
-       {\
-               if ( size() < 2 ) return;\
-               quick_sort( 0, size()-1 );\
-       }\
-}
-
-/////////////////////////////// shallow-copy container ///////////////////////
-
-#define __DEFINE_STL_VECTOR_SHALLOW( vectorClass, Type ) class vectorClass {\
-\
-public:\
-       typedef Type              value_type;\
-       typedef value_type*           iterator;\
-       typedef const value_type* const_iterator;\
-       typedef iterator                  pointer;\
-       typedef const iterator    const_pointer;\
-       typedef value_type&       reference;\
-       typedef const value_type& const_reference;\
-       typedef size_t            size_type;\
-       typedef ptrdiff_t         difference_type;\
-\
-       typedef iterator       OutputIterator;\
-       typedef const_iterator InputIterator;\
-\
-protected:\
-\
-       inline void PlacementCopy( const_iterator first, const_iterator last, iterator result )\
-       {\
-               memcpy(result, first, int(difference_type(last-first)*sizeof(value_type)) );\
-       }\
-\
-       inline void ConstructObjects( iterator first, iterator last, const value_type& pattern )\
-       {\
-                       if ( sizeof(pattern) == 1 )\
-                       \
-                               memset( first, int(difference_type(last-first)/sizeof(value_type)), \
-                                       int(*((char*)&pattern)) );\
-                       else\
-                               while( first != last ) \
-                                       *first++ = pattern;\
-       }\
-\
-       inline void CopyObjects( iterator first, iterator last, iterator result )\
-       {\
-               memcpy(result, first, int(difference_type(last-first)*sizeof(value_type)) );\
-       }\
-\
-       inline void CopyObjectsBack( iterator first, iterator last, iterator result )\
-       {\
-               memmove(result, first, int(difference_type(last-first)*sizeof(value_type)) );\
-       }\
-\
-public:\
-\
-       class reverse_iterator \
-       {\
-               friend class vectorClass;\
-               friend class const_reverse_iterator;\
-\
-       public:\
-               iterator mpPos;\
-\
-       public:\
-\
-               reverse_iterator() {}\
-\
-               reverse_iterator ( iterator pPos )\
-               {\
-                       mpPos = pPos;\
-               }\
-       \
-               int operator==( const reverse_iterator& rhs ) const { return (mpPos == rhs.mpPos); }\
-               int operator!=( const reverse_iterator& rhs ) const { return (mpPos != rhs.mpPos); }\
-\
-               inline reverse_iterator( const reverse_iterator& other )\
-               {\
-                       mpPos = other.mpPos;\
-               }\
-\
-               inline const reverse_iterator& operator--() \
-               {\
-                       --mpPos;\
-                       return *this;\
-               }\
-\
-               inline reverse_iterator operator--(int)\
-               {\
-                       reverse_iterator tmp = *this;\
-                       --mpPos;\
-                       return tmp;\
-               }\
-\
-               inline const reverse_iterator & operator++() \
-               {\
-                       ++mpPos;\
-                       return *this;\
-               }\
-\
-               inline reverse_iterator  operator++(int)\
-               {\
-                       reverse_iterator tmp = *this;\
-                       ++mpPos;\
-                       return tmp;\
-               }\
-\
-               inline const_reference operator*() const { return *mpPos; }\
-       };\
-\
-\
-       class const_reverse_iterator \
-       {\
-       protected:\
-               iterator mpPos;\
-       public:\
-\
-               const_reverse_iterator() {}\
-\
-               const_reverse_iterator( const iterator pPos )\
-               {\
-                       mpPos = pPos;\
-               }\
-       \
-               int operator==( const const_reverse_iterator& rhs ) const { return (mpPos == rhs.mpPos); }\
-               int operator!=( const const_reverse_iterator& rhs ) const { return (mpPos != rhs.mpPos); }\
-\
-               inline const_reverse_iterator( const reverse_iterator& other )\
-               {\
-                       mpPos = other.mpPos;\
-               }\
-\
-               inline const const_reverse_iterator& operator--() \
-               {\
-                       --mpPos;\
-                       return *this;\
-               }\
-\
-               inline const_reverse_iterator operator--(int)\
-               {\
-                       const_reverse_iterator tmp = *this;\
-                       --mpPos;\
-                       return tmp;\
-               }\
-\
-               inline const const_reverse_iterator & operator++() \
-               {\
-                       ++mpPos;\
-                       return *this;\
-               }\
-\
-               inline const_reverse_iterator operator++(int)\
-               {\
-                       const_reverse_iterator tmp = *this;\
-                       ++mpPos;\
-                       return tmp;\
-               }\
-\
-               inline const_reference operator*() const { return *mpPos; }\
-       };\
-\
-protected:\
-       \
-       pointer mpStart;\
-       pointer mpEnd;\
-       pointer mpEndOfBuf;\
-\
-protected:\
-\
-       inline void quick_sort(int low, int hi) \
-       {\
-       }\
-\
-       inline void DestructRange( iterator first, iterator last )\
-       {\
-       }\
-\
-       inline iterator DoInsert(iterator position, const value_type& x)\
-       {\
-               if ( mpEnd < mpEndOfBuf )\
-               {\
-                       new (mpEnd) value_type(*(mpEnd-1) );\
-           \
-                       CopyObjectsBack( position, mpEnd, position + 1 );\
-           \
-                       *position = x;\
-           \
-                       ++mpEnd;\
-           \
-                       return position;\
-               }\
-           \
-               size_type minBufLen = WXSTL_VECTOR_MIN_BUF_SIZE/sizeof(value_type);\
-           \
-               size_type doubledSize = size()*2;\
-           \
-               size_type newLen = ( doubledSize < minBufLen ) ? minBufLen : doubledSize;\
-           \
-               iterator pNewStart = (iterator)( new char[newLen*sizeof(value_type)] );\
-           \
-               PlacementCopy( mpStart, position, pNewStart );\
-           \
-               iterator atPosition = pNewStart + difference_type( position - mpStart );\
-           \
-               new (atPosition) value_type(x);\
-           \
-               iterator newPos = atPosition;\
-           \
-               ++atPosition;\
-           \
-               if ( mpStart ) \
-               {\
-                       PlacementCopy( position, mpEnd, atPosition );\
-                       DestructRange( mpStart, mpEnd );\
-                       delete [](char*)mpStart;\
-               }\
-           \
-               mpEnd = atPosition + difference_type( mpEnd - position );\
-           \
-               mpStart    = pNewStart;\
-               mpEndOfBuf = pNewStart + newLen;\
-           \
-               return newPos;\
-       }\
-\
-public:\
-\
-       inline vectorClass() : mpStart(0), \
-                                                  mpEnd(0),\
-                                                  mpEndOfBuf(0)\
-       {}\
-\
-       inline vectorClass( const_iterator first, const_iterator last )\
-               : mpStart(0),\
-                 mpEnd(0),\
-                 mpEndOfBuf(0)\
-               \
-               { while( first != last ) push_back( *first++ ); }\
-\
-       inline vectorClass( size_type n, const value_type& value = value_type() )\
-               : mpStart(0),\
-                 mpEnd(0),\
-                 mpEndOfBuf(0)\
-               \
-               { for( size_type i = 0; i != n; ++i ) push_back( value ); }\
-\
-       inline const vectorClass& operator=( const vectorClass& other )\
-       {\
-               if (mpStart) \
-               {\
-                       DestructRange( begin(), end() );\
-                       delete [](char*)mpStart; \
-               }\
-\
-               size_t newLen = difference_type( other.mpEndOfBuf - other.mpStart );\
-\
-               mpStart = (iterator)( new char[newLen*sizeof(value_type)] );\
-\
-               PlacementCopy( other.begin(), other.end(), mpStart );\
-\
-               mpEnd = mpStart + other.size();\
-\
-               mpEndOfBuf = mpStart + newLen;\
-\
-               return *this;\
-       }\
-\
-       inline vectorClass( const vectorClass& other )\
-               : mpStart(0),\
-                 mpEnd(0),\
-                 mpEndOfBuf(0)\
-       {\
-               this->operator=( other );\
-       }\
-\
-       inline ~vectorClass() \
-       { \
-               if (mpStart) \
-               {\
-                       DestructRange( begin(), end() );\
-                       delete [](char*)mpStart; \
-               }\
-       }\
-\
-       inline iterator begin() { return mpStart; }\
-\
-       inline const_iterator begin() const { return mpStart; }\
-\
-       inline iterator end() { return mpEnd; }\
-\
-       inline const_iterator end() const { return mpEnd; }\
-\
-       inline size_type size() const { return (size_type)difference_type(mpEnd-mpStart); }\
-\
-       inline size_type max_size() const { return UINT_MAX/sizeof(value_type); }\
-\
-       inline size_type capacity() const \
-                       { return difference_type(mpEndOfBuf-mpStart)/sizeof(value_type); }\
-\
-       inline int empty() const { return mpStart == mpEnd; }\
-\
-       inline reference operator[](size_type n) { return *(mpStart+n); }\
-\
-       inline const_reference operator[](size_type n) const { return *(mpStart+n); }\
-\
-       inline reference front() { return (*mpStart); }\
-       \
-       inline const_reference front() const { return (*mpStart); }\
-\
-       inline reference back() { return (*(mpEnd-1)); }\
-\
-       inline const_reference back() const { return (*(mpEnd-1)); }\
-\
-       inline void reserve(size_type n) {}\
-\
-       inline void push_back(const value_type& x)\
-       {\
-               if ( mpEnd != mpEndOfBuf ) \
-               {\
-                       new (mpEnd) value_type(x);\
-                       ++mpEnd;\
-               }\
-               else\
-                       DoInsert( mpEnd, x );\
-       }\
-\
-       inline iterator insert(iterator position, const value_type& x = value_type())\
-       {\
-               if ( position == mpEnd && mpEnd != mpEndOfBuf )\
-               {\
-                       new (mpEnd) value_type(x);\
-                       ++mpEnd;\
-                       return (mpEnd-1);\
-               }\
-               else return DoInsert( position, x );\
-       }\
-\
-       inline void pop_back()\
-       {\
-               DestructRange( mpEnd-1, mpEnd );\
-\
-               --mpEnd;\
-       }\
-\
-       inline void erase(iterator first, iterator last)\
-       {\
-               if ( last == mpEnd )\
-               {\
-                       DestructRange( first, last );\
-                       mpEnd = first;\
-                       return;\
-               }\
-           \
-               CopyObjects( last, last + difference_type( mpEnd - last ), first );\
-           \
-               iterator newEnd = mpEnd - difference_type( last - first );\
-               DestructRange( newEnd, mpEnd );\
-           \
-               mpEnd = newEnd;\
-       }\
-\
-       inline void erase( iterator position )\
-       {\
-               erase( position, position + 1 );\
-       }\
-\
-       inline void sort()\
-       {\
-               if ( size() < 2 ) return;\
-               quick_sort( 0, size()-1 );\
-       }\
-}
-
-
-
-// redefine below symbol to change the default allocation unit of vector content buffer
-#define WXSTL_VECTOR_MIN_BUF_SIZE 64
-
-// defines vector class, where objects are copied
-// using "deep-copy" sematics (i.e. by calling their copy constructors)
-
-#define WXSTL_VECTOR(ELEMENT_CLASS) \
-__DEFINE_STL_VECTOR_DEEP(_WXSTL_VECTOR_##ELEMENT_CLASS, ELEMENT_CLASS)
-
-// defines vector class, where objects are copied
-// using "shallow-copy" sematics (i.e. instead of calling
-// their constructors, memcpy() and memmove() are used to copy their raw data)
-
-
-#define WXSTL_VECTOR_SHALLOW_COPY(ELEMENT_CLASS) __DEFINE_STL_VECTOR_SHALLOW(_WXSTL_VECTORSC_##ELEMENT_CLASS, ELEMENT_CLASS)
-
-#endif
index 64d917bd4e0e9f2fda9b9d63c345c2cfa38ee094..33ac212e0360250e33d7c12dc72f56d489e546e3 100644 (file)
 // just a copy of argv
 static char **g_argv = NULL;
 
+class HelpGenApp: public wxApp
+{
+public:
+    HelpGenApp() {};
+
+    bool OnInit();
+};
+
+IMPLEMENT_APP(HelpGenApp);
+
 // -----------------------------------------------------------------------------
 // private functions
 // -----------------------------------------------------------------------------
@@ -456,7 +466,12 @@ static void usage()
     exit(1);
 }
 
+/*
 int main(int argc, char **argv)
+{
+*/
+
+bool HelpGenApp::OnInit()
 {
     enum
     {
@@ -634,7 +649,7 @@ int main(int argc, char **argv)
             wxLogError("Can't complete diff.");
 
             // failure
-            return 1;
+            return false;
         }
 
         DocManager docman(paramNames);
@@ -654,7 +669,7 @@ int main(int argc, char **argv)
         docman.DumpDifferences(ctxTop);
     }
 
-    return 0;
+    return false;
 }
 
 // -----------------------------------------------------------------------------
@@ -1914,6 +1929,10 @@ static const char *GetCurrentTime(const char *timeFormat)
 
 /*
    $Log$
+   Revision 1.8  1999/09/13 14:29:39  JS
+   Made HelpGen into a wxWin app (still uses command-line args); moved includes
+   into src for simplicity; added VC++ 5 project file
+
    Revision 1.7  1999/02/21 22:32:32  VZ
    1. more C++ parser fixes - now it almost parses wx/string.h
     a) #if/#ifdef/#else (very) limited support
index 626b82f58aa4493dd05365d766a2fc0d0fcfcb01..82bdf07561820e7c4fad310d1cc21b72b5cb7ef7 100644 (file)
@@ -1,3 +1,2 @@
-/* mondrian ICON "mondrian.ico" */
 #include "wx/msw/wx.rc"
 
diff --git a/utils/HelpGen/src/cjparser.h b/utils/HelpGen/src/cjparser.h
new file mode 100644 (file)
index 0000000..384b2b1
--- /dev/null
@@ -0,0 +1,125 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        No names yet.
+// Purpose:     Implementation of C++/Java parser
+//              compatible with SourceParserBase interface
+// Author:      Aleksandras Gluchovas
+// Modified by:
+// Created:     22/09/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Aleskandars Gluchovas
+// Licence:       wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __CJPARSESR_G__
+#define __CJPARSESR_G__
+
+#include "srcparser.h"
+
+#include <iostream.h>
+#include <memory.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+// class parses given "memory-resident" Java or C++ source code
+// and captures information about classes/attrubutes/methods/
+// arguments/etc into structures. Conforms with SourceParserBase
+// interface requirements.
+
+class CJSourceParser : public SourceParserBase
+{
+protected:
+    // begining of the full-text area of the source file
+    char* mpStart;
+
+    // points to first character after the end
+    // of teh full-text area
+    char* mpEnd;
+
+    // current "privacy level"
+    int   mCurVis;
+
+    // current parsing position int full-text area
+    char*  cur;
+
+    // about the current class
+    bool   mIsVirtual;
+    bool   mIsTemplate;
+    size_t mNestingLevel;
+
+    // context data for which is currently being collected
+    spContext* mpCurCtx;
+
+    int mCurCtxType; // type of the current context
+
+    bool mCommentsOn;
+    bool mMacrosOn;
+
+protected:
+
+    void AttachComments( spContext& ctx, char* cur );
+    void ParseKeyword( char*& cur );
+    bool ParseNameAndRetVal( char*& cur, bool& isAMacro );
+    bool ParseArguments( char*& cur );
+    void ParseMemberVar( char*& cur );
+    void SkipFunction( char*& cur );
+    void SkipFunctionBody( char*& cur );
+    bool CheckVisibilty( char*& cur );
+
+    void AddClassNode( char*& cur );
+    void AddMacroNode( char*& cur );
+    void AddEnumNode( char*& cur );
+    void AddTypeDefNode( char*& cur );
+
+    void DumpOperationInfo( spOperation& info, const string& tab, ostream& os );
+    void DumpClassHeader( spClass& info, ostream& os );
+    void DumpClassBody( spClass& info, ostream& os );
+
+public:
+
+    // NOTE:: discarding of macros or comments improves performance and
+    //          decreases memory usage
+
+    CJSourceParser(bool collectCommnets = 1,
+                   bool collectMacros   = 1);
+
+    // returns the root-node of the created context tree
+    // (user is responsible for releasing it from the heep)
+    // "end" should point to the last (character + 1) of the
+    // source text
+
+    virtual spFile* Parse( char* start, char* end );
+};
+
+// inline'ed helpers used (just info):
+/*
+static inline void skip_to_eol( char*& cur );
+static inline void skip_eol( char*& cur );
+static inline bool skip_to_next_comment_in_the_line( char*& cur );
+static void skip_to_prev_line( char*& cur );
+static inline void skip_comments( char*& cur );
+static inline void clear_commets_queue();
+static inline void skip_quoted_string( char*& cur );
+static inline bool get_next_token( char*& cur );
+static inline void skip_preprocessor_dir( char*& cur );
+static void skip_token( char*& cur );
+static inline size_t get_token_len( char* tok );
+static inline bool cmp_tokens( char* tok1, char* tok2 );
+static inline bool cmp_tokens_fast( char* tok1, char* tok2, size_t len );
+static inline void skip_tempalate_statement( char*& cur );
+static inline void skip_statement( char*& cur );
+static inline void skip_token_back( char*& cur );
+static inline void skip_next_token_back( char*& cur );
+static string get_token_str( char* cur );
+static size_t skip_block( char*& cur );
+static inline bool skip_imp_block( char*& cur );
+static bool is_class_token( char*& cur );
+inline static bool is_forward_decl( char* cur );
+inline static bool is_function( char* cur, bool& isAMacro );
+static inline void skip_scope_block( char*& cur );
+static void arrange_indirection_tokens_between( string& type, string& identifier );
+static bool is_keyword( char* cur );
+static inline void get_string_between( char* start, char* end, string* pStr );
+static char* set_comment_text( string& text, char* start );
+*/
+
+#endif
diff --git a/utils/HelpGen/src/docripper.h b/utils/HelpGen/src/docripper.h
new file mode 100644 (file)
index 0000000..23ae9ac
--- /dev/null
@@ -0,0 +1,157 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        No names yet.
+// Purpose:     Contrib. demo
+// Author:      Aleksandras Gluchovas
+// Modified by:
+// Created:     22/09/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Aleskandars Gluchovas
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __DOCRIPPER_G__
+#define __DOCRIPPER_G__
+
+#include "scriptbinder.h"
+#include "srcparser.h"
+#include "sourcepainter.h"
+
+#if defined( wxUSE_TEMPLATE_STL )
+               
+       #include <vector>
+
+       typedef vector<ScriptTemplate*> STemplateListT;
+
+#else
+
+       #include "wxstlvec.h"
+
+       typedef ScriptTemplate* ScriptTemplatePtrT; 
+       typedef WXSTL_VECTOR_SHALLOW_COPY(ScriptTemplatePtrT) STemplateListT;
+
+#endif
+
+
+// specific DocGenerator class for "Ripper", 
+// also acts as source code visitor
+
+class RipperDocGen : public DocGeneratorBase, public spVisitor
+{
+protected:
+       // templates for various sections
+       ScriptTemplate mTopTempl;
+       ScriptTemplate mContentIdxTempl;
+       ScriptTemplate mSuperContentTempl;
+       ScriptTemplate mSubContentTempl;
+       ScriptTemplate mOutLineTempl;
+       ScriptTemplate mOutLine1Templ;
+
+       // template used for corss-references
+       ScriptTemplate mRefTempl;
+
+       // template used to show not-existing sections
+       ScriptTemplate mDeadRefTempl;
+
+       // template collection for generation of class-tree
+       STemplateListT mTreeTemplates;
+
+       // pointers to all major index sections
+       ScriptSection* mpTopIdx;
+       ScriptSection* mpClassIdx;
+       ScriptSection* mpEnumIdx;
+       ScriptSection* mpTypeDefIdx;
+       ScriptSection* mpMacroIdx;
+       ScriptSection* mpGlobalVarsIdx;
+       ScriptSection* mpGlobalFuncIdx;
+       ScriptSection* mpConstIdx;
+
+       // parser set up from user-code for sepcific language
+       SourceParserBase* mpParser;
+
+       // class section, which is currently being
+       // assembled
+       ScriptSection*    mpCurClassSect;
+       
+       // source syntax heighlighter object
+       SourcePainter  mSrcPainter;
+
+       // context, to which all file contexts
+       // are assembled
+       spContext*     mpFileBinderCtx;
+
+       // script tags set up from usesr code
+       MarkupTagsT    mTags;
+
+protected:
+       // helpers
+       void AppendComments( spContext& fromContext, string& str );
+
+       void AppendMulitilineStr( string& st, string& mlStr );
+
+       void AppendHighlightedSource( string& st, string source );
+
+       // returns TRUE, if no comments found in the context,
+       // plus, creates dummy(empty) section, and puts a 
+       // reference woth "dead-link" template to it in the 
+       // given index-section "toSect"
+
+       bool CheckIfUncommented( spContext& ctx, ScriptSection& toSect );
+
+       // checks if context has any comments, then returns
+       // template of normal reference, otherwise of dead reference
+
+       ScriptTemplate* GetRefTemplFor( spContext& ctx );
+
+       // adds "someClass::" perfix to the context name,
+       // if it's not in the file scope (i.e. if it's not global)
+
+       string GetScopedName( spContext& ofCtx );
+
+       // adds section to currently assembled class section
+       // and places references to it from "public", "protected"
+       // or "private" indexing-subsections of the class, depending
+       // on the visibility of the context
+
+       void AddToCurrentClass( ScriptSection* pSection, spContext& ctx, 
+                                                       const char* subSectionName );
+
+       // called, after all files are processed, to
+       // resolve possible super/derived class relations,
+       // and put cross references to them - where resolution was
+       // successful
+       void LinkSuperClassRefs();
+
+       // implementations of "visiting procedures", declared in spVisitor
+
+       virtual void VisitClass( spClass& cl );
+       virtual void VisitEnumeration( spEnumeration& en );
+       virtual void VisitTypeDef( spTypeDef& td );
+       virtual void VisitPreprocessorLine( spPreprocessorLine& pd );
+       virtual void VisitAttribute( spAttribute& attr );
+       virtual void VisitOperation( spOperation& op );
+
+       // overriden member of DocGernatorBase
+
+       virtual bool OnSaveDocument( ScriptStream& stm );
+
+       virtual ScriptSection* GetTopSection() 
+               { return mpTopIdx; }
+
+public:
+       RipperDocGen();
+       ~RipperDocGen();
+
+       // should be called onece to set user-code provided,
+       // parser for specific source code language
+       // (NOTE:: it's the user-code's responsibility to
+       //  relseas memory of pParser)
+
+       void Init( SourceParserBase* pParser );
+       
+       // should be called on each file
+       
+       void ProcessFile( const char* sourceFile );
+};
+
+
+#endif
\ No newline at end of file
diff --git a/utils/HelpGen/src/ifcontext.h b/utils/HelpGen/src/ifcontext.h
new file mode 100644 (file)
index 0000000..80014c8
--- /dev/null
@@ -0,0 +1,100 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        No names yet.
+// Purpose:     Contrib. demo
+// Author:      Aleksandras Gluchovas
+// Modified by:
+// Created:     27/12/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Aleskandars Gluchovas
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __IFCONTEXT_G__
+#define __IFCONTEXT_G__
+
+#include "srcparser.h"
+#include "cjparser.h"
+
+class spBookmark
+{
+public:
+       size_t mFrom;
+       size_t mLen;
+       size_t mFileNo;
+
+       inline spBookmark() {}
+
+       inline spBookmark( int from, int len, int fileNo )
+               : mFrom( from ), mLen( len ), mFileNo( fileNo )
+       {}
+};
+
+#if defined( wxUSE_TEMPLATE_STL )
+
+       typedef vector<spBookmark) BookmarkListT
+
+#else
+
+       typedef WXSTL_VECTOR_SHALLOW_COPY(spBookmark) BookmarkListT;
+
+#endif
+
+
+class spInterFileContext : public spContext
+{
+protected:
+
+       BookmarkListT  mDeletionMarks;
+
+       BookmarkListT  mFiltered;
+
+       size_t         mCurFileNo;
+
+       CJSourceParser mParser;
+
+protected:
+
+       size_t GetFileNoOfContext( spContext& ctx );
+       size_t GetFileNo( const string& fname );
+
+       void InsertBookmarkSorted( BookmarkListT& lst, spBookmark& mark );
+
+       void DoAppendSourceFragment( string& source, 
+                                                                string& result, 
+                                                        size_t  pos, size_t len );
+
+       void GenerateContextBody( spContext& ctx, 
+                                                         string&    source,
+                                                         string&    result, 
+                                                         size_t& lastSavedPos,
+                                                         size_t& lastKnownPos );
+
+public:
+
+       StrListT       mFiles;
+       StrListT       mContents;
+
+public:
+
+       spInterFileContext();
+       ~spInterFileContext();
+
+       void AddFile( const string& fname, const string& content );
+
+       void RemoveContext( spContext& ctx );
+
+       void GenrateContents();
+
+       void ParseContents( SourceParserPlugin* pPlugin = NULL );
+
+       void WriteToFiles();
+
+       // overriden method of the base class (finds out the source fragment)
+
+       virtual string GetBody( spContext* pCtx = NULL );
+
+       virtual string GetHeader( spContext* pCtx = NULL );
+};
+
+
+#endif
\ No newline at end of file
diff --git a/utils/HelpGen/src/makefile.nt b/utils/HelpGen/src/makefile.nt
deleted file mode 100644 (file)
index d1f1075..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#
-# File:                makefile.nt
-# Author:      Julian Smart
-# Created:     1993
-# Updated:     
-# Copyright:   (c) 1993, AIAI, University of Edinburgh
-#
-# "%W% %G%"
-#
-# Makefile : Builds minimal example (MS VC++).
-# Use FINAL=1 argument to nmake to build final version with no debugging
-# info
-
-# Set WXDIR for your system
-WXDIR = $(WXWIN)
-
-WXUSINGDLL=0
-
-!include $(WXDIR)\src\ntwxwin.mak
-
-THISDIR = $(WXDIR)\utils\HelpGen\src
-PROGRAM=HelpGen
-EXTRAINC=-I..\include
-
-OBJECTS = $(PROGRAM).obj cjparser.obj ifcontext.obj markup.obj\
-  scriptbinder.obj srcparser.obj sourcepainter.obj
-
-$(PROGRAM):    $(PROGRAM).exe
-
-all:    wx $(PROGRAM).exe
-
-wx:
-        cd $(WXDIR)\src\msw
-        nmake -f makefile.nt FINAL=$(FINAL)
-        cd $(THISDIR)
-
-wxclean:
-        cd $(WXDIR)\src\msw
-        nmake -f makefile.nt clean
-        cd $(THISDIR)
-
-$(PROGRAM).exe:      $(DUMMYOBJ) $(WXLIB) $(OBJECTS) $(PROGRAM).res
-       $(link) @<<
--out:$(PROGRAM).exe
-$(LINKFLAGS)
-$(DUMMYOBJ) $(OBJECTS) $(PROGRAM).res
-$(LIBS)
-<<
-
-
-$(PROGRAM).obj:      $(PROGRAM).$(SRCSUFF) $(DUMMYOBJ)
-        $(cc) @<<
-$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
-<<
-
-$(PROGRAM).res :      $(PROGRAM).rc $(WXDIR)\include\wx\msw\wx.rc
-    $(rc) -r /i$(WXDIR)\include -fo$@ $(PROGRAM).rc
-
-
-clean:
-        -erase *.obj
-        -erase *.exe
-        -erase *.res
-        -erase *.map
-        -erase *.sbr
-        -erase *.pdb
diff --git a/utils/HelpGen/src/markup.h b/utils/HelpGen/src/markup.h
new file mode 100644 (file)
index 0000000..13e43a0
--- /dev/null
@@ -0,0 +1,51 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        No names yet.
+// Purpose:     Contrib. demo
+// Author:      Aleksandras Gluchovas
+// Modified by:
+// Created:     22/09/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Aleskandars Gluchovas
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __MARKUP_G__
+#define __MARKUP_G__
+
+// indicies for the MarkupTagsT array
+
+#define TAG_BOLD        0
+#define TAG_ITALIC             1
+
+#define TAG_FIXED_FONT  2
+#define TAG_BLACK_FONT 3
+#define TAG_RED_FONT   4
+#define TAG_GREEN_FONT 5
+#define TAG_BLUE_FONT  6
+
+#define TAG_PARAGRAPH  7
+#define TAG_NEW_LINE   8
+#define TAG_HEADING_1  9
+#define TAG_HEADING_2  10
+#define TAG_HEADING_3   11
+
+#define TAG_ITEM_LIST   12
+#define TAG_LIST_ITEM   13 
+
+struct TagStructT
+{
+       char* start; // tag that starts style
+       char* end;   // tag that finishes style
+};
+
+// tag array
+typedef TagStructT* MarkupTagsT;
+
+// returns array of TagStructT with tag strings for HTML
+
+MarkupTagsT get_HTML_markup_tags();
+
+// MarkupTagsT get_PostScript_markup_tags();
+// MarkupTagsT get_Latex_markup_tags();
+
+#endif
\ No newline at end of file
diff --git a/utils/HelpGen/src/scriptbinder.h b/utils/HelpGen/src/scriptbinder.h
new file mode 100644 (file)
index 0000000..17c52ff
--- /dev/null
@@ -0,0 +1,377 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        No names yet.
+// Purpose:     Contrib. demo
+// Author:      Aleksandras Gluchovas
+// Modified by:
+// Created:     22/09/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Aleskandars Gluchovas
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __SCRIPTBINDER_G__
+#define __SCRIPTBINDER_G__
+
+#if defined( wxUSE_TEMPLATE_STL )
+
+       #include <vector>
+
+       #ifdef WIN32
+               #include <bstring.h>
+       #else
+               #include <strclass.h>
+               #include <string.h>
+       #endif
+
+#else
+
+       #include "wxstlvec.h"
+       #include "wx/string.h"
+       
+       // FIXME:: dirty!
+       typedef wxString string;
+
+#endif
+
+#ifndef ASSERT
+// assert yourself
+#define ASSERT(x) if (!(x) ) throw;
+#endif
+
+#include "markup.h"
+
+// just another portable stream class...
+
+class ScriptStream
+{
+protected:
+       char*  mpBuf;
+       size_t mSize;
+       size_t mCapacity;
+public:
+       ScriptStream();
+       ~ScriptStream();
+
+       void WriteBytes( const void* srcBuf, size_t count );
+
+       ScriptStream& operator<<( const char* str );
+       ScriptStream& operator<<( const string& str );
+       ScriptStream& operator<<( char ch );
+
+       void endl();
+
+       inline char*  GetBuf() { return mpBuf; }
+       inline size_t GetBufSize() { return mSize; }
+
+       // clears current contents of the stream
+       void Reset() { mSize = 0; }
+};
+
+
+class ScriptTemplate;
+
+// used internally by ScriptTemplate
+
+enum TEMPLATE_VARIABLE_TYPES
+{
+       TVAR_INTEGER,
+       TVAR_STRING,
+       TVAR_DOUBLE,
+       TVAR_REF_ARRAY
+};
+
+// helper structures used only by ScriptTemplate
+
+struct TVarInfo
+{
+public:
+       const char*             mName;
+       int                     mType;
+       int                     mOfs;
+
+       TVarInfo( const char* name, int ofs, int varType )
+               : mName(name),
+                 mType( varType ),
+                 mOfs( ofs )
+       {}
+};
+
+struct TArrayInfo : public TVarInfo
+{
+public:
+       int mRefOfs;
+       int mSizeIntOfs;
+       int mObjRefTemplOfs;
+
+       TArrayInfo( const char* name )
+               : TVarInfo( name, 0, TVAR_REF_ARRAY )
+       {}
+};
+
+// stores offset of the given member (of the given class)
+// to (*pOfs), though the use of template classes would have 
+// solved this problem in much clearer fashion
+
+// FOR NOW:: obtaining physical offset of class member
+//           does not appeare to be protable across compilers?
+// FIXME::   +/- 1 problem
+
+#ifdef __UNIX__
+       #define WEIRD_OFFSET 1
+#else
+       #define WEIRD_OFFSET 0
+
+#endif
+
+#define GET_VAR_OFS( className, varName, pOfs )          \
+       {                                                                                                        \
+               int* className::* varPtr;                                                \
+               varPtr = (int* className::*)&className::varName; \
+                                                                                                                \
+               (*pOfs) = int(*(int*)&varPtr)-WEIRD_OFFSET;                                      \
+       }
+
+class ScriptSection;
+
+#if defined( wxUSE_TEMPLATE_STL )
+
+       typedef vector<TVarInfo*> TVarListT;
+
+       // container class for sections
+       typedef vector<ScriptSection*> SectListT;
+
+#else
+
+       typedef TVarInfo*      TVarInfoPtrT;
+       typedef ScriptSection* ScriptSectionPtrT;
+
+       typedef WXSTL_VECTOR_SHALLOW_COPY(TVarInfoPtrT) TVarListT;
+
+       // container class for sections
+       typedef WXSTL_VECTOR_SHALLOW_COPY(ScriptSectionPtrT) SectListT;
+
+#endif
+
+// class performs preprocessing of arbitrary scripts,
+// replaces identifiers enclosed in $(..) tag, whith
+// values of the corresponding class member variables
+
+class ScriptTemplate
+{
+protected:
+       // do not use string object here - parsing of
+       // C string can be much faster (in debug v.)
+       char*     mTText; 
+                                     
+
+       TVarListT mVars;
+
+       inline void PrintVar( TVarInfo*  pInfo, 
+                                                 void*       dataObj, 
+                                                 ScriptStream& stm );
+       
+public:
+       ScriptTemplate( const string& templateText );
+       virtual ~ScriptTemplate();
+       
+       bool HasVar( const char* name );
+
+       // Member variables registration methods.
+
+       // NOTE:: GET_VAR_OFS() macro should be used
+       // to get offset of the class member (see #define above)
+       void AddStringVar ( const char* name, int ofs );
+       void AddIntegerVar( const char* name, int ofs );
+       void AddDoubleVar ( const char* name, int ofs );
+
+       void AddObjectRefArray( const char*     name,
+                                                       int                         ofsRefToFirstObj,
+                                   int                     ofsObjSizeInt,
+                                                       int                         ofsObjRefTempl
+                                                 );
+
+       // reads the script, replaces $(..) tags with values
+       // of registered members of dataObj object, and outputs
+       // the result to given text stream
+
+       void PrintScript( void* dataObj, ScriptStream& stm );
+};
+
+class ScriptSection;
+
+// class manages section and aggregated sections of
+// inter-linked documents
+
+class ScriptSection
+{
+protected:
+
+       // NOTE:: "$(NAME)", $(ID), "$(BODY)" and "$(REFLIST)" aree 
+       //        reseved template variables of ScriptSection 
+
+       // the below there members are registered to ScriptTemplate,
+       // GUID within the section tree (numeric)
+
+       ScriptSection*  mpParent;
+       string          mId;   // $(ID)      
+       string          mName; // $(NAME)      
+       string          mBody; // $(BODY)
+
+       // NULL, if this section is not aggregated anywhere
+
+       SectListT       mSubsections; // aggregated sectons
+       SectListT       mReferences;  // registered as $(REFLIST)
+
+       bool            mAutoHide;  // see autoHide arg, in constructor
+       bool            mSortOn;    // TRUE, if sort subsectons by naem
+
+       // tempalte for this section
+       ScriptTemplate* mpSectTempl;
+
+       // template used for links (or references) to this section
+       ScriptTemplate* mpRefTempl;
+       
+       // do not call destructor of this object,
+       // call RemoveRef() instead
+       int             mRefCount;
+
+       static int      mIdCounter;  // generator of GUIDs
+
+       // fields registered and used by ScriptTemplate object
+       void*           mRefFirst;
+       int             mArrSize;
+
+protected:
+       virtual void AddRef();
+       virtual void RemoveRef();
+       void DoRemoveEmptySections(int& nRemoved, SectListT& removedLst);
+       void DoRemoveDeadLinks( SectListT& removedLst);
+
+public:
+
+       // NOTE:: pass NULL to certain template, if your sure
+       //        this kind of template will never be used,
+       //        e.g. if section is contained but never referrenced,
+       //        then pReferenceTemplate can be NULL
+
+       // if autoHide option is TRUE, the section will be automatically
+       // collapsed (not shown) if it doesn't contain any references
+       // to other sections (e.g. could be usefull for autoamically 
+       // hiding empty index-sections). 
+
+       ScriptSection( const string&   name = "",
+                                  const string&   body = "",
+                                  ScriptTemplate* pSectionTemplate   = NULL,
+                                  ScriptTemplate* pReferenceTemplate = NULL,                      
+                                  bool            autoHide           = FALSE,
+                                  bool            sorted             = FALSE
+                                );
+
+       // calls RemoveRef() to all aggreagated sections first,
+       // then to all referenced section - this way all
+       // sections (even not aggregated ones) become "garbage-collected"
+
+       // NOTE:: do not call destructor directlly, call RemoveRef()
+       //        instead
+       virtual ~ScriptSection();
+
+
+       // if addToReferencesToo is TRUE, section is aggregated and
+       // also added to reference list of this section
+
+       void AddSection( ScriptSection* pSection, bool addToReferencesToo = FALSE );
+
+       // add cross-reference to this given section
+       void AddReference( ScriptSection* pReferredSection );
+
+       // subsection may be given of variable depth level,
+       // e.g. "publications/reviews/software"
+
+       ScriptSection* GetSubsection( const char* name );
+
+       // returns list aggregated sections
+       SectListT& GetSubsections();
+
+       // binds reserved template names ( $(..) ) to member 
+       // vairalbes in the ScriptSection class, should be called 
+       // to initialize each user-code provided script template
+
+       static void RegisterTemplate( ScriptTemplate& sectionTempalte );
+
+       // prints out section tree to the stream, starting from
+       // this section as a root node
+       virtual void Print( ScriptStream& stm );        
+
+       // searches empty sections which has autoHide == TRUE,
+       // and colapses them (this method should be called )
+       // on the root-section of the sections tree
+
+       // NOTE:: does not work properly, yet!
+       void RemoveEmptySections();
+};
+
+// base class for documnetation generators
+// (allows user code set up target script type,
+//  independently of documentation type)
+
+class DocGeneratorBase
+{
+protected:
+       MarkupTagsT    mTags;
+
+       // override this method to do some post processing
+       // after generation of document, or even write some
+       // data into output stream, before the section tree
+       // is flushed into it.
+
+       // return FALSE, if something has gone wrong and
+       // document cannot be saved now
+
+       virtual bool OnSaveDocument( ScriptStream& stm ) 
+               { return 1; }
+
+       // override this method to provide reference to
+       // the top section of the document (used as default
+       // starting section when saving a document)
+
+       virtual ScriptSection* GetTopSection() 
+               { return 0; }
+
+public:
+
+       DocGeneratorBase() 
+               : mTags(0) // no defaul script
+       {}
+
+       // dectrouctors of polymorphic classes SHOULD be virtual
+       virtual ~DocGeneratorBase() {}
+
+       // returns tags, being used for specific target script
+       MarkupTagsT GetScriptMarkupTags() { return mTags; }
+
+       // sets tag array for specific script
+
+       // NOTE:: Why virtual? since approach with MarkupTagsT is 
+       //        "flowless" only in theory. Overriding this method
+       //        allows document generators to check the type of the
+       //        target script, and perhaps make some modifications
+       //        to generator's tamplates, to match the specific script
+
+       virtual void SetScriptMarkupTags( MarkupTagsT tags )
+               { mTags = tags; }
+
+       // seves document to file starting from the root-node of
+       // the document (provided by GetTopSection() method),
+       // or from "pFromSection" if it's not NULL.
+
+       // fopenOptions arg. is string passed to fopen() method,
+       // returns TRUE, if saving was successfull
+
+       virtual bool SaveDocument( const char*    fname, 
+                                                          const char*    fopenOptions = "w",
+                                                          ScriptSection* pFromSection = NULL
+                                                          );
+                    
+};
+
+#endif
index 9e24ea95dd7bb50296c85eb7ccf514fa62e3e2e3..fbabb6644641ef54a55cb9a5d9d386272b389544 100644 (file)
@@ -25,7 +25,7 @@
        #include <map>
 #else
 
-       #include <wxstlac.h>
+       #include "wxstlac.h"
 
 #endif
 
diff --git a/utils/HelpGen/src/sourcepainter.h b/utils/HelpGen/src/sourcepainter.h
new file mode 100644 (file)
index 0000000..333059a
--- /dev/null
@@ -0,0 +1,104 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        No names yet.
+// Purpose:     Contrib. demo
+// Author:      Aleksandras Gluchovas
+// Modified by:
+// Created:     22/09/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Aleskandars Gluchovas
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __SOURCEPAINTER_G__
+#define __SOURCEPAINTER_G__
+
+#ifndef ASSERT
+#define ASSERT(x) if (!(x)) throw
+#endif
+
+#if defined( wxUSE_TEMPLATE_STL )
+
+       #include <vector.h>
+       typedef vector<int> SPBlockListT;
+
+       #ifdef WIN32
+               #include <bstring.h>
+       #else
+               #include <strclass.h>
+               #include <string.h>
+       #endif
+#else
+
+       #include "wxstlvec.h"
+       #include "wx/string.h"
+       
+       // FIXME:: dirty!
+       #define  string wxString
+
+       typedef WXSTL_VECTOR_SHALLOW_COPY(int) SPBlockListT;
+
+#endif
+
+#include "markup.h" // import MarkupTagsT definition
+
+// "colored" codes for highlighted blocks
+
+#define RANK_BLACK  0 // common source fragments
+#define RANK_BLUE   1 // basic types
+#define RANK_RED    2 // reserved words
+#define RANK_GREEN  3 // comments
+
+// colored block description format :
+// int( ( rank << 16 ) | ( source_range_len ) )
+
+
+// FOR NOW:: no lagnguage-map selection
+
+// source code syntax heighlighter (CPP+JAVA+VB+PASCAL)
+
+class SourcePainter
+{
+protected:
+       string            mResultStr;
+       SPBlockListT  mBlocks;
+       bool          mCollectResultsOn;
+
+       // state variables
+       bool        mIsInComment;
+       bool        mCommentIsMultiline;
+public:
+
+       // assembleResultString == TRUE - instructs painter
+       // to collect each chunk of srouce passed to ProcessSource(),
+       // so that results cann be futher obtained in a single string 
+       // instead of vector of block descriptions
+
+       SourcePainter( bool assembleResultString = TRUE );
+       virtual ~SourcePainter() {}
+
+       // can be called multiple times (e.g. on each source line)
+       void ProcessSource( char* src, int srcLen );
+
+       // method, for manually adjusting state of source painter
+       void SetState( bool isInComment,
+                          bool commentIsMultiline );
+
+       // reinitializes object - clears results of previouse processing
+       void Init( bool assembleResultString = TRUE );
+
+       // generates string of highlighted source for the scipting
+       // language given by "tags" argument
+       
+       virtual void GetResultString(string& result, MarkupTagsT tags);
+
+       // returns vector of block descriptors, see SPBlockListT definition
+       // (block descriptors can be used for fast custom hightlighted text generation)
+
+       SPBlockListT& GetBlocks();
+
+       // NOTE:: static method
+       // returns if the given word is a reserved word or basic type identifier
+       static bool IsKeyword( char* word, int wordLen );
+};
+
+#endif
diff --git a/utils/HelpGen/src/srcparser.h b/utils/HelpGen/src/srcparser.h
new file mode 100644 (file)
index 0000000..9eb017a
--- /dev/null
@@ -0,0 +1,769 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        No names yet.
+// Purpose:     To provide a simple _framework_
+//              for series of source code parsers with
+//              compatible interfaces
+// Author:      Aleksandras Gluchovas
+// Modified by: AG on 28/12/98
+// Created:     22/09/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Aleskandars Gluchovas
+// Licence:       wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __SRCPARSER_G__
+#define __SRCPARSER_G__
+
+#if defined( wxUSE_TEMPLATE_STL )
+    #include <vector>
+
+    #ifdef WIN32
+    #include <bstring.h>
+    #else
+
+    #include <strclass.h>
+    #include <string.h>
+
+    #endif
+
+#else
+    #include "wx/string.h"
+    #include "wxstlvec.h"
+
+    // FOR NOW:: quick n' dirty:
+
+    #define  string wxString
+
+#endif
+
+#include "markup.h" // markup tags used in spOperator::GetFullName()
+
+// these methods are used for debugging only and disappear in the release build
+#ifdef __WXDEBUG__
+    #define DECLARE_DUMP virtual void DumpThis(const wxString& indent) const;
+#else
+    #define DECLARE_DUMP
+#endif
+
+// context class list in "inside-out" order :
+
+class spContext;
+
+class spParameter;
+class spAttribute;
+class spOperation;
+class spEnumeration;
+class spTypeDef;
+class spPreprocessorLine;
+class spClass;
+class spNameSpace;
+class spFile;
+
+// source context visibilities
+enum SRC_VISIBLITY_TYPES
+{
+    SP_VIS_PUBLIC,
+    SP_VIS_PROTECTED,
+    SP_VIS_PRIVATE
+};
+
+// class types
+enum SP_CLASS_TYPES
+{
+    SP_CLTYPE_INVALID,
+    SP_CLTYPE_CLASS,
+    SP_CLTYPE_TEMPLATE_CLASS,
+    SP_CLTYPE_STRUCTURE,
+    SP_CLTYPE_UNION,
+    SP_CLTYPE_INTERFACE
+};
+
+// inheritance types
+enum SP_INHERITANCE_TYPES
+{
+    SP_INHERIT_VIRTUAL,
+    SP_INHERIT_PUBLIC,
+    SP_INHERIT_PRIVATE
+};
+
+// proprocessor definitions types (specific to C++ code)
+
+enum SP_PREP_DEFINITION_TYPES
+{
+    SP_PREP_DEF_DEFINE_SYMBOL,
+    SP_PREP_DEF_REDEFINE_SYMBOL,
+    SP_PREP_DEF_INCLUDE_FILE,
+    SP_PREP_DEF_OTHER
+};
+
+// common context types
+
+#define SP_CTX_UNKNOWN       0x000
+#define    SP_CTX_FILE          0x001
+#define    SP_CTX_NAMESPACE     0x002
+#define    SP_CTX_CLASS         0x004
+#define SP_CTX_TYPEDEF       0x008
+#define SP_CTX_PREPROCESSOR  0x010
+#define SP_CTX_ENUMERATION   0x020
+#define    SP_CTX_ATTRIBUTE     0x040
+#define    SP_CTX_OPERATION     0x080
+#define    SP_CTX_PARAMETER     0x100
+
+// other (custom) context codes may be defined elsewere, however they should
+// not clash with above codes for common type and also should not
+// exceed 16-bits of in value
+
+// masks all context types (up to 16 custom context can be defined)
+
+#define SP_CTX_ANY           0xFFFF
+
+class spComment;
+
+
+
+#if defined( wxUSE_TEMPLATE_STL )
+
+    // context members
+    typedef vector<spContext*> MMemberListT;
+    // comments list
+    typedef vector<spComment*> MCommentListT;
+    // list of parameters
+    typedef vector<spParameter*> MParamListT;
+    // string list
+    typedef vector<string>     StrListT;
+
+#else
+
+    typedef spContext*   spContextPtrT;
+    typedef spComment*   spCommentPtrT;
+    typedef spParameter* spParameterPtrT;
+    typedef WXSTL_VECTOR_SHALLOW_COPY(spContextPtrT)   MMemberListT;
+    typedef WXSTL_VECTOR_SHALLOW_COPY(spCommentPtrT)   MCommentListT;
+    typedef WXSTL_VECTOR_SHALLOW_COPY(spParameterPtrT) MParamListT;
+    typedef WXSTL_VECTOR_SHALLOW_COPY(string)          StrListT;
+
+#endif;
+// base class for all visitors of source code contents
+
+class spVisitor
+{
+protected:
+    bool mSiblingSkipped;
+    bool mChildSkipped;
+    int  mContextMask;
+
+    spContext* mpCurCxt;
+
+public:
+    // methods invoked by context
+
+    // method invoked from user's controling code
+    // to visit all nodes staring at the given context.
+    // Content is sorted if requrired, see comments
+    // spClass on sorting the class members
+
+    void VisitAll( spContext& atContext,
+                   bool sortContent = TRUE
+                 );
+
+    // methods invoked by visitor
+
+    // goes to the next context in the outter scope
+    // NOTE:: should not be invoked more than once while
+    //        visiting certain context
+
+    void SkipSiblings();
+
+    // prevents going down into the contexts contained by
+    // the current context
+    // NOTE:: the same as above
+
+    void SkipChildren();
+
+    // can be called only in from visiting procedure
+    void RemoveCurrentContext();
+
+    // method enables fast filtered traversal
+    // of source content, e.g. collecting only classes,
+    // or only global functions
+
+    // arg. context - can contain combination of contexts concatinated
+    //           with bitwise OR, e.g. SP_CTX_CLASS | SP_CTX_NAMESPACE
+    //
+    // method can be invoked from the user's controling as well as
+    // from within the visting procedure
+
+    void SetFilter( int contextMask );
+
+    // methods should be implemneted by specific visitor:
+
+    // NOTE:: Do not confuse visiting with parsing, first
+    //        the source is parsed, and than can be visited
+    //        multiple times by variouse visitors (there can
+    //        be more the one visitor visiting content at a time)
+
+    virtual void VisitFile( spFile& fl ) {}
+
+    virtual void VisitNameSpace( spNameSpace& ns ) {}
+
+    virtual void VisitClass( spClass& cl ) {}
+
+    virtual void VisitEnumeration( spEnumeration& en ) {}
+
+    virtual void VisitTypeDef( spTypeDef& td ) {}
+
+    virtual void VisitPreprocessorLine( spPreprocessorLine& pd ) {}
+
+    virtual void VisitAttribute( spAttribute& attr ) {}
+
+    virtual void VisitOperation( spOperation& op ) {}
+
+    virtual void VisitParameter( spParameter& param ) {}
+
+    virtual void VisitCustomContext( spContext& ctx ) {}
+};
+
+// stores one section of comments,
+// multiple sections can be put to geather
+// and attached to some context
+
+class spComment
+{
+public:
+    string mText;
+    bool   mIsMultiline; // multiline comments ar those with /**/'s
+
+    // TRUE, if these was an empty empty
+    // line above single line comment
+
+    bool   mStartsPar;
+
+public:
+
+    bool    IsMultiline() const;
+    bool    StartsParagraph() const;
+
+    string& GetText();
+
+    // contstant version of GetText()
+    string  GetText() const;
+};
+
+// abstract base class for common (to most languages) code
+// contexts (constructs), e.g file, namespace, class, operation,
+// etc
+
+class spContext
+{
+protected:
+    // "linked" list of comments belonging to this context
+    MCommentListT mComments;
+
+    // NULL, if this is file context
+    MMemberListT   mMembers;
+
+    // NULL, if this is top-most context
+    spContext*    mpParent;
+
+    // points to context object, where the this context
+    // was originally declared, meaning that this object
+    // is redeclaration (or if in the case of operation
+    // this context object most probably referres to the
+    // implemnetation in .cpp file for example)
+
+    // is NULL, if this object referres to the first occurence
+    // of the context
+
+    spContext*    mpFirstOccurence;
+
+    // used, to avoid excessive sorting of context's agreggates
+    bool          mAlreadySorted;
+
+public:
+
+    // source line number, (-1) if unknown
+    int           mSrcLineNo;
+
+    // offset of context in the source file, (-1) if unknown
+    int           mSrcOffset;
+
+    // lentgh of the context in characters, (-1) if unknown
+    int           mContextLength;
+
+    // source line number, in which this cotext ends, (-1) if unknown
+    int           mLastScrLineNo;
+
+    // fields are valid, if the may contain other contexts nested inside
+    int           mHeaderLength;
+    int           mFooterLength;
+
+    // zero-based index of the first character of
+    // this context in the source line, (-1) if unknown
+    int           mFirstCharPos;
+
+    // zero-based index of the first character of
+    // this context in the last source line of this context, (-1) if unknown
+    int           mLastCharPos;
+
+    // see SRC_VISIBLITY_TYPES enumeration
+    int           mVisibility;
+
+    // TRUE, if context does not really exist in the source
+    //       but was created by external tools (e.g. forward engineering)
+
+    bool         mIsVirtualContext;
+    bool         mVirtualContextHasChildren;
+
+    // body of the context in case (mIsVirtual == TRUE)
+    string       mVirtualContextBody;
+    string       mVittualContextFooter;
+
+    // e.g. can be used by documentation generator to store
+    // reference to section object
+    void*         mpUserData;
+
+public:
+    // universal identifier of the context (e.g. class name)
+    string        mName;
+
+public:
+    // default constructor
+    spContext();
+
+    // automatically destorys all aggregated contexts
+    // (thus, it's enought to call destructor of root-context)
+    virtual ~spContext();
+
+    // see mUererData member;
+    void* GetUserData() { return mpUserData; }
+
+    // sets untyped pointer to user data
+    void SetUserData( void* pUserData )
+        { mpUserData = pUserData; }
+
+    // searches the whole context tree for the cotnexts
+    // which match given masks, pust results into lst array
+    void GetContextList( MMemberListT& lst, int contextMask );
+
+    // used by default visitor's implementation
+    bool IsSorted();
+
+    /*** forward/reverse ingineering fecilities ***/
+
+    bool PositionIsKnown();
+
+    bool IsVirtualContext();
+
+    bool VitualContextHasChildren();
+
+    void SetVirtualContextBody( const string& body,
+                                bool  hasChildren = FALSE,
+                                const string& footer = "" );
+
+    string GetVirtualContextBody();
+    string GetFooterOfVirtualContextBody();
+
+    // can be overriden by top-level context classes
+    // to find-out ot the source-fragment of this
+    // context using it's position information
+    virtual string GetBody( spContext* pCtx = NULL );
+
+    virtual string GetHeader( spContext* pCtx = NULL );
+
+    // TRUE, if there is at least one entry
+    // in the comment list of this context
+    bool HasComments();
+    MCommentListT& GetCommentList() { return mComments; }
+    const MCommentListT& GetCommentList() const { return mComments; }
+
+    // should be overriden, if the context supports sorting
+    // of it's members
+    virtual void SortMembers() {}
+
+    // returns identifier of this context
+    inline string& GetName() { return mName; }
+
+    // returns -1, if souce line # is unknow
+    inline int GetSourceLineNo() { return mSrcLineNo; }
+
+    // see comments on mpFirstOccurence member variable
+    bool IsFirstOccurence();
+    spContext* GetFirstOccurence();
+
+    // returns not-NULL value if this context
+    // is aggregated by another cotnext
+    spContext* GetOutterContext();
+
+    // perhaps more intuitive alias for `GetOutterContext()'
+    inline spContext* GetParent() { return mpParent; }
+
+    bool HasOutterContext();
+
+    // add one aggregate (or child) into this context
+    void AddMember ( spContext* pMember );
+    MMemberListT& GetMembers();
+
+    // append comment to the comment list decribing
+    // this context
+    void AddComment( spComment* pComment );
+
+    // returns NULL, if the context with the given
+    // name and type is not contained by this context
+    // and it's children. Children's children are not
+    // searched recursivelly if searchSubMembers is FALSE
+
+    spContext* FindContext( const string& identifier,
+                            int   contextType      = SP_CTX_ANY,
+                            bool  searchSubMembers = TRUE
+                          );
+
+    // removes this context from it's parent
+    // (NOTE:: context should have an outter cotnext
+    //  to when this method is called, otherwise removal
+    //  will result assertion failure)
+    void RemoveThisContext();
+
+    // returns TRUE, if this object is aggregated in the file
+    bool IsInFile();
+
+    // TRUE, if outter context is a namespace
+    bool IsInNameSpace();
+
+    // TRUE, if outter context is a class
+    bool IsInClass();
+
+    // TRUE, if outter cotext is an operation (TRUE for "spParameter"s)
+    bool IsInOperation();
+
+    // TRUE if the context is public
+    bool IsPublic() const { return mVisibility == SP_VIS_PUBLIC; }
+
+    // NOTE:: method returns not the type of this object
+    //          but the file/namespace/class/operation or file in which this
+    //          attribute is contained. First, check for the type of
+    //        context using the above method.
+
+    //          Requiering container which does not exist, will result
+    //        in assertion failure
+
+    spClass&     GetClass();
+    spFile&      GetFile();
+    spNameSpace& GetNameSpace();
+    spOperation& GetOperation();
+
+    // each new context should override this method
+    // to return it's specific type
+    virtual int GetContextType() const { return SP_CTX_UNKNOWN; }
+
+    // perhaps more intuitive short-cut
+    inline int GetType() { return GetContextType(); }
+
+    // cast this context to the desired type - returns NULL if type is wrong
+    spAttribute *CastToAttribute()
+    {
+        return GetContextType() == SP_CTX_ATTRIBUTE ? (spAttribute *)this
+                                                    : NULL;
+    }
+
+    // derived classes override this to invoke VisitXXX method
+    // which corresponds to the class of specific context,
+    // - this is what the "Visitor" pattern told us ^)
+
+    // if method is not overriden, then it's probably user-defined
+    // custom context
+
+    virtual void AcceptVisitor( spVisitor& visitor )
+
+        { visitor.VisitCustomContext( *this );    };
+
+    // called by visitors, to remove given subcontext
+    // of this context object
+    void RemoveChild( spContext* pChild );
+
+    void RemoveChildren();
+
+    spContext* GetEnclosingContext( int mask = SP_CTX_ANY );
+
+#ifdef __WXDEBUG__
+    virtual void Dump(const wxString& indent) const;
+#endif  // __WXDEBUG__
+
+    DECLARE_DUMP
+};
+
+// stores information about single argument of operation
+
+class spParameter : public spContext
+{
+public:
+    // type of argument (parameter)
+    string mType;
+
+    // "stringified" initial value
+    string mInitVal;
+
+public:
+    virtual int GetContextType() const { return SP_CTX_PARAMETER; }
+
+    virtual void AcceptVisitor( spVisitor& visitor )
+        { visitor.VisitParameter( *this ); }
+
+    DECLARE_DUMP
+};
+
+
+// stores information about member(or global) variable
+
+class spAttribute : public spContext
+{
+public:
+    // type of the attribute
+    string mType;
+
+    // it's initial value
+    string mInitVal;
+
+    // constantness
+    bool   mIsConstant;
+public:
+
+    virtual int GetContextType() const { return SP_CTX_ATTRIBUTE; }
+
+    virtual void AcceptVisitor( spVisitor& visitor )
+        { visitor.VisitAttribute( *this ); }
+
+    DECLARE_DUMP
+};
+
+class spOperation : public spContext
+{
+public:
+    // type of return value
+    string      mRetType;
+
+    // argument list
+    //MParamListT mParams;
+
+    // TRUE, if operation does not modify
+    // the content of the object
+    bool        mIsConstant;
+
+    // flag, specific to C++
+    bool        mIsVirtual;
+
+    // TRUE, if definition follows the declaration immediatelly
+    bool        mHasDefinition;
+
+    // scope if any (e.g. MyClass::MyFunction(), scope stirng is "MyClass" )
+    // usually found along with implementation of the method, which is now skipped
+
+    string      mScope;
+
+public:
+    spOperation();
+
+    // returns full declaration of the operations
+    // (ret val., identifier, arg. list),
+
+    // arguments are marked up with italic,
+    // default values marked up with bold-italic,
+    // all the rest is marked as bold
+
+    // NOTE:: this method may be overriden by class
+    //        specific to concrete parser, to provide
+    //        language-dependent reperesnetation of
+    //        operation and it's argumetn list
+    //
+    // the default implementation outputs name in
+    // C++/Java syntax
+
+    virtual string GetFullName(MarkupTagsT tags);
+
+    virtual int GetContextType() const { return SP_CTX_OPERATION; }
+
+    virtual void AcceptVisitor( spVisitor& visitor )
+        { visitor.VisitOperation( *this ); }
+
+    DECLARE_DUMP
+};
+
+// stores infromation about preprocessor directive
+
+class spPreprocessorLine : public spContext
+{
+
+public:
+
+    // prepocessor statement including '#' and
+    // attached multiple lines with '\' character
+    string mLine;
+
+    int    mDefType; // see SP_PREP_DEFINITION_TYPES enumeration
+
+public:
+
+    virtual int GetContextType() const { return SP_CTX_PREPROCESSOR; }
+
+    virtual int GetStatementType() const { return mDefType; }
+
+    string CPP_GetIncludedFileNeme() const;
+
+    virtual void AcceptVisitor( spVisitor& visitor )
+        { visitor.VisitPreprocessorLine( *this ); }
+
+    DECLARE_DUMP
+};
+
+// stores information about the class
+
+class spClass : public spContext
+{
+public:
+    // list of superclasses/interfaces
+    StrListT     mSuperClassNames;
+
+    // see SP_CLASS_TYPES enumeration
+    int          mClassSubType;
+
+    // see SP_INHERITANCE_TYPES enumeration
+    int          mInheritanceType;
+
+    // valid if mClassSubType is SP_CLTYPE_TEMPLATE_CLASS
+    string       mTemplateTypes;
+
+    // TRUE, if it's and interface of abstract base class
+    bool         mIsAbstract;
+
+public:
+    // sorts class members in the following order:
+    //
+    // (by "privacy level" - first private, than protected, public)
+    //
+    //     within above set
+    //
+    //       (by member type - attributes first, than methods, nested classes)
+    //
+    //          within above set
+    //
+    //             (by identifier of the member)
+
+    virtual void SortMembers();
+
+    virtual int GetContextType() const { return SP_CTX_CLASS; }
+
+    virtual void AcceptVisitor( spVisitor& visitor )
+        { visitor.VisitClass( *this ); }
+
+    DECLARE_DUMP
+};
+
+// stores information about enum statement
+
+class spEnumeration  : public spContext
+{
+public:
+    string mEnumContent; // full-text content of enumeration
+
+public:
+    virtual int GetContextType() const { return SP_CTX_ENUMERATION; }
+
+    virtual void AcceptVisitor( spVisitor& visitor )
+        { visitor.VisitEnumeration( *this ); }
+
+    DECLARE_DUMP
+};
+
+class spTypeDef  : public spContext
+{
+public:
+    // the original type which is redefined
+    // by this type definition
+    string mOriginalType;
+
+public:
+    virtual int GetContextType() const { return SP_CTX_TYPEDEF; }
+
+    virtual void AcceptVisitor( spVisitor& visitor )
+        { visitor.VisitTypeDef( *this ); }
+
+    DECLARE_DUMP
+};
+
+// NOTE:: files context may be put to other
+//        file context, resulting in a collection
+//        of parsed file contexts, with a virtual "superfile"
+
+class spFile : public spContext
+{
+public:
+    // since file name cannot be determined from
+    // source code, filling in this field is optional
+    string mFileName;
+
+public:
+    virtual int GetContextType() const { return SP_CTX_FILE; }
+
+    virtual void AcceptVisitor( spVisitor& visitor )
+        { visitor.VisitFile( *this ); }
+
+    DECLARE_DUMP
+};
+
+//TODO:: comments.
+
+class SourceParserPlugin
+{
+public:
+    virtual bool CanUnderstandContext( char* cur, char* end, spContext* pOuttterCtx ) = 0;
+    virtual void ParseContext( char* start, char*& cur, char* end, spContext* pOuttterCtx ) = 0;
+};
+
+// abstract interface for source parsers
+// which can output parsing results in the
+// form of context-tree, where each node
+// should be derivative of spContext, (see
+// above classes)
+
+class SourceParserBase
+{
+private:
+    // auto-resizing file buffer, created in ParseFile()
+    // to reuse large heap block for multiple parsings
+
+    char* mpFileBuf;
+    int   mFileBufSz;
+
+protected:
+    SourceParserPlugin* mpPlugin;
+
+protected:
+    // value is set in the derived parser classes
+    int mParserStatus;
+
+public:
+    SourceParserBase();
+    virtual ~SourceParserBase();
+
+    // loads entier source file(as text) into memory,
+    // and passes it's contents to ParseAll() method,
+    // memory occupied by source text is released after
+    // parsing is done
+    //
+    // (NOTE:: this is the default implementation),
+
+    virtual spFile* ParseFile( const char* fname );
+
+    // should returns the root-node of the created context tree
+    // (user is responsible for releasing it from the heep)
+    // "end" should point to the (last character + 1) of the
+    // source text area
+
+    virtual spFile* Parse( char* start, char* end ) = 0;
+
+    // returns parser "status word" (specific to concrete parser)
+    int GetParserStatus() { return mParserStatus; }
+
+    void SetPlugin( SourceParserPlugin* pPlugin );
+};
+
+#endif
diff --git a/utils/HelpGen/src/wxstlac.h b/utils/HelpGen/src/wxstlac.h
new file mode 100644 (file)
index 0000000..9f69f1f
--- /dev/null
@@ -0,0 +1,667 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        No names yet.
+// Purpose:     Contrib. demo
+// Author:      Aleksandras Gluchovas
+// Modified by:
+// Created:     27/09/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Aleskandars Gluchovas
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __WXSTLAC_G__
+#define __WXSTLAC_G__
+
+#ifdef new
+#undef new
+#endif
+
+#include <stddef.h>
+#include <sys/types.h>
+#include <memory.h>
+#include <limits.h>
+#include <new.h>
+
+// the below macro used internally (see actual interface after this macro)
+
+// arguments:
+//
+//         ARG_IS_UNIQUE
+//             ASSOC_CONT_CLASS_NAME
+//
+//         ARG_VALUE_TYPE
+//      ARG_KEY_TYPE
+//      ARG_ACTUAL_VALUE_TYPE
+//      
+//      _KEY_NAME
+//      _VALUE_NAME
+//
+//             _X_KEY_NAME
+//             _X_VALUE_NAME
+//
+//      _INSERT_METHOD_DEFINITION
+
+#define __DEFINE_ASOC_CLASS( ARG_IS_UNIQUE, \
+FUNCTOR,\
+ASSOC_CONT_CLASS_NAME, \
+ARG_VALUE_TYPE, \
+ARG_KEY_TYPE, \
+ARG_ACTUAL_VALUE_TYPE, \
+_KEY_NAME, \
+_VALUE_NAME, \
+_X_KEY_NAME, \
+_X_VALUE_NAME, \
+_INSERT_METHOD_DEFINITION \
+) class \
+ASSOC_CONT_CLASS_NAME\
+{\
+protected:\
+\
+public:\
+       typedef ARG_VALUE_TYPE        value_type;\
+       typedef ARG_KEY_TYPE          key_type;\
+       typedef ARG_ACTUAL_VALUE_TYPE actual_value_type;\
+\
+       typedef value_type*                       pointer;\
+       typedef value_type&                       reference;\
+\
+       typedef const value_type&         const_reference;\
+\
+       typedef FUNCTOR                           key_compare;\
+       typedef key_compare           Compare;\
+\
+protected:\
+\
+       struct tree_node \
+       {\
+               tree_node*  mpParent;\
+               tree_node*  mpLeft;\
+               tree_node*  mpRight;\
+\
+               value_type  mData;\
+       };\
+\
+       typedef tree_node* node_ref_type;\
+\
+       node_ref_type   mpRoot;\
+       node_ref_type   mpLeftMost;\
+       node_ref_type   mpRightMost;\
+\
+       node_ref_type   mpFreeListHead;\
+       int             mKeyIsUnique;\
+\
+       key_compare     mCmpFunctorObj;\
+\
+public:\
+\
+       static inline node_ref_type next( node_ref_type pNode )\
+       {\
+               if ( pNode->mpRight ) \
+               {\
+                       pNode = pNode->mpRight;\
+\
+                       while ( pNode->mpLeft ) pNode = pNode->mpLeft;\
+\
+                       return pNode;\
+               }\
+               else\
+               if ( pNode->mpParent )\
+               {\
+                       if ( pNode == pNode->mpParent->mpLeft )\
+\
+                               return pNode->mpParent;\
+\
+                       pNode = pNode->mpParent;\
+\
+                       node_ref_type prevNode = pNode;\
+                       pNode = pNode->mpParent;\
+\
+                       while(pNode)\
+                       {\
+                               if ( pNode->mpRight &&\
+                                        pNode->mpRight != prevNode\
+                                  ) return pNode;\
+\
+                               prevNode = pNode;\
+                               pNode= pNode->mpParent;\
+                       }\
+\
+                       return 0;\
+               }\
+               else\
+                       return 0;\
+       }\
+\
+       static inline node_ref_type prev( node_ref_type pNode )\
+       {\
+               if ( pNode->mpLeft ) \
+               {\
+                       pNode = pNode->mpLeft;\
+\
+                       while ( pNode->mpRight ) pNode = pNode->mpRight;\
+\
+                       return pNode;\
+               }\
+               else\
+               if ( pNode->mpParent )\
+               {\
+                       if ( pNode == pNode->mpParent->mpRight )\
+                               return pNode->mpParent;\
+\
+                       pNode = pNode->mpParent;\
+\
+                       node_ref_type prevNode = pNode;\
+                       pNode = pNode->mpParent;\
+\
+                       while(pNode)\
+                       {\
+                               if ( pNode->mpLeft &&\
+                                        pNode->mpLeft != prevNode\
+                                  ) return pNode;\
+\
+                               prevNode = pNode;\
+                               pNode= pNode->mpParent;\
+                       }\
+\
+                       return 0;\
+               }\
+               else \
+                       return 0;\
+       }\
+\
+protected:\
+\
+       inline int are_equel( const key_type& x, const key_type& y )\
+       {\
+               return ( !mCmpFunctorObj(x,y) && !mCmpFunctorObj(y,x) );\
+       }\
+\
+       inline int is_less( const key_type& x, const key_type& y )\
+       {\
+               return mCmpFunctorObj(x,y);\
+       }\
+\
+       static inline const actual_value_type& value( node_ref_type pNode )\
+       {\
+               return pNode->_VALUE_NAME;\
+       }\
+\
+       static inline const key_type& key( node_ref_type pNode )\
+       {\
+               return pNode->_KEY_NAME;\
+       }\
+\
+       inline node_ref_type AllocNode() \
+       { \
+               if ( mpFreeListHead ) \
+               {\
+                       node_ref_type pFreeNode = mpFreeListHead;\
+                       mpFreeListHead = mpFreeListHead->mpLeft;\
+\
+                       return pFreeNode;\
+               }\
+               else\
+               {\
+                       char* pHeapBlock = new char[sizeof(tree_node)];\
+\
+                       return (node_ref_type)pHeapBlock;\
+               }\
+       }\
+\
+       inline void DestroyFreeList()\
+       {\
+               while ( mpFreeListHead )\
+               {\
+                       node_ref_type tmp = mpFreeListHead;\
+                       mpFreeListHead = mpFreeListHead->mpLeft;\
+\
+                       delete [](char*)tmp;\
+               }\
+       }\
+\
+       inline void RecycleNode( node_ref_type pNode ) \
+       {\
+               pNode->mpLeft = mpFreeListHead;\
+               mpFreeListHead = pNode;\
+       }\
+\
+       inline node_ref_type do_insert(const value_type& x = value_type() )\
+       {\
+               node_ref_type pNewNode = AllocNode();\
+\
+               pNewNode->mpParent = \
+                       pNewNode->mpLeft =\
+                               pNewNode->mpRight = 0;\
+\
+           node_ref_type pCurrent = mpRoot;\
+               node_ref_type pParent = 0;\
+    \
+               while (pCurrent) \
+               {\
+                       if ( mKeyIsUnique && are_equel( _X_KEY_NAME, value(pCurrent) ) )\
+                       {\
+                               RecycleNode(pNewNode);\
+                               return 0;\
+                       }\
+\
+                       pParent = pCurrent;\
+\
+                       pCurrent = is_less( _X_KEY_NAME, value(pCurrent) ) \
+                               ? pCurrent->mpLeft \
+                               : pCurrent->mpRight;\
+               }\
+    \
+               pNewNode->mpParent = pParent;\
+\
+           if(pParent)\
+\
+                       if( is_less(_X_KEY_NAME, value(pParent) ) )\
+            \
+                               pParent->mpLeft = pNewNode;\
+                       else\
+                               pParent->mpRight = pNewNode;\
+                       else\
+                               mpRoot = pNewNode;\
+\
+               new ( &pNewNode->_KEY_NAME   ) key_type(_X_KEY_NAME);\
+               new ( &pNewNode->_VALUE_NAME ) actual_value_type(_X_VALUE_NAME);\
+\
+               if ( prev(pNewNode) == 0 ) mpLeftMost = pNewNode;\
+               if ( next(pNewNode) == 0 ) mpRightMost = pNewNode;\
+\
+               return pNewNode;\
+       }\
+\
+       friend class iterator;\
+\
+public:\
+\
+       class iterator;\
+       class const_iterator;\
+\
+       class iterator \
+       {\
+       public:\
+               node_ref_type mpNode;\
+               friend class CONT_CLASS_NAME;\
+               friend class const_iterator;\
+               friend class const_reverse_iterator;\
+\
+               inline iterator( node_ref_type pNode )\
+               {\
+                       mpNode = pNode;\
+               }\
+       \
+       public:\
+               inline iterator() {}\
+               inline int operator==( const iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
+               inline int operator!=( const iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
+\
+               inline iterator( const iterator& other )\
+               {\
+                       mpNode = other.mpNode;\
+               }\
+\
+               inline const iterator& operator=( const iterator& other )\
+               {\
+                       mpNode = other.mpNode;\
+                       return *this;\
+               }\
+\
+               inline const iterator& operator--() \
+               {\
+                       mpNode = ASSOC_CONT_CLASS_NAME::prev(mpNode);\
+                       return *this;\
+               }\
+\
+               inline iterator operator--(int)\
+               {\
+                       iterator tmp = *this;\
+                       mpNode = ASSOC_CONT_CLASS_NAME::prev(mpNode);\
+                       return tmp;\
+               }\
+\
+               inline const iterator& operator++() \
+               {\
+                       mpNode = ASSOC_CONT_CLASS_NAME::next(mpNode);\
+                       return *this;\
+               }\
+\
+               inline iterator operator++(int)\
+               {\
+                       iterator tmp = *this;\
+                       mpNode = ASSOC_CONT_CLASS_NAME::next(mpNode);\
+                       return tmp;\
+               }\
+\
+               inline reference operator*() const { return mpNode->mData; }\
+       };\
+\
+\
+       class const_iterator \
+       {\
+       public:\
+               node_ref_type mpNode;\
+               friend class CONT_CLASS_NAME;\
+               friend class const_reverse_iterator;\
+\
+               inline const_iterator( node_ref_type pNode )\
+               {\
+                       mpNode = pNode;\
+               }\
+       \
+       public:\
+               inline const_iterator() {}\
+\
+               inline int operator==( const const_iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
+               inline int operator!=( const const_iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
+\
+               inline const_iterator( const iterator& other )\
+               {\
+                       mpNode = other.mpNode;\
+               }\
+\
+               inline const_iterator( const const_iterator& other )\
+               {\
+                       mpNode = other.mpNode;\
+               }\
+\
+               inline const const_iterator& operator=( const const_iterator& other )\
+               {\
+                       mpNode = other.mpNode;\
+                       return *this;\
+               }\
+\
+               inline const const_iterator& operator--() \
+               {\
+                       mpNode = ASSOC_CONT_CLASS_NAME::prev(mpNode);\
+                       return *this;\
+               }\
+\
+               inline const_iterator operator--(int)\
+               {\
+                       const_iterator tmp = *this;\
+                       mpNode = ASSOC_CONT_CLASS_NAME::prev(mpNode);\
+                       return tmp;\
+               }\
+\
+               inline const const_iterator& operator++() \
+               {\
+                       mpNode = ASSOC_CONT_CLASS_NAME::next(mpNode);\
+                       return *this;\
+               }\
+\
+               inline const_iterator operator++(int)\
+               {\
+                       const_iterator tmp = *this;\
+                       mpNode = ASSOC_CONT_CLASS_NAME::next(mpNode);\
+                       return tmp;\
+               }\
+\
+               inline const_reference operator*() const { return mpNode->mData; }\
+       };\
+\
+public:\
+\
+       inline ASSOC_CONT_CLASS_NAME( key_compare cmpFunctorObj = key_compare(),\
+                                                                 int keyIsUnique = ARG_IS_UNIQUE )\
+                       : mpFreeListHead( 0 ),\
+                         mKeyIsUnique( keyIsUnique ),\
+                         mCmpFunctorObj( cmpFunctorObj )\
+       {\
+               mpLeftMost = 0;\
+               mpRightMost = 0;\
+               mpRoot = 0;\
+       }\
+\
+       inline ~ASSOC_CONT_CLASS_NAME() \
+       { \
+               erase( begin(), end() ); \
+\
+               DestroyFreeList();\
+       }\
+\
+       inline iterator begin() { return mpLeftMost; }\
+       inline iterator end()   { return 0; }\
+\
+       inline const_iterator begin() const { return mpLeftMost; }\
+       inline const_iterator end()   const { return 0; }\
+\
+       inline iterator lower_bound( const key_type& x )\
+       { \
+               node_ref_type pCurrent = mpRoot;\
+    \
+               while( pCurrent )\
+               {\
+                       node_ref_type pParent = pCurrent;\
+\
+                       if( are_equel( x, key(pCurrent) ) )\
+                               \
+                               return (pCurrent);\
+                       else\
+                               pCurrent = is_less( x, key(pCurrent) ) \
+                                       ? pCurrent->mpLeft \
+                                       : pCurrent->mpRight;\
+\
+                       if ( !pCurrent ) return (pParent);\
+               }\
+\
+               return begin();\
+       }\
+\
+       inline const_iterator lower_bound( const key_type& x ) const\
+\
+               { return const_iterator( lower_bound(x).mpNode ); }\
+\
+       inline iterator upper_bound( const key_type& x )\
+       {\
+               node_ref_type pCurrent = mpRoot;\
+    \
+               while( pCurrent )\
+               {\
+                       node_ref_type pParent = pCurrent;\
+\
+                       if( are_equel( x, key(pCurrent) ) )\
+                               \
+                               return (pCurrent);\
+                       else\
+                               pCurrent = is_less( x, key(pCurrent) ) \
+                                       ? pCurrent->mpLeft \
+                                       : pCurrent->mpRight;\
+\
+                       if ( !pCurrent ) return next(pParent);\
+               }\
+\
+               return end();\
+       }\
+\
+       inline const_iterator upper_bound( const key_type& x ) const\
+\
+               { return const_iterator( upper_bound(x).mpNode ); }\
+\
+       inline iterator find( const key_type& x )\
+       {\
+               node_ref_type pCurrent = mpRoot;\
+    \
+               while( pCurrent )\
+               {\
+                       if( are_equel( x, key(pCurrent) ) )\
+                               \
+                               return (pCurrent);\
+                       else\
+                               pCurrent = is_less( x, key(pCurrent) ) \
+                                       ? pCurrent->mpLeft \
+                                       : pCurrent->mpRight;\
+               }\
+\
+               return end();\
+       }\
+\
+       inline const_iterator find( const key_type& x ) const\
+\
+               { return const_iterator( find(x).mpNode ); }\
+\
+       inline void erase(iterator first, iterator last)\
+       {\
+               if ( first.mpNode == 0 ) return;\
+\
+               while( first != last ) \
+               {\
+                       iterator next = first;\
+                       ++next;\
+                       erase( first );\
+                       first = next;\
+               }\
+       }\
+\
+       inline void erase(iterator position)\
+       {\
+               if ( position.mpNode == 0 ) return;\
+\
+               node_ref_type pZ = position.mpNode;\
+               node_ref_type pX, pY;\
+\
+               if ( pZ == mpLeftMost ) mpLeftMost   = next(pZ);\
+               if ( pZ == mpRightMost ) mpRightMost = prev( pZ );\
+\
+        if ( !pZ->mpLeft || !pZ->mpRight )\
+           \
+            pY = pZ;\
+        else \
+               {\
+            pY = pZ->mpRight;\
+           \
+            while (pY->mpLeft) \
+                               \
+                               pY = pY->mpLeft;\
+        }\
+           \
+        if ( pY->mpLeft)\
+           \
+            pX = pY->mpLeft;\
+        else\
+            pX = pY->mpRight;\
+           \
+        if ( pX ) pX->mpParent = pY->mpParent;\
+           \
+        if (pY->mpParent)\
+           \
+            if (pY == pY->mpParent->mpLeft )\
+           \
+                pY->mpParent->mpLeft = pX;\
+                   else\
+                pY->mpParent->mpRight = pX;\
+        else\
+            mpRoot = pX;\
+           \
+               node_ref_type toRemove = 0;\
+               \
+        if (pY != pZ) {\
+           \
+            pY->mpLeft = pZ->mpLeft;\
+           \
+            if (pY->mpLeft) pY->mpLeft->mpParent = pY;\
+           \
+            pY->mpRight = pZ->mpRight;\
+           \
+            if ( pY->mpRight ) \
+                               \
+                               pY->mpRight->mpParent = pY;\
+           \
+            pY->mpParent = pZ->mpParent;\
+           \
+            if (pZ->mpParent)\
+           \
+                if (pZ == pZ->mpParent->mpLeft)\
+           \
+                    pZ->mpParent->mpLeft = pY;\
+                else\
+                    pZ->mpParent->mpRight = pY;\
+            else\
+                mpRoot = pY;\
+           \
+            toRemove = pZ;\
+        } \
+               else \
+            toRemove = pY;\
+           \
+               value(toRemove).~actual_value_type();\
+               key(toRemove).~actual_value_type();\
+\
+               RecycleNode( toRemove );\
+       }\
+\
+       _INSERT_METHOD_DEFINITION\
+}
+
+// do not undefine ___WXSTL_COMMA, where associated containers are defined!
+// (it is used as workaround for constraints of C-Preprocessor's nested macros)
+
+#define ___WXSTL_COMMA ,
+
+#define __DEFINE_MAP(ARG_IS_UNIQUE, KEY_TYPE, VAL_TYPE, FUNCTOR ) __DEFINE_ASOC_CLASS( ARG_IS_UNIQUE,\
+FUNCTOR,\
+__WXSTLMAP_##KEY_TYPE##VAL_TYPE##ARG_IS_UNIQUE, \
+struct key_value_pair   { KEY_TYPE first ; \
+                                                 VAL_TYPE second;\
+                                                 key_value_pair() {}\
+                                                 key_value_pair( const KEY_TYPE& key ___WXSTL_COMMA const VAL_TYPE& value ) \
+                                                       : first(key) ___WXSTL_COMMA second( value ) {} \
+                                               } , \
+KEY_TYPE,\
+VAL_TYPE,\
+mData.first, mData.second, x.first, x.second, \
+struct insert_result_iterator\
+{\
+       iterator first;\
+       int      second;\
+};\
+inline insert_result_iterator insert( const value_type& x )\
+{\
+       insert_result_iterator result;\
+\
+       result.first = do_insert(x);\
+       result.second  = ( result.first == end() ) ? 0 : 1;\
+\
+       return result;\
+} )
+
+#define __DEFINE_SET(ARG_IS_UNIQUE, KEY_TYPE, FUNCTOR ) __DEFINE_ASOC_CLASS( ARG_IS_UNIQUE,\
+FUNCTOR,\
+__WXSTLSET_##TYPE##ARG_IS_UNIQUE, \
+KEY_TYPE,\
+KEY_TYPE,\
+KEY_TYPE,\
+mData, mData, x, x, \
+struct insert_result_iterator\
+{\
+       iterator first;\
+       int      second;\
+};\
+inline insert_result_iterator insert( const value_type& x )\
+{\
+       insert_result_iterator result;\
+\
+       result.first = do_insert(x);\
+       result.second  = ( result.first == end() ) ? 0 : 1;\
+\
+       return result;\
+} )
+
+// helper macros to create functor objects for associative containers of the given type
+
+#define LESS_THEN_FUNCTOR(TYPE) struct \
+{ inline int operator()(const TYPE& x, const TYPE& y ) const { return x < y; } }
+
+#define GREATER_THEN_FUNCTOR(TYPE) struct \
+{ inline int operator()(const TYPE& x, const TYPE& y ) const { return x > y; } }
+
+// functor argument should be created using the two above macros 
+// or passing own class with method "operator()(const TYPE&,cosnt TYPE&)" defined in it
+
+#define WXSTL_MAP( KEY_TYPE, VALUE_TYPE, FUNCTOR )      __DEFINE_MAP( 1 ,KEY_TYPE, VALUE_TYPE, FUNCTOR)
+#define WXSTL_MULTIMAP( KEY_TYPE, VALUE_TYPE, FUNCTOR ) __DEFINE_MAP( 0 ,KEY_TYPE, VALUE_TYPE, FUNCTOR)
+#define WXSTL_SET( KEY_TYPE, FUNCTOR )                  __DEFINE_SET( 1 ,KEY_TYPE, FUNCTOR )
+#define WXSTL_MULTISET( KEY_TYPE, FUNCTOR )             __DEFINE_SET( 0 ,KEY_TYPE, FUNCTOR )
+
+#endif
diff --git a/utils/HelpGen/src/wxstllst.h b/utils/HelpGen/src/wxstllst.h
new file mode 100644 (file)
index 0000000..5a1d1bc
--- /dev/null
@@ -0,0 +1,559 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        No names yet.
+// Purpose:     Contrib. demo
+// Author:      Aleksandras Gluchovas
+// Modified by:
+// Created:     27/09/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Aleskandars Gluchovas
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __WXSTLLST_G__
+#define __WXSTLLST_G__
+
+#ifdef new
+#undef new
+#endif
+
+#include <stddef.h>
+#include <sys/types.h>
+#include <memory.h>
+#include <limits.h>
+#include <new.h>
+
+// VERSION:: 0.2 (copy-constructor/adign-op added)
+
+// FOR NOW:: class-member operators "new" and "delete"
+//           are ignored by list class, memory allocated 
+//           and freed using global operators
+
+typedef int Type;
+
+
+// the below macro used internally (see actual interface after this macro)
+
+#define __DEFINE_STL_LIST(listClass,Type) class \
+ listClass \
+{\
+public:\
+\
+       typedef Type                      value_type;\
+       typedef value_type*           pointer;\
+       typedef const value_type* const_pointer;\
+       typedef value_type&       reference;\
+       typedef const value_type& const_reference;\
+       typedef size_t                    size_type;\
+       typedef ptrdiff_t                 difference_type;\
+\
+protected:\
+       struct list_node\
+       {\
+               list_node* mpNext;\
+               list_node* mpPrev;\
+               value_type mData;\
+       };\
+\
+       typedef list_node* node_ref_type;\
+\
+       node_ref_type mpFreeListHead;\
+       node_ref_type mpTerminator;\
+       size_type     mSize;\
+\
+       inline node_ref_type AllocNode() \
+       { \
+               if ( mpFreeListHead ) \
+               {\
+                       node_ref_type pFreeNode = mpFreeListHead;\
+                       mpFreeListHead = mpFreeListHead->mpPrev;\
+\
+                       return pFreeNode;\
+               }\
+               else\
+               {\
+                       char* pHeapBlock = new char[sizeof(list_node)];\
+\
+                       return (node_ref_type)pHeapBlock;\
+               }\
+       }\
+\
+       inline void DestroyFreeList()\
+       {\
+               while ( mpFreeListHead )\
+               {\
+                       node_ref_type tmp = mpFreeListHead;\
+                       mpFreeListHead = mpFreeListHead->mpPrev;\
+\
+                       delete [](char*)tmp;\
+               }\
+       }\
+\
+       inline void RecycleNode( node_ref_type pNode ) \
+       {\
+               pNode->mpPrev = mpFreeListHead;\
+               mpFreeListHead = pNode;\
+       }\
+\
+public:\
+\
+       class iterator \
+       {\
+       public:\
+               node_ref_type mpNode;\
+               friend class listClass;\
+               friend class const_iterator;\
+               friend class const_reverse_iterator;\
+\
+       protected:\
+               iterator( node_ref_type pNode )\
+               {\
+                       mpNode = pNode;\
+               }\
+       \
+       public:\
+               iterator() {}\
+               int operator==( const iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
+               int operator!=( const iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
+\
+               inline iterator( const iterator& other )\
+               {\
+                       mpNode = other.mpNode;\
+               }\
+\
+               inline const iterator& operator--() \
+               {\
+                       mpNode = mpNode->mpPrev;\
+                       return *this;\
+               }\
+\
+               inline iterator operator--(int)\
+               {\
+                       iterator tmp = *this;\
+                       mpNode = mpNode->mpPrev;\
+                       return tmp;\
+               }\
+\
+               inline const iterator& operator++() \
+               {\
+                       mpNode = mpNode->mpNext;\
+                       return *this;\
+               }\
+\
+               inline iterator operator++(int)\
+               {\
+                       iterator tmp = *this;\
+                       mpNode = mpNode->mpNext;\
+                       return tmp;\
+               }\
+\
+               inline reference operator*()       const { return mpNode->mData; }\
+       };\
+\
+\
+       class const_iterator \
+       {\
+       protected:\
+               node_ref_type mpNode;\
+               friend class listClass;\
+\
+       protected:\
+               const_iterator( node_ref_type pNode )\
+               {\
+                       mpNode = pNode;\
+               }\
+       \
+       public:\
+               \
+               const_iterator() {}\
+               int operator==( const const_iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
+               int operator!=( const const_iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
+\
+\
+               inline const_iterator( const iterator& other )\
+               {\
+                       mpNode = other.mpNode;\
+               }\
+\
+               inline const const_iterator& operator--() \
+               {\
+                       mpNode = mpNode->mpPrev;\
+                       return *this;\
+               }\
+\
+               inline const_iterator operator--(int)\
+               {\
+                       const_iterator tmp = *this;\
+                       mpNode = mpNode->mpPrev;\
+                       return tmp;\
+               }\
+\
+               inline const const_iterator& operator++() \
+               {\
+                       mpNode = mpNode->mpNext;\
+                       return *this;\
+               }\
+\
+               inline const_iterator operator++(int)\
+               {\
+                       const_iterator tmp = *this;\
+                       mpNode = mpNode->mpNext;\
+                       return tmp;\
+               }\
+\
+               inline const_reference operator*() const { return mpNode->mData; }\
+       };\
+\
+       typedef iterator       OutputIterator;\
+       typedef const_iterator InputIterator;\
+\
+       class reverse_iterator \
+       {\
+       public:\
+               node_ref_type mpNode;\
+               friend class listClass;\
+               friend class const_reverse_iterator;\
+\
+       protected:\
+               reverse_iterator ( node_ref_type pNode )\
+               {\
+                       mpNode = pNode;\
+               }\
+       \
+       public:\
+\
+               reverse_iterator() {}\
+               int operator==( const reverse_iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
+               int operator!=( const reverse_iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
+\
+               inline reverse_iterator( const reverse_iterator& other )\
+               {\
+                       mpNode = other.mpNode;\
+               }\
+\
+               inline const reverse_iterator& operator--() \
+               {\
+                       mpNode = mpNode->mpNext;\
+                       return *this;\
+               }\
+\
+               inline reverse_iterator operator--(int)\
+               {\
+                       reverse_iterator tmp = *this;\
+                       mpNode = mpNode->mpPrev;\
+                       return tmp;\
+               }\
+\
+               inline const reverse_iterator & operator++() \
+               {\
+                       mpNode = mpNode->mpNext;\
+                       return *this;\
+               }\
+\
+               inline reverse_iterator  operator++(int)\
+               {\
+                       reverse_iterator tmp = *this;\
+                       mpNode = mpNode->mpPrev;\
+                       return tmp;\
+               }\
+\
+               inline const_reference operator*() const { return mpNode->mData; }\
+       };\
+\
+\
+       class const_reverse_iterator \
+       {\
+       protected:\
+               node_ref_type mpNode;\
+               friend class listClass;\
+\
+       protected:\
+               const_reverse_iterator( node_ref_type pNode )\
+               {\
+                       mpNode = pNode;\
+               }\
+       \
+       public:\
+\
+               const_reverse_iterator() {}\
+               int operator==( const const_reverse_iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
+               int operator!=( const const_reverse_iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
+\
+               inline const_reverse_iterator( const reverse_iterator& other )\
+               {\
+                       mpNode = other.mpNode;\
+               }\
+\
+               inline const const_reverse_iterator& operator--() \
+               {\
+                       mpNode = mpNode->mpNext;\
+                       return *this;\
+               }\
+\
+               inline const_reverse_iterator operator--(int)\
+               {\
+                       const_reverse_iterator tmp = *this;\
+                       mpNode = mpNode->mpNext;\
+                       return tmp;\
+               }\
+\
+               inline const const_reverse_iterator& operator++() \
+               {\
+                       mpNode = mpNode->mpPrev;\
+                       return *this;\
+               }\
+\
+               inline const_reverse_iterator operator++(int)\
+               {\
+                       const_reverse_iterator tmp = *this;\
+                       mpNode = mpNode->mpPrev;\
+                       return tmp;\
+               }\
+\
+               inline const_reference operator*() const { return mpNode->mData; }\
+       };\
+\
+public:\
+\
+    inline listClass()\
+                       : mpFreeListHead( 0 ),\
+                         mSize(0)\
+       {\
+               mpTerminator = AllocNode();\
+               mpTerminator->mpPrev = mpTerminator->mpNext = mpTerminator;\
+       }\
+\
+       listClass( const listClass& other )\
+       {\
+               mpTerminator = AllocNode();\
+               mpTerminator->mpPrev = mpTerminator->mpNext = mpTerminator;\
+\
+               for( listClass::const_iterator i = other.begin(); i != other.end(); ++i )\
+\
+                       push_back( (*i) );\
+       }\
+\
+       inline const listClass& operator=( const listClass& rhs ) \
+       {\
+               erase( begin(), end() );\
+\
+               for( listClass::const_iterator i = rhs.begin(); i != rhs.end(); ++i )\
+\
+                       push_back( (*i) );\
+\
+               return *this;\
+       }\
+\
+       inline listClass(const_iterator first, const_iterator last)\
+                       : mpFreeListHead( 0 ),\
+                         mSize(0)\
+       \
+               { while( first != last ) push_back( *first++ ); }\
+\
+       inline listClass( size_type n, const value_type& value = value_type() )\
+       \
+               { for( size_t i = 0; i != n; ++n ) push_back( value ); }\
+\
+       inline ~listClass() \
+       { \
+               erase( begin(), end() ); \
+\
+               RecycleNode( mpTerminator );\
+               DestroyFreeList();\
+       }\
+\
+       inline iterator begin() { return iterator(mpTerminator->mpNext); }\
+       \
+       inline const_iterator begin() const \
+               { return const_iterator(mpTerminator->mpNext); }\
+       \
+       inline iterator end() { return iterator(mpTerminator); }\
+\
+       inline const_iterator end() const { return const_iterator(mpTerminator); }\
+\
+       inline reverse_iterator rbegin() \
+               { return reverse_iterator(mpTerminator->mpPrev); }\
+\
+       inline reverse_iterator rend() \
+               { return reverse_iterator(mpTerminator); }\
+\
+       inline const_reverse_iterator rbegin() const\
+               { return const_reverse_iterator(mpTerminator->mpPrev); }\
+\
+       inline const_reverse_iterator  rend() const\
+               { return const_reverse_iterator(mpTerminator); }\
+\
+       inline int empty() const { return (mSize == 0); }\
+\
+       inline size_type size() const { return mSize; }\
+\
+       inline size_type max_size() const { return UINT_MAX/sizeof(list_node); }\
+\
+       inline reference front() { return mpTerminator->mData; }\
+\
+       inline const_reference front() const { return mpTerminator->mData; }\
+\
+       inline reference back() { return mpTerminator->mpPrev->mData; }\
+\
+       inline const_reference back() const { return mpTerminator->mpPrev->mData; }\
+\
+       inline void push_front(const value_type& x) { insert( begin(), x ); }\
+\
+       inline void push_back(const value_type& x) { insert( end(), x ); }\
+\
+       iterator insert(iterator position, const value_type& x = value_type())\
+       {\
+               node_ref_type pNew = AllocNode();\
+\
+               node_ref_type pos = *((node_ref_type*)&position);\
+\
+               pNew->mpNext = pos;\
+               pNew->mpPrev = pos->mpPrev;\
+               pos->mpPrev->mpNext = pNew;\
+               pos->mpPrev  = pNew;\
+\
+               new (&pNew->mData) value_type(x);\
+\
+               ++mSize;\
+\
+               return iterator(pNew);\
+       }\
+\
+       inline void insert(iterator position, const_iterator first, const_iterator last )\
+       {\
+               while( first != last ) insert( position, *first++ );\
+       }\
+\
+       inline void splice( iterator position, listClass& other )\
+       {\
+               if ( other.begin() == other.end() ) return;\
+\
+               node_ref_type pTill = other.mpTerminator->mpPrev;\
+               node_ref_type pFrom = other.begin().mpNode;\
+\
+               mpTerminator->mpPrev->mpNext = pFrom;\
+               pFrom->mpPrev = mpTerminator->mpPrev->mpNext;\
+\
+               pTill->mpNext = mpTerminator;\
+               mpTerminator->mpPrev = pTill;\
+\
+               other.mpTerminator->mpNext = \
+                       other.mpTerminator->mpPrev = other.mpTerminator;\
+\
+               mSize += other.mSize;\
+               other.mSize = 0;\
+       }\
+\
+       inline void splice( iterator position, listClass& other, iterator first, iterator last )\
+       {\
+               if ( first == last ) return;\
+\
+               size_type sz = 0;\
+               iterator tmp = first;\
+               while( tmp != last ) \
+               {\
+                       ++tmp;\
+                       ++sz;\
+               }\
+\
+               mSize += sz;\
+               other.mSize -= sz;\
+\
+               node_ref_type pPos   = position.mpNode;\
+               node_ref_type pFirst = first.mpNode;\
+               node_ref_type pLast  = last.mpNode;\
+               node_ref_type pTill  = last.mpNode->mpPrev;\
+\
+               pPos->mpPrev->mpNext = pFirst;\
+               pPos->mpPrev = pTill;\
+\
+               pFirst->mpPrev->mpNext = last.mpNode;\
+               pLast->mpPrev = pTill;\
+\
+               pFirst->mpPrev = pPos->mpPrev;\
+               pTill->mpNext = pPos;\
+       }\
+\
+       inline void pop_front() { erase( begin() ); }\
+       inline void pop_back()  { erase( --end() );   }\
+       \
+       inline void erase(iterator position)\
+       {\
+               erase( position, ++position );\
+       }\
+       \
+       inline void erase(iterator first, iterator last)\
+       {\
+               node_ref_type firstNode = *((node_ref_type*)&first);\
+               node_ref_type lastNode = *((node_ref_type*)&last);\
+\
+               firstNode->mpPrev->mpNext = lastNode;\
+               lastNode->mpPrev = firstNode->mpPrev;\
+\
+               while( firstNode != lastNode )\
+               {\
+                       node_ref_type next = firstNode->mpNext;\
+\
+                       typedef value_type value_type_local;\
+                       firstNode->mData.value_type_local::~value_type_local();\
+\
+                       RecycleNode( firstNode );\
+\
+                       firstNode = next;\
+\
+                       --mSize;\
+               }\
+       }\
+\
+       inline void remove(const value_type& value)\
+       {\
+               for( iterator i = begin(); i != end(); ++i )\
+               \
+                       if ( (*i) == value ) \
+                       {\
+                               erase( i ); break;\
+                       }\
+       }\
+\
+       void sort()\
+       {\
+               if ( mSize < 2 ) return;\
+\
+               iterator from = begin();\
+               iterator other_end = end();\
+               --other_end;\
+\
+               for( size_type i = 0; i != mSize; ++i )\
+               {\
+                       size_type nSwaps = 0;\
+\
+                       iterator next = begin();\
+                       ++next;\
+\
+                       for( iterator j = begin(); j != other_end;  ++j )\
+                       {\
+\
+                               if ( (*next) < (*j) )\
+                               {\
+                                       value_type tmp = (*j);\
+                                       (*j) = (*next);\
+                                       (*next) = tmp;\
+\
+                                       ++nSwaps;\
+                               }\
+\
+                               ++next;\
+                       }\
+\
+                       if ( !nSwaps) break;\
+\
+                       --other_end;\
+               }\
+       }\
+}
+
+// defines list class with the given element type
+#define WXSTL_LIST(ELEMENT_CLASS)  __DEFINE_STL_LIST(\
+\
+_WXSTL_LIST_##ELEMENT_CLASS, ELEMENT_CLASS )
+
+#endif
\ No newline at end of file
diff --git a/utils/HelpGen/src/wxstlvec.h b/utils/HelpGen/src/wxstlvec.h
new file mode 100644 (file)
index 0000000..6658b07
--- /dev/null
@@ -0,0 +1,781 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        No names yet.
+// Purpose:     Contrib. demo
+// Author:      Aleksandras Gluchovas
+// Modified by:
+// Created:     27/09/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Aleskandars Gluchovas
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __WXSTLVEC_G__
+#define __WXSTLVEC_G__
+
+#ifdef new
+#undef new
+#endif
+
+#include <memory.h>
+#include <string.h>  // imports memmove()
+#include <stddef.h>
+#include <sys/types.h>
+#include <limits.h>
+#include <new>
+
+// the below macro used internally (see actual interface after this macro)
+
+#define __DEFINE_STL_VECTOR_DEEP( vectorClass, Type ) class vectorClass {\
+\
+public:\
+       typedef Type              value_type;\
+       typedef value_type*           iterator;\
+       typedef const value_type* const_iterator;\
+       typedef iterator                  pointer;\
+       typedef const iterator    const_pointer;\
+       typedef value_type&       reference;\
+       typedef const value_type& const_reference;\
+       typedef size_t            size_type;\
+       typedef ptrdiff_t         difference_type;\
+\
+       typedef iterator       OutputIterator;\
+       typedef const_iterator InputIterator;\
+\
+protected:\
+\
+       inline void PlacementCopy( const_iterator first, const_iterator last, iterator result )\
+       {\
+               while ( first != last ) \
+                       new (result++) value_type(*first++);\
+       }\
+\
+       inline void ConstructObjects( iterator first, iterator last, const value_type& pattern )\
+       {\
+               while( first != last ) \
+                       new (first++) value_type(pattern);\
+       }\
+\
+       inline void CopyObjects( iterator first, iterator last, iterator result )\
+       {\
+               while( first != last ) \
+                       *result++ = *first++;\
+       }\
+\
+       inline void CopyObjectsBack( iterator first, iterator last, iterator result )\
+       {\
+               result += difference_type(last,first);\
+\
+               while( first != last ) \
+                       *(--result) = *(--last);\
+       }\
+\
+public:\
+\
+       class reverse_iterator \
+       {\
+               friend class vectorClass;\
+               friend class const_reverse_iterator;\
+\
+       public:\
+               iterator mpPos;\
+\
+       public:\
+\
+               reverse_iterator() {}\
+\
+               reverse_iterator ( iterator pPos )\
+               {\
+                       mpPos = pPos;\
+               }\
+       \
+               int operator==( const reverse_iterator& rhs ) const { return (mpPos == rhs.mpPos); }\
+               int operator!=( const reverse_iterator& rhs ) const { return (mpPos != rhs.mpPos); }\
+\
+               inline reverse_iterator( const reverse_iterator& other )\
+               {\
+                       mpPos = other.mpPos;\
+               }\
+\
+               inline const reverse_iterator& operator--() \
+               {\
+                       --mpPos;\
+                       return *this;\
+               }\
+\
+               inline reverse_iterator operator--(int)\
+               {\
+                       reverse_iterator tmp = *this;\
+                       --mpPos;\
+                       return tmp;\
+               }\
+\
+               inline const reverse_iterator & operator++() \
+               {\
+                       ++mpPos;\
+                       return *this;\
+               }\
+\
+               inline reverse_iterator  operator++(int)\
+               {\
+                       reverse_iterator tmp = *this;\
+                       ++mpPos;\
+                       return tmp;\
+               }\
+\
+               inline const_reference operator*() const { return *mpPos; }\
+       };\
+\
+\
+       class const_reverse_iterator \
+       {\
+       protected:\
+               iterator mpPos;\
+       public:\
+\
+               const_reverse_iterator() {}\
+\
+               const_reverse_iterator( const iterator pPos )\
+               {\
+                       mpPos = pPos;\
+               }\
+       \
+               int operator==( const const_reverse_iterator& rhs ) const { return (mpPos == rhs.mpPos); }\
+               int operator!=( const const_reverse_iterator& rhs ) const { return (mpPos != rhs.mpPos); }\
+\
+               inline const_reverse_iterator( const reverse_iterator& other )\
+               {\
+                       mpPos = other.mpPos;\
+               }\
+\
+               inline const const_reverse_iterator& operator--() \
+               {\
+                       --mpPos;\
+                       return *this;\
+               }\
+\
+               inline const_reverse_iterator operator--(int)\
+               {\
+                       const_reverse_iterator tmp = *this;\
+                       --mpPos;\
+                       return tmp;\
+               }\
+\
+               inline const const_reverse_iterator & operator++() \
+               {\
+                       ++mpPos;\
+                       return *this;\
+               }\
+\
+               inline const_reverse_iterator operator++(int)\
+               {\
+                       const_reverse_iterator tmp = *this;\
+                       ++mpPos;\
+                       return tmp;\
+               }\
+\
+               inline const_reference operator*() const { return *mpPos; }\
+       };\
+\
+protected:\
+       \
+       pointer mpStart;\
+       pointer mpEnd;\
+       pointer mpEndOfBuf;\
+\
+protected:\
+\
+       inline void quick_sort(int low, int hi) \
+       {\
+       }\
+\
+       inline void DestructRange( iterator first, iterator last )\
+       {\
+               typedef value_type value_type_local;\
+\
+               while ( first != last ) \
+               {\
+                       first->value_type_local::~value_type_local();\
+                       ++first;\
+               }\
+       }\
+\
+       inline iterator DoInsert(iterator position, const value_type& x)\
+       {\
+               if ( mpEnd < mpEndOfBuf )\
+               {\
+                       new (mpEnd) value_type(*(mpEnd-1) );\
+           \
+                       CopyObjectsBack( position, mpEnd, position + 1 );\
+           \
+                       *position = x;\
+           \
+                       ++mpEnd;\
+           \
+                       return position;\
+               }\
+           \
+               size_type minBufLen = WXSTL_VECTOR_MIN_BUF_SIZE/sizeof(value_type);\
+           \
+               size_type doubledSize = size()*2;\
+           \
+               size_type newLen = ( doubledSize < minBufLen ) ? minBufLen : doubledSize;\
+           \
+               iterator pNewStart = (iterator)( new char[newLen*sizeof(value_type)] );\
+           \
+               PlacementCopy( mpStart, position, pNewStart );\
+           \
+               iterator atPosition = pNewStart + difference_type( position - mpStart );\
+           \
+               new (atPosition) value_type(x);\
+           \
+               iterator newPos = atPosition;\
+           \
+               ++atPosition;\
+           \
+               if ( mpStart ) \
+               {\
+                       PlacementCopy( position, mpEnd, atPosition );\
+                       DestructRange( mpStart, mpEnd );\
+                       delete [](char*)mpStart;\
+               }\
+           \
+               mpEnd = atPosition + difference_type( mpEnd - position );\
+           \
+               mpStart    = pNewStart;\
+               mpEndOfBuf = pNewStart + newLen;\
+           \
+               return newPos;\
+       }\
+\
+public:\
+\
+       inline vectorClass() : mpStart(0), \
+                                                  mpEnd(0),\
+                                                  mpEndOfBuf(0)\
+       {}\
+\
+       inline vectorClass( const_iterator first, const_iterator last )\
+               : mpStart(0),\
+                 mpEnd(0),\
+                 mpEndOfBuf(0)\
+               \
+               { while( first != last ) push_back( *first++ ); }\
+\
+       inline vectorClass( size_type n, const value_type& value = value_type() )\
+               : mpStart(0),\
+                 mpEnd(0),\
+                 mpEndOfBuf(0)\
+               \
+               { for( size_type i = 0; i != n; ++i ) push_back( value ); }\
+\
+       inline const vectorClass& operator=( const vectorClass& other )\
+       {\
+               if (mpStart) \
+               {\
+                       DestructRange( begin(), end() );\
+                       delete [](char*)mpStart; \
+               }\
+\
+               size_t newLen = difference_type( other.mpEndOfBuf - other.mpStart );\
+\
+               mpStart = (iterator)( new char[newLen*sizeof(value_type)] );\
+\
+               PlacementCopy( other.begin(), other.end(), mpStart );\
+\
+               mpEnd = mpStart + other.size();\
+\
+               mpEndOfBuf = mpStart + newLen;\
+\
+               return *this;\
+       }\
+\
+       inline vectorClass( const vectorClass& other )\
+               : mpStart(0),\
+                 mpEnd(0),\
+                 mpEndOfBuf(0)\
+       {\
+               this->operator=( other );\
+       }\
+\
+       inline ~vectorClass() \
+       { \
+               if (mpStart) \
+               {\
+                       DestructRange( begin(), end() );\
+                       delete [](char*)mpStart; \
+               }\
+       }\
+\
+       inline iterator begin() { return mpStart; }\
+\
+       inline const_iterator begin() const { return mpStart; }\
+\
+       inline iterator end() { return mpEnd; }\
+\
+       inline const_iterator end() const { return mpEnd; }\
+\
+       inline size_type size() const { return (size_type)difference_type(mpEnd-mpStart); }\
+\
+       inline size_type max_size() const { return UINT_MAX/sizeof(value_type); }\
+\
+       inline size_type capacity() const \
+                       { return difference_type(mpEndOfBuf-mpStart)/sizeof(value_type); }\
+\
+       inline int empty() const { return mpStart == mpEnd; }\
+\
+       inline reference operator[](size_type n) { return *(mpStart+n); }\
+\
+       inline const_reference operator[](size_type n) const { return *(mpStart+n); }\
+\
+       inline reference front() { return (*mpStart); }\
+       \
+       inline const_reference front() const { return (*mpStart); }\
+\
+       inline reference back() { return (*(mpEnd-1)); }\
+\
+       inline const_reference back() const { return (*(mpEnd-1)); }\
+\
+       inline void reserve(size_type n) {}\
+\
+       inline void push_back(const value_type& x)\
+       {\
+               if ( mpEnd != mpEndOfBuf ) \
+               {\
+                       new (mpEnd) value_type(x);\
+                       ++mpEnd;\
+               }\
+               else\
+                       DoInsert( mpEnd, x );\
+       }\
+\
+       inline iterator insert(iterator position, const value_type& x = value_type())\
+       {\
+               if ( position == mpEnd && mpEnd != mpEndOfBuf )\
+               {\
+                       new (mpEnd) value_type(x);\
+                       ++mpEnd;\
+                       return (mpEnd-1);\
+               }\
+               else return DoInsert( position, x );\
+       }\
+\
+       inline void pop_back()\
+       {\
+               DestructRange( mpEnd-1, mpEnd );\
+\
+               --mpEnd;\
+       }\
+\
+       inline void erase(iterator first, iterator last)\
+       {\
+               if ( last == mpEnd )\
+               {\
+                       DestructRange( first, last );\
+                       mpEnd = first;\
+                       return;\
+               }\
+           \
+               CopyObjects( last, last + difference_type( mpEnd - last ), first );\
+           \
+               iterator newEnd = mpEnd - difference_type( last - first );\
+               DestructRange( newEnd, mpEnd );\
+           \
+               mpEnd = newEnd;\
+       }\
+\
+       inline void erase( iterator position )\
+       {\
+               erase( position, position + 1 );\
+       }\
+\
+       inline void sort()\
+       {\
+               if ( size() < 2 ) return;\
+               quick_sort( 0, size()-1 );\
+       }\
+}
+
+/////////////////////////////// shallow-copy container ///////////////////////
+
+#define __DEFINE_STL_VECTOR_SHALLOW( vectorClass, Type ) class vectorClass {\
+\
+public:\
+       typedef Type              value_type;\
+       typedef value_type*           iterator;\
+       typedef const value_type* const_iterator;\
+       typedef iterator                  pointer;\
+       typedef const iterator    const_pointer;\
+       typedef value_type&       reference;\
+       typedef const value_type& const_reference;\
+       typedef size_t            size_type;\
+       typedef ptrdiff_t         difference_type;\
+\
+       typedef iterator       OutputIterator;\
+       typedef const_iterator InputIterator;\
+\
+protected:\
+\
+       inline void PlacementCopy( const_iterator first, const_iterator last, iterator result )\
+       {\
+               memcpy(result, first, int(difference_type(last-first)*sizeof(value_type)) );\
+       }\
+\
+       inline void ConstructObjects( iterator first, iterator last, const value_type& pattern )\
+       {\
+                       if ( sizeof(pattern) == 1 )\
+                       \
+                               memset( first, int(difference_type(last-first)/sizeof(value_type)), \
+                                       int(*((char*)&pattern)) );\
+                       else\
+                               while( first != last ) \
+                                       *first++ = pattern;\
+       }\
+\
+       inline void CopyObjects( iterator first, iterator last, iterator result )\
+       {\
+               memcpy(result, first, int(difference_type(last-first)*sizeof(value_type)) );\
+       }\
+\
+       inline void CopyObjectsBack( iterator first, iterator last, iterator result )\
+       {\
+               memmove(result, first, int(difference_type(last-first)*sizeof(value_type)) );\
+       }\
+\
+public:\
+\
+       class reverse_iterator \
+       {\
+               friend class vectorClass;\
+               friend class const_reverse_iterator;\
+\
+       public:\
+               iterator mpPos;\
+\
+       public:\
+\
+               reverse_iterator() {}\
+\
+               reverse_iterator ( iterator pPos )\
+               {\
+                       mpPos = pPos;\
+               }\
+       \
+               int operator==( const reverse_iterator& rhs ) const { return (mpPos == rhs.mpPos); }\
+               int operator!=( const reverse_iterator& rhs ) const { return (mpPos != rhs.mpPos); }\
+\
+               inline reverse_iterator( const reverse_iterator& other )\
+               {\
+                       mpPos = other.mpPos;\
+               }\
+\
+               inline const reverse_iterator& operator--() \
+               {\
+                       --mpPos;\
+                       return *this;\
+               }\
+\
+               inline reverse_iterator operator--(int)\
+               {\
+                       reverse_iterator tmp = *this;\
+                       --mpPos;\
+                       return tmp;\
+               }\
+\
+               inline const reverse_iterator & operator++() \
+               {\
+                       ++mpPos;\
+                       return *this;\
+               }\
+\
+               inline reverse_iterator  operator++(int)\
+               {\
+                       reverse_iterator tmp = *this;\
+                       ++mpPos;\
+                       return tmp;\
+               }\
+\
+               inline const_reference operator*() const { return *mpPos; }\
+       };\
+\
+\
+       class const_reverse_iterator \
+       {\
+       protected:\
+               iterator mpPos;\
+       public:\
+\
+               const_reverse_iterator() {}\
+\
+               const_reverse_iterator( const iterator pPos )\
+               {\
+                       mpPos = pPos;\
+               }\
+       \
+               int operator==( const const_reverse_iterator& rhs ) const { return (mpPos == rhs.mpPos); }\
+               int operator!=( const const_reverse_iterator& rhs ) const { return (mpPos != rhs.mpPos); }\
+\
+               inline const_reverse_iterator( const reverse_iterator& other )\
+               {\
+                       mpPos = other.mpPos;\
+               }\
+\
+               inline const const_reverse_iterator& operator--() \
+               {\
+                       --mpPos;\
+                       return *this;\
+               }\
+\
+               inline const_reverse_iterator operator--(int)\
+               {\
+                       const_reverse_iterator tmp = *this;\
+                       --mpPos;\
+                       return tmp;\
+               }\
+\
+               inline const const_reverse_iterator & operator++() \
+               {\
+                       ++mpPos;\
+                       return *this;\
+               }\
+\
+               inline const_reverse_iterator operator++(int)\
+               {\
+                       const_reverse_iterator tmp = *this;\
+                       ++mpPos;\
+                       return tmp;\
+               }\
+\
+               inline const_reference operator*() const { return *mpPos; }\
+       };\
+\
+protected:\
+       \
+       pointer mpStart;\
+       pointer mpEnd;\
+       pointer mpEndOfBuf;\
+\
+protected:\
+\
+       inline void quick_sort(int low, int hi) \
+       {\
+       }\
+\
+       inline void DestructRange( iterator first, iterator last )\
+       {\
+       }\
+\
+       inline iterator DoInsert(iterator position, const value_type& x)\
+       {\
+               if ( mpEnd < mpEndOfBuf )\
+               {\
+                       new (mpEnd) value_type(*(mpEnd-1) );\
+           \
+                       CopyObjectsBack( position, mpEnd, position + 1 );\
+           \
+                       *position = x;\
+           \
+                       ++mpEnd;\
+           \
+                       return position;\
+               }\
+           \
+               size_type minBufLen = WXSTL_VECTOR_MIN_BUF_SIZE/sizeof(value_type);\
+           \
+               size_type doubledSize = size()*2;\
+           \
+               size_type newLen = ( doubledSize < minBufLen ) ? minBufLen : doubledSize;\
+           \
+               iterator pNewStart = (iterator)( new char[newLen*sizeof(value_type)] );\
+           \
+               PlacementCopy( mpStart, position, pNewStart );\
+           \
+               iterator atPosition = pNewStart + difference_type( position - mpStart );\
+           \
+               new (atPosition) value_type(x);\
+           \
+               iterator newPos = atPosition;\
+           \
+               ++atPosition;\
+           \
+               if ( mpStart ) \
+               {\
+                       PlacementCopy( position, mpEnd, atPosition );\
+                       DestructRange( mpStart, mpEnd );\
+                       delete [](char*)mpStart;\
+               }\
+           \
+               mpEnd = atPosition + difference_type( mpEnd - position );\
+           \
+               mpStart    = pNewStart;\
+               mpEndOfBuf = pNewStart + newLen;\
+           \
+               return newPos;\
+       }\
+\
+public:\
+\
+       inline vectorClass() : mpStart(0), \
+                                                  mpEnd(0),\
+                                                  mpEndOfBuf(0)\
+       {}\
+\
+       inline vectorClass( const_iterator first, const_iterator last )\
+               : mpStart(0),\
+                 mpEnd(0),\
+                 mpEndOfBuf(0)\
+               \
+               { while( first != last ) push_back( *first++ ); }\
+\
+       inline vectorClass( size_type n, const value_type& value = value_type() )\
+               : mpStart(0),\
+                 mpEnd(0),\
+                 mpEndOfBuf(0)\
+               \
+               { for( size_type i = 0; i != n; ++i ) push_back( value ); }\
+\
+       inline const vectorClass& operator=( const vectorClass& other )\
+       {\
+               if (mpStart) \
+               {\
+                       DestructRange( begin(), end() );\
+                       delete [](char*)mpStart; \
+               }\
+\
+               size_t newLen = difference_type( other.mpEndOfBuf - other.mpStart );\
+\
+               mpStart = (iterator)( new char[newLen*sizeof(value_type)] );\
+\
+               PlacementCopy( other.begin(), other.end(), mpStart );\
+\
+               mpEnd = mpStart + other.size();\
+\
+               mpEndOfBuf = mpStart + newLen;\
+\
+               return *this;\
+       }\
+\
+       inline vectorClass( const vectorClass& other )\
+               : mpStart(0),\
+                 mpEnd(0),\
+                 mpEndOfBuf(0)\
+       {\
+               this->operator=( other );\
+       }\
+\
+       inline ~vectorClass() \
+       { \
+               if (mpStart) \
+               {\
+                       DestructRange( begin(), end() );\
+                       delete [](char*)mpStart; \
+               }\
+       }\
+\
+       inline iterator begin() { return mpStart; }\
+\
+       inline const_iterator begin() const { return mpStart; }\
+\
+       inline iterator end() { return mpEnd; }\
+\
+       inline const_iterator end() const { return mpEnd; }\
+\
+       inline size_type size() const { return (size_type)difference_type(mpEnd-mpStart); }\
+\
+       inline size_type max_size() const { return UINT_MAX/sizeof(value_type); }\
+\
+       inline size_type capacity() const \
+                       { return difference_type(mpEndOfBuf-mpStart)/sizeof(value_type); }\
+\
+       inline int empty() const { return mpStart == mpEnd; }\
+\
+       inline reference operator[](size_type n) { return *(mpStart+n); }\
+\
+       inline const_reference operator[](size_type n) const { return *(mpStart+n); }\
+\
+       inline reference front() { return (*mpStart); }\
+       \
+       inline const_reference front() const { return (*mpStart); }\
+\
+       inline reference back() { return (*(mpEnd-1)); }\
+\
+       inline const_reference back() const { return (*(mpEnd-1)); }\
+\
+       inline void reserve(size_type n) {}\
+\
+       inline void push_back(const value_type& x)\
+       {\
+               if ( mpEnd != mpEndOfBuf ) \
+               {\
+                       new (mpEnd) value_type(x);\
+                       ++mpEnd;\
+               }\
+               else\
+                       DoInsert( mpEnd, x );\
+       }\
+\
+       inline iterator insert(iterator position, const value_type& x = value_type())\
+       {\
+               if ( position == mpEnd && mpEnd != mpEndOfBuf )\
+               {\
+                       new (mpEnd) value_type(x);\
+                       ++mpEnd;\
+                       return (mpEnd-1);\
+               }\
+               else return DoInsert( position, x );\
+       }\
+\
+       inline void pop_back()\
+       {\
+               DestructRange( mpEnd-1, mpEnd );\
+\
+               --mpEnd;\
+       }\
+\
+       inline void erase(iterator first, iterator last)\
+       {\
+               if ( last == mpEnd )\
+               {\
+                       DestructRange( first, last );\
+                       mpEnd = first;\
+                       return;\
+               }\
+           \
+               CopyObjects( last, last + difference_type( mpEnd - last ), first );\
+           \
+               iterator newEnd = mpEnd - difference_type( last - first );\
+               DestructRange( newEnd, mpEnd );\
+           \
+               mpEnd = newEnd;\
+       }\
+\
+       inline void erase( iterator position )\
+       {\
+               erase( position, position + 1 );\
+       }\
+\
+       inline void sort()\
+       {\
+               if ( size() < 2 ) return;\
+               quick_sort( 0, size()-1 );\
+       }\
+}
+
+
+
+// redefine below symbol to change the default allocation unit of vector content buffer
+#define WXSTL_VECTOR_MIN_BUF_SIZE 64
+
+// defines vector class, where objects are copied
+// using "deep-copy" sematics (i.e. by calling their copy constructors)
+
+#define WXSTL_VECTOR(ELEMENT_CLASS) \
+__DEFINE_STL_VECTOR_DEEP(_WXSTL_VECTOR_##ELEMENT_CLASS, ELEMENT_CLASS)
+
+// defines vector class, where objects are copied
+// using "shallow-copy" sematics (i.e. instead of calling
+// their constructors, memcpy() and memmove() are used to copy their raw data)
+
+
+#define WXSTL_VECTOR_SHALLOW_COPY(ELEMENT_CLASS) __DEFINE_STL_VECTOR_SHALLOW(_WXSTL_VECTORSC_##ELEMENT_CLASS, ELEMENT_CLASS)
+
+#endif