Blame src/htags.cpp

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