Blame src/filename.cpp

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 "filename.h"
Packit 1c1d7e
#include "util.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
Packit 1c1d7e
FileName::FileName(const char *fn,const char *n) : FileList()
Packit 1c1d7e
{
Packit 1c1d7e
  setAutoDelete(TRUE);
Packit 1c1d7e
  fName=fn;
Packit 1c1d7e
  name=n;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
FileName::~FileName()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void FileName::generateDiskNames()
Packit 1c1d7e
{
Packit 1c1d7e
  //QCString commonPrefix;
Packit 1c1d7e
  QListIterator<FileDef> it(*this);
Packit 1c1d7e
  FileDef *fd;
Packit 1c1d7e
  int count=0;
Packit 1c1d7e
  for (;(fd=it.current());++it)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (!fd->isReference()) count++;
Packit 1c1d7e
  }
Packit 1c1d7e
  if (count==1)
Packit 1c1d7e
  {
Packit 1c1d7e
    // skip references
Packit 1c1d7e
    for (it.toFirst();(fd=it.current()) && fd->isReference();++it) { }
Packit 1c1d7e
    if (fd)
Packit 1c1d7e
    {
Packit 1c1d7e
      // name if unique, so diskname is simply the name
Packit 1c1d7e
      //printf("!!!!!!!! Unique disk name=%s for fd=%s\n",name.data(),fd->diskname.data());
Packit 1c1d7e
      fd->setDiskName(name);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (count>1) // multiple occurrences of the same file name
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("Multiple occurrences of %s\n",name.data());
Packit 1c1d7e
    int i=0,j=0;
Packit 1c1d7e
    bool found=FALSE;
Packit 1c1d7e
    while (!found) // search for the common prefix of all paths
Packit 1c1d7e
    {
Packit 1c1d7e
      for (it.toFirst();(fd=it.current()) && fd->isReference();++it) { }
Packit 1c1d7e
      if (fd)
Packit 1c1d7e
      {
Packit 1c1d7e
        char c=fd->getPath().at(i);
Packit 1c1d7e
        if (c=='/') j=i; // remember last position of dirname
Packit 1c1d7e
        ++it;
Packit 1c1d7e
        while ((fd=it.current()) && !found)
Packit 1c1d7e
        {
Packit 1c1d7e
          QCString path = fd->getPath();
Packit 1c1d7e
          if (!fd->isReference())
Packit 1c1d7e
          {
Packit 1c1d7e
            //printf("i=%d j=%d fd->path=`%s' fd->name=`%s'\n",i,j,fd->path.left(i).data(),fd->name().data());
Packit 1c1d7e
            if (i==(int)path.length())
Packit 1c1d7e
            {
Packit 1c1d7e
              //warning("Input file %s found multiple times!\n"
Packit 1c1d7e
              //        "         The generated documentation for this file may not be correct!\n",fd->absFilePath().data());
Packit 1c1d7e
              found=TRUE;
Packit 1c1d7e
            }
Packit 1c1d7e
            else if (path[i]!=c)
Packit 1c1d7e
            {
Packit 1c1d7e
              found=TRUE;
Packit 1c1d7e
            }
Packit 1c1d7e
          }
Packit 1c1d7e
          ++it;
Packit 1c1d7e
        }
Packit 1c1d7e
        i++;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    for (it.toFirst();(fd=it.current());++it)
Packit 1c1d7e
    {
Packit 1c1d7e
      //printf("fd->setName(%s)\n",(fd->path.right(fd->path.length()-j-1)+name).data());
Packit 1c1d7e
      if (!fd->isReference())
Packit 1c1d7e
      {
Packit 1c1d7e
        QCString path   = fd->getPath();
Packit 1c1d7e
        QCString prefix = path.right(path.length()-j-1);
Packit 1c1d7e
        fd->setName(prefix+name);
Packit 1c1d7e
        //printf("!!!!!!!! non unique disk name=%s:%s\n",prefix.data(),name.data());
Packit 1c1d7e
        fd->setDiskName(prefix+name);
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int FileName::compareValues(const FileDef *f1, const FileDef *f2) const
Packit 1c1d7e
{
Packit 1c1d7e
  return qstricmp(f1->fileName(),f2->fileName());
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
FileNameIterator::FileNameIterator(const FileName &fname) :
Packit 1c1d7e
  QListIterator<FileDef>(fname)
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
FileNameList::FileNameList() : QList<FileName>()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
FileNameList::~FileNameList()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void FileNameList::generateDiskNames()
Packit 1c1d7e
{
Packit 1c1d7e
  FileNameListIterator it(*this);
Packit 1c1d7e
  FileName *fn;
Packit 1c1d7e
  for (;(fn=it.current());++it)
Packit 1c1d7e
  {
Packit 1c1d7e
    fn->generateDiskNames();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int FileNameList::compareValues(const FileName *f1, const FileName *f2) const
Packit 1c1d7e
{
Packit 1c1d7e
  return Config_getBool(FULL_PATH_NAMES) ?
Packit 1c1d7e
         qstricmp(f1->fullName(),f2->fullName()) :
Packit 1c1d7e
         qstricmp(f1->fileName(),f2->fileName());
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
FileNameListIterator::FileNameListIterator(const FileNameList &fnlist) :
Packit 1c1d7e
  QListIterator<FileName>(fnlist)
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static bool getCaseSenseNames()
Packit 1c1d7e
{
Packit 1c1d7e
  static bool caseSenseNames = Config_getBool(CASE_SENSE_NAMES);
Packit 1c1d7e
  return caseSenseNames;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
FileNameDict::FileNameDict(uint size) : QDict<FileName>(size,getCaseSenseNames()) 
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e