summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/commentcnv.l2
-rw-r--r--src/commentscan.l16
-rw-r--r--src/dirdef.cpp52
-rw-r--r--src/dot.cpp4
-rw-r--r--src/doxygen.cpp98
-rw-r--r--src/htmlgen.cpp2
-rw-r--r--src/scanner.l30
-rw-r--r--src/xmlgen.cpp6
8 files changed, 159 insertions, 51 deletions
diff --git a/src/commentcnv.l b/src/commentcnv.l
index a3d62a4..cb065ec 100644
--- a/src/commentcnv.l
+++ b/src/commentcnv.l
@@ -320,7 +320,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
copyToOutput(yytext,yyleng);
BEGIN(CComment);
}
-<CComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"|"f$"|"f["|"f{")/[^a-z_A-Z0-9] { /* start of a verbatim block */
+<CComment,ReadLine>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"|"f$"|"f["|"f{")/[^a-z_A-Z0-9] { /* start of a verbatim block */
copyToOutput(yytext,yyleng);
if (yytext[2]=='[')
{
diff --git a/src/commentscan.l b/src/commentscan.l
index 161b766..fe7f171 100644
--- a/src/commentscan.l
+++ b/src/commentscan.l
@@ -293,7 +293,7 @@ static void groupAddDocs(Entry *e,const char *fileName);
*/
static ParserInterface *langParser; // the language parser that is calling us
-static const char * inputString; // input string
+static QCString inputString; // input string
static int inputPosition; // read pointer
static QCString yyFileName; // file name that is read from
static int yyLineNr; // line number in the input
@@ -2215,8 +2215,9 @@ bool parseCommentBlock(/* in */ ParserInterface *parser,
guards.clear();
langParser = parser;
current = curEntry;
+ if (comment.isEmpty()) return FALSE; // avoid empty strings
inputString = comment;
- if (inputString==0) return FALSE; // avoid empty strings
+ inputString.append(" ");
inputPosition = position;
yyLineNr = lineNr;
yyFileName = fileName;
@@ -2229,6 +2230,12 @@ bool parseCommentBlock(/* in */ ParserInterface *parser,
outputXRef.resize(0);
setOutput( isBrief || isJavaDocStyle ? OutputBrief : OutputDoc );
briefEndsAtDot = isJavaDocStyle;
+
+
+ Debug::print(Debug::CommentScan,0,"-----------\nCommentScanner: %s:%d\n"
+ "input=[%s]\n",fileName.data(),lineNr,comment.data()
+ );
+
commentScanYYrestart( commentScanYYin );
BEGIN( Comment );
commentScanYYlex();
@@ -2253,9 +2260,8 @@ bool parseCommentBlock(/* in */ ParserInterface *parser,
openGroup(current,yyFileName,yyLineNr);
}
- Debug::print(Debug::CommentScan,0,"CommentScanner\n%s:%d\n"
- "input=[%s]\nbrief=[%s]\ndocs=[%s]\n------------\n",
- fileName.data(),lineNr,comment.data(),
+ Debug::print(Debug::CommentScan,0,
+ "brief=[%s]\ndocs=[%s]\n===========\n",
current->brief.data(),current->doc.data()
);
diff --git a/src/dirdef.cpp b/src/dirdef.cpp
index 0e9a898..8452f0b 100644
--- a/src/dirdef.cpp
+++ b/src/dirdef.cpp
@@ -1,3 +1,5 @@
+#include <md5.h>
+
#include "dirdef.h"
#include "filename.h"
#include "doxygen.h"
@@ -66,32 +68,42 @@ void DirDef::addFile(FileDef *fd)
fd->setDirDef(this);
}
-static QCString escapeDirName(const QCString &anchor)
+static QCString encodeDirName(const QCString &anchor)
{
QCString result;
- int l = anchor.length(),i;
- for (i=0;i<l;i++)
- {
- char c = anchor.at(i);
- if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9'))
- {
- result+=c;
- }
- else
- {
- static char hexStr[]="0123456789ABCDEF";
- char escChar[]={ '_', 0, 0, 0 };
- escChar[1]=hexStr[c>>4];
- escChar[2]=hexStr[c&0xf];
- result+=escChar;
- }
- }
- return result;
+
+ // convert to md5 hash
+ uchar md5_sig[16];
+ QCString sigStr(33);
+ MD5Buffer((const unsigned char *)anchor.data(),anchor.length(),md5_sig);
+ MD5SigToString(md5_sig,sigStr.data(),33);
+ return sigStr;
+
+ // old algorithm
+
+// int l = anchor.length(),i;
+// for (i=0;i<l;i++)
+// {
+// char c = anchor.at(i);
+// if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9'))
+// {
+// result+=c;
+// }
+// else
+// {
+// static char hexStr[]="0123456789ABCDEF";
+// char escChar[]={ '_', 0, 0, 0 };
+// escChar[1]=hexStr[c>>4];
+// escChar[2]=hexStr[c&0xf];
+// result+=escChar;
+// }
+// }
+// return result;
}
QCString DirDef::getOutputFileBase() const
{
- return "dir_"+escapeDirName(name());
+ return "dir_"+encodeDirName(name());
//return QCString().sprintf("dir_%06d",m_dirCount);
}
diff --git a/src/dot.cpp b/src/dot.cpp
index a304788..3cc7e2f 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -1958,7 +1958,7 @@ void DotInclDepGraph::buildGraph(DotNode *n,FileDef *fd,int distance)
if (bfd)
{
in = bfd->absFilePath();
- doc = bfd->isLinkable() && bfd->isHidden();
+ doc = bfd->isLinkable() && !bfd->isHidden();
src = bfd->generateSourceFile();
}
if (doc || src || !Config_getBool("HIDE_UNDOC_RELATIONS"))
@@ -1967,7 +1967,7 @@ void DotInclDepGraph::buildGraph(DotNode *n,FileDef *fd,int distance)
if (bfd) url=bfd->getOutputFileBase().copy();
if (!doc && src)
{
- url+="-source";
+ url=bfd->getSourceFileBase();
}
DotNode *bn = m_usedNodes->find(in);
if (bn) // file is already a node in the graph
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 95cce31..ff2606a 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -3511,6 +3511,85 @@ static bool isRecursiveBaseClass(const QCString &scope,const QCString &name)
return result;
}
+/*! Searches for the end of a template in prototype \a s starting from
+ * character position \a startPos. If the end was found the position
+ * of the closing \> is returned, otherwise -1 is returned.
+ *
+ * Handles exotic cases such as
+ * \code
+ * Class<(id<0)>
+ * Class<bits<<2>
+ * Class<"<">
+ * Class<'<'>
+ * Class<(")<")>
+ * \endcode
+ */
+static int findEndOfTemplate(const QCString &s,int startPos)
+{
+ // locate end of template
+ int e=startPos;
+ int brCount=1;
+ int roundCount=0;
+ int len = s.length();
+ bool insideString=FALSE;
+ bool insideChar=FALSE;
+ char pc = 0;
+ while (e<len && brCount!=0)
+ {
+ char c=s.at(e);
+ switch(c)
+ {
+ case '<':
+ if (!insideString && !insideChar)
+ {
+ if (e<len-1 && s.at(e+1)=='<')
+ e++;
+ else if (roundCount==0)
+ brCount++;
+ }
+ break;
+ case '>':
+ if (!insideString && !insideChar)
+ {
+ if (e<len-1 && s.at(e+1)=='>')
+ e++;
+ else if (roundCount==0)
+ brCount--;
+ }
+ break;
+ case '(':
+ if (!insideString && !insideChar)
+ roundCount++;
+ break;
+ case ')':
+ if (!insideString && !insideChar)
+ roundCount--;
+ break;
+ case '"':
+ if (!insideChar)
+ {
+ if (insideString && pc!='\\')
+ insideString=FALSE;
+ else
+ insideString=TRUE;
+ }
+ break;
+ case '\'':
+ if (!insideString)
+ {
+ if (insideChar && pc!='\\')
+ insideChar=FALSE;
+ else
+ insideChar=TRUE;
+ }
+ break;
+ }
+ pc = c;
+ e++;
+ }
+ return brCount==0 ? e : -1;
+}
+
static bool findClassRelation(
Entry *root,
Definition *context,
@@ -3603,23 +3682,8 @@ static bool findClassRelation(
{
// TODO: here we should try to find the correct template specialization
// but for now, we only look for the unspecializated base class.
- // locate end of template
- int e=i+1;
- int brCount=1;
- int typeLen = baseClassName.length();
- while (e<typeLen && brCount!=0)
- {
- if (baseClassName.at(e)=='<')
- {
- if (e<typeLen-1 && baseClassName.at(e+1)=='<') e++; else brCount++;
- }
- if (baseClassName.at(e)=='>')
- {
- if (e<typeLen-1 && baseClassName.at(e+1)=='>') e++; else brCount--;
- }
- e++;
- }
- if (brCount==0) // end of template was found at e
+ int e=findEndOfTemplate(baseClassName,i+1);
+ if (e!=-1) // end of template was found at e
{
templSpec=baseClassName.mid(i,e-i);
baseClassName=baseClassName.left(i)+baseClassName.right(baseClassName.length()-e);
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 8391e3c..64166e0 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -569,7 +569,7 @@ static void writeDefaultHeaderFile(QTextStream &t, const char *title,
}
t << "\" rel=\"stylesheet\" type=\"text/css\">\n";
- t << "<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\">\n";
+ t << "<link href=\"" << relPathStr << "tabs.css\" rel=\"stylesheet\" type=\"text/css\">\n";
t << "</head><body>\n";
}
diff --git a/src/scanner.l b/src/scanner.l
index 4e510d9..d037938 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -655,6 +655,7 @@ IDLATTR ("["[^\]]*"]"){BN}*
%x CopyArgSharp
%x CopyArgComment
%x CopyArgCommentLine
+%x CopyArgVerbatim
/** Prototype scanner states */
@@ -2855,10 +2856,35 @@ IDLATTR ("["[^\]]*"]"){BN}*
unput(lastCopyArgChar);
BEGIN( lastCommentInArgContext );
}
+<CopyArgCommentLine>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"dot"|"code")/[^a-z_A-Z0-9] { // verbatim command (which could contain nested comments!)
+ docBlockName=&yytext[1];
+ fullArgString+=yytext;
+ BEGIN(CopyArgVerbatim);
+ }
+<CopyArgCommentLine>{CMD}("f$"|"f["|"f{") {
+ docBlockName=&yytext[1];
+ if (docBlockName.at(1)=='{')
+ {
+ docBlockName.at(1)='}';
+ }
+ fullArgString+=yytext;
+ BEGIN(CopyArgVerbatim);
+ }
+<CopyArgVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddot"|"endcode"|"f$"|"f]"|"f}")/[^a-z_A-Z0-9] { // end of verbatim block
+ fullArgString+=yytext;
+ if (yytext[1]=='f') // end of formula
+ {
+ BEGIN(CopyArgCommentLine);
+ }
+ if (&yytext[4]==docBlockName)
+ {
+ BEGIN(CopyArgCommentLine);
+ }
+ }
<CopyArgCommentLine>[^\\\@\n]+ { fullArgString+=yytext; }
<CopyArgCommentLine>. { fullArgString+=*yytext; }
-<CopyArgComment>\n { fullArgString+=*yytext; yyLineNr++; }
-<CopyArgComment>. { fullArgString+=*yytext; }
+<CopyArgComment,CopyArgVerbatim>\n { fullArgString+=*yytext; yyLineNr++; }
+<CopyArgComment,CopyArgVerbatim>. { fullArgString+=*yytext; }
<CopyArgComment>{CMD}("brief"|"short"){B}+ {
warn(yyFileName,yyLineNr,
"Warning: Ignoring %cbrief command inside argument documentation",*yytext
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
index 0126cc6..3126adc 100644
--- a/src/xmlgen.cpp
+++ b/src/xmlgen.cpp
@@ -1112,14 +1112,14 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &ti)
t << "\">";
if (!bcd->templSpecifiers.isEmpty())
{
- convertToXML(
- insertTemplateSpecifierInScope(
+ t << convertToXML(
+ insertTemplateSpecifierInScope(
bcd->classDef->displayName(),bcd->templSpecifiers)
);
}
else
{
- convertToXML(bcd->classDef->displayName());
+ t << convertToXML(bcd->classDef->displayName());
}
t << "</basecompoundref>" << endl;
}