Warning fixes. Code cleanup. Whitespaces and tabs removed.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27857 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Włodzimierz Skiba
2004-06-17 19:00:22 +00:00
parent e5a9c66398
commit 8ad74db31e
5 changed files with 1253 additions and 1280 deletions

View File

@@ -191,17 +191,17 @@ public:
bool FlushAll()
{
if ( m_text.empty() )
return TRUE;
return true;
if ( !Write(m_text) ) {
wxLogError("Failed to output generated documentation.");
return FALSE;
return false;
}
m_text.clear();
return TRUE;
return true;
}
private:
@@ -223,19 +223,19 @@ public:
// already have)
bool AddNamesFromFile(const wxString& filename);
// return TRUE if we ignore this function
// return true if we ignore this function
bool IgnoreMethod(const wxString& classname,
const wxString& funcname) const
{
if ( IgnoreClass(classname) )
return TRUE;
return true;
IgnoreListEntry ignore(classname, funcname);
return m_ignore.Index(&ignore) != wxNOT_FOUND;
}
// return TRUE if we ignore this class entirely
// return true if we ignore this class entirely
bool IgnoreClass(const wxString& classname) const
{
IgnoreListEntry ignore(classname, "");
@@ -321,7 +321,7 @@ protected:
wxTeXFile m_file; // file we're writing to now
// state variables
bool m_inClass, // TRUE after file successfully opened
bool m_inClass, // true after file successfully opened
m_inTypesSection, // enums & typedefs go there
m_inMethodSection, // functions go here
m_isFirstParam; // first parameter of current function?
@@ -367,10 +367,10 @@ public:
DocManager(bool checkParamNames);
~DocManager();
// returns FALSE on failure
// returns false on failure
bool ParseTeXFile(const wxString& filename);
// returns FALSE if there were any differences
// returns false if there were any differences
bool DumpDifferences(spContext *ctxTop) const;
// get our `ignore' object
@@ -397,12 +397,12 @@ protected:
}
// skips characters until the next 'c' in '*pp' unless it ends before in
// which case FALSE is returned and pp points to '\0', otherwise TRUE is
// which case false is returned and pp points to '\0', otherwise true is
// returned and pp points to 'c'
bool SkipUntil(const char **pp, char c);
// the same as SkipUntil() but only spaces are skipped: on first non space
// character different from 'c' the function stops and returns FALSE
// character different from 'c' the function stops and returns false
bool SkipSpaceUntil(const char **pp, char c);
// extract the string between {} and modify '*pp' to point at the
@@ -463,7 +463,7 @@ protected:
};
public: // FIXME: macro requires it
WX_DEFINE_ARRAY(ParamInfo *, ArrayParamInfo);
WX_DEFINE_ARRAY_PTR(ParamInfo *, ArrayParamInfo);
// info about a function
struct MethodInfo
@@ -505,8 +505,8 @@ public: // FIXME: macro requires it
ArrayParamInfo m_params;
};
WX_DEFINE_ARRAY(MethodInfo *, ArrayMethodInfo);
WX_DEFINE_ARRAY(ArrayMethodInfo *, ArrayMethodInfos);
WX_DEFINE_ARRAY_PTR(MethodInfo *, ArrayMethodInfo);
WX_DEFINE_ARRAY_PTR(ArrayMethodInfo *, ArrayMethodInfos);
private:
// first array contains the names of all classes we found, the second has a
@@ -594,8 +594,8 @@ int main(int argc, char **argv)
wxArrayString filesH, filesTeX;
wxString directoryOut, // directory for 'dmup' output
ignoreFile; // file with classes/functions to ignore
bool overwrite = FALSE, // overwrite existing files during 'dump'?
paramNames = FALSE; // check param names during 'diff'?
bool overwrite = false, // overwrite existing files during 'dump'?
paramNames = false; // check param names during 'diff'?
for ( int current = 1; current < argc ; current++ ) {
// all options have one letter
@@ -609,7 +609,7 @@ int main(int argc, char **argv)
case 'q':
// be quiet
wxLog::GetActiveTarget()->SetVerbose(FALSE);
wxLog::GetActiveTarget()->SetVerbose(false);
continue;
case 'H':
@@ -642,7 +642,7 @@ int main(int argc, char **argv)
break;
}
paramNames = TRUE;
paramNames = true;
continue;
case 'f':
@@ -652,7 +652,7 @@ int main(int argc, char **argv)
break;
}
overwrite = TRUE;
overwrite = true;
continue;
case 'o':
@@ -762,7 +762,7 @@ int main(int argc, char **argv)
wxLogError("Can't complete diff.");
// failure
return FALSE;
return false;
}
DocManager docman(paramNames);
@@ -802,7 +802,7 @@ void HelpGenVisitor::Reset()
{
m_inClass =
m_inTypesSection =
m_inMethodSection = FALSE;
m_inMethodSection = false;
m_classname =
m_funcName =
@@ -839,7 +839,7 @@ void HelpGenVisitor::InsertEnumDocs()
void HelpGenVisitor::InsertDataStructuresHeader()
{
if ( !m_inTypesSection ) {
m_inTypesSection = TRUE;
m_inTypesSection = true;
m_file.WriteVerbatim("\\wxheading{Data structures}\n\n");
}
@@ -848,7 +848,7 @@ void HelpGenVisitor::InsertDataStructuresHeader()
void HelpGenVisitor::InsertMethodsHeader()
{
if ( !m_inMethodSection ) {
m_inMethodSection = TRUE;
m_inMethodSection = true;
m_file.WriteVerbatim( "\\latexignore{\\rtfignore{\\wxheading{Members}}}\n\n");
}
@@ -876,40 +876,42 @@ void HelpGenVisitor::CloseFunction()
void HelpGenVisitor::CloseClass()
{
CloseFunction();
CloseFunction();
if ( m_inClass ) {
if ( m_inClass )
{
size_t count = m_arrayFuncDocs.GetCount();
if ( count ) {
size_t n;
if ( count )
{
size_t n;
FunctionDocEntry::classname = m_classname;
m_arrayFuncDocs.Sort(FunctionDocEntry::Compare);
// Now examine each first line and if it's been seen, cut it
// off (it's a duplicate \membersection)
wxHashTable membersections(wxKEY_STRING);
// Now examine each first line and if it's been seen, cut it
// off (it's a duplicate \membersection)
wxHashTable membersections(wxKEY_STRING);
for ( n = 0; n < count; n++ )
{
{
wxString section(m_arrayFuncDocs[n].text);
// Strip leading whitespace
int pos = section.Find("\\membersection");
if (pos > -1)
{
section = section.Mid(pos);
}
// Strip leading whitespace
int pos = section.Find("\\membersection");
if (pos > -1)
{
section = section.Mid(pos);
}
wxString ms(section.BeforeFirst(wxT('\n')));
if (membersections.Get(ms))
{
m_arrayFuncDocs[n].text = section.AfterFirst(wxT('\n'));
}
else
{
membersections.Put(ms, & membersections);
}
wxString ms(section.BeforeFirst(wxT('\n')));
if (membersections.Get(ms))
{
m_arrayFuncDocs[n].text = section.AfterFirst(wxT('\n'));
}
else
{
membersections.Put(ms, & membersections);
}
}
for ( n = 0; n < count; n++ ) {
@@ -919,10 +921,10 @@ void HelpGenVisitor::CloseClass()
m_arrayFuncDocs.Empty();
}
m_inClass = FALSE;
m_inClass = false;
m_classname.clear();
}
m_file.FlushAll();
m_file.FlushAll();
}
void HelpGenVisitor::EndVisit()
@@ -934,11 +936,11 @@ void HelpGenVisitor::EndVisit()
m_fileHeader.Empty();
m_file.FlushAll();
if (m_file.IsOpened())
{
m_file.Flush();
m_file.Close();
}
if (m_file.IsOpened())
{
m_file.Flush();
m_file.Close();
}
wxLogVerbose("%s: finished generating for the current file.",
GetCurrentTime("%H:%M:%S"));
@@ -955,11 +957,11 @@ void HelpGenVisitor::VisitClass( spClass& cl )
{
CloseClass();
if (m_file.IsOpened())
{
m_file.Flush();
m_file.Close();
}
if (m_file.IsOpened())
{
m_file.Flush();
m_file.Close();
}
wxString name = cl.GetName();
@@ -999,7 +1001,7 @@ void HelpGenVisitor::VisitClass( spClass& cl )
}
m_inMethodSection =
m_inTypesSection = FALSE;
m_inTypesSection = false;
wxLogInfo("Created new file '%s' for class '%s'.",
filename.c_str(), name.c_str());
@@ -1103,7 +1105,7 @@ void HelpGenVisitor::VisitClass( spClass& cl )
derived << "No base class";
}
else {
bool first = TRUE;
bool first = true;
for ( StrListT::const_iterator i = baseClasses.begin();
i != baseClasses.end();
i++ ) {
@@ -1112,7 +1114,7 @@ void HelpGenVisitor::VisitClass( spClass& cl )
derived << "\\\\\n";
}
else {
first = FALSE;
first = false;
}
wxString baseclass = *i;
@@ -1136,7 +1138,7 @@ void HelpGenVisitor::VisitClass( spClass& cl )
InsertTypedefDocs();
InsertEnumDocs();
//m_file.Flush();
//m_file.Flush();
}
void HelpGenVisitor::VisitEnumeration( spEnumeration& en )
@@ -1269,7 +1271,7 @@ void HelpGenVisitor::VisitOperation( spOperation& op )
// save state info
m_funcName = funcname;
m_isFirstParam = TRUE;
m_isFirstParam = true;
m_textStoredFunctionComment = GetAllComments(op);
@@ -1283,19 +1285,19 @@ void HelpGenVisitor::VisitOperation( spOperation& op )
funcname = dtor;
}
m_textFunc.Printf("\n"
"\\membersection{%s::%s}\\label{%s}\n",
m_classname.c_str(), funcname.c_str(),
MakeLabel(m_classname, funcname).c_str());
m_textFunc.Printf("\n"
"\\membersection{%s::%s}\\label{%s}\n",
m_classname.c_str(), funcname.c_str(),
MakeLabel(m_classname, funcname).c_str());
wxString func;
func.Printf("\n"
wxString func;
func.Printf("\n"
"\\%sfunc{%s%s}{%s}{",
op.mIsConstant ? "const" : "",
op.mIsVirtual ? "virtual " : "",
op.mRetType.c_str(),
funcname.c_str());
m_textFunc += func;
m_textFunc += func;
}
void HelpGenVisitor::VisitParameter( spParameter& param )
@@ -1304,7 +1306,7 @@ void HelpGenVisitor::VisitParameter( spParameter& param )
return;
if ( m_isFirstParam ) {
m_isFirstParam = FALSE;
m_isFirstParam = false;
}
else {
m_textFunc << ", ";
@@ -1407,11 +1409,11 @@ bool DocManager::ParseTeXFile(const wxString& filename)
wxFile file(m_filename, wxFile::read);
if ( !file.IsOpened() )
return FALSE;
return false;
off_t len = file.Length();
if ( len == wxInvalidOffset )
return FALSE;
return false;
char *buf = new char[len + 1];
buf[len] = '\0';
@@ -1419,7 +1421,7 @@ bool DocManager::ParseTeXFile(const wxString& filename)
if ( file.Read(buf, len) == wxInvalidOffset ) {
delete [] buf;
return FALSE;
return false;
}
// reinit everything
@@ -1525,7 +1527,7 @@ bool DocManager::ParseTeXFile(const wxString& filename)
TeXUnfilter(&returnType);
current++;
if ( !SkipSpaceUntil(&current, '{') ) {
if ( !SkipSpaceUntil(&current, '{') ) {
wxLogWarning("file %s(%d): '{' expected after return type",
m_filename.c_str(), m_line);
@@ -1545,8 +1547,8 @@ bool DocManager::ParseTeXFile(const wxString& filename)
current = funcEnd + 1;
// trim spaces from both sides
funcName.Trim(FALSE);
funcName.Trim(TRUE);
funcName.Trim(false);
funcName.Trim(true);
// special cases: '$...$' may be used for LaTeX inline math, remove the
// '$'s
@@ -1597,7 +1599,7 @@ bool DocManager::ParseTeXFile(const wxString& filename)
wxArrayString paramNames, paramTypes, paramValues;
bool isVararg = FALSE;
bool isVararg = false;
current++; // skip '\\'
lenMatch = TryMatch(current, "void");
@@ -1629,7 +1631,7 @@ bool DocManager::ParseTeXFile(const wxString& filename)
// vararg function?
wxString paramText = ExtractStringBetweenBraces(&current);
if ( paramText == "..." ) {
isVararg = TRUE;
isVararg = true;
}
else {
wxLogWarning("Parameters of '%s::%s' are in "
@@ -1715,20 +1717,20 @@ bool DocManager::ParseTeXFile(const wxString& filename)
wxLogVerbose("%s: finished parsing doc file '%s'.\n",
GetCurrentTime("%H:%M:%S"), m_filename.c_str());
return TRUE;
return true;
}
bool DocManager::DumpDifferences(spContext *ctxTop) const
{
typedef MMemberListT::const_iterator MemberIndex;
bool foundDiff = FALSE;
bool foundDiff = false;
// flag telling us whether the given class was found at all in the header
size_t nClass, countClassesInDocs = m_classes.GetCount();
bool *classExists = new bool[countClassesInDocs];
for ( nClass = 0; nClass < countClassesInDocs; nClass++ ) {
classExists[nClass] = FALSE;
classExists[nClass] = false;
}
// ctxTop is normally an spFile
@@ -1747,7 +1749,7 @@ bool DocManager::DumpDifferences(spContext *ctxTop) const
int index = m_classes.Index(nameClass);
if ( index == wxNOT_FOUND ) {
if ( !m_ignoreNames.IgnoreClass(nameClass) ) {
foundDiff = TRUE;
foundDiff = true;
wxLogError("Class '%s' is not documented at all.",
nameClass.c_str());
@@ -1757,7 +1759,7 @@ bool DocManager::DumpDifferences(spContext *ctxTop) const
continue;
}
else {
classExists[index] = TRUE;
classExists[index] = true;
}
// array of method descriptions for this class
@@ -1767,7 +1769,7 @@ bool DocManager::DumpDifferences(spContext *ctxTop) const
// flags telling if we already processed given function
bool *methodExists = new bool[countMethods];
for ( nMethod = 0; nMethod < countMethods; nMethod++ ) {
methodExists[nMethod] = FALSE;
methodExists[nMethod] = false;
}
wxArrayString aOverloadedMethods;
@@ -1790,7 +1792,7 @@ bool DocManager::DumpDifferences(spContext *ctxTop) const
if ( aMethodsWithSameName.IsEmpty() && ctxMethod->IsPublic() ) {
if ( !m_ignoreNames.IgnoreMethod(nameClass, nameMethod) ) {
foundDiff = TRUE;
foundDiff = true;
wxLogError("'%s::%s' is not documented.",
nameClass.c_str(),
@@ -1802,7 +1804,7 @@ bool DocManager::DumpDifferences(spContext *ctxTop) const
}
else if ( aMethodsWithSameName.GetCount() == 1 ) {
index = (size_t)aMethodsWithSameName[0u];
methodExists[index] = TRUE;
methodExists[index] = true;
if ( m_ignoreNames.IgnoreMethod(nameClass, nameMethod) )
continue;
@@ -1858,7 +1860,7 @@ bool DocManager::DumpDifferences(spContext *ctxTop) const
const ParamInfo& param = method.GetParam(nParam);
if ( m_checkParamNames &&
(param.GetName() != ctxParam->mName) ) {
foundDiff = TRUE;
foundDiff = true;
wxLogError("Parameter #%d of '%s::%s' should be "
"'%s' and not '%s'.",
@@ -1872,7 +1874,7 @@ bool DocManager::DumpDifferences(spContext *ctxTop) const
}
if ( param.GetType() != ctxParam->mType ) {
foundDiff = TRUE;
foundDiff = true;
wxLogError("Type of parameter '%s' of '%s::%s' "
"should be '%s' and not '%s'.",
@@ -1908,7 +1910,7 @@ bool DocManager::DumpDifferences(spContext *ctxTop) const
// mark all methods with this name as existing
for ( nMethod = 0; nMethod < countMethods; nMethod++ ) {
if ( methods[nMethod]->GetName() == nameMethod )
methodExists[nMethod] = TRUE;
methodExists[nMethod] = true;
}
aOverloadedMethods.Add(nameMethod);
@@ -1927,7 +1929,7 @@ bool DocManager::DumpDifferences(spContext *ctxTop) const
if ( !methodExists[nMethod] ) {
const wxString& nameMethod = methods[nMethod]->GetName();
if ( !m_ignoreNames.IgnoreMethod(nameClass, nameMethod) ) {
foundDiff = TRUE;
foundDiff = true;
wxLogError("'%s::%s' is documented but doesn't exist.",
nameClass.c_str(),
@@ -1942,7 +1944,7 @@ bool DocManager::DumpDifferences(spContext *ctxTop) const
// check that all classes we found in the docs really exist
for ( nClass = 0; nClass < countClassesInDocs; nClass++ ) {
if ( !classExists[nClass] ) {
foundDiff = TRUE;
foundDiff = true;
wxLogError("Class '%s' is documented but doesn't exist.",
m_classes[nClass].c_str());
@@ -1978,11 +1980,11 @@ bool IgnoreNamesHandler::AddNamesFromFile(const wxString& filename)
{
wxFile file(filename, wxFile::read);
if ( !file.IsOpened() )
return FALSE;
return false;
off_t len = file.Length();
if ( len == wxInvalidOffset )
return FALSE;
return false;
char *buf = new char[len + 1];
buf[len] = '\0';
@@ -1990,7 +1992,7 @@ bool IgnoreNamesHandler::AddNamesFromFile(const wxString& filename)
if ( file.Read(buf, len) == wxInvalidOffset ) {
delete [] buf;
return FALSE;
return false;
}
wxString line;
@@ -2027,7 +2029,7 @@ bool IgnoreNamesHandler::AddNamesFromFile(const wxString& filename)
delete [] buf;
return TRUE;
return true;
}
// -----------------------------------------------------------------------------
@@ -2115,7 +2117,7 @@ static wxString MakeHelpref(const char *argument)
static void TeXFilter(wxString* str)
{
// TeX special which can be quoted (don't include backslash nor braces as
// we generate them
// we generate them
static wxRegEx reNonSpecialSpecials("[#$%&_]"),
reAccents("[~^]");
@@ -2130,8 +2132,8 @@ static void TeXFilter(wxString* str)
static void TeXUnfilter(wxString* str)
{
// FIXME may be done much more quickly
str->Trim(TRUE);
str->Trim(FALSE);
str->Trim(true);
str->Trim(false);
// undo TeXFilter
static wxRegEx reNonSpecialSpecials("\\\\([#$%&_{}])"),
@@ -2151,7 +2153,7 @@ static wxString GetAllComments(const spContext& ctx)
wxString comment = (*i)->GetText();
// don't take comments like "// ----------" &c
comment.Trim(FALSE);
comment.Trim(false);
if ( !!comment &&
comment == wxString(comment[0u], comment.length() - 1) + '\n' )
comments << "\n";
@@ -2185,6 +2187,9 @@ static const wxString GetVersionString()
/*
$Log$
Revision 1.29 2004/06/17 19:00:22 ABX
Warning fixes. Code cleanup. Whitespaces and tabs removed.
Revision 1.28 2004/05/25 11:19:57 JS
More name changes

View File

@@ -6,7 +6,7 @@
// Created: 22/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
@@ -161,12 +161,12 @@ static inline bool skip_to_next_comment_in_the_line( char*& cur )
*cur != '/'
) ++cur;
if ( cur == _gSrcEnd ) return FALSE;
if ( cur == _gSrcEnd ) return false;
if ( *cur == '/' )
{
if ( (*(cur+1) == '*') ||
(*(cur+1) == '/') ) return TRUE;
(*(cur+1) == '/') ) return true;
else
{
++cur;
@@ -174,7 +174,7 @@ static inline bool skip_to_next_comment_in_the_line( char*& cur )
}
}
return FALSE;
return false;
} while(1);
}
@@ -381,10 +381,9 @@ static inline bool get_next_token( char*& cur )
}
if ( cur >= _gSrcEnd )
return FALSE;
return false;
else
return TRUE;
return true;
}
static inline void skip_preprocessor_dir( char*& cur )
@@ -497,13 +496,13 @@ static inline bool cmp_tokens( char* tok1, char* tok2 )
do
{
if ( *(tok1++) != *(tok2++) )
return FALSE;
return false;
--len;
} while ( --len );
return TRUE;
return true;
}
static inline bool cmp_tokens_fast( char* tok1, char* tok2, size_t len )
@@ -511,11 +510,11 @@ static inline bool cmp_tokens_fast( char* tok1, char* tok2, size_t len )
do
{
if ( *(tok1++) != *(tok2++) )
return FALSE;
return false;
} while ( --len );
return TRUE;
return true;
}
static inline void skip_tempalate_statement( char*& cur )
@@ -741,18 +740,18 @@ static inline bool skip_imp_block( char*& cur )
while( *cur != '{' && cur < _gSrcEnd )
{
skip_token( cur );
if ( !get_next_token( cur ) ) return FALSE;
if ( !get_next_token( cur ) ) return false;
}
while( *cur != '}' && cur < _gSrcEnd )
{
skip_token( cur );
if ( !get_next_token( cur ) ) return FALSE;
if ( !get_next_token( cur ) ) return false;
}
++cur;
return TRUE;
return true;
}
static bool is_class_token( char*& cur )
@@ -779,7 +778,7 @@ static bool is_class_token( char*& cur )
return cmp_tokens_fast( cur, "union", 5 );
return FALSE;
return false;
}
inline static bool is_forward_decl( char* cur )
@@ -788,11 +787,11 @@ inline static bool is_forward_decl( char* cur )
{
switch( *cur )
{
case ':' : return FALSE;
case '{' : return FALSE;
case '(' : return FALSE;
case ':' : return false;
case '{' : return false;
case '(' : return false;
case ';' : return TRUE;
case ';' : return true;
default : break;
};
@@ -801,12 +800,12 @@ inline static bool is_forward_decl( char* cur )
} while (cur < _gSrcEnd); // prevent running out of bounds
return FALSE;
return false;
}
inline static bool is_function( char* cur, bool& isAMacro )
{
isAMacro = FALSE;
isAMacro = false;
int tmpLnNo;
store_line_no( tmpLnNo );
@@ -825,10 +824,10 @@ inline static bool is_function( char* cur, bool& isAMacro )
if ( cur > eol )
{
isAMacro = TRUE;
isAMacro = true;
restore_line_no( tmpLnNo );
return TRUE;
return true;
}
// it's not a macro, go to the begining of arg. list
@@ -840,7 +839,7 @@ inline static bool is_function( char* cur, bool& isAMacro )
if ( *cur == '(' )
{
restore_line_no( tmpLnNo );
return TRUE;
return true;
}
// end of statement found without any brackets in it
@@ -849,7 +848,7 @@ inline static bool is_function( char* cur, bool& isAMacro )
if ( *cur == ';' )
{
restore_line_no( tmpLnNo );
return FALSE;
return false;
}
++cur;
@@ -859,7 +858,7 @@ inline static bool is_function( char* cur, bool& isAMacro )
isAMacro = 1;
restore_line_no( tmpLnNo );
return FALSE;
return false;
}
// upon return the cursor is positioned after the
@@ -1018,8 +1017,8 @@ spFile* CJSourceParser::Parse( char* start, char* end )
) == 0
)
{
int o = 0;
++o;
// int o = 0;
// ++o;
}
switch (*cur)
@@ -1118,7 +1117,7 @@ spFile* CJSourceParser::Parse( char* start, char* end )
continue;
}
bool isAMacro = 0;
bool isAMacro = false;
if ( is_function( cur, isAMacro ) )
{
@@ -1132,8 +1131,9 @@ spFile* CJSourceParser::Parse( char* start, char* end )
int tmpLnNo;
store_line_no( tmpLnNo );
wxUnusedVar( tmpLnNo );
isAMacro = FALSE;
isAMacro = false;
if ( !ParseNameAndRetVal( cur, isAMacro ) )
{
@@ -1219,11 +1219,11 @@ void CJSourceParser::AttachComments( spContext& ctx, char* cur )
if ( i == 0 )
pComment->mStartsPar = TRUE;
pComment->mStartsPar = true;
else
if ( pComment->mIsMultiline )
pComment->mStartsPar = TRUE;
pComment->mStartsPar = true;
else
{
// find out wheather there is a new-line
@@ -1235,9 +1235,9 @@ void CJSourceParser::AttachComments( spContext& ctx, char* cur )
if ( prevLine >= prevComEnd )
pComment->mStartsPar = TRUE;
pComment->mStartsPar = true;
else
pComment->mStartsPar = FALSE;
pComment->mStartsPar = false;
}
prevComEnd = set_comment_text( pComment->mText, start );
@@ -1521,7 +1521,7 @@ void CJSourceParser::ParseKeyword( char*& cur )
bool CJSourceParser::ParseNameAndRetVal( char*& cur, bool& isAMacro )
{
isAMacro = FALSE;
isAMacro = false;
// FOR NOW:: all functions in the global
// scope are ignored
@@ -1537,7 +1537,7 @@ bool CJSourceParser::ParseNameAndRetVal( char*& cur, bool& isAMacro )
isVirtual = true;
skip_token( cur );
if ( !get_next_token( cur ) ) return FALSE;
if ( !get_next_token( cur ) ) return false;
}
char* bracketPos = cur;
@@ -1564,9 +1564,9 @@ bool CJSourceParser::ParseNameAndRetVal( char*& cur, bool& isAMacro )
mpPlugin->ParseContext( _gSrcStart, cur, _gSrcEnd, mpCurCtx );
isAMacro = TRUE;
isAMacro = true;
return FALSE;
return false;
}
}
@@ -1633,7 +1633,7 @@ bool CJSourceParser::ParseNameAndRetVal( char*& cur, bool& isAMacro )
// now, enter operation context
mpCurCtx = pOp;
return TRUE;
return true;
}
bool CJSourceParser::ParseArguments( char*& cur )
@@ -1655,7 +1655,7 @@ bool CJSourceParser::ParseArguments( char*& cur )
get_next_token( cur );
bool first_blk = 1;
bool first_blk = true;
while( *cur != ')' && *cur != ',' )
{
@@ -1693,7 +1693,7 @@ bool CJSourceParser::ParseArguments( char*& cur )
// if only one block enclosed, than it's probably
// some macro, there should be at least two blocks,
// one for argument type and another for it's identifier
return FALSE;
return false;
}
if ( blocksSkipped == 0 )
@@ -1777,29 +1777,31 @@ bool CJSourceParser::ParseArguments( char*& cur )
int tmpLnNo;
store_line_no( tmpLnNo );
bool result = true;
do
{
if ( *tok == '{' || *tok == ';' )
{
restore_line_no(tmpLnNo);
return TRUE;
break;
}
// check for unexpected tokens
if ( *tok == '=' || *tok == '0' )
{
skip_token(tok);
if ( !get_next_token(tok) ) return FALSE;
if ( !get_next_token(tok) ) return false;
continue;
}
if ( *tok == '}' ) return FALSE;
if ( *tok == '}' ) return false;
// if initialization list found
if ( *tok == ':' )
{
restore_line_no(tmpLnNo);
return TRUE;
break;
}
if ( cmp_tokens_fast( tok, "const", 5 ) )
@@ -1807,30 +1809,28 @@ bool CJSourceParser::ParseArguments( char*& cur )
((spOperation*)mpCurCtx)->mIsConstant = true;
skip_token(tok);
if ( !get_next_token(tok) ) return FALSE;
if ( !get_next_token(tok) ) return false;
continue;
}
if ( CheckVisibilty( tok ) ) return FALSE;
if ( CheckVisibilty( tok ) ) return false;
// if next context found
if ( is_keyword( tok ) ) return FALSE;
if ( is_keyword( tok ) ) return false;
skip_token(tok);
if ( !get_next_token(tok) ) return FALSE;
if ( !get_next_token(tok) ) return false;
} while(1);
return TRUE;
return result;
}
void CJSourceParser::ParseMemberVar( char*& cur )
{
MMemberListT& members = mpCurCtx->GetMembers();
bool firstMember = 1;
size_t first = 0;
bool firstMember = true;
string type;
@@ -1860,7 +1860,6 @@ void CJSourceParser::ParseMemberVar( char*& cur )
if ( firstMember )
{
firstMember = 0;
first = members.size() - 1;;
}
skip_token_back( cur );
@@ -1904,7 +1903,7 @@ void CJSourceParser::ParseMemberVar( char*& cur )
} while(1);
first = 0;
size_t first = 0;
// set up types for all collected (same-type) attributes;
while ( first != members.size() - 1 )
@@ -1950,7 +1949,7 @@ void CJSourceParser::SkipFunctionBody( char*& cur )
{
// FIXME:: check for comments and quoted stirngs here
bool hasDefinition = FALSE;
bool hasDefinition = false;
while( *cur != '{' && *cur != ';' )
{
@@ -1964,7 +1963,7 @@ void CJSourceParser::SkipFunctionBody( char*& cur )
}
else
{
hasDefinition = TRUE;
hasDefinition = true;
skip_scope_block( cur ); // skip the whole imp.
}
@@ -2004,22 +2003,22 @@ bool CJSourceParser::CheckVisibilty( char*& cur )
if ( cmp_tokens_fast( cur, "public:", len ) )
{
mCurVis = SP_VIS_PUBLIC;
return TRUE;
return true;
}
if ( cmp_tokens_fast( cur, "protected:", len ) )
{
mCurVis = SP_VIS_PROTECTED;
return TRUE;
return true;
}
if ( cmp_tokens_fast( cur, "private:", len ) )
{
mCurVis = SP_VIS_PRIVATE;
return TRUE;
return true;
}
return FALSE;
return false;
}
void CJSourceParser::AddClassNode( char*& cur )

View File

@@ -6,7 +6,7 @@
// Created: 22/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx/wx.h".
@@ -32,7 +32,7 @@
// ***** currently only HTML versions of variouse templates available ***** //
static const char* HTM_TopTempl =
static const char* HTM_TopTempl =
"<html><body bgcolor=#FFFFFF>\n\
\n\n<!------ Automatically Generated by \"wxDocRipper\"------->\n\n\n\
@@ -42,7 +42,7 @@ $(REFLIST)\
</ul><p>\n\n\
";
static const char* HTM_ContentIdxTempl =
static const char* HTM_ContentIdxTempl =
"\
<a name=\"r$(ID)_$(NAME)\">\n\
@@ -53,7 +53,7 @@ $(REFLIST)\
</ul><p>\n\n\
";
static const char* HTM_SuperContentTempl =
static const char* HTM_SuperContentTempl =
"\
<a name=\"r$(ID)_$(NAME)\">\n\
@@ -62,7 +62,7 @@ static const char* HTM_SuperContentTempl =
$(BODY)\n\
";
static const char* HTM_SubContentTempl =
static const char* HTM_SubContentTempl =
"\
<a name=\"r$(ID)_$(NAME)\">\n\
@@ -104,490 +104,456 @@ static const char* HTM_DeadRefTempl =
RipperDocGen::RipperDocGen()
: mTopTempl ( HTM_TopTempl ),
mContentIdxTempl ( HTM_ContentIdxTempl ),
mSuperContentTempl( HTM_SuperContentTempl ),
mSubContentTempl ( HTM_SubContentTempl ),
mOutLineTempl ( HTM_OutLineTempl ),
mOutLine1Templ ( HTM_OutLine1Templ ),
: mTopTempl ( HTM_TopTempl ),
mContentIdxTempl ( HTM_ContentIdxTempl ),
mSuperContentTempl( HTM_SuperContentTempl ),
mSubContentTempl ( HTM_SubContentTempl ),
mOutLineTempl ( HTM_OutLineTempl ),
mOutLine1Templ ( HTM_OutLine1Templ ),
mRefTempl ( HTM_RefTempl ),
mDeadRefTempl ( HTM_DeadRefTempl ),
mRefTempl ( HTM_RefTempl ),
mDeadRefTempl ( HTM_DeadRefTempl ),
mpCurClassSect(0)
{ // topIndex is not referenced
mpTopIdx = new ScriptSection( "Source Code Contents" , "", &mTopTempl , 0 );
mpClassIdx = new ScriptSection( "Classes Reference" , "", &mContentIdxTempl, &mRefTempl );
mpEnumIdx = new ScriptSection( "Enumerations Reference" , "", &mContentIdxTempl, &mRefTempl );
mpTypeDefIdx = new ScriptSection( "Type Definitions Reference" , "", &mContentIdxTempl, &mRefTempl );
mpMacroIdx = new ScriptSection( "Macros Reference" , "", &mContentIdxTempl, &mRefTempl );
mpGlobalVarsIdx = new ScriptSection( "Global Variables Reference" , "", &mContentIdxTempl, &mRefTempl );
mpGlobalFuncIdx = new ScriptSection( "Global Functions Reference", "", &mContentIdxTempl, &mRefTempl );
mpConstIdx = new ScriptSection( "Constants Reference" , "", &mContentIdxTempl, &mRefTempl );
mpCurClassSect(0)
{
// topIndex is not referenced
mpTopIdx = new ScriptSection( "Source Code Contents" , "", &mTopTempl , 0 );
mpClassIdx = new ScriptSection( "Classes Reference" , "", &mContentIdxTempl, &mRefTempl );
mpEnumIdx = new ScriptSection( "Enumerations Reference" , "", &mContentIdxTempl, &mRefTempl );
mpTypeDefIdx = new ScriptSection( "Type Definitions Reference" , "", &mContentIdxTempl, &mRefTempl );
mpMacroIdx = new ScriptSection( "Macros Reference" , "", &mContentIdxTempl, &mRefTempl );
mpGlobalVarsIdx = new ScriptSection( "Global Variables Reference" , "", &mContentIdxTempl, &mRefTempl );
mpGlobalFuncIdx = new ScriptSection( "Global Functions Reference", "", &mContentIdxTempl, &mRefTempl );
mpConstIdx = new ScriptSection( "Constants Reference" , "", &mContentIdxTempl, &mRefTempl );
// assemble top index
mpTopIdx->AddSection( mpClassIdx , 1 );
mpTopIdx->AddSection( mpEnumIdx , 1 );
mpTopIdx->AddSection( mpTypeDefIdx , 1 );
mpTopIdx->AddSection( mpMacroIdx , 1 );
mpTopIdx->AddSection( mpGlobalVarsIdx, 1 );
mpTopIdx->AddSection( mpGlobalFuncIdx, 1 );
mpTopIdx->AddSection( mpConstIdx , 1 );
// assemble top index
mpTopIdx->AddSection( mpClassIdx , 1 );
mpTopIdx->AddSection( mpEnumIdx , 1 );
mpTopIdx->AddSection( mpTypeDefIdx , 1 );
mpTopIdx->AddSection( mpMacroIdx , 1 );
mpTopIdx->AddSection( mpGlobalVarsIdx, 1 );
mpTopIdx->AddSection( mpGlobalFuncIdx, 1 );
mpTopIdx->AddSection( mpConstIdx , 1 );
// register reserved variables for index and description templates
ScriptSection::RegisterTemplate( mTopTempl );
ScriptSection::RegisterTemplate( mContentIdxTempl );
ScriptSection::RegisterTemplate( mSuperContentTempl );
ScriptSection::RegisterTemplate( mSubContentTempl );
ScriptSection::RegisterTemplate( mOutLineTempl );
ScriptSection::RegisterTemplate( mOutLine1Templ );
ScriptSection::RegisterTemplate( mRefTempl );
ScriptSection::RegisterTemplate( mDeadRefTempl );
// register reserved variables for index and description templates
ScriptSection::RegisterTemplate( mTopTempl );
ScriptSection::RegisterTemplate( mContentIdxTempl );
ScriptSection::RegisterTemplate( mSuperContentTempl );
ScriptSection::RegisterTemplate( mSubContentTempl );
ScriptSection::RegisterTemplate( mOutLineTempl );
ScriptSection::RegisterTemplate( mOutLine1Templ );
ScriptSection::RegisterTemplate( mRefTempl );
ScriptSection::RegisterTemplate( mDeadRefTempl );
// create the top-most (interfile) context
mpFileBinderCtx = new spFile();
// create the top-most (interfile) context
mpFileBinderCtx = new spFile();
// the default script is HTML
mTags = get_HTML_markup_tags();
// the default script is HTML
mTags = get_HTML_markup_tags();
mpParser = 0; // no default parser!
mpParser = 0; // no default parser!
}
void RipperDocGen::Init( SourceParserBase* pParser )
{
mpParser = pParser;
mpParser = pParser;
}
RipperDocGen::~RipperDocGen()
{
delete mpFileBinderCtx;
delete mpFileBinderCtx;
}
void RipperDocGen::AppendComments( spContext& fromContext, string& str )
{
if ( !fromContext.HasComments() ) return;
if ( !fromContext.HasComments() ) return;
size_t start = str.length();
size_t start = str.length();
str += mTags[TAG_BOLD].end;
str += mTags[TAG_PARAGRAPH].start;
str += mTags[TAG_BOLD].end;
str += mTags[TAG_PARAGRAPH].start;
MCommentListT& lst = fromContext.GetCommentList();
MCommentListT& lst = fromContext.GetCommentList();
for( size_t i = 0; i != lst.size(); ++i )
{
if ( i != 0 )
if ( lst[i]->StartsParagraph() )
{
str += mTags[TAG_PARAGRAPH].start;
for( size_t i = 0; i != lst.size(); ++i )
{
}
str += lst[i]->mText;
}
if ( i != 0 )
// remove new lines, and insert paragraph breaks
if ( lst[i]->StartsParagraph() )
{
str += mTags[TAG_PARAGRAPH].start;
}
// if empty lines found
str += lst[i]->mText;
}
size_t len = str.length();
// remove new lines, and insert paragraph breaks
for( size_t n = start; n != len; ++n )
if ( str[n] == 10 ||
str[n] == 13 )
// if empty lines found
{
size_t len = str.length();
if ( n + 2 < len )
for( size_t n = start; n != len; ++n )
{
if ( ( str[n] == 13 && str[n+1] == 10 && // FIXME:: quick-hack
str[n+2] == 13 ) ||
( str[n] == 10 && str[n+1] == 10 )
)
{
str.insert( n + 1, "<p>" ); // FIXME:: quick-hack
len += 3;
}
}
str[n] = ' ';
}
str += mTags[TAG_PARAGRAPH].end;
if ( str[n] == 10 ||
str[n] == 13 )
{
if ( n + 2 < len )
{
if ( ( str[n] == 13 && str[n+1] == 10 && // FIXME:: quick-hack
str[n+2] == 13 ) ||
( str[n] == 10 && str[n+1] == 10 )
)
{
str.insert( n + 1, "<p>" ); // FIXME:: quick-hack
len += 3;
}
}
str[n] = ' ';
}
str += mTags[TAG_PARAGRAPH].end;
}
void RipperDocGen::AppendMulitilineStr( string& st, string& mlStr )
{
st = mTags[TAG_FIXED_FONT].start;
st += mlStr;
st += mTags[TAG_FIXED_FONT].end;
st = mTags[TAG_FIXED_FONT].start;
st += mlStr;
st += mTags[TAG_FIXED_FONT].end;
}
void RipperDocGen::AppendHighlightedSource( string& st, string source )
{
// FIXME:: below should not be fixed :)
char buf[1024*32];
// FIXME:: below should not be fixed :)
char buf[1024*32];
// DBG:::
// ASSERT( source.length() + 1 < sizeof(buf) );
// DBG:::
// ASSERT( source.length() + 1 < sizeof(buf) );
strcpy( buf, source.c_str() );
// highlight things
mSrcPainter.Init();
mSrcPainter.ProcessSource( buf, strlen(buf) );
mSrcPainter.GetResultString( st, mTags );
strcpy( buf, source.c_str() );
// highlight things
mSrcPainter.Init();
mSrcPainter.ProcessSource( buf, strlen(buf) );
mSrcPainter.GetResultString( st, mTags );
}
bool RipperDocGen::CheckIfUncommented( spContext& ctx, ScriptSection& toSect )
{
if ( ctx.HasComments() ) return 0;
if ( ctx.HasComments() ) return 0;
toSect.AddReference(
new ScriptSection( GetScopedName( ctx ), "", 0, &mDeadRefTempl )
);
toSect.AddReference(
new ScriptSection( GetScopedName( ctx ), "", 0, &mDeadRefTempl )
);
return 1;
return 1;
}
ScriptTemplate* RipperDocGen::GetRefTemplFor( spContext& ctx )
{
if ( ctx.HasComments() )
return &mRefTempl;
else
return &mDeadRefTempl;
if ( ctx.HasComments() )
return &mRefTempl;
else
return &mDeadRefTempl;
}
string RipperDocGen::GetScopedName( spContext& ofCtx )
{
if ( ofCtx.IsInFile() ) return ofCtx.GetName();
else
return ofCtx.GetOutterContext()->GetName() +
"::" + ofCtx.GetName();
if ( ofCtx.IsInFile() )
return ofCtx.GetName();
else
return ofCtx.GetOutterContext()->GetName() +
"::" + ofCtx.GetName();
}
void RipperDocGen::AddToCurrentClass( ScriptSection* pSection, spContext& ctx,
const char* subSectionName )
void RipperDocGen::AddToCurrentClass( ScriptSection* pSection, spContext& ctx,
const char* subSectionName )
{
string sName;
string sName;
if ( ctx.mVisibility == SP_VIS_PROTECTED )
if ( ctx.mVisibility == SP_VIS_PROTECTED )
sName = "Protected members/";
else
if ( ctx.mVisibility == SP_VIS_PRIVATE )
sName = "Private members/";
else
sName = "Public members/";
sName = "Protected members/";
else
if ( ctx.mVisibility == SP_VIS_PRIVATE )
sName += subSectionName;
sName = "Private members/";
else
sName = "Public members/";
ScriptSection* pSect = mpCurClassSect->GetSubsection( sName.c_str() );
sName += subSectionName;
if ( CheckIfUncommented( ctx, *pSect ) )
{
delete pSection;
return;
}
ScriptSection* pSect = mpCurClassSect->GetSubsection( sName.c_str() );
pSect->AddReference( pSection );
if ( CheckIfUncommented( ctx, *pSect ) )
{
delete pSection;
return;
}
pSect->AddReference( pSection );
mpCurClassSect->AddSection( pSection );
mpCurClassSect->AddSection( pSection );
}
void RipperDocGen::LinkSuperClassRefs()
{
MMemberListT clLst;
MMemberListT clLst;
// collect all classes in the context tree
mpFileBinderCtx->GetContextList( clLst, SP_CTX_CLASS );
// collect all classes in the context tree
mpFileBinderCtx->GetContextList( clLst, SP_CTX_CLASS );
for( size_t i = 0; i != clLst.size(); ++i )
{
spClass& cl = *((spClass*)clLst[i]);
for( size_t i = 0; i != clLst.size(); ++i )
{
spClass& cl = *((spClass*)clLst[i]);
// FIXME:: why sometimes GetUserData() returns NULL?
if ( !cl.GetUserData() )
continue;
// FIXME:: why sometimes GetUserData() returns NULL?
if ( !cl.GetUserData() )
continue;
ScriptSection* pClSect = (ScriptSection*)cl.GetUserData();
ScriptSection* pSuperSect = pClSect->GetSubsection("Derived from");
ScriptSection* pClSect = (ScriptSection*)cl.GetUserData();
ScriptSection* pSuperSect = pClSect->GetSubsection("Derived from");
for( size_t n = 0; n != cl.mSuperClassNames.size(); ++n )
{
string& superClName = cl.mSuperClassNames[n];
for( size_t n = 0; n != cl.mSuperClassNames.size(); ++n )
{
string& superClName = cl.mSuperClassNames[n];
spClass* pFound = NULL;
spClass* pFound = NULL;
string* name;
for( size_t k = 0; k != clLst.size(); ++k )
{
if ( clLst[k]->GetName() == superClName )
{
pFound = (spClass*)clLst[k];
break;
}
}
for( size_t k = 0; k != clLst.size(); ++k )
{
name = &clLst[k]->GetName();
if ( !pFound )
{
ScriptSection* pNotFound =
new ScriptSection( superClName, "", 0, &mDeadRefTempl );
if ( clLst[k]->GetName() == superClName )
{
pFound = (spClass*)clLst[k];
break;
}
}
pSuperSect->AddReference( pNotFound );
}
else
if ( pFound->GetUserData() )
if ( !pFound )
{
ScriptSection* pNotFound =
new ScriptSection( superClName, "", 0, &mDeadRefTempl );
pSuperSect->AddReference( pNotFound );
}
else
if ( pFound->GetUserData() )
pSuperSect->AddReference(
(ScriptSection*)pFound->GetUserData() );
}
}
pSuperSect->AddReference(
(ScriptSection*)pFound->GetUserData() );
}
}
}
void RipperDocGen::ProcessFile( const char* sourceFile )
{
wxSTD cout << "Processing file " << sourceFile << "..." << wxSTD endl;
wxSTD cout << "Processing file " << sourceFile << "..." << wxSTD endl;
spFile* pCtx = mpParser->ParseFile( sourceFile );
spFile* pCtx = mpParser->ParseFile( sourceFile );
if ( pCtx == NULL )
{
wxSTD cout << "Cannot open file " << sourceFile << ", skipped..." << wxSTD endl;
if ( pCtx == NULL )
{
wxSTD cout << "Cannot open file " << sourceFile << ", skipped..." << wxSTD endl;
return;
}
return;
}
VisitAll( *pCtx, TRUE );
VisitAll( *pCtx, true );
mpFileBinderCtx->AddMember( pCtx );
mpFileBinderCtx->AddMember( pCtx );
}
// implementations of "visiting procedures"
void RipperDocGen::VisitEnumeration( spEnumeration& en )
{
// FOR NOW:: do not reference "nameless" enums
if ( en.GetName() == "" ) return;
// FOR NOW:: do not reference "nameless" enums
if ( en.GetName() == "" ) return;
if ( CheckIfUncommented( en, *mpEnumIdx ) )
return;
if ( CheckIfUncommented( en, *mpEnumIdx ) )
return;
string body;
body += mTags[TAG_BOLD].start;
string body;
body += mTags[TAG_BOLD].start;
AppendMulitilineStr( body, en.mEnumContent );
AppendMulitilineStr( body, en.mEnumContent );
body += mTags[TAG_BOLD].end;
body += mTags[TAG_BOLD].end;
string line;
AppendHighlightedSource( line, body );
AppendComments( en, line );
string line;
AppendHighlightedSource( line, body );
AppendComments( en, line );
mpEnumIdx->AddSection(
new ScriptSection( en.GetName(), line,
&mSubContentTempl,
GetRefTemplFor( en ) ), 1
);
mpEnumIdx->AddSection(
new ScriptSection( en.GetName(), line,
&mSubContentTempl,
GetRefTemplFor( en ) ), 1
);
}
void RipperDocGen::VisitTypeDef( spTypeDef& td )
{
if ( CheckIfUncommented( td, *mpTypeDefIdx ) )
return;
if ( CheckIfUncommented( td, *mpTypeDefIdx ) )
return;
string body;
body += mTags[TAG_BOLD].start;
body += "typdef ";
body += mTags[TAG_BOLD].end;
string body;
body += mTags[TAG_BOLD].start;
body += "typdef ";
body += mTags[TAG_BOLD].end;
AppendMulitilineStr( body, td.mOriginalType );
body += td.mOriginalType;
body += ' ';
AppendMulitilineStr( body, td.mOriginalType );
body += td.mOriginalType;
body += ' ';
body += mTags[TAG_BOLD].start;
body += td.GetName();
body += mTags[TAG_BOLD].end;
body += mTags[TAG_BOLD].start;
body += td.GetName();
body += mTags[TAG_BOLD].end;
string line;
AppendHighlightedSource( line, body );
AppendComments( td, line );
string line;
AppendHighlightedSource( line, body );
AppendComments( td, line );
mpTypeDefIdx->AddSection(
new ScriptSection( td.GetName(), line,
&mSubContentTempl,
GetRefTemplFor( td ) ), TRUE
);
mpTypeDefIdx->AddSection(
new ScriptSection( td.GetName(), line,
&mSubContentTempl,
GetRefTemplFor( td ) ), true
);
}
void RipperDocGen::VisitPreprocessorLine( spPreprocessorLine& pd )
{
if ( pd.mDefType != SP_PREP_DEF_REDEFINE_SYMBOL )
if ( pd.mDefType != SP_PREP_DEF_REDEFINE_SYMBOL )
return;
if ( CheckIfUncommented( pd, *mpMacroIdx ) )
return;
return;
string body;
body += mTags[TAG_FIXED_FONT].start;
string coloredLine = pd.mLine;
AppendHighlightedSource( coloredLine, pd.mLine );
if ( CheckIfUncommented( pd, *mpMacroIdx ) )
return;
AppendMulitilineStr( body, coloredLine );
string body;
body += mTags[TAG_FIXED_FONT].start;
body += mTags[TAG_FIXED_FONT].end;
string coloredLine = pd.mLine;
AppendHighlightedSource( coloredLine, pd.mLine );
AppendComments( pd, body );
AppendMulitilineStr( body, coloredLine );
body += mTags[TAG_FIXED_FONT].end;
AppendComments( pd, body );
mpMacroIdx->AddSection(
new ScriptSection( pd.GetName(), body,
&mSubContentTempl,
GetRefTemplFor( pd ) ), TRUE
);
mpMacroIdx->AddSection(
new ScriptSection( pd.GetName(), body,
&mSubContentTempl,
GetRefTemplFor( pd ) ), true
);
}
void RipperDocGen::VisitClass( spClass& cl )
{
// FOR NOW:: do not document nested classes -
// nicier visiting method yet needed
// FOR NOW:: do not document nested classes -
// nicier visiting method yet needed
if ( cl.IsInClass() )
{
SkipChildren(); // spVisitor's method
return;
}
if ( cl.IsInClass() )
{
SkipChildren(); // spVisitor's method
return;
}
string body;
AppendComments( cl, body );
string body;
AppendComments( cl, body );
mpCurClassSect =
new ScriptSection( cl.GetName(), body, &mSuperContentTempl, &mRefTempl );
mpCurClassSect =
new ScriptSection( cl.GetName(), body, &mSuperContentTempl, &mRefTempl );
// set up reference in the class context, pointing back
// to the section where this class is represented
cl.SetUserData( mpCurClassSect );
// set up reference in the class context, pointing back
// to the section where this class is represented
cl.SetUserData( mpCurClassSect );
ScriptSection* pSuper = new ScriptSection( "Derived from" ,"", &mOutLine1Templ,0, 1 );
ScriptSection* pSuper = new ScriptSection( "Derived from" ,"", &mOutLine1Templ,0, 1 );
ScriptSection* pPublic = new ScriptSection( "Public members" ,"", &mOutLineTempl,0, 1 );
ScriptSection* pProtected = new ScriptSection( "Protected members" ,"", &mOutLineTempl,0, 1 );
ScriptSection* pPrivate = new ScriptSection( "Private members" ,"", &mOutLineTempl,0, 1 );
ScriptSection* pPublic = new ScriptSection( "Public members" ,"", &mOutLineTempl,0, 1 );
ScriptSection* pProtected = new ScriptSection( "Protected members" ,"", &mOutLineTempl,0, 1 );
ScriptSection* pPrivate = new ScriptSection( "Private members" ,"", &mOutLineTempl,0, 1 );
pPublic->AddSection( new ScriptSection( "Operations", "", &mOutLine1Templ, 0, 1 ) );
pPublic->AddSection( new ScriptSection( "Attributes", "", &mOutLine1Templ, 0, 1 ) );
pPublic->AddSection( new ScriptSection( "Operations", "", &mOutLine1Templ, 0, 1 ) );
pPublic->AddSection( new ScriptSection( "Attributes", "", &mOutLine1Templ, 0, 1 ) );
pProtected->AddSection( new ScriptSection( "Operations", "", &mOutLine1Templ, 0, 1 ) );
pProtected->AddSection( new ScriptSection( "Attributes", "", &mOutLine1Templ, 0, 1 ) );
pProtected->AddSection( new ScriptSection( "Operations", "", &mOutLine1Templ, 0, 1 ) );
pProtected->AddSection( new ScriptSection( "Attributes", "", &mOutLine1Templ, 0, 1 ) );
pPrivate->AddSection( new ScriptSection( "Operations", "", &mOutLine1Templ, 0, 1 ) );
pPrivate->AddSection( new ScriptSection( "Attributes", "", &mOutLine1Templ, 0, 1 ) );
mpCurClassSect->AddSection( pSuper );
mpCurClassSect->AddSection( pPublic );
mpCurClassSect->AddSection( pProtected );
mpCurClassSect->AddSection( pPrivate );
pPrivate->AddSection( new ScriptSection( "Operations", "", &mOutLine1Templ, 0, 1 ) );
pPrivate->AddSection( new ScriptSection( "Attributes", "", &mOutLine1Templ, 0, 1 ) );
mpCurClassSect->AddSection( pSuper );
mpCurClassSect->AddSection( pPublic );
mpCurClassSect->AddSection( pProtected );
mpCurClassSect->AddSection( pPrivate );
mpClassIdx->AddSection( mpCurClassSect, TRUE );
mpClassIdx->AddSection( mpCurClassSect, true );
}
void RipperDocGen::VisitAttribute( spAttribute& attr )
{
string body;
body += mTags[TAG_BOLD].start;
body += attr.mType;
body += mTags[TAG_BOLD].end;
string body;
body += mTags[TAG_BOLD].start;
body += attr.mType;
body += mTags[TAG_BOLD].end;
body += mTags[TAG_ITALIC].start;
body += ' ';
body += attr.GetName();
body += mTags[TAG_ITALIC].end;
body += mTags[TAG_ITALIC].start;
body += ' ';
body += attr.GetName();
body += mTags[TAG_ITALIC].end;
string line;
AppendHighlightedSource( line, body );
AppendComments( attr, line );
string line;
AppendHighlightedSource( line, body );
AppendComments( attr, line );
ScriptSection* pSection =
new ScriptSection( GetScopedName( attr ), line,
&mSubContentTempl,
GetRefTemplFor( attr ) );
ScriptSection* pSection =
new ScriptSection( GetScopedName( attr ), line,
&mSubContentTempl,
GetRefTemplFor( attr ) );
if ( attr.mIsConstant )
mpConstIdx->AddSection( pSection, TRUE );
else
if ( !attr.IsInClass() )
{
if ( CheckIfUncommented( attr, *mpGlobalVarsIdx ) )
return;
mpGlobalVarsIdx->AddSection( pSection, TRUE );
}
else
AddToCurrentClass( pSection, attr, "Attributes" );
if ( attr.mIsConstant )
mpConstIdx->AddSection( pSection, true );
else
if ( !attr.IsInClass() )
{
if ( CheckIfUncommented( attr, *mpGlobalVarsIdx ) )
return;
mpGlobalVarsIdx->AddSection( pSection, true );
}
else
AddToCurrentClass( pSection, attr, "Attributes" );
}
void RipperDocGen::VisitOperation( spOperation& op )
{
string body;
string body;
AppendHighlightedSource( body, op.GetFullName(mTags) );
AppendHighlightedSource( body, op.GetFullName(mTags) );
AppendComments( op, body );
AppendComments( op, body );
ScriptSection* pSection =
new ScriptSection( GetScopedName( op ), body,
&mSubContentTempl,
GetRefTemplFor( op ) );
ScriptSection* pSection =
new ScriptSection( GetScopedName( op ), body,
&mSubContentTempl,
GetRefTemplFor( op ) );
if ( !op.IsInClass() )
{
if ( CheckIfUncommented( op, *mpGlobalFuncIdx ) )
return;
if ( !op.IsInClass() )
{
if ( CheckIfUncommented( op, *mpGlobalFuncIdx ) )
return;
mpGlobalFuncIdx->AddSection( pSection, 1 );
}
else
AddToCurrentClass( pSection, op, "Operations" );
mpGlobalFuncIdx->AddSection( pSection, 1 );
}
else
AddToCurrentClass( pSection, op, "Operations" );
}
bool RipperDocGen::OnSaveDocument( ScriptStream& stm )
bool RipperDocGen::OnSaveDocument( ScriptStream& WXUNUSED(stm) )
{
LinkSuperClassRefs();
LinkSuperClassRefs();
// FOR NOW:: doesn't work yet
//mpTopIdx->RemoveEmptySections();
// FOR NOW:: doesn't work yet
//mpTopIdx->RemoveEmptySections();
return 1; // saving can proceed now
return 1; // saving can proceed now
}

View File

@@ -6,7 +6,7 @@
// Created: 22/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx/wx.h".
@@ -35,284 +35,284 @@
static size_t log2(size_t nr)
{
size_t tmp = 0;
while (nr >= 2 )
{
nr /= 2;
++tmp;
}
size_t tmp = 0;
while (nr >= 2 )
{
nr /= 2;
++tmp;
}
return tmp;
return tmp;
}
/***** Implementation for class ScriptStream *****/
ScriptStream::ScriptStream()
: mpBuf(0),
mSize(0),
mCapacity(0)
: mpBuf(0),
mSize(0),
mCapacity(0)
{}
ScriptStream::~ScriptStream()
{
if ( mpBuf ) delete mpBuf;
if ( mpBuf ) delete mpBuf;
}
void ScriptStream::WriteBytes( const void* srcBuf, size_t count )
{
if ( !count ) return;
if ( !count ) return;
// increase the capacity if necessary
if ( mSize + count > mCapacity )
{
mCapacity =
( 0x2 << (log2( mSize + count ) + 1 ) );
// increase the capacity if necessary
if ( mSize + count > mCapacity )
{
mCapacity =
( 0x2 << (log2( mSize + count ) + 1 ) );
if ( mCapacity < 128 ) mCapacity = 128;
if ( mCapacity < 128 ) mCapacity = 128;
char* oldBuf = mpBuf;
char* oldBuf = mpBuf;
mpBuf = new char[mCapacity];
mpBuf = new char[mCapacity];
if ( oldBuf )
{
memcpy( mpBuf, oldBuf, mSize );
delete oldBuf;
}
}
if ( oldBuf )
{
memcpy( mpBuf, oldBuf, mSize );
delete oldBuf;
}
}
// append new data
memcpy( &mpBuf[mSize], srcBuf, count );
// append new data
memcpy( &mpBuf[mSize], srcBuf, count );
mSize += count;
mSize += count;
}
ScriptStream& ScriptStream::operator<<( const char* str )
{
WriteBytes( str, strlen( str ) );
WriteBytes( str, strlen( str ) );
return *this;
return *this;
}
ScriptStream& ScriptStream::operator<<( const string& str )
{
if ( str.length() < 512 )
{
char buf[512];
size_t len = str.length();
if ( str.length() < 512 )
{
char buf[512];
size_t len = str.length();
for( size_t i = 0; i != len; ++i )
buf[i] = str[i];
for( size_t i = 0; i != len; ++i )
buf[i] = str[i];
WriteBytes( buf, len );
}
else
WriteBytes( str.c_str(), str.length() );
WriteBytes( buf, len );
}
else
WriteBytes( str.c_str(), str.length() );
return *this;
return *this;
}
ScriptStream& ScriptStream::operator<<( char ch )
{
WriteBytes( &ch, 1 );
WriteBytes( &ch, 1 );
return *this;
return *this;
}
void ScriptStream::endl()
{
char ch = '\n';
WriteBytes( &ch, 1 );
char ch = '\n';
WriteBytes( &ch, 1 );
}
/***** Implementation for class ScriptTemplate *****/
ScriptTemplate::ScriptTemplate( const string& templateText )
{
string tmp = templateText;
string tmp = templateText;
mTText = (char*)malloc( tmp.length() + 1 );
mTText = (char*)malloc( tmp.length() + 1 );
strcpy( mTText, tmp.c_str() );
strcpy( mTText, tmp.c_str() );
}
ScriptTemplate::~ScriptTemplate()
{
for( size_t i = 0; i != mVars.size(); ++i )
for( size_t i = 0; i != mVars.size(); ++i )
delete mVars[i];
delete mVars[i];
free( mTText );
free( mTText );
}
bool ScriptTemplate::HasVar( const char* name )
{
for( size_t i = 0; i != mVars.size(); ++i )
for( size_t i = 0; i != mVars.size(); ++i )
if ( strcmp( mVars[i]->mName, name ) == 0 )
if ( strcmp( mVars[i]->mName, name ) == 0 )
return 1;
return 1;
return 0;
return 0;
}
void ScriptTemplate::AddStringVar ( const char* name, int ofs )
{
mVars.push_back( new TVarInfo( name, ofs, TVAR_STRING ) );
mVars.push_back( new TVarInfo( name, ofs, TVAR_STRING ) );
}
void ScriptTemplate::AddIntegerVar( const char* name, int ofs )
{
mVars.push_back( new TVarInfo( name, ofs, TVAR_INTEGER ) );
mVars.push_back( new TVarInfo( name, ofs, TVAR_INTEGER ) );
}
void ScriptTemplate::AddDoubleVar ( const char* name, int ofs )
{
mVars.push_back( new TVarInfo( name, ofs, TVAR_DOUBLE ) );
mVars.push_back( new TVarInfo( name, ofs, TVAR_DOUBLE ) );
}
void ScriptTemplate::AddObjectRefArray( const char* name,
int ofsRefToFirstObj,
int ofsObjSizeInt,
int ofsObjRefTempl
)
int ofsRefToFirstObj,
int ofsObjSizeInt,
int ofsObjRefTempl
)
{
TArrayInfo* pInfo = new TArrayInfo( name );
TArrayInfo* pInfo = new TArrayInfo( name );
mVars.push_back( pInfo );
mVars.push_back( pInfo );
pInfo->mRefOfs = ofsRefToFirstObj;
pInfo->mSizeIntOfs = ofsObjSizeInt;
pInfo->mObjRefTemplOfs = ofsObjRefTempl;
pInfo->mRefOfs = ofsRefToFirstObj;
pInfo->mSizeIntOfs = ofsObjSizeInt;
pInfo->mObjRefTemplOfs = ofsObjRefTempl;
}
inline void ScriptTemplate::PrintVar( TVarInfo* pInfo,
void* dataObj,
ScriptStream& stm )
inline void ScriptTemplate::PrintVar( TVarInfo* pInfo,
void* dataObj,
ScriptStream& stm )
{
char buf[128];
char buf[128];
switch ( pInfo->mType )
{
case TVAR_INTEGER :
{
sprintf(buf, "%d",*( (int*) ((char*)dataObj + pInfo->mOfs) ) );
stm.WriteBytes( buf, strlen(buf ) );
break;
}
switch ( pInfo->mType )
{
case TVAR_INTEGER :
{
sprintf(buf, "%d",*( (int*) ((char*)dataObj + pInfo->mOfs) ) );
stm.WriteBytes( buf, strlen(buf ) );
break;
}
case TVAR_STRING :
{
string& str = *( (string*) ((char*)dataObj+pInfo->mOfs) );
case TVAR_STRING :
{
string& str = *( (string*) ((char*)dataObj+pInfo->mOfs) );
const char* cs = str.c_str();
const char* cs = str.c_str();
#ifdef DEBUG_WEIRED_OFFSETS
cout << "DBG:: cs address is " << (int)cs << endl;
cout << "DBG:: str address is " << (int)(&str) << endl;
cout << "DBG:: dataObj points to " << (int)dataObj << endl;
cout << "DBG:: pInfo->mOfs value is " << (int)pInfo->mOfs << endl;
cout << "DBG:: d+pInfo->mOfs is " << (int)((char*)dataObj + pInfo->mOfs) << endl;
cout << "DBG:: pInfo->mName is " << pInfo->mName << endl;
cout << "DBG:: pInfo->mType is " << pInfo->mType << endl;
cout << "DBG:: end of dump. " << endl;
cout << "DBG:: cs address is " << (int)cs << endl;
cout << "DBG:: str address is " << (int)(&str) << endl;
cout << "DBG:: dataObj points to " << (int)dataObj << endl;
cout << "DBG:: pInfo->mOfs value is " << (int)pInfo->mOfs << endl;
cout << "DBG:: d+pInfo->mOfs is " << (int)((char*)dataObj + pInfo->mOfs) << endl;
cout << "DBG:: pInfo->mName is " << pInfo->mName << endl;
cout << "DBG:: pInfo->mType is " << pInfo->mType << endl;
cout << "DBG:: end of dump. " << endl;
cout << "DBG:: cs value is " << endl << cs << endl;
cout << "DBG:: cs value is " << endl << cs << endl;
#endif
stm.WriteBytes( cs, strlen(cs) );
break;
}
stm.WriteBytes( cs, strlen(cs) );
break;
}
case TVAR_DOUBLE :
{
sprintf( buf, "%f",
*( (double*)( (char*)dataObj+pInfo->mOfs) ) );
case TVAR_DOUBLE :
{
sprintf( buf, "%f",
*( (double*)( (char*)dataObj+pInfo->mOfs) ) );
stm.WriteBytes( buf, strlen(buf ) );
break;
}
stm.WriteBytes( buf, strlen(buf ) );
break;
}
case TVAR_REF_ARRAY :
{
TArrayInfo& info = *((TArrayInfo*)pInfo);
case TVAR_REF_ARRAY :
{
TArrayInfo& info = *((TArrayInfo*)pInfo);
int sz = *((int*) ( (char*)dataObj+info.mSizeIntOfs ));
if ( !sz )
{
// DBG::
int u = 0;
++u;
break;
}
int sz = *((int*) ( (char*)dataObj+info.mSizeIntOfs ));
if ( !sz )
{
// DBG::
int u = 0;
++u;
break;
}
int* array = *((int**)( (char*)dataObj+info.mRefOfs ));
ScriptTemplate* pRefTempl;
int* array = *((int**)( (char*)dataObj+info.mRefOfs ));
ScriptTemplate* pRefTempl;
for( int i = 0; i != sz; ++i )
{
pRefTempl =
*((ScriptTemplate**)((char*)(array[i])+info.mObjRefTemplOfs));
for( int i = 0; i != sz; ++i )
{
pRefTempl =
*((ScriptTemplate**)((char*)(array[i])+info.mObjRefTemplOfs));
pRefTempl->PrintScript( (void*)array[i], stm );
}
pRefTempl->PrintScript( (void*)array[i], stm );
}
break;
}
break;
}
default : break;
}
default : break;
}
}
void ScriptTemplate::PrintScript( void* dataObj, ScriptStream& stm )
{
char* cur = mTText;
char* cur = mTText;
// template parsing loop
do
{
char* start = cur;
// template parsing loop
do
{
char* start = cur;
while( *cur != '\0' && *cur != '$' ) ++cur;
while( *cur != '\0' && *cur != '$' ) ++cur;
// flush text collected between variables
stm.WriteBytes( start, cur - start );
// flush text collected between variables
stm.WriteBytes( start, cur - start );
if ( *cur == '\0' ) break;
if ( *cur == '\0' ) break;
cur += 2; // skip to the name of the var
cur += 2; // skip to the name of the var
start = cur;
start = cur;
while( *cur != ')' ) ++cur;
while( *cur != ')' ) ++cur;
// put terminating zero temorarely
// put terminating zero temorarely
*cur = '\0';
*cur = '\0';
// look up variable
// look up variable
size_t sz = mVars.size();
bool found = 0;
size_t sz = mVars.size();
// bool found = false;
for( size_t i = 0; i != sz; ++i )
{
if ( strcmp( mVars[i]->mName, start ) == 0 )
{
PrintVar( mVars[i], dataObj, stm );
for( size_t i = 0; i != sz; ++i )
{
if ( strcmp( mVars[i]->mName, start ) == 0 )
{
PrintVar( mVars[i], dataObj, stm );
*cur = ')'; // remove terminating zero
++cur;
found = 1;
break;
}
}
*cur = ')'; // remove terminating zero
++cur;
// found = 1;
break;
}
}
// variable referred by template script is not
// registered to this tempalte object
// ASSERT( found );
// variable referred by template script is not
// registered to this tempalte object
// ASSERT( found );
} while(1);
} while(1);
}
/***** implementation for class ScriptSection *****/
@@ -320,301 +320,301 @@ void ScriptTemplate::PrintScript( void* dataObj, ScriptStream& stm )
int ScriptSection::mIdCounter = 0;
ScriptSection::ScriptSection( const string& name,
const string& body,
ScriptTemplate* pSectionTemplate,
ScriptTemplate* pReferenceTemplate,
bool autoHide,
bool sorted
)
: mpParent ( NULL ),
const string& body,
ScriptTemplate* pSectionTemplate,
ScriptTemplate* pReferenceTemplate,
bool autoHide,
bool sorted
)
: mpParent ( NULL ),
mName ( name ),
mBody ( body ),
mName ( name ),
mBody ( body ),
mAutoHide( autoHide ),
mSortOn ( sorted ),
mAutoHide( autoHide ),
mSortOn ( sorted ),
mpSectTempl( pSectionTemplate ),
mpRefTempl ( pReferenceTemplate ),
mpSectTempl( pSectionTemplate ),
mpRefTempl ( pReferenceTemplate ),
mRefCount( 0 ),
mArrSize( 0 )
mRefCount( 0 ),
mArrSize( 0 )
{
// generate GUID
// generate GUID
char buf[32];
sprintf( buf, "%d", ++mIdCounter );
mId = buf;
char buf[32];
sprintf( buf, "%d", ++mIdCounter );
mId = buf;
}
ScriptSection::~ScriptSection()
{
SectListT lst = mSubsections;
SectListT lst = mSubsections;
while( mSubsections.size() )
while( mSubsections.size() )
mSubsections[0]->RemoveRef();
mSubsections[0]->RemoveRef();
for( size_t i = 0; i != mReferences.size(); ++i )
for( size_t i = 0; i != mReferences.size(); ++i )
mReferences[i]->RemoveRef();
mReferences[i]->RemoveRef();
}
void ScriptSection::AddRef()
{
++mRefCount;
++mRefCount;
}
void ScriptSection::RemoveRef()
{
if ( !mRefCount || !(--mRefCount) )
{
if (mpParent)
{
// remove ourselves from parent's list
if ( !mRefCount || !(--mRefCount) )
{
if (mpParent)
{
// remove ourselves from parent's list
SectListT& lst = mpParent->mSubsections;
for( size_t i = 0; i != lst.size(); ++i )
SectListT& lst = mpParent->mSubsections;
for( size_t i = 0; i != lst.size(); ++i )
if ( lst[i] == this )
{
lst.erase( &lst[i] );
break;
}
}
if ( lst[i] == this )
{
lst.erase( &lst[i] );
break;
}
}
delete this;
}
delete this;
}
}
ScriptSection* ScriptSection::GetSubsection( const char* name )
{
// FOR NOW:: fixed section name length
char buf[128];
// FOR NOW:: fixed section name length
char buf[128];
size_t cur = 0;
size_t cur = 0;
while( name[cur] && name[cur] != '/' )
{
buf[cur] = name[cur];
++cur;
}
while( name[cur] && name[cur] != '/' )
{
buf[cur] = name[cur];
++cur;
}
// ASSERT( cur < sizeof(buf) );
// ASSERT( cur < sizeof(buf) );
buf[cur] = '\0';
buf[cur] = '\0';
size_t sz = mSubsections.size();
size_t sz = mSubsections.size();
for( size_t i = 0; i != sz; ++i )
{
// DBG::
//ScriptSection& sect = *mSubsections[i];
for( size_t i = 0; i != sz; ++i )
{
// DBG::
//ScriptSection& sect = *mSubsections[i];
if ( mSubsections[i]->mName == buf )
{
if ( name[cur] == '/' )
if ( mSubsections[i]->mName == buf )
{
if ( name[cur] == '/' )
// search recursivelly
return mSubsections[i]->GetSubsection( &name[cur+1] );
else
return mSubsections[i];
}
}
// search recursivelly
return mSubsections[i]->GetSubsection( &name[cur+1] );
else
return mSubsections[i];
}
}
return 0;
return 0;
}
void ScriptSection::AddSection( ScriptSection* pSection,
bool addToReferencesToo
)
bool addToReferencesToo
)
{
mSubsections.push_back( pSection );
mSubsections.push_back( pSection );
pSection->AddRef();
pSection->AddRef();
// can add section to multiple containers
// ASSERT( pSection->mpParent == 0 );
// can add section to multiple containers
// ASSERT( pSection->mpParent == 0 );
pSection->mpParent = this;
pSection->mpParent = this;
if ( addToReferencesToo )
if ( addToReferencesToo )
AddReference( pSection );
AddReference( pSection );
}
void ScriptSection::AddReference( ScriptSection* pReferredSection )
{
mReferences.push_back( pReferredSection );
mReferences.push_back( pReferredSection );
pReferredSection->AddRef();
pReferredSection->AddRef();
// set up mandatory fields used by ScriptTemplate
mArrSize = mReferences.size();
if ( mArrSize )
mRefFirst = (void*)&mReferences[0];
// set up mandatory fields used by ScriptTemplate
mArrSize = mReferences.size();
if ( mArrSize )
mRefFirst = (void*)&mReferences[0];
}
SectListT& ScriptSection::GetSubsections()
{
return mSubsections;
return mSubsections;
}
// static method:
void ScriptSection::RegisterTemplate( ScriptTemplate& sectionTempalte )
{
int nameOfs, bodyOfs, idOfs,
arrRefOfs, arrSizeOfs, refTemplOfs;
int nameOfs, bodyOfs, idOfs,
arrRefOfs, arrSizeOfs, refTemplOfs;
// obtaining offsets of member vars
GET_VAR_OFS( ScriptSection, mName, &nameOfs )
GET_VAR_OFS( ScriptSection, mBody, &bodyOfs )
GET_VAR_OFS( ScriptSection, mId, &idOfs )
GET_VAR_OFS( ScriptSection, mRefFirst, &arrRefOfs )
GET_VAR_OFS( ScriptSection, mArrSize, &arrSizeOfs )
// obtaining offsets of member vars
GET_VAR_OFS( ScriptSection, mName, &nameOfs )
GET_VAR_OFS( ScriptSection, mBody, &bodyOfs )
GET_VAR_OFS( ScriptSection, mId, &idOfs )
GET_VAR_OFS( ScriptSection, mRefFirst, &arrRefOfs )
GET_VAR_OFS( ScriptSection, mArrSize, &arrSizeOfs )
GET_VAR_OFS( ScriptSection, mpRefTempl, &refTemplOfs )
GET_VAR_OFS( ScriptSection, mpRefTempl, &refTemplOfs )
// registering member variables with given script template
// registering member variables with given script template
sectionTempalte.AddStringVar( "NAME", nameOfs );
sectionTempalte.AddStringVar( "BODY", bodyOfs );
sectionTempalte.AddStringVar( "ID", idOfs );
sectionTempalte.AddStringVar( "NAME", nameOfs );
sectionTempalte.AddStringVar( "BODY", bodyOfs );
sectionTempalte.AddStringVar( "ID", idOfs );
sectionTempalte.AddObjectRefArray( "REFLIST",
arrRefOfs, arrSizeOfs, refTemplOfs );
sectionTempalte.AddObjectRefArray( "REFLIST",
arrRefOfs, arrSizeOfs, refTemplOfs );
}
void ScriptSection::Print( ScriptStream& stm )
{
// TBD:: sorting
// TBD:: sorting
// print out this content first
if ( mpSectTempl )
// print out this content first
if ( mpSectTempl )
mpSectTempl->PrintScript( this, stm );
mpSectTempl->PrintScript( this, stm );
// attach contents subsections at the end of this content
// attach contents subsections at the end of this content
for( size_t i = 0; i != mSubsections.size(); ++i )
for( size_t i = 0; i != mSubsections.size(); ++i )
mSubsections[i]->Print( stm );
mSubsections[i]->Print( stm );
}
void ScriptSection::DoRemoveEmptySections(int& nRemoved, SectListT& removedLst)
{
for( size_t i = 0; i != mSubsections.size(); ++i )
{
ScriptSection& sect = *mSubsections[i];
for( size_t i = 0; i != mSubsections.size(); ++i )
{
ScriptSection& sect = *mSubsections[i];
sect.DoRemoveEmptySections( nRemoved, removedLst );
sect.DoRemoveEmptySections( nRemoved, removedLst );
if (sect.mAutoHide )
if ( sect.mReferences.size() == 0 )
{
bool found = 0;
for( size_t k = 0; k != removedLst.size(); ++k )
if (sect.mAutoHide )
if ( sect.mReferences.size() == 0 )
{
bool found = false;
for( size_t k = 0; k != removedLst.size(); ++k )
if ( removedLst[k] == &sect )
{
found = 1;
break;
}
if ( !found )
{
removedLst.push_back( &sect );
++nRemoved;
if ( removedLst[k] == &sect )
{
found = 1;
break;
}
if ( !found )
{
removedLst.push_back( &sect );
++nRemoved;
delete &sect;
--i;
}
}
}
delete &sect;
--i;
}
}
}
}
void ScriptSection::DoRemoveDeadLinks( SectListT& removedLst)
{
size_t dsz = removedLst.size();
size_t dsz = removedLst.size();
for( size_t i = 0; i != mSubsections.size(); ++i )
{
mSubsections[i]->DoRemoveDeadLinks( removedLst );
}
for( size_t i = 0; i != mSubsections.size(); ++i )
{
mSubsections[i]->DoRemoveDeadLinks( removedLst );
}
for( size_t n = 0; n != mReferences.size(); ++n )
{
for( size_t k = 0; k != dsz; ++k )
for( size_t n = 0; n != mReferences.size(); ++n )
{
for( size_t k = 0; k != dsz; ++k )
if ( removedLst[k] == mReferences[n] )
{
mReferences.erase( &mReferences[n] );
--n;
if ( removedLst[k] == mReferences[n] )
{
mReferences.erase( &mReferences[n] );
--n;
// set up mandatory fields used by ScriptTemplate
mArrSize = mReferences.size();
if ( mArrSize )
mRefFirst = (void*)&mReferences[0];
// set up mandatory fields used by ScriptTemplate
mArrSize = mReferences.size();
if ( mArrSize )
mRefFirst = (void*)&mReferences[0];
break;
}
}
break;
}
}
}
void ScriptSection::RemoveEmptySections()
{
// FIXME:: this is very_very_very slow alg.! +"doesn't work"
// FIXME:: this is very_very_very slow alg.! +"doesn't work"
int nRemoved = 0;
int nRemoved = 0;
do
{
SectListT removedLst;
nRemoved = 0;
do
{
SectListT removedLst;
nRemoved = 0;
DoRemoveEmptySections( nRemoved, removedLst );
DoRemoveEmptySections( nRemoved, removedLst );
DoRemoveDeadLinks( removedLst );
}
while( nRemoved );
DoRemoveDeadLinks( removedLst );
}
while( nRemoved );
}
/***** Iimplementation for class DocGeneratorBase *****/
bool DocGeneratorBase::SaveDocument( const char* fname,
const char* fopenOptions,
ScriptSection* pFromSection
)
bool DocGeneratorBase::SaveDocument( const char* fname,
const char* fopenOptions,
ScriptSection* pFromSection
)
{
FILE* fp = fopen( fname, fopenOptions );
FILE* fp = fopen( fname, fopenOptions );
if ( (int)fp == -1 ) return 0;
if ( (int)fp == -1 ) return 0;
ScriptStream stm;
ScriptStream stm;
// check if derived class agrees about saving it
if ( !OnSaveDocument( stm ) ) return 0;
// check if derived class agrees about saving it
if ( !OnSaveDocument( stm ) ) return 0;
if ( pFromSection )
if ( pFromSection )
pFromSection->Print( stm );
else
{
ScriptSection* pTopSect = GetTopSection();
// ASSERT( pTopSect );
pTopSect->Print( stm );
}
pFromSection->Print( stm );
else
{
ScriptSection* pTopSect = GetTopSection();
// ASSERT( pTopSect );
pTopSect->Print( stm );
}
size_t nWrite = fwrite( stm.GetBuf(), 1, stm.GetBufSize(), fp );
size_t nWrite = fwrite( stm.GetBuf(), 1, stm.GetBufSize(), fp );
if ( nWrite != stm.GetBufSize() ) return 0;
if ( nWrite != stm.GetBufSize() ) return 0;
fclose( fp );
fclose( fp );
return 1;
return 1;
// that^s it
// that^s it
}

File diff suppressed because it is too large Load Diff