" << endl;
- if (regenerate || !insertMapFile(t,absMapName,relPath,mapLabel))
- {
- int mapId = DotManager::instance()->addMap(fileName,absMapName,relPath,
- FALSE,QCString(),mapLabel);
- t << "" << endl;
+ t << "";
+
+ if (imgExt=="svg")
+ {
+ t << " ";
+ if (regenerate || !writeSVGFigureLink(t,relPath,baseName,absImgName)) // need to patch the links in the generated SVG file
+ {
+ if (regenerate)
+ {
+ DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString());
+ }
+ int mapId = DotManager::instance()->addSVGObject(fileName,baseName,absImgName,relPath);
+ t << "" << endl;
+ }
+ t << " " << endl;
+ }
+ else
+ {
+ t << "" << endl;
+ if (regenerate || !insertMapFile(t,absMapName,relPath,mapLabel))
+ {
+ int mapId = DotManager::instance()->addMap(fileName,absMapName,relPath,
+ FALSE,QCString(),mapLabel);
+ t << "" << endl;
+ }
}
t << " | " << endl;
diff --git a/src/dot.h b/src/dot.h
index c3d2c1d..0b45af5 100644
--- a/src/dot.h
+++ b/src/dot.h
@@ -357,7 +357,7 @@ class DotRunner
};
/** @brief Helper class to insert a set of map file into an output file */
-class DotMapConverter
+class DotFilePatcher
{
public:
struct Map
@@ -368,11 +368,14 @@ class DotMapConverter
QCString context;
QCString label;
};
- DotMapConverter(const char *patchFile);
+ DotFilePatcher(const char *patchFile);
int addMap(const QCString &mapFile,const QCString &relPath,
bool urlOnly,const QCString &context,const QCString &label);
int addFigure(const QCString &baseName,
const QCString &figureName,bool heightCheck);
+ int addSVGConversion(const QCString &relPath,bool urlOnly,const QCString &context);
+ int addSVGObject(const QCString &baseName, const QCString &figureName,
+ const QCString &relPath);
bool run();
private:
@@ -415,13 +418,17 @@ class DotManager
const QCString &context,const QCString &label);
int addFigure(const QCString &file,const QCString &baseName,
const QCString &figureName,bool heightCheck);
+ int addSVGConversion(const QCString &file,const QCString &relPath,
+ bool urlOnly,const QCString &context);
+ int addSVGObject(const QCString &file,const QCString &baseName,
+ const QCString &figureNAme,const QCString &relPath);
bool run();
private:
DotManager();
virtual ~DotManager();
QList m_dotRuns;
- SDict m_dotMaps;
+ SDict m_dotMaps;
static DotManager *m_theInstance;
DotRunnerQueue *m_queue;
QList m_workers;
@@ -433,8 +440,9 @@ void generateGraphLegend(const char *path);
void writeDotGraphFromFile(const char *inFile,const char *outDir,
const char *outFile,GraphOutputFormat format);
-QCString getDotImageMapFromFile(const QCString& inFile, const QCString& outDir,
- const QCString& relPath,const QCString& context);
+void writeDotImageMapFromFile(FTextStream &t,
+ const QCString& inFile, const QCString& outDir,
+ const QCString& relPath,const QCString& context);
void writeDotDirDepGraph(FTextStream &t,DirDef *dd);
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 3efe75d..7ff5c89 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -2197,8 +2197,9 @@ static MemberDef *addVariableToFile(
* \returns -1 if this is not a function pointer variable or
* the index at which the brace of (...*name) was found.
*/
-static int findFunctionPtr(const QCString &type,int *pLength=0)
+static int findFunctionPtr(const QCString &type,int lang, int *pLength=0)
{
+ if (lang == SrcLangExt_F90) return -1; // Fortran does not have function pointers
static const QRegExp re("([^)]*[\\*\\^][^)]*)");
int i=-1,l;
if (!type.isEmpty() && // return type is non-empty
@@ -2381,7 +2382,7 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
else
{
int i=isFuncPtr;
- if (i==-1) i=findFunctionPtr(root->type); // for typedefs isFuncPtr is not yet set
+ if (i==-1) i=findFunctionPtr(root->type,root->lang); // for typedefs isFuncPtr is not yet set
if (i!=-1) // function pointer
{
int ai = root->type.find('[',i);
@@ -2593,7 +2594,7 @@ static void buildVarList(EntryNav *rootNav)
(rootNav->section()==Entry::VARIABLE_SEC // it's a variable
) ||
(rootNav->section()==Entry::FUNCTION_SEC && // or maybe a function pointer variable
- (isFuncPtr=findFunctionPtr(rootNav->type()))!=-1
+ (isFuncPtr=findFunctionPtr(rootNav->type(),rootNav->lang()))!=-1
) ||
(rootNav->section()==Entry::FUNCTION_SEC && // class variable initialized by constructor
isVarWithConstructor(rootNav)
@@ -6164,7 +6165,7 @@ static void filterMemberDocumentation(EntryNav *rootNav)
}
if ( // detect func variable/typedef to func ptr
- (i=findFunctionPtr(root->type,&l))!=-1
+ (i=findFunctionPtr(root->type,root->lang,&l))!=-1
)
{
//printf("Fixing function pointer!\n");
@@ -10393,6 +10394,7 @@ void generateOutput()
// what categories we find in this function.
if (Config_getBool("GENERATE_HTML") && searchEngine)
{
+ msg("Generating search indices...\n");
QCString searchDirName = Config_getString("HTML_OUTPUT")+"/search";
QDir searchDir(searchDirName);
if (!searchDir.exists() && !searchDir.mkdir(searchDirName))
diff --git a/src/doxygen.css b/src/doxygen.css
index 39053f8..3a07205 100644
--- a/src/doxygen.css
+++ b/src/doxygen.css
@@ -683,4 +683,44 @@ div.headertitle
{
padding: 5px 5px 5px 10px;
}
+dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug
+{
+ border-left:4px solid;
+ padding: 0 0 0 6px;
+}
+
+dl.note
+{
+ border-color: #D0D000;
+}
+
+dl.warning, dl.attention
+{
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+ border-color: #00D000;
+}
+
+dl.deprecated
+{
+ border-color: #505050;
+}
+
+dl.todo
+{
+ border-color: #00C0E0;
+}
+
+dl.test
+{
+ border-color: #3030E0;
+}
+
+dl.bug
+{
+ border-color: #C08050;
+}
diff --git a/src/doxygen_css.h b/src/doxygen_css.h
index f32c905..63bcd89 100644
--- a/src/doxygen_css.h
+++ b/src/doxygen_css.h
@@ -683,4 +683,44 @@
"{\n"
" padding: 5px 5px 5px 10px;\n"
"}\n"
+"dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug\n"
+"{\n"
+" border-left:4px solid;\n"
+" padding: 0 0 0 6px;\n"
+"}\n"
+"\n"
+"dl.note\n"
+"{\n"
+" border-color: #D0D000;\n"
+"}\n"
+"\n"
+"dl.warning, dl.attention\n"
+"{\n"
+" border-color: #FF0000;\n"
+"}\n"
+"\n"
+"dl.pre, dl.post, dl.invariant\n"
+"{\n"
+" border-color: #00D000;\n"
+"}\n"
+"\n"
+"dl.deprecated\n"
+"{\n"
+" border-color: #505050;\n"
+"}\n"
+"\n"
+"dl.todo\n"
+"{\n"
+" border-color: #00C0E0;\n"
+"}\n"
+"\n"
+"dl.test\n"
+"{\n"
+" border-color: #3030E0;\n"
+"}\n"
+"\n"
+"dl.bug\n"
+"{\n"
+" border-color: #C08050;\n"
+"}\n"
"\n"
diff --git a/src/entry.cpp b/src/entry.cpp
index c8475a6..2bde394 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -365,8 +365,8 @@ void Entry::addSpecialListItem(const char *listName,int itemId)
EntryNav::EntryNav(EntryNav *parent, Entry *e)
: m_parent(parent), m_subList(0), m_section(e->section), m_type(e->type),
- m_name(e->name), m_fileDef(0), m_info(0), m_offset(-1),
- m_noLoad(FALSE)
+ m_name(e->name), m_fileDef(0), m_lang(e->lang),
+ m_info(0), m_offset(-1), m_noLoad(FALSE)
{
if (e->tagInfo)
{
diff --git a/src/entry.h b/src/entry.h
index 9e9aa84..6460fec 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -413,6 +413,7 @@ class EntryNav
Entry *entry() const { return m_info; }
int section() const { return m_section; }
+ SrcLangExt lang() const { return m_lang; }
const QCString &type() const { return m_type; }
const QCString &name() const { return m_name; }
TagInfo *tagInfo() const { return m_tagInfo; }
@@ -432,6 +433,7 @@ class EntryNav
QCString m_name; //!< member name
TagInfo *m_tagInfo; //!< tag file info
FileDef *m_fileDef;
+ SrcLangExt m_lang; //!< programming language in which this entry was found
Entry *m_info;
int64 m_offset;
diff --git a/src/fortrancode.l b/src/fortrancode.l
index d8f592c..2923ad6 100644
--- a/src/fortrancode.l
+++ b/src/fortrancode.l
@@ -645,12 +645,16 @@ B [ \t]
BS [ \t]*
BS_ [ \t]+
COMMA {BS},{BS}
-ARGS {BS}("("[^)]*")"){BS}
+ARGS_L0 ("("[^)]*")")
+ARGS_L1a [^()]*"("[^)]*")"[^)]*
+ARGS_L1 ("("{ARGS_L1a}*")")
+ARGS_L2 "("({ARGS_L0}|[^()]|{ARGS_L1a}|{ARGS_L1})*")"
+ARGS {BS}({ARGS_L0}|{ARGS_L1}|{ARGS_L2})
NUM_TYPE (complex|integer|logical|real)
KIND {ARGS}
CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS}))
-TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{B}PRECISION|{CHAR})
+TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS_}PRECISION|{CHAR}|TYPE{ARGS})
INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")"
ATTR_SPEC (ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|ELEMENTAL)
diff --git a/src/fortranscanner.l b/src/fortranscanner.l
index b8d4afd..cb6a9f9 100644
--- a/src/fortranscanner.l
+++ b/src/fortranscanner.l
@@ -210,7 +210,11 @@ B [ \t]
BS [ \t]*
BS_ [ \t]+
COMMA {BS},{BS}
-ARGS {BS}("("[^)]*")")
+ARGS_L0 ("("[^)]*")")
+ARGS_L1a [^()]*"("[^)]*")"[^)]*
+ARGS_L1 ("("{ARGS_L1a}*")")
+ARGS_L2 "("({ARGS_L0}|[^()]|{ARGS_L1a}|{ARGS_L1})*")"
+ARGS {BS}({ARGS_L0}|{ARGS_L1}|{ARGS_L2})
NOARGS {BS}"\n"
NUM_TYPE (complex|integer|logical|real)
@@ -377,6 +381,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
current->section=Entry::USINGDIR_SEC;
current_root->addSubEntry(current);
current = new Entry;
+ current->lang = SrcLangExt_F90;
yy_pop_state();
}
|