Commit f38608d4 authored by dimitri's avatar dimitri

Release-1.1.3-20000522

parent 8013b5fe
DOXYGEN Version 1.1.3-20000514
DOXYGEN Version 1.1.3-20000522
CONTENTS
--------
......@@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
1. Unpack the archive, unless you already have:
gunzip doxygen-1.1.3-20000514.src.tar.gz # uncompress the archive
tar xf doxygen-1.1.3-20000514.src.tar # unpack it
gunzip doxygen-1.1.3-20000522.src.tar.gz # uncompress the archive
tar xf doxygen-1.1.3-20000522.src.tar # unpack it
2. Run the configure script:
......@@ -252,4 +252,4 @@ The latest version of doxygen can be obtained at
Enjoy,
Dimitri van Heesch (14 May 2000)
Dimitri van Heesch (22 May 2000)
DOXYGEN Version 1.1.3-20000514
DOXYGEN Version 1.1.3-20000522
Please read INSTALL for compilation instructions.
......@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
Enjoy,
Dimitri van Heesch (14 May 2000)
Dimitri van Heesch (22 May 2000)
1.1.3-20000514
1.1.3-20000522
......@@ -40,13 +40,16 @@ void err(const char *fmt, ...)
vfprintf(stderr, fmt, args);
va_end(args);
}
void warn(const char *fmt, ...)
void warn_cont(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(stderr, fmt, args);
va_end(args);
}
void initWarningFormat()
{
}
#else
#include "doxygen.h"
#include "message.h"
......@@ -183,7 +186,7 @@ static int yyread(char *buf,int max_size)
else
{
*b=FALSE;
warn("Warning: Invalid value `%s' for "
warn_cont("Warning: Invalid value `%s' for "
"boolean tag in line %d; use YES or NO\n",
bs.data(),yyLineNr);
}
......@@ -248,7 +251,7 @@ static void writeStringList(QTextStream &t,QStrList &l)
const char *s=p;
bool hasBlanks=FALSE;
while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t');
if (!first) t << " ";
if (!first) t << " ";
first=FALSE;
if (hasBlanks) t << "\"" << s << "\""; else t << s;
p = l.next();
......@@ -288,7 +291,7 @@ void configStrToVal()
int ts = tabSizeString.toInt(&ok);
if (!ok || ts<1 || ts>16)
{
warn("Warning: argument of TAB_SIZE is not a valid number, using tab size of 8 spaces!\n");
warn_cont("Warning: argument of TAB_SIZE is not a valid number, using tab size of 8 spaces!\n");
ts=8;
}
Config::tabSize = ts;
......@@ -304,7 +307,7 @@ void configStrToVal()
int cols = colsInAlphaIndexString.toInt(&ok);
if (!ok || cols<1 || cols>20)
{
warn("Warning: argument of COLS_IN_ALPHA_INDEX is not a valid number in the range [1..20]!\n"
warn_cont("Warning: argument of COLS_IN_ALPHA_INDEX is not a valid number in the range [1..20]!\n"
"Using the default of 5 columns!\n");
cols = 5;
}
......@@ -341,7 +344,8 @@ static void substEnvVarsInStrList(QStrList &sl)
if (!wasQuoted) /* as a result of the expansion, a single string
may have expanded into a list, which we'll
add to sl. If the orginal string already
contained multiple elements no splitting is done! */
contained multiple elements no further
splitting is done to allow quoted items with spaces! */
{
......@@ -354,10 +358,10 @@ static void substEnvVarsInStrList(QStrList &sl)
{
char c;
// skip until start of new word
for (;i<l && ((c=result.at(i))==' ' || c=='\t');i++)
p=i; // p marks the start index of the word
while (i<l && ((c=result.at(i))==' ' || c=='\t')) i++;
p=i; // p marks the start index of the word
// skip until end of a word
for (;i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"');i++);
while (i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"')) i++;
if (i<l) // not at the end of the string
{
if (c=='"') // word within quotes
......@@ -424,6 +428,29 @@ void checkConfig()
// projectName[0]=toupper(projectName[0]);
//}
if (Config::warnFormat.isEmpty())
{
Config::warnFormat="$file:$line $text";
}
else
{
if (Config::warnFormat.find("$file")==-1)
{
err("Error: warning format does not contain a $file tag!\n");
exit(1);
}
if (Config::warnFormat.find("$line")==-1)
{
err("Error: warning format does not contain a $line tag!\n");
exit(1);
}
if (Config::warnFormat.find("$text")==-1)
{
err("Error: wanring format foes not contain a $text tag!\n");
exit(1);
}
}
initWarningFormat();
// set default man page extension if non is given by the user
if (Config::manExtension.isEmpty())
......@@ -715,7 +742,7 @@ void checkConfig()
QFileInfo fi(Config::perlPath);
if (!fi.exists())
{
warn("Warning: tag PERL_PATH: perl interpreter not found at default or"
warn_cont("Warning: tag PERL_PATH: perl interpreter not found at default or"
"user specified (%s) location\n",
Config::perlPath.data());
}
......
......@@ -775,21 +775,7 @@ void init()
ConfigString::addFixedValue("outputLanguage","Japanese");
ConfigString::addFixedValue("outputLanguage","Finnish");
ConfigString::addFixedValue("outputLanguage","Spanish");
ConfigBool::add( "quietFlag",
"QUIET",
"FALSE",
"generate progress messages flag",
"The QUIET tag can be used to turn on/off the messages that are generated \n"
"by doxygen. Possible values are YES and NO. If left blank NO is used. \n"
);
ConfigBool::add( "warningFlag",
"WARNINGS",
"TRUE",
"generate warnings flag",
"The WARNINGS tag can be used to turn on/off the warning messages that are \n"
"generated by doxygen. Possible values are YES and NO. If left blank \n"
"NO is used. \n"
);
ConfigString::addFixedValue("outputLanguage","Croatian");
ConfigBool::add( "noIndexFlag",
"DISABLE_INDEX",
"FALSE",
......@@ -984,6 +970,41 @@ void init()
"documentation sections, marked by \\if sectionname ... \\endif. \n"
);
//-----------------------------------------------------------------------------------------------
ConfigInfo::add( "Messages","configuration options related to warning and progress messages");
//-----------------------------------------------------------------------------------------------
ConfigBool::add( "quietFlag",
"QUIET",
"FALSE",
"generate progress messages flag",
"The QUIET tag can be used to turn on/off the messages that are generated \n"
"by doxygen. Possible values are YES and NO. If left blank NO is used. \n"
);
ConfigBool::add( "warningFlag",
"WARNINGS",
"TRUE",
"generate warnings flag",
"The WARNINGS tag can be used to turn on/off the warning messages that are \n"
"generated by doxygen. Possible values are YES and NO. If left blank \n"
"NO is used. \n"
);
ConfigBool::add( "warningUndocFlag",
"WARN_IF_UNDOCUMENTED",
"TRUE",
"generate undocumented warnings",
"If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings \n"
"for undocumented members. If EXTRACT_ALL is set to YES then this flag will \n"
"automatically be disabled. \n"
);
ConfigString::add("warnFormat",
"WARN_FORMAT",
"$file:$line: $text",
"format of the warning messages",
"The WARN_FORMAT tag determines the format of the warning messages that \n"
"doxygen can produce. The string should contain the $file, $line, and $text \n"
"tags, which will be replaced by the file and line number from which the \n"
"warning originated and the warning text. \n"
);
//-----------------------------------------------------------------------------------------------
ConfigInfo::add( "Input","configuration options related to the input files");
//-----------------------------------------------------------------------------------------------
ConfigList::add( "inputSources",
......
......@@ -13,6 +13,7 @@
*/
#include <stdio.h>
#include <stdlib.h>
#include <qmainwindow.h>
#include <qpopupmenu.h>
#include <qfileinfo.h>
......
......@@ -87,6 +87,7 @@ documentation:
<li> \refitem cmdmainpage \mainpage
<li> \refitem cmdname \name
<li> \refitem cmdnamespace \namespace
<li> \refitem cmdnosubgrouping \nosubgrouping
<li> \refitem cmdoverload \overload
<li> \refitem cmdpage \page
<li> \refitem cmdpar \par
......@@ -366,6 +367,14 @@ See section \ref memgroup for an example.
Indicates that a comment block contains documentation for a
namespace with name \<name\>.
<hr>
\subsection cmdnosubgrouping \nosubgrouping
This command can be put in the documentation
of a class. It can be used in combination with member grouping
to avoid that doxygen puts a member group as a subgroup of a
Public/Protected/Private/... section.
<hr>
\subsection cmdoverload \overload [(function declaration)]
......
......@@ -147,11 +147,21 @@ QTime and QIODevice classes.
Another reason is for the nice and bug free utility classes, like QList,
QDict, QString, QArray, QTextStream, QRegExp etc.
The GUI front-end doxywizard uses Qt for... well... the GUI!
<li><b>Can use doxygen on my Java code?</b>
No, at the moment there is no support for Java. I suggest to
use Sun's JavaDoc instead.
<li><b>How can I exclude all test directories from my directory tree?</b>
Simply put an exclude pattern like this in the configuration file:
\verbatim
EXCLUDE_PATTERNS = */test/*
\endverbatim
</ol>
\htmlonly
......
......@@ -493,13 +493,16 @@ detailed information about the group.
Nesting of member groups is not allowed.
If all members of a member group have the same type and protection level
(for instance all are static public members), then the whole member
group is displayed as a subgroup of the type/protection level group
(the group is displayed as a subsection of the "Static Public Members"
section for instance). If two or more members have different types,
then the group is put at the same level as the automatically
generated groups.
If all members of a member group inside a class have the same type
and protection level (for instance all are static public members),
then the whole member group is displayed as a subgroup of
the type/protection level group (the group is displayed as a
subsection of the "Static Public Members" section for instance).
If two or more members have different types, then the group is put
at the same level as the automatically generated groups.
If you want to force all member-groups of a class to be at the top level,
you should put a \ref cmdnosubgrouping "\\nosubgrouping" command inside the
documentation of the class.
\par Example:
\verbinclude memgrp.cpp
......
Name: doxygen
Version: 1.1.3-20000514
Version: 1.1.3-20000522
Summary: documentation system for C, C++ and IDL
Release: 1
Source0: doxygen-%{version}.src.tar.gz
......
......@@ -42,8 +42,11 @@ static QCString stripExtension(const char *fName)
}
// constructs a new class definition
ClassDef::ClassDef(const char *nm,CompoundType ct,const char *ref,const char *fName)
: Definition(removeRedundantWhiteSpace(nm))
ClassDef::ClassDef(
const char *defFileName,int defLine,
const char *nm,CompoundType ct,
const char *ref,const char *fName)
: Definition(defFileName,defLine,removeRedundantWhiteSpace(nm))
{
//name=n;
if (fName)
......@@ -83,6 +86,16 @@ ClassDef::ClassDef(const char *nm,CompoundType ct,const char *ref,const char *fN
memberGroupList = new MemberGroupList;
memberGroupList->setAutoDelete(TRUE);
memberGroupDict = new MemberGroupDict(257);
int i=name().findRev("::");
if (i==-1)
{
scopelessName=name();
}
else
{
scopelessName=name().right(name().length()-i-2);
}
subGrouping=TRUE;
}
// destroy the class definition
......@@ -354,12 +367,14 @@ void ClassDef::insertMember(MemberDef *md,int groupId)
enumValMembers.append(md);
break;
case MemberDef::Function:
if (md->name()==name() || // constructor
if (md->name()==scopelessName || // constructor
(md->name().find('~')!=-1 && // hack to detect destructor
md->name().find("operator")==-1
)
)
{
constructors.append(md);
}
else
{
if (Config::sortMembersFlag)
......@@ -454,6 +469,17 @@ void ClassDef::computeAnchors()
setAnchors('u',&priTypes);
}
void ClassDef::distributeMemberGroupDocumentation()
{
MemberGroupListIterator mgli(*memberGroupList);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
mg->distributeMemberGroupDocumentation();
}
}
// add a file name to the used files set
void ClassDef::insertUsedFile(const char *f)
{
......@@ -524,7 +550,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
OutputList briefOutput(&ol);
if (!briefDescription().isEmpty())
{
parseDoc(briefOutput,name(),0,briefDescription());
parseDoc(briefOutput,defFileName,defLine,name(),0,briefDescription());
ol+=briefOutput;
ol.writeString(" \n");
ol.pushGeneratorState();
......@@ -738,7 +764,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
if (!mg->allMembersInSameSection()) // group is in its own section
if (!mg->allMembersInSameSection() || !subGrouping) // group is in its own section
{
mg->writeDeclarations(ol,this,0,0,0);
}
......@@ -856,7 +882,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
ol.disableAllBut(OutputGenerator::RTF);
ol.newParagraph();
ol.popGeneratorState();
parseDoc(ol,name(),0,documentation()+"\n");
parseDoc(ol,defFileName,defLine,name(),0,documentation()+"\n");
}
// write examples
if (exampleFlag)
......@@ -1149,33 +1175,6 @@ void ClassDef::writeMemberList(OutputList &ol)
ol.popGeneratorState();
}
//void ClassDef::writeIncludeFile(OutputList &ol)
//{
// initParseCodeContext();
// if (!incFile) return;
// //printf("incFile=%s\n",incFile->absFilePath().data());
// ol.disableAllBut(OutputGenerator::Html);
// startFile(ol,fileName+"-include",name()+" Include File");
// startTitle(ol,0);
// QCString n=incName.copy();
// if (incName.isEmpty())
// {
// n=incFile->name();
// if (Config::fullPathNameFlag)
// {
// n.prepend(stripFromPath(incFile->getPath().copy()));
// }
// }
// parseText(ol,n);
// endTitle(ol,0,0);
// parseText(ol,theTranslator->trVerbatimText(incFile->name()));
// //ol.writeRuler();
// ol.startCodeFragment();
// parseCode(ol,n,fileToString(incFile->absFilePath()),FALSE,0);
// ol.endCodeFragment();
// endFile(ol);
// ol.enableAll();
//}
// add a reference to an example
bool ClassDef::addExample(const char *anchor,const char *nameStr,
......@@ -1203,48 +1202,6 @@ bool ClassDef::hasExamples()
return exampleList->count()>0;
}
#if 0
// write the list of all examples that are used in this class.
void ClassDef::writeExample(OutputList &ol)
{
QCString exampleLine=theTranslator->trWriteList(exampleList->count());
QRegExp marker("@[0-9]+");
int index=0,newIndex,matchLen;
// now replace all markers in inheritLine with links to the classes
while ((newIndex=marker.match(exampleLine,index,&matchLen))!=-1)
{
bool ok;
parseText(ol,exampleLine.mid(index,newIndex-index));
uint entryIndex = exampleLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
Example *e=exampleList->at(entryIndex);
if (ok && e)
{
ol.writeObjectLink(0,e->file,e->anchor,e->name);
}
index=newIndex+matchLen;
}
parseText(ol,exampleLine.right(exampleLine.length()-index));
ol.writeString(".");
#if 0
Example *e=exampleList->first();
while (e)
{
ol.writeObjectLink(0,e->file,e->anchor,e->name);
e=exampleList->next();
if (e)
{
if (exampleList->at()==(int)exampleList->count()-1)
parseText(ol," "+theTranslator->trAnd()+" ");
else
ol.writeString(", ");
}
}
ol.writeString(".");
#endif
}
#endif
void ClassDef::setTemplateArguments(ArgumentList *al)
{
......@@ -1260,33 +1217,6 @@ void ClassDef::setTemplateArguments(ArgumentList *al)
}
}
//QCString ClassDef::getTemplateNameString()
//{
// QCString result;
// if (!tempArgs || tempArgs->count()==0) return result;
// result="<";
// Argument *a=tempArgs->first();
// while (a)
// {
// if (!a->name.isEmpty()) // add template argument name
// {
// result+=a->name;
// }
// else // extract name from type
// {
// int i=a->type.length()-1;
// while (i>=0 && isId(a->type.at(i))) i--;
// if (i>0)
// {
// result+=a->type.right(a->type.length()-i-1);
// }
// }
// a=tempArgs->next();
// if (a) result+=", ";
// }
// result+=">";
// return result;
//}
bool ClassDef::hasNonReferenceSuperClass()
{
......@@ -1297,33 +1227,6 @@ bool ClassDef::hasNonReferenceSuperClass()
return found;
}
//void ClassDef::writeMembersToContents()
//{
// HtmlHelp *htmlHelp = HtmlHelp::getInstance();
//
// htmlHelp->incContentsDepth();
//
// MemberNameInfoListIterator mnili(*allMemberNameInfoList);
// MemberNameInfo *mni;
// for (;(mni=mnili.current());++mnili)
// {
// MemberNameInfoIterator mnii(*mni);
// MemberInfo *mi;
// for (mnii.toLast();(mi=mnii.current());--mnii)
// {
// MemberDef *md=mi->memberDef;
// ClassDef *cd=md->memberClass();
// if (md->isLinkable() && cd==this) // member is not inherited
// {
// htmlHelp->addContentsItem(md->name()+md->argsString(),
// cd->getOutputFileBase(),
// md->anchor());
// }
// }
// }
// htmlHelp->decContentsDepth();
//}
void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup)
{
//ol.insertMemberAlign();
......
......@@ -53,7 +53,9 @@ class ClassDef : public Definition
Interface=Entry::INTERFACE_SEC,
Exception=Entry::EXCEPTION_SEC
};
ClassDef(const char *name,CompoundType ct,const char *ref=0,const char *fName=0);
ClassDef(const char *fileName,int startLine,
const char *name,CompoundType ct,
const char *ref=0,const char *fName=0);
~ClassDef();
QCString getOutputFileBase() const { return fileName; }
CompoundType compoundType() const { return compType; }
......@@ -115,8 +117,11 @@ class ClassDef : public Definition
{
return usesIntfClassDict;
}
void setSubGrouping(bool enabled) { subGrouping = enabled; }
bool visited;
void distributeMemberGroupDocumentation();
protected:
void addUsedInterfaceClasses(MemberDef *md,const char *typeStr);
......@@ -126,6 +131,7 @@ class ClassDef : public Definition
IncludeInfo *incInfo; // header file to refer to
QCString incName; // alternative include file name
QCString memListFileName;
QCString scopelessName; // name without any scopes
BaseClassList *inherits;
BaseClassList *inheritedBy;
NamespaceDef *nspace; // the namespace this class is in
......@@ -177,6 +183,10 @@ class ClassDef : public Definition
FileDef *fileDef;
UsesClassDict *usesImplClassDict;
UsesClassDict *usesIntfClassDict;
bool subGrouping; // does this class group its user-grouped members
// as a sub-section of the normal (public/protected/..)
// groups?
};
struct UsesClassDef
......
......@@ -1002,10 +1002,10 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
<SkipCxxComment>. {
g_code->codify(yytext);
}
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*{B}*"/*"[*!]/[^/*] {
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*"//@"[{}]{B}*\n)?{B}*"/*"[*!]/[^/*] {
g_yyLineNr+=QCString(yytext).contains('\n');
}
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)* {
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*"//@"[{}]{B}*\n)? {
g_yyLineNr+=QCString(yytext).contains('\n');
g_code->endCodeLine();
if (g_yyLineNr<g_inputLines)
......@@ -1046,6 +1046,40 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
endFontClass();
}
}
<*>\n({B}*"//@"[{}]{B}*\n) { // remove one-line group marker
if (Config::stripCommentsFlag)
{
g_yyLineNr+=((QCString)yytext).contains('\n');
g_code->endCodeLine();
if (g_yyLineNr<g_inputLines)
{
startCodeLine(*g_code);
}
}
else
{
startFontClass("comment");
codifyLines(yytext);
endFontClass();
}
}
<*>^{B}*"//@"[{}]{B}*\n { // remove one-line group marker
if (Config::stripCommentsFlag)
{
g_yyLineNr++;
g_code->endCodeLine();
if (g_yyLineNr<g_inputLines)
{
startCodeLine(*g_code);
}
}
else
{
startFontClass("comment");
codifyLines(yytext);
endFontClass();
}
}
<*>^{B}*"//"[!/][^\n]*\n { // remove special one-line comment
if (Config::stripCommentsFlag)
{
......
......@@ -35,8 +35,6 @@ struct Config
static QCString projectNumber; // the number of the project
static QCString outputDir; // the global output directory
static QCString outputLanguage; // the output language
static bool quietFlag; // generate progress messages flag
static bool warningFlag; // generate warnings flag
static bool noIndexFlag; // generate condensed index flag
static bool extractAllFlag; // gererate docs for all classes flag
static bool extractPrivateFlag; // generate docs for private members flag
......@@ -61,6 +59,10 @@ struct Config
static bool sortMembersFlag; // sort members alphabetically?
static int tabSize; // number of spaces in a tab
static QStrList sectionFilterList; // list of section filters that are enabled
static bool quietFlag; // generate progress messages flag
static bool warningFlag; // generate warnings flag
static bool warningUndocFlag; // generate undocumented warnings
static QCString warnFormat; // format of the warning messages
static QStrList inputSources; // list of input files
static QStrList filePatternList; // list of file patterns
static bool recursiveFlag; // scan directories recursively
......
This diff is collapsed.
......@@ -25,9 +25,17 @@
#include "outputlist.h"
#include "scanner.h"
Definition::Definition(const char *name,const char *b,const char *d)
Definition::Definition(const char *df,int dl,
const char *name,const char *b,const char *d)
{
n=name; brief=b; doc=d; sectionList=0, startBodyLine=endBodyLine=-1, bodyDef=0;
defFileName = df;
defLine = dl;
n=name;
brief=b;
doc=d;
sectionList=0,
startBodyLine=endBodyLine=-1,
bodyDef=0;
}
Definition::~Definition()
......
......@@ -25,12 +25,14 @@ class FileDef;
class OutputList;
class SectionList;
/*! The common base class of all definitions. */
/*! The common base class of all entity definitions found in the sources. */
class Definition
{
public:
/*! create a new definition */
Definition(const char *name,const char *b=0,const char *d=0);
Definition(
const char *defFileName,int defLine,
const char *name,const char *b=0,const char *d=0);
/*! destroys the definition */
virtual ~Definition();
/*! returns the name of the definition */
......@@ -92,17 +94,27 @@ class Definition
FileDef *getBodyDef() { return bodyDef; }
void writeSourceRef(OutputList &ol,const char *scopeName);
/*! returns the file in which this definition was found */
QCString getDefFileName() const { return defFileName; }
/*! returns the line number at which the definition was found */
int getDefLine() const { return defLine; }
protected:
int startBodyLine; // line number of the start of the definition
int endBodyLine; // line number of the end of the definition
FileDef *bodyDef; // file definition containing the function body
// where the item was found
QCString defFileName;
int defLine;
private:
QCString n; // name of the definition
QCString brief; // brief description
QCString doc; // detailed description
QCString ref; // reference to external documentation
SectionList *sectionList; // list of all sections
};
#endif
This diff is collapsed.
......@@ -36,8 +36,14 @@
struct PageInfo
{
PageInfo(const char *n,const char *d,const char *t)
{ name=n; doc=d; title=t; }
PageInfo(const char *f, int l,const char *n,const char *d,const char *t) :
defFileName(f), defLine(l), name(n), doc(d), title(t) {}
// where the page definition was found
QCString defFileName;
int defLine;
// contents of the page
QCString name;
QCString doc;
QCString title;
......
......@@ -207,6 +207,7 @@ void Entry::reset()
scopeSpec.resize(0);
memberSpec.resize(0);
initializer.resize(0);
startLine = 1;
bodyLine = -1;
endBodyLine = -1;
mGrpId = -1;
......@@ -217,6 +218,7 @@ void Entry::reset()
stat = FALSE;
proto = FALSE;
inLine = FALSE;
subGrouping = TRUE;
protection = Public;
sublist->clear();
extends->clear();
......
......@@ -159,6 +159,7 @@ class Entry
bool stat; // static ?
bool proto; // prototype ?
bool inLine; // inline ?
bool subGrouping; // automatically group class members?
Specifier virt; // virtualness of the entry
Entry *parent; // parent node in the tree
QCString type; // member type
......
......@@ -35,7 +35,7 @@
file was read from a tag file or 0 otherwise
*/
FileDef::FileDef(const char *p,const char *nm,const char *ref)
: Definition(nm)
: Definition((QCString)p+nm,1,nm)
{
path=p;
filepath=path+nm;
......@@ -83,6 +83,16 @@ void FileDef::computeAnchors()
setAnchors('a',&allMemberList);
}
void FileDef::distributeMemberGroupDocumentation()
{
MemberGroupListIterator mgli(*memberGroupList);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
mg->distributeMemberGroupDocumentation();
}
}
/*! Write the documentation page for this file to the file of output
generators \a ol.
*/
......@@ -95,6 +105,8 @@ void FileDef::writeDocumentation(OutputList &ol)
//{
// fn.prepend(stripFromPath(getPath().copy()));
//}
//printf("WriteDocumentation %p diskname=%s\n",this,diskname.data());
QCString pageTitle=name()+" File Reference";
startFile(ol,diskname,pageTitle);
......@@ -113,7 +125,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
//if (brief.at(bl-1)!='.' && brief.at(bl-1)!='!' && brief.at(bl!='?'))
// brief+='.';
parseDoc(briefOutput,0,0,briefDescription());
parseDoc(briefOutput,filepath,1,0,0,briefDescription());
ol+=briefOutput;
ol.writeString(" \n");
ol.disableAllBut(OutputGenerator::Html);
......@@ -293,7 +305,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
//if (doc.at(dl-1)!='.' && doc.at(dl-1)!='!' && doc.at(dl-1)!='?')
// doc+='.';
parseDoc(ol,0,0,documentation()+"\n");
parseDoc(ol,filepath,1,0,0,documentation()+"\n");
}
//printf("Writing source ref for file %s\n",name().data());
if (Config::sourceBrowseFlag)
......
......@@ -125,6 +125,8 @@ class FileDef : public Definition
QList<IncludeInfo> *includeFileList() const { return includeList; }
QDict<IncludeInfo> *includeFileDict() const { return includeDict; }
void distributeMemberGroupDocumentation();
private:
MemberList allMemberList;
MemberList defineMembers;
......
......@@ -55,7 +55,7 @@ void FileName::generateDiskNames()
//printf("Multiple occurrences of %s\n",name.data());
int i=0,j=0;
bool found=FALSE;
while (!found)
while (!found) // search for the common prefix of all paths
{
fd=first();
while (fd && fd->isReference()) fd=next();
......@@ -66,7 +66,7 @@ void FileName::generateDiskNames()
{
if (!fd->isReference())
{
//printf("i=%d fd->path=`%s' fd->name=`%s'\n",i,fd->path.data(),fd->name().data());
//printf("i=%d j=%d fd->path=`%s' fd->name=`%s'\n",i,j,fd->path.left(i).data(),fd->name().data());
if (i==(int)fd->path.length())
{
//warning("Warning: Input file %s found multiple times!\n"
......@@ -88,8 +88,9 @@ void FileName::generateDiskNames()
//printf("fd->setName(%s)\n",(fd->path.right(fd->path.length()-j-1)+name).data());
if (!fd->isReference())
{
fd->setName(fd->path.right(fd->path.length()-j-1)+name);
fd->diskname=convertSlashes(fd->name());
QCString prefix = fd->path.right(fd->path.length()-j-1);
fd->setName(prefix+name);
fd->diskname=convertSlashes(prefix+name);
}
fd=next();
}
......
......@@ -61,7 +61,8 @@ class FileNameListIterator : public QListIterator<FileName>
class FileNameDict : public QDict<FileName>
{
public:
FileNameDict(uint size) : QDict<FileName>(size) {}
FileNameDict(uint size) :
QDict<FileName>(size,Config::caseSensitiveNames) {}
~FileNameDict() {}
};
......
......@@ -31,8 +31,8 @@
#include "membergroup.h"
#include "doxygen.h"
GroupDef::GroupDef(const char *na,const char *t) :
Definition(na)
GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t) :
Definition(df,dl,na)
{
fileList = new FileList;
classList = new ClassList;
......@@ -66,6 +66,16 @@ GroupDef::~GroupDef()
delete memberGroupDict;
}
void GroupDef::distributeMemberGroupDocumentation()
{
MemberGroupListIterator mgli(*memberGroupList);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
mg->distributeMemberGroupDocumentation();
}
}
void GroupDef::addFile(const FileDef *def)
{
fileList->append(def);
......@@ -159,7 +169,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
OutputList briefOutput(&ol);
if (!briefDescription().isEmpty())
{
parseDoc(briefOutput,name(),0,briefDescription());
parseDoc(briefOutput,defFileName,defLine,name(),0,briefDescription());
ol+=briefOutput;
ol.writeString(" \n");
ol.pushGeneratorState();
......@@ -189,7 +199,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
if (!fd->briefDescription().isEmpty() && Config::briefMemDescFlag)
{
ol.startMemberDescription();
parseDoc(ol,0,0,fd->briefDescription());
parseDoc(ol,defFileName,defLine,0,0,fd->briefDescription());
ol.endMemberDescription();
ol.newParagraph();
}
......@@ -214,7 +224,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
if (!nd->briefDescription().isEmpty() && Config::briefMemDescFlag)
{
ol.startMemberDescription();
parseDoc(ol,0,0,nd->briefDescription());
parseDoc(ol,defFileName,defLine,0,0,nd->briefDescription());
ol.endMemberDescription();
ol.newParagraph();
}
......@@ -238,7 +248,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
if (!gd->briefDescription().isEmpty() && Config::briefMemDescFlag)
{
ol.startMemberDescription();
parseDoc(ol,0,0,gd->briefDescription());
parseDoc(ol,defFileName,defLine,0,0,gd->briefDescription());
ol.endMemberDescription();
ol.newParagraph();
}
......@@ -284,7 +294,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
// write documentation
if (!documentation().isEmpty())
{
parseDoc(ol,name(),0,documentation()+"\n");
parseDoc(ol,defFileName,defLine,name(),0,documentation()+"\n");
}
}
......@@ -427,7 +437,8 @@ void addMemberToGroups(Entry *root,MemberDef *md)
}
else if (mgd!=gd)
{
warn("Warning: Member %s found in multiple groups.!\n"
warn(mgd->getDefFileName(),mgd->getDefLine(),
"Warning: Member %s found in multiple groups.!\n"
"The member will be put in group %s, and not in group %s",
md->name().data(),mgd->name().data(),gd->name().data()
);
......
......@@ -39,7 +39,7 @@ class MemberGroupDict;
class GroupDef : public Definition
{
public:
GroupDef(const char *name,const char *title);
GroupDef(const char *fileName,int line,const char *name,const char *title);
~GroupDef();
QCString getOutputFileBase() const { return fileName; }
const char *groupTitle() const { return title; }
......@@ -60,6 +60,7 @@ class GroupDef : public Definition
return isLinkableInProject() || isReference();
}
void computeAnchors();
void distributeMemberGroupDocumentation();
private:
QCString title; // title of the group
......
......@@ -154,7 +154,7 @@ void HtmlGenerator::writeFooter(int part,bool external)
}
t << "doxygen.gif\" alt=\"doxygen\" "
<< "align=center border=0 " << endl <<
"width=118 height=53></a> " << versionString <<" ";
"width=110 height=53></a>" << versionString <<" ";
}
break;
default:
......
......@@ -393,7 +393,8 @@ void writeFileIndex(OutputList &ol)
{
ol.docify(" (");
OutputList briefOutput(&ol);
parseDoc(briefOutput,0,0,
parseDoc(briefOutput,fd->absFilePath(),1,
0,0,
abbreviate(fd->briefDescription(),fd->name()));
ol+=briefOutput;
ol.docify(")");
......@@ -432,7 +433,9 @@ void writeFileIndex(OutputList &ol)
{
ol.docify(" (");
OutputList briefOutput(&ol);
parseDoc(briefOutput,0,0,
parseDoc(briefOutput,
fd->absFilePath(),1,
0,0,
abbreviate(fd->briefDescription(),fd->name()));
ol+=briefOutput;
ol.docify(")");
......@@ -580,8 +583,10 @@ void writeNamespaceIndex(OutputList &ol)
if (!nd->briefDescription().isEmpty())
{
OutputList briefOutput(&ol);
parseDoc(briefOutput,nd->name(),0,
abbreviate(nd->briefDescription(),nd->name()));
parseDoc(briefOutput,
nd->getDefFileName(),nd->getDefLine(),
nd->name(),0,
abbreviate(nd->briefDescription(),nd->name()));
ol+=briefOutput;
}
else
......@@ -654,8 +659,10 @@ void writeAnnotatedClassList(OutputList &ol)
if (!cd->briefDescription().isEmpty())
{
OutputList briefOutput(&ol);
parseDoc(briefOutput,cd->name(),0,
abbreviate(cd->briefDescription(),cd->name()));
parseDoc(briefOutput,
cd->getDefFileName(),cd->getDefLine(),
cd->name(),0,
abbreviate(cd->briefDescription(),cd->name()));
ol+=briefOutput;
}
else
......@@ -1454,10 +1461,15 @@ void writeGroupList(OutputList &ol)
{
ol.startDescItem();
ol.startTextLink(gd->getOutputFileBase(),0);
parseDoc(ol,0,0,gd->groupTitle());
parseDoc(ol,
gd->getDefFileName(),gd->getDefLine(),
0,0,
gd->groupTitle());
ol.endTextLink();
ol.endDescItem();
parseDoc(ol,0,0,gd->briefDescription());
parseDoc(ol,
gd->getDefFileName(),gd->getDefLine(),
0,0,gd->briefDescription());
ol.newParagraph();
}
}
......@@ -1517,6 +1529,11 @@ void writeIndex(OutputList &ol)
//ol.disable(OutputGenerator::Latex);
ol.disableAllBut(OutputGenerator::Html);
QCString defFileName =
mainPage ? mainPage->defFileName.data() : "<generated>";
int defLine =
mainPage ? mainPage->defLine : 1;
if (!mainPage || mainPage->title.isEmpty())
ol.startFile("index","Main Index",FALSE);
else
......@@ -1526,7 +1543,7 @@ void writeIndex(OutputList &ol)
ol.startTitleHead(0);
if (mainPage && !mainPage->title.isEmpty())
{
parseDoc(ol,0,0,mainPage->title);
parseDoc(ol,defFileName,defLine,0,0,mainPage->title);
}
else
{
......@@ -1537,14 +1554,14 @@ void writeIndex(OutputList &ol)
if (!Config::projectNumber.isEmpty())
{
ol.startProjectNumber();
parseDoc(ol,0,0,Config::projectNumber);
parseDoc(ol,defFileName,defLine,0,0,Config::projectNumber);
ol.endProjectNumber();
}
if (Config::noIndexFlag) writeQuickLinks(ol,FALSE);
if (mainPage)
{
parseDoc(ol,0,0,mainPage->doc);
parseDoc(ol,defFileName,defLine,0,0,mainPage->doc);
}
endFile(ol);
......@@ -1565,7 +1582,7 @@ void writeIndex(OutputList &ol)
if (!Config::projectNumber.isEmpty())
{
ol.startProjectNumber();
parseDoc(ol,0,0,Config::projectNumber);
parseDoc(ol,defFileName,defLine,0,0,Config::projectNumber);
ol.endProjectNumber();
}
ol.endIndexSection(isTitlePageStart);
......@@ -1577,7 +1594,7 @@ void writeIndex(OutputList &ol)
ol.startIndexSection(isMainPage);
if (!mainPage->title.isEmpty())
{
parseDoc(ol,0,0,mainPage->title);
parseDoc(ol,defFileName,defLine,0,0,mainPage->title);
}
else
{
......@@ -1674,7 +1691,7 @@ void writeIndex(OutputList &ol)
ol.writeSection(si->label,si->title,FALSE);
}
ol.startTextBlock();
parseDoc(ol,0,0,mainPage->doc);
parseDoc(ol,defFileName,defLine,0,0,mainPage->doc);
ol.endTextBlock();
endFile(ol);
ol.enable(OutputGenerator::Man);
......
......@@ -596,7 +596,7 @@ void LatexGenerator::writeStyleInfo(int part)
t << "\\newenvironment{CompactItemize}\n";
t << "{\n";
t << " \\begin{itemize}\n";
t << " \\setlength{\\itemsep}{-4pt}\n";
t << " \\setlength{\\itemsep}{-3pt}\n";
t << " \\setlength{\\parsep}{0pt}\n";
t << " \\setlength{\\topsep}{0pt}\n";
t << " \\setlength{\\partopsep}{0pt}\n";
......
This diff is collapsed.
......@@ -225,12 +225,13 @@ static void writeTemplatePrefix(OutputList &ol,ArgumentList *al,bool br=TRUE)
* all types.
*/
MemberDef::MemberDef(const char *t,const char *na,const char *a,const char *e,
MemberDef::MemberDef(const char *df,int dl,
const char *t,const char *na,const char *a,const char *e,
Protection p,Specifier v,bool s,bool r,MemberType mt,
const ArgumentList *tal,const ArgumentList *al
) : Definition(substituteClassNames(na))
) : Definition(df,dl,substituteClassNames(na))
{
//printf("++++++ MemberDef(%s,%s,%s) ++++++ \n",t,na,a);
//printf("++++++ MemberDef(%s file=%s,line=%d) ++++++ \n",na,df,dl);
classDef=0;
fileDef=0;
fileDec=0;
......@@ -251,7 +252,6 @@ MemberDef::MemberDef(const char *t,const char *na,const char *a,const char *e,
args=substituteClassNames(a);
if (type.isNull()) decl=name()+args; else decl=type+" "+name()+args;
declLine=0;
defLine=0;
memberGroup=0;
virt=v;
prot=p;
......@@ -395,8 +395,10 @@ QCString MemberDef::getOutputFileBase() const
{
return nspace->getOutputFileBase();
}
warn("Warning: Internal inconsistency: member %s does not belong to any\n"
" container!\n",name().data());
warn(defFileName,defLine,
"Warning: Internal inconsistency: member %s does not belong to any"
" container!",name().data()
);
return "dummy";
}
......@@ -773,7 +775,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
if (!briefDescription().isEmpty() && Config::briefMemDescFlag && !annMemb)
{
ol.startMemberDescription();
parseDoc(ol,cname,name(),briefDescription());
parseDoc(ol,defFileName,defLine,cname,name(),briefDescription());
if (/*!documentation().isEmpty()*/ detailsAreVisible())
{
ol.disableAllBut(OutputGenerator::Html);
......@@ -1044,14 +1046,14 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
) /* || !annMemb */
)
{
parseDoc(ol,scopeName,name(),briefDescription());
parseDoc(ol,defFileName,defLine,scopeName,name(),briefDescription());
ol.newParagraph();
}
/* write detailed description */
if (!documentation().isEmpty())
{
parseDoc(ol,scopeName,name(),documentation()+"\n");
parseDoc(ol,defFileName,defLine,scopeName,name(),documentation()+"\n");
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::RTF);
ol.newParagraph();
......@@ -1083,7 +1085,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
ol.endEmphasis();
ol.endDescTableTitle();
ol.startDescTableData();
parseDoc(ol,scopeName,name(),a->docs);
parseDoc(ol,defFileName,defLine,scopeName,name(),a->docs);
ol.endDescTableData();
}
}
......@@ -1138,7 +1140,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if (!fmd->briefDescription().isEmpty())
{
parseDoc(ol,scopeName,fmd->name(),fmd->briefDescription());
parseDoc(ol,defFileName,defLine,scopeName,fmd->name(),fmd->briefDescription());
//ol.newParagraph();
}
if (!fmd->briefDescription().isEmpty() &&
......@@ -1148,7 +1150,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
}
if (!fmd->documentation().isEmpty())
{
parseDoc(ol,scopeName,fmd->name(),fmd->documentation()+"\n");
parseDoc(ol,defFileName,defLine,scopeName,fmd->name(),fmd->documentation()+"\n");
}
ol.endDescTableData();
}
......@@ -1329,7 +1331,7 @@ void MemberDef::warnIfUndocumented()
t="group", d=gd;
if (d && d->isLinkable() && !isLinkable() && name().find('@')==-1)
warn("Warning: Member %s of %s %s is not documented\n",
warn_undoc(defFileName,defLine,"Warning: Member %s of %s %s is not documented.",
name().data(),t,d->name().data());
}
......
......@@ -59,7 +59,8 @@ class MemberDef : public Definition
// initialization
};
MemberDef(const char *type,const char *name,const char *args,
MemberDef(const char *defFileName,int defLine,
const char *type,const char *name,const char *args,
const char *excp,Protection prot,Specifier virt,bool stat,
bool related,MemberType t,const ArgumentList *tal,
const ArgumentList *al);
......@@ -96,8 +97,8 @@ class MemberDef : public Definition
MemberList *getSectionList() const { return section; }
void setMemberType(MemberType t) { mtype=t; }
void setDefinition(const char *d) { def=d; }
void setDefFile(const char *f) { defFile=f; }
void setDefLine(int l) { defLine=l; }
//void setDefFile(const char *f) { defFile=f; }
//void setDefLine(int l) { defLine=l; }
void setFileDef(FileDef *fd) { fileDef=fd; }
void setFileDec(FileDef *fd) { fileDec=fd; }
void setAnchor(const char *a) { anc=a; }
......@@ -143,10 +144,8 @@ class MemberDef : public Definition
ExampleList *getExampleList() const { return exampleList; }
// prototype related members
const char *getDefFile() { return defFile; }
int getDefLine() { return defLine; }
void setDecFile(const char *f) { declFile=f; }
void setDecLine(int l) { defLine=l; }
//void setDecFile(const char *f) { declFile=f; }
//void setDecLine(int l) { defLine=l; }
// convenience members
bool isSignal() const { return mtype==Signal; }
......@@ -219,8 +218,8 @@ class MemberDef : public Definition
QCString declFile; // file where the declaration was found
int declLine; // line where the declaration was found
QCString def; // member definition in code (fully qualified name)
QCString defFile; // file where the definition was found
int defLine; // line where the definition was found
//QCString defFile; // file where the definition was found
//int defLine; // line where the definition was found
QCString anc; // HTML anchor name
Specifier virt; // normal/virtual/pure virtual
Protection prot; // protection type [Public/Protected/Private]
......
......@@ -75,7 +75,7 @@ void MemberGroup::setAnchors()
void MemberGroup::writeDeclarations(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd)
{
memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,doc,TRUE);
memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,doc,TRUE,TRUE);
}
void MemberGroup::writePlainDeclarations(OutputList &ol,
......@@ -101,8 +101,26 @@ int MemberGroup::countDecMembers()
{
if (numDeclMembers==-1) /* number of member not cached */
{
memberList->countDecMembers(TRUE);
memberList->countDecMembers(TRUE,TRUE);
numDeclMembers = memberList->totalCount();
}
return numDeclMembers;
}
void MemberGroup::distributeMemberGroupDocumentation()
{
MemberDef *md=memberList->first();
if (md && md->hasDocumentation())
{
MemberDef *omd=memberList->next();
while (omd)
{
if (!omd->hasDocumentation())
{
omd->setBriefDescription(md->briefDescription());
omd->setDocumentation(md->documentation());
}
omd=memberList->next();
}
}
}
......@@ -53,6 +53,7 @@ class MemberGroup /* : public Definition */
bool allMembersInSameSection() { return inSameSection; }
void addToDeclarationSection();
int countDecMembers();
void distributeMemberGroupDocumentation();
private:
MemberList *memberList; // list of all members in the group
......
......@@ -44,13 +44,16 @@ int MemberList::compareItems(GCI item1, GCI item2)
return strcmp(c1->name(),c2->name());
}
void MemberList::countDecMembers(bool inGroup)
void MemberList::countDecMembers(bool inGroup,bool countSubGroups)
{
//printf("----- countDecMembers ----\n");
varCnt=funcCnt=enumCnt=enumValCnt=typeCnt=protoCnt=defCnt=friendCnt=0;
m_count=0;
MemberDef *md=first();
while (md)
{
//printf("md=%p md->name()=`%s' inGroup=%d getMemberGroup()=%p\n",
// md,md->name().data(),inGroup,md->getMemberGroup());
if (!(md->memberClass()==0 && md->isStatic() && !Config::extractPrivateFlag) &&
(!Config::hideMemberFlag || md->hasDocumentation()) &&
(
......@@ -60,7 +63,8 @@ void MemberList::countDecMembers(bool inGroup)
(md->isEnumerate() &&
md->hasDocumentedEnumValues()
)
) && inGroup==(md->getMemberGroup()!=0) &&
) &&
inGroup==(md->getMemberGroup()!=0) &&
!(inGroup && md->protection()==Private && !Config::extractPrivateFlag)
)
{
......@@ -88,17 +92,18 @@ void MemberList::countDecMembers(bool inGroup)
}
md=next();
}
if (memberGroupList && !inGroup)
if (memberGroupList && countSubGroups)
{
MemberGroupListIterator mgli(*memberGroupList);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
//printf("memberGroupList adding %d inGroup=%d\n",
// mg->countDecMembers(),m_count);
m_count+=mg->countDecMembers();
int mgCount = mg->countDecMembers();
//printf("memberGroupList adding %d inGroup=%d\n",mgCount,inGroup);
m_count+=mgCount;
}
}
//printf("----- end countDecMembers ----\n");
//printf("MemberList::countDecMembers(%d)=%d\n",inGroup,m_count);
}
......@@ -147,12 +152,13 @@ MemberListIterator::MemberListIterator(const QList<MemberDef> &l) :
void MemberList::writePlainDeclarations(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
bool inGroup
bool inGroup,bool countSubGroups
)
{
countDecMembers(inGroup);
//printf("writePlainDeclaration() totalCount()=%d defineCount()=%d\n",totalCount(),defineCount());
//printf("----- writePlainDeclaration() ----\n");
countDecMembers(inGroup,countSubGroups);
if (totalCount()==0) return; // no members in this list
//printf("----> writePlainDeclaration() inGroup=%d totalCount()=%d\n",inGroup,totalCount());
ol.pushGeneratorState();
......@@ -163,6 +169,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (defineCount()>0)
{
//printf("There are %d defines\n",defineCount());
if (sectionPerType)
{
ol.startMemberHeader();
......@@ -191,6 +198,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (protoCount()>0)
{
//printf("There are %d prototypes\n",protoCount());
if (sectionPerType)
{
ol.startMemberHeader();
......@@ -214,6 +222,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (typedefCount()>0)
{
//printf("There are %d typedefs\n",typedefCount());
if (sectionPerType)
{
ol.startMemberHeader();
......@@ -236,6 +245,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
// write enums
if (enumCount()>0)
{
//printf("There are %d enums\n",enumCount());
if (sectionPerType)
{
ol.startMemberHeader();
......@@ -357,6 +367,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
{
ol.startMemberDescription();
parseDoc(ol,
md->getDefFileName(),md->getDefLine(),
cd?cd->name().data():0,md->name().data(),
md->briefDescription()
);
......@@ -384,6 +395,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
// write functions
if (funcCount()>0)
{
//printf("There are %d functions\n",funcCount());
if (sectionPerType)
{
ol.startMemberHeader();
......@@ -408,6 +420,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (friendCount()>0)
{
//printf("There are %d friends\n",friendCount());
MemberListIterator mli(*this);
for ( ; (md=mli.current()) ; ++mli )
{
......@@ -455,6 +468,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
// write variables
if (varCount()>0)
{
//printf("There are %d variables\n",varCount());
if (sectionPerType)
{
ol.startMemberHeader();
......@@ -483,6 +497,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (md->fromAnnonymousScope() && !md->annonymousDeclShown()
&& inGroup==(md->getMemberGroup()!=0))
{
//printf("annonymous compound members\n");
md->setFromAnnonymousScope(FALSE);
md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
md->setFromAnnonymousScope(TRUE);
......@@ -493,16 +508,28 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (!sectionPerType) { ol.endMemberList(); /*ol.writeChar('\n');*/ }
ol.popGeneratorState();
//printf("----- end writePlainDeclaration() ----\n");
}
void MemberList::writeDeclarations(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
const char *title,const char *subtitle,bool inGroup)
const char *title,const char *subtitle,
bool inGroup,bool countSubGroups)
{
//printf("MemberList::writeDeclaration(title=`%s',subtitle=`%s')\n",
// title,subtitle);
countDecMembers(inGroup);
if (totalCount()==0) return;
//printf("MemberList::writeDeclaration(title=`%s',subtitle=`%s')\n",title,subtitle);
//printf("----- writeDeclaration() ----\n");
countDecMembers(FALSE,countSubGroups); // count member not in group
int normalMembers = totalCount();
int ingroupMembers = 0;
//printf("Normal members %d\n",normalMembers);
if (inGroup)
{
countDecMembers(TRUE,countSubGroups); // count member inside group
ingroupMembers = totalCount();
}
int totalMembers = normalMembers + ingroupMembers;
//printf("Total members %d\n",totalMembers);
if (totalMembers==0) return;
if (title)
{
ol.startMemberHeader();
......@@ -514,13 +541,13 @@ void MemberList::writeDeclarations(OutputList &ol,
//printf("subtitle=`%s'\n",subtitle);
ol.startMemberSubtitle();
if (inGroup)
parseDoc(ol,0,0,subtitle);
parseDoc(ol,"<generated>",1,0,0,subtitle);
else
parseText(ol,subtitle);
ol.endMemberSubtitle();
}
writePlainDeclarations(ol,cd,nd,fd,gd,inGroup);
writePlainDeclarations(ol,cd,nd,fd,gd,inGroup,FALSE);
if (memberGroupList)
{
......@@ -530,13 +557,17 @@ void MemberList::writeDeclarations(OutputList &ol,
while ((mg=mgli.current()))
{
ol.startMemberGroupHeader();
parseText(ol,mg->header());
if (mg->header()!="[NOHEADER]")
{
parseText(ol,mg->header());
}
ol.endMemberGroupHeader();
if (!mg->documentation().isEmpty())
{
//printf("Member group has docs!\n");
ol.startMemberGroupDocs();
parseDoc(ol,0,0,mg->documentation());
parseDoc(ol,"<generated>",1,
0,0,mg->documentation());
ol.endMemberGroupDocs();
}
ol.startMemberGroup();
......@@ -545,6 +576,7 @@ void MemberList::writeDeclarations(OutputList &ol,
ol.endMemberGroup(mgli.current()==0);
}
}
//printf("----- end writeDeclaration() ----\n");
}
......
......@@ -41,7 +41,7 @@ class MemberList : public QList<MemberDef>
int protoCount() const { return protoCnt; }
int defineCount() const { return defCnt; }
int friendCount() const { return friendCnt; }
void countDecMembers(bool inGroup);
void countDecMembers(bool inGroup,bool countSubGroups);
void countDocMembers();
int totalCount() const
{ return //varCnt+funcCnt+enumCnt+enumValCnt+typeCnt+
......@@ -50,10 +50,11 @@ class MemberList : public QList<MemberDef>
}
void writePlainDeclarations(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
bool inGroup=FALSE);
bool inGroup=FALSE,bool countSubGroups=TRUE);
void writeDeclarations(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
const char *title,const char *subtitle,bool inGroup=FALSE);
const char *title,const char *subtitle,
bool inGroup=FALSE,bool countSubGroups=TRUE);
void writeDocumentation(OutputList &ol,const char *scopeName
/*,MemberDef::MemberType m*/);
void addMemberGroup(MemberGroup *mg);
......
......@@ -18,6 +18,57 @@
#include <stdarg.h>
#include <stdio.h>
#include "config.h"
#include <qregexp.h>
static QCString outputFormat;
static int warnFormatOrder; // 1 = $file,$line,$text
// 2 = $text,$line,$file
// 3 = $line,$text,$file
// 4 = $file,$text,$line
// 5 = $text,$file,$line
// 6 = $line,$file,$text
void initWarningFormat()
{
int filePos = Config::warnFormat.find("$file");
int linePos = Config::warnFormat.find("$line");
int textPos = Config::warnFormat.find("$text");
// sort items on position (there are 6 cases)
warnFormatOrder = 1;
if (filePos>linePos && filePos>textPos)
{
if (linePos>textPos) // $text,$line,$file
{
warnFormatOrder = 2;
}
else // $line,$text,$file
{
warnFormatOrder = 3;
}
}
else if (filePos<linePos && filePos<textPos)
{
if (linePos>textPos) // $file,$text,$line
{
warnFormatOrder = 4;
}
}
else if (filePos<linePos && filePos>textPos) // $text,$file,$line
{
warnFormatOrder = 5;
}
else // $line,$file,$text
{
warnFormatOrder = 6;
}
outputFormat = Config::warnFormat.
replace(QRegExp("\\$file"),"%s").
replace(QRegExp("\\$text"),"%s").
replace(QRegExp("\\$line"),"%d")+
'\n';
}
void msg(const char *fmt, ...)
{
......@@ -30,7 +81,31 @@ void msg(const char *fmt, ...)
}
}
void warn(const char *fmt, ...)
void warn(const char *file,int line,const char *fmt, ...)
{
if (Config::warningFlag)
{
if (file==0) file="<unknwon>";
char text[4096];
va_list args;
va_start(args, fmt);
vsprintf(text, fmt, args);
va_end(args);
switch(warnFormatOrder)
{
case 1: fprintf(stderr,outputFormat,file,line,text); break;
case 2: fprintf(stderr,outputFormat,text,line,file); break;
case 3: fprintf(stderr,outputFormat,line,text,file); break;
case 4: fprintf(stderr,outputFormat,file,text,line); break;
case 5: fprintf(stderr,outputFormat,text,file,line); break;
case 6: fprintf(stderr,outputFormat,line,file,text); break;
default:
printf("Error: warning format has not been initialized!\n");
}
}
}
void warn_cont(const char *fmt, ...)
{
if (Config::warningFlag)
{
......@@ -41,6 +116,30 @@ void warn(const char *fmt, ...)
}
}
void warn_undoc(const char *file,int line,const char *fmt, ...)
{
if (Config::warningUndocFlag)
{
if (file==0) file="<unknwon>";
char text[4096];
va_list args;
va_start(args, fmt);
vsprintf(text, fmt, args);
va_end(args);
switch(warnFormatOrder)
{
case 1: fprintf(stderr,outputFormat,file,line,text); break;
case 2: fprintf(stderr,outputFormat,text,line,file); break;
case 3: fprintf(stderr,outputFormat,line,text,file); break;
case 4: fprintf(stderr,outputFormat,file,text,line); break;
case 5: fprintf(stderr,outputFormat,text,file,line); break;
case 6: fprintf(stderr,outputFormat,line,file,text); break;
default:
printf("Error: warning format has not been initialized!\n");
}
}
}
void err(const char *fmt, ...)
{
va_list args;
......
......@@ -19,7 +19,10 @@
#define MESSAGE_H
extern void msg(const char *fmt, ...);
extern void warn(const char *fmt, ...);
extern void warn(const char *file,int line,const char *fmt, ...);
extern void warn_cont(const char *fmt, ...);
extern void warn_undoc(const char *file,int line,const char *fmt, ...);
extern void err(const char *fmt, ...);
void initWarningFormat();
#endif
......@@ -27,7 +27,9 @@
#include "doxygen.h"
#include "message.h"
NamespaceDef::NamespaceDef(const char *name,const char *ref) : Definition(name)
NamespaceDef::NamespaceDef(const char *df,int dl,
const char *name,const char *ref) :
Definition(df,dl,name)
{
fileName="namespace_"+nameToFile(name);
classList = new ClassList;
......@@ -38,6 +40,8 @@ NamespaceDef::NamespaceDef(const char *name,const char *ref) : Definition(name)
memberGroupList = new MemberGroupList;
memberGroupList->setAutoDelete(TRUE);
memberGroupDict = new MemberGroupDict(1009);
defFileName = df;
defLine = dl;
}
NamespaceDef::~NamespaceDef()
......@@ -49,6 +53,15 @@ NamespaceDef::~NamespaceDef()
delete memberGroupDict;
}
void NamespaceDef::distributeMemberGroupDocumentation()
{
MemberGroupListIterator mgli(*memberGroupList);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
mg->distributeMemberGroupDocumentation();
}
}
void NamespaceDef::insertUsedFile(const char *f)
{
if (files.find(f)==-1) files.append(f);
......@@ -130,7 +143,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
OutputList briefOutput(&ol);
if (!briefDescription().isEmpty())
{
parseDoc(briefOutput,name(),0,briefDescription());
parseDoc(briefOutput,defFileName,defLine,name(),0,briefDescription());
ol+=briefOutput;
ol.writeString(" \n");
ol.pushGeneratorState();
......@@ -183,7 +196,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
}
if (!documentation().isEmpty())
{
parseDoc(ol,name(),0,documentation()+"\n");
parseDoc(ol,defFileName,defLine,name(),0,documentation()+"\n");
ol.newParagraph();
}
ol.endTextBlock();
......
......@@ -36,7 +36,8 @@ class MemberGroupList;
class NamespaceDef : public Definition
{
public:
NamespaceDef(const char *name,const char *ref=0);
NamespaceDef(const char *defFileName,int defLine,
const char *name,const char *ref=0);
~NamespaceDef();
//QCString namespaceFile() const { return fileName; }
QCString getOutputFileBase() const { return fileName; }
......@@ -72,6 +73,7 @@ class NamespaceDef : public Definition
{
return isLinkableInProject() || isReference();
}
void distributeMemberGroupDocumentation();
private:
//QCString reference;
......
......@@ -171,12 +171,12 @@ static FILE *findFile(const char *fileName)
{
QCString cmd = Config::inputFilter+" "+absName;
f=popen(cmd,"r");
if (!f) warn("Warning: could not execute filter %s\n",cmd.data());
if (!f) err("Error: could not execute filter %s\n",cmd.data());
}
else
{
f=fopen(absName,"r");
if (!f) warn("Warning: could not open file %s for reading\n",absName.data());
if (!f) err("Error: could not open file %s for reading\n",absName.data());
}
if (f)
{
......@@ -761,7 +761,9 @@ void addDefine()
{
//bool ambig;
//FileDef *fd=findFileDef(&inputNameDict,g_yyFileName,ambig);
MemberDef *md=new MemberDef("#define",g_defName,g_defArgsStr,0,
MemberDef *md=new MemberDef(
g_yyFileName,g_yyLineNr,
"#define",g_defName,g_defArgsStr,0,
Public,Normal,FALSE,FALSE,MemberDef::Define,0,0);
if (!g_defArgsStr.isEmpty())
{
......@@ -773,8 +775,8 @@ void addDefine()
//printf("Setting initializer for `%s' to `%s'\n",g_defName.data(),g_defText.data());
md->setInitializer(g_defLitText);
md->setDefFile(g_yyFileName);
md->setDefLine(g_yyLineNr);
//md->setDefFile(g_yyFileName);
//md->setDefLine(g_yyLineNr);
md->setFileDef(g_yyFileDef);
md->setDefinition("#define "+g_defName);
......
......@@ -1665,7 +1665,7 @@ void RTFGenerator::incrementIndentLevel()
m_listLevel++;
if (m_listLevel>indentLevels-1)
{
warn("Warning: Maximum indent level (%d) exceeded while generating RTF output!\n",indentLevels);
warn_cont("Warning: Maximum indent level (%d) exceeded while generating RTF output!\n",indentLevels);
m_listLevel=indentLevels-1;
}
}
......@@ -1675,7 +1675,7 @@ void RTFGenerator::decrementIndentLevel()
m_listLevel--;
if (m_listLevel<0)
{
warn("Warning: Negative indent level while generating RTF output!\n");
warn_cont("Warning: Negative indent level while generating RTF output!\n");
m_listLevel=0;
}
}
......
......@@ -29,8 +29,10 @@
class OutputList;
extern void parseMain(Entry *);
extern void parseDoc(OutputList &ol,const char *clName, const char *memName,
const QCString &docString);
extern void parseDoc(OutputList &ol,
const char *fileName,int startLine,
const char *clName, const char *memName,
const QCString &docString);
extern void parseExample(OutputList &ol,const QCString &docString,
const char *fileName);
extern void parseText(OutputList &ol,const QCString &txtString);
......
This diff is collapsed.
......@@ -54,7 +54,7 @@ static void addClass(const char *name,const char *fileName)
//printf("adding class %s\n",name);
if (name!=0 && strlen(name)>0 && classDict[name]==0)
{
cd = new ClassDef(name,ClassDef::Class,tagName,fileName);
cd = new ClassDef(fileName,1,name,ClassDef::Class,tagName,fileName);
fd = 0;
nd = 0;
classList.inSort(cd);
......@@ -92,7 +92,7 @@ static void addNamespace(const char *name)
// since namespace are open, this need not to be the case. As a result
// namespace may contain members that are located in
// different namespaces!
nd = new NamespaceDef(name,tagName);
nd = new NamespaceDef("<tagfile>",1,name,tagName);
namespaceList.inSort(nd);
namespaceDict.insert(name,nd);
}
......@@ -110,7 +110,8 @@ static void addMember(const char *name,const char *anchor,const char *args)
MemberDef *md;
ArgumentList *argList = new ArgumentList;
stringToArgumentList(args,argList);
md=new MemberDef(0,name,args,0,Public,Normal,FALSE,FALSE,
md=new MemberDef("<tagfile>",1,
0,name,args,0,Public,Normal,FALSE,FALSE,
MemberDef::Function,0,argList);
delete argList;
md->setAnchor(anchor);
......
......@@ -793,7 +793,7 @@ class Translator
/*! Text shown before a multi-line variable/enum initialization */
virtual QCString trInitialValue()
{
return "Initial value:";
return "Initializer:";
}
/*! Text used the source code in the file index */
virtual QCString trCode()
......
......@@ -221,7 +221,7 @@ ClassDef *getResolvedClass(const char *name)
}
if (count==10)
{
warn("Warning: possible recursive typedef dependency detected for %s!\n",name);
warn_cont("Warning: possible recursive typedef dependency detected for %s!\n",name);
return classDict[name];
}
else
......@@ -734,7 +734,7 @@ QCString fileToString(const char *name)
QFileInfo fi(name);
if (!fi.exists() || !fi.isFile())
{
warn("Error: file `%s' not found\n",name);
err("Error: file `%s' not found\n",name);
return "";
}
f.setName(name);
......@@ -742,7 +742,7 @@ QCString fileToString(const char *name)
}
if (!fileOpened)
{
warn("Error: cannot open file `%s' for reading\n",name);
err("Error: cannot open file `%s' for reading\n",name);
return "";
}
int fsize=f.size();
......@@ -2086,8 +2086,9 @@ FileDef *findFileDef(const FileNameDict *fnDict,const char *n,bool &ambig)
//----------------------------------------------------------------------
void showFileDefMatches(const FileNameDict *fnDict,const char *n)
QCString showFileDefMatches(const FileNameDict *fnDict,const char *n)
{
QCString result;
QCString name=n;
QCString path;
int slashPos=QMAX(name.findRev('/'),name.findRev('\\'));
......@@ -2104,11 +2105,12 @@ void showFileDefMatches(const FileNameDict *fnDict,const char *n)
{
if (path.isEmpty() || fd->getPath().right(path.length())==path)
{
msg(" %s\n",fd->absFilePath().data());
result+=" %s\n",fd->absFilePath().data();
}
fd=fn->next();
}
}
return result;
}
//----------------------------------------------------------------------
......@@ -2281,11 +2283,15 @@ QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &te
if (!templ.isEmpty() && scope.find('<')==-1)
{
int si,pi=0;
while ((si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ)
&& !getClass(scope.left(si)))
{ //printf("Tried `%s'\n",(scope.left(si)+templ).data());
pi=si+2;
}
ClassDef *cd=0;
while (
(si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ) &&
((cd=getClass(scope.left(si)))==0 || cd->templateArguments()==0)
)
{
//printf("Tried `%s'\n",(scope.left(si)+templ).data());
pi=si+2;
}
if (si==-1) // not nested => append template specifier
{
result+=templ;
......
......@@ -65,7 +65,7 @@ extern ClassDef *getClass(const char *key);
extern ClassDef *getResolvedClass(const char *key);
extern FileDef *findFileDef(const FileNameDict *fnDict,const char *n,
bool &ambig);
extern void showFileDefMatches(const FileNameDict *fnDict,const char *n);
extern QCString showFileDefMatches(const FileNameDict *fnDict,const char *n);
extern int guessSection(const char *name);
extern bool isId(char c);
extern QCString removeRedundantWhiteSpace(const QCString &s);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment