|
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 <stdio.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <qdir.h>
|
|
Packit |
1c1d7e |
#include <qdict.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "htags.h"
|
|
Packit |
1c1d7e |
#include "util.h"
|
|
Packit |
1c1d7e |
#include "message.h"
|
|
Packit |
1c1d7e |
#include "config.h"
|
|
Packit |
1c1d7e |
#include "portable.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Htags::useHtags = FALSE;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QDir g_inputDir;
|
|
Packit |
1c1d7e |
static QDict<QCString> g_symbolDict(10007);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! constructs command line of htags(1) and executes it.
|
|
Packit |
1c1d7e |
* \retval TRUE success
|
|
Packit |
1c1d7e |
* \retval FALSE an error has occurred.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
bool Htags::execute(const QCString &htmldir)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static QStrList &inputSource = Config_getList(INPUT);
|
|
Packit |
1c1d7e |
static bool quiet = Config_getBool(QUIET);
|
|
Packit |
1c1d7e |
static bool warnings = Config_getBool(WARNINGS);
|
|
Packit |
1c1d7e |
static QCString htagsOptions = ""; //Config_getString(HTAGS_OPTIONS);
|
|
Packit |
1c1d7e |
static QCString projectName = Config_getString(PROJECT_NAME);
|
|
Packit |
1c1d7e |
static QCString projectNumber = Config_getString(PROJECT_NUMBER);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString cwd = QDir::currentDirPath().utf8();
|
|
Packit |
1c1d7e |
if (inputSource.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_inputDir.setPath(cwd);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (inputSource.count()==1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_inputDir.setPath(inputSource.first());
|
|
Packit |
1c1d7e |
if (!g_inputDir.exists())
|
|
Packit |
1c1d7e |
err("Cannot find directory %s. "
|
|
Packit |
1c1d7e |
"Check the value of the INPUT tag in the configuration file.\n",
|
|
Packit |
1c1d7e |
inputSource.first()
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("If you use USE_HTAGS then INPUT should specify a single directory.\n");
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* Construct command line for htags(1).
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
QCString commandLine = " -g -s -a -n ";
|
|
Packit |
1c1d7e |
if (!quiet) commandLine += "-v ";
|
|
Packit |
1c1d7e |
if (warnings) commandLine += "-w ";
|
|
Packit |
1c1d7e |
if (!htagsOptions.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
commandLine += ' ';
|
|
Packit |
1c1d7e |
commandLine += htagsOptions;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!projectName.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
commandLine += "-t \"";
|
|
Packit |
1c1d7e |
commandLine += projectName;
|
|
Packit |
1c1d7e |
if (!projectNumber.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
commandLine += '-';
|
|
Packit |
1c1d7e |
commandLine += projectNumber;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
commandLine += "\" ";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
commandLine += " \"" + htmldir + "\"";
|
|
Packit |
1c1d7e |
QCString oldDir = QDir::currentDirPath().utf8();
|
|
Packit |
1c1d7e |
QDir::setCurrent(g_inputDir.absPath());
|
|
Packit |
1c1d7e |
//printf("CommandLine=[%s]\n",commandLine.data());
|
|
Packit |
1c1d7e |
portable_sysTimerStart();
|
|
Packit |
1c1d7e |
bool result=portable_system("htags",commandLine,FALSE)==0;
|
|
Packit |
1c1d7e |
portable_sysTimerStop();
|
|
Packit |
1c1d7e |
QDir::setCurrent(oldDir);
|
|
Packit |
1c1d7e |
return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! load filemap and make index.
|
|
Packit |
1c1d7e |
* \param htmlDir of HTML directory generated by htags(1).
|
|
Packit |
1c1d7e |
* \retval TRUE success
|
|
Packit |
1c1d7e |
* \retval FALSE error
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
bool Htags::loadFilemap(const QCString &htmlDir)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString fileMapName = htmlDir+"/HTML/FILEMAP";
|
|
Packit |
1c1d7e |
QFileInfo fi(fileMapName);
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* Construct FILEMAP dictionary using QDict.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* In FILEMAP, URL includes 'html' suffix but we cut it off according
|
|
Packit |
1c1d7e |
* to the method of FileDef class.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* FILEMAP format:
|
|
Packit |
1c1d7e |
* <NAME>\t<HREF>.html\n
|
|
Packit |
1c1d7e |
* QDICT:
|
|
Packit |
1c1d7e |
* dict[<NAME>] = <HREF>
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
if (fi.exists() && fi.isReadable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QFile f(fileMapName);
|
|
Packit |
1c1d7e |
const int maxlen = 8192;
|
|
Packit |
1c1d7e |
QCString line(maxlen+1);
|
|
Packit |
1c1d7e |
line.at(maxlen)='\0';
|
|
Packit |
1c1d7e |
if (f.open(IO_ReadOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int len;
|
|
Packit |
1c1d7e |
while ((len=f.readLine(line.rawData(),maxlen))>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
line.resize(len+1);
|
|
Packit |
1c1d7e |
//printf("Read line: %s",line.data());
|
|
Packit |
1c1d7e |
int sep = line.find('\t');
|
|
Packit |
1c1d7e |
if (sep!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString key = line.left(sep).stripWhiteSpace();
|
|
Packit |
1c1d7e |
QCString value = line.mid(sep+1).stripWhiteSpace();
|
|
Packit |
1c1d7e |
int ext=value.findRev('.');
|
|
Packit |
1c1d7e |
if (ext!=-1) value=value.left(ext); // strip extension
|
|
Packit |
1c1d7e |
g_symbolDict.setAutoDelete(TRUE);
|
|
Packit |
1c1d7e |
g_symbolDict.insert(key,new QCString(value));
|
|
Packit |
1c1d7e |
//printf("Key/Value=(%s,%s)\n",key.data(),value.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("file %s cannot be opened\n",fileMapName.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! convert path name into the url in the hypertext generated by htags.
|
|
Packit |
1c1d7e |
* \param path path name
|
|
Packit |
1c1d7e |
* \returns URL NULL: not found.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
QCString Htags::path2URL(const QCString &path)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString url,symName=path;
|
|
Packit |
1c1d7e |
QCString dir = g_inputDir.absPath().utf8();
|
|
Packit |
1c1d7e |
int dl=dir.length();
|
|
Packit |
1c1d7e |
if ((int)symName.length()>dl+1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
symName = symName.mid(dl+1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!symName.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString *result = g_symbolDict[symName];
|
|
Packit |
1c1d7e |
//printf("path2URL=%s symName=%s result=%p\n",path.data(),symName.data(),result);
|
|
Packit |
1c1d7e |
if (result)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
url = "HTML/" + *result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return url;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|