|
Packit |
1c1d7e |
/******************************************************************************
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
* granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
* See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Documents produced by Doxygen are derivative works derived from the
|
|
Packit |
1c1d7e |
* input used in their production; they are not affected by this license.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "msc.h"
|
|
Packit |
1c1d7e |
#include "portable.h"
|
|
Packit |
1c1d7e |
#include "config.h"
|
|
Packit |
1c1d7e |
#include "message.h"
|
|
Packit |
1c1d7e |
#include "docparser.h"
|
|
Packit |
1c1d7e |
#include "doxygen.h"
|
|
Packit |
1c1d7e |
#include "index.h"
|
|
Packit |
1c1d7e |
#include "util.h"
|
|
Packit |
1c1d7e |
#include "ftextstream.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <qdir.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static const int maxCmdLine = 40960;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool convertMapFile(FTextStream &t,const char *mapName,const QCString relPath,
|
|
Packit |
1c1d7e |
const QCString &context)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QFile f(mapName);
|
|
Packit |
1c1d7e |
if (!f.open(IO_ReadOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("failed to open map file %s for inclusion in the docs!\n"
|
|
Packit |
1c1d7e |
"If you installed Graphviz/dot after a previous failing run, \n"
|
|
Packit |
1c1d7e |
"try deleting the output directory and rerun doxygen.\n",mapName);
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
const int maxLineLen=1024;
|
|
Packit |
1c1d7e |
char buf[maxLineLen];
|
|
Packit |
1c1d7e |
char url[maxLineLen];
|
|
Packit |
1c1d7e |
char ref[maxLineLen];
|
|
Packit |
1c1d7e |
int x1,y1,x2,y2;
|
|
Packit |
1c1d7e |
while (!f.atEnd())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bool isRef = FALSE;
|
|
Packit |
1c1d7e |
int numBytes = f.readLine(buf,maxLineLen);
|
|
Packit |
1c1d7e |
buf[numBytes-1]='\0';
|
|
Packit |
1c1d7e |
//printf("ReadLine `%s'\n",buf);
|
|
Packit |
1c1d7e |
if (qstrncmp(buf,"rect",4)==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// obtain the url and the coordinates in the order used by graphviz-1.5
|
|
Packit |
1c1d7e |
sscanf(buf,"rect %s %d,%d %d,%d",url,&x1,&y1,&x2,&y2;;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (qstrcmp(url,"\\ref")==0 || qstrcmp(url,"@ref")==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
isRef = TRUE;
|
|
Packit |
1c1d7e |
sscanf(buf,"rect %s %s %d,%d %d,%d",ref,url,&x1,&y1,&x2,&y2;;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// sanity checks
|
|
Packit |
1c1d7e |
if (y2
|
|
Packit |
1c1d7e |
if (x2
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if ( isRef )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// handle doxygen \ref tag URL reference
|
|
Packit |
1c1d7e |
DocRef *df = new DocRef( (DocNode*) 0, url, context );
|
|
Packit |
1c1d7e |
t << externalRef(relPath,df->ref(),TRUE);
|
|
Packit |
1c1d7e |
if (!df->file().isEmpty()) t << df->file() << Doxygen::htmlFileExtension;
|
|
Packit |
1c1d7e |
if (!df->anchor().isEmpty()) t << "#" << df->anchor();
|
|
Packit |
1c1d7e |
delete df;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << url;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "\" shape=\"rect\" coords=\""
|
|
Packit |
1c1d7e |
<< x1 << "," << y1 << "," << x2 << "," << y2 << "\""
|
|
Packit |
1c1d7e |
<< " alt=\"\"/>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void writeMscGraphFromFile(const char *inFile,const char *outDir,
|
|
Packit |
1c1d7e |
const char *outFile,MscOutputFormat format)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString absOutFile = outDir;
|
|
Packit |
1c1d7e |
absOutFile+=portable_pathSeparator();
|
|
Packit |
1c1d7e |
absOutFile+=outFile;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// chdir to the output dir, so dot can find the font file.
|
|
Packit |
1c1d7e |
QCString oldDir = QDir::currentDirPath().utf8();
|
|
Packit |
1c1d7e |
// go to the html output directory (i.e. path)
|
|
Packit |
1c1d7e |
QDir::setCurrent(outDir);
|
|
Packit |
1c1d7e |
//printf("Going to dir %s\n",QDir::currentDirPath().data());
|
|
Packit |
1c1d7e |
QCString mscExe = Config_getString(MSCGEN_PATH)+"mscgen"+portable_commandExtension();
|
|
Packit |
1c1d7e |
QCString mscArgs;
|
|
Packit |
1c1d7e |
QCString imgName = outFile;
|
|
Packit |
1c1d7e |
switch (format)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case MSC_BITMAP:
|
|
Packit |
1c1d7e |
mscArgs+="-T png";
|
|
Packit |
1c1d7e |
imgName+=".png";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case MSC_EPS:
|
|
Packit |
1c1d7e |
mscArgs+="-T eps";
|
|
Packit |
1c1d7e |
imgName+=".eps";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case MSC_SVG:
|
|
Packit |
1c1d7e |
mscArgs+="-T svg";
|
|
Packit |
1c1d7e |
imgName+=".svg";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
default:
|
|
Packit |
1c1d7e |
goto error; // I am not very fond of goto statements, but when in Rome...
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
mscArgs+=" -i \"";
|
|
Packit |
1c1d7e |
mscArgs+=inFile;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
mscArgs+="\" -o \"";
|
|
Packit |
1c1d7e |
mscArgs+=imgName+"\"";
|
|
Packit |
1c1d7e |
int exitCode;
|
|
Packit |
1c1d7e |
// printf("*** running: %s %s outDir:%s %s\n",mscExe.data(),mscArgs.data(),outDir,outFile);
|
|
Packit |
1c1d7e |
portable_sysTimerStart();
|
|
Packit |
1c1d7e |
if ((exitCode=portable_system(mscExe,mscArgs,FALSE))!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
portable_sysTimerStop();
|
|
Packit |
1c1d7e |
goto error;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
portable_sysTimerStop();
|
|
Packit |
1c1d7e |
if ( (format==MSC_EPS) && (Config_getBool(USE_PDFLATEX)) )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString epstopdfArgs(maxCmdLine);
|
|
Packit |
1c1d7e |
epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
|
|
Packit |
1c1d7e |
outFile,outFile);
|
|
Packit |
1c1d7e |
portable_sysTimerStart();
|
|
Packit |
1c1d7e |
if (portable_system("epstopdf",epstopdfArgs)!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Problems running epstopdf. Check your TeX installation!\n");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
portable_sysTimerStop();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Doxygen::indexList->addImageFile(imgName);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
error:
|
|
Packit |
1c1d7e |
QDir::setCurrent(oldDir);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString getMscImageMapFromFile(const QCString& inFile, const QCString& outDir,
|
|
Packit |
1c1d7e |
const QCString& relPath,const QCString& context)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString outFile = inFile + ".map";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//printf("*** running:getMscImageMapFromFile \n");
|
|
Packit |
1c1d7e |
// chdir to the output dir, so dot can find the font file.
|
|
Packit |
1c1d7e |
QCString oldDir = QDir::currentDirPath().utf8();
|
|
Packit |
1c1d7e |
// go to the html output directory (i.e. path)
|
|
Packit |
1c1d7e |
QDir::setCurrent(outDir);
|
|
Packit |
1c1d7e |
//printf("Going to dir %s\n",QDir::currentDirPath().data());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString mscExe = Config_getString(MSCGEN_PATH)+"mscgen"+portable_commandExtension();
|
|
Packit |
1c1d7e |
QCString mscArgs = "-T ismap -i \"";
|
|
Packit |
1c1d7e |
mscArgs+=inFile;
|
|
Packit |
1c1d7e |
mscArgs+="\" -o \"";
|
|
Packit |
1c1d7e |
mscArgs+=outFile + "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int exitCode;
|
|
Packit |
1c1d7e |
portable_sysTimerStart();
|
|
Packit |
1c1d7e |
if ((exitCode=portable_system(mscExe,mscArgs,FALSE))!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
portable_sysTimerStop();
|
|
Packit |
1c1d7e |
QDir::setCurrent(oldDir);
|
|
Packit |
1c1d7e |
return "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
portable_sysTimerStop();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGString result;
|
|
Packit |
1c1d7e |
FTextStream tmpout(&result);
|
|
Packit |
1c1d7e |
convertMapFile(tmpout, outFile, relPath, context);
|
|
Packit |
1c1d7e |
QDir().remove(outFile);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDir::setCurrent(oldDir);
|
|
Packit |
1c1d7e |
return result.data();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void writeMscImageMapFromFile(FTextStream &t,const QCString &inFile,
|
|
Packit |
1c1d7e |
const QCString &outDir,
|
|
Packit |
1c1d7e |
const QCString &relPath,
|
|
Packit |
1c1d7e |
const QCString &baseName,
|
|
Packit |
1c1d7e |
const QCString &context,
|
|
Packit |
1c1d7e |
MscOutputFormat format
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString mapName = baseName+".map";
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
switch (format)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case MSC_BITMAP:
|
|
Packit |
1c1d7e |
t << "png";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case MSC_EPS:
|
|
Packit |
1c1d7e |
t << "eps";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case MSC_SVG:
|
|
Packit |
1c1d7e |
t << "svg";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
default:
|
|
Packit |
1c1d7e |
t << "unknown";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "\" alt=\""
|
|
Packit |
1c1d7e |
<< baseName << "\" border=\"0\" usemap=\"#" << mapName << "\"/>" << endl;
|
|
Packit |
1c1d7e |
QCString imap = getMscImageMapFromFile(inFile,outDir,relPath,context);
|
|
Packit |
1c1d7e |
t << "<map name=\"" << mapName << "\" id=\"" << mapName << "\">" << imap << "</map>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|