filename.cpp 3.94 KB
Newer Older
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1 2
/******************************************************************************
 *
3
 * 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
4
 *
Dimitri van Heesch's avatar
Dimitri van Heesch committed
5
 * Copyright (C) 1997-2013 by Dimitri van Heesch.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
6 7 8 9 10 11 12
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation under the terms of the GNU General Public License is hereby 
 * granted. No representations are made about the suitability of this software 
 * for any purpose. It is provided "as is" without express or implied warranty.
 * See the GNU General Public License for more details.
 *
Dimitri van Heesch's avatar
Dimitri van Heesch committed
13 14
 * Documents produced by Doxygen are derivative works derived from the
 * input used in their production; they are not affected by this license.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
15 16 17 18 19
 *
 */

#include "filename.h"
#include "util.h"
20
#include "config.h"
Dimitri van Heesch's avatar
Dimitri van Heesch committed
21

22
FileName::FileName(const char *fn,const char *n) : FileList()
Dimitri van Heesch's avatar
Dimitri van Heesch committed
23
{
24
  setAutoDelete(TRUE);
25
  fName=fn;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
26 27 28 29 30 31 32 33 34 35
  name=n;
}

FileName::~FileName()
{
}


void FileName::generateDiskNames()
{
36
  //QCString commonPrefix;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
37 38
  FileDef *fd=first();
  int count=0;
39 40 41 42 43
  while (fd) 
  { 
    if (!fd->isReference()) count++; 
    fd=next(); 
  }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
44 45 46 47 48 49
  if (count==1)
  {
    fd=first();
    // skip references
    while (fd && fd->isReference()) fd=next();
    // name if unique, so diskname is simply the name
50
    //printf("!!!!!!!! Unique disk name=%s for fd=%s\n",name.data(),fd->diskname.data());
51
    fd->m_diskName=name;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
52 53 54 55 56 57
  }
  else if (count>1) // multiple occurrences of the same file name
  {
    //printf("Multiple occurrences of %s\n",name.data());
    int i=0,j=0;
    bool found=FALSE;
58
    while (!found) // search for the common prefix of all paths
Dimitri van Heesch's avatar
Dimitri van Heesch committed
59 60 61
    {
      fd=first();
      while (fd && fd->isReference()) fd=next();
62
      char c=fd->m_path.at(i);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
63
      if (c=='/') j=i; // remember last position of dirname
64
      fd=next();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
65 66 67 68
      while (fd && !found)
      {
        if (!fd->isReference())
        {
69
          //printf("i=%d j=%d fd->path=`%s' fd->name=`%s'\n",i,j,fd->path.left(i).data(),fd->name().data());
70
          if (i==(int)fd->m_path.length())
Dimitri van Heesch's avatar
Dimitri van Heesch committed
71
          {
72
            //warning("Input file %s found multiple times!\n"
73
            //        "         The generated documentation for this file may not be correct!\n",fd->absFilePath().data());
Dimitri van Heesch's avatar
Dimitri van Heesch committed
74 75
            found=TRUE;
          }
76
          else if (fd->m_path[i]!=c)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
77 78 79 80 81 82 83 84 85 86 87 88
          {
            found=TRUE;  
          }
        } 
        fd=next();
      }
      i++;
    }
    fd=first();
    while (fd)
    {
      //printf("fd->setName(%s)\n",(fd->path.right(fd->path.length()-j-1)+name).data());
89 90
      if (!fd->isReference())
      {
91
        QCString prefix = fd->m_path.right(fd->m_path.length()-j-1);
92
        fd->setName(prefix+name);
93
        //printf("!!!!!!!! non unique disk name=%s for fd=%s\n",(prefix+name).data(),fd->diskname.data());
94
        fd->m_diskName=prefix+name;
95
      }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
96 97 98 99 100
      fd=next();
    }
  }
}

101
int FileName::compareItems(QCollection::Item item1, QCollection::Item item2)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
102 103 104
{
  FileName *f1=(FileName *)item1;
  FileName *f2=(FileName *)item2;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
105
  return qstricmp(f1->fileName(),f2->fileName());
Dimitri van Heesch's avatar
Dimitri van Heesch committed
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
}

FileNameIterator::FileNameIterator(const FileName &fname) :
  QListIterator<FileDef>(fname)
{
}

FileNameList::FileNameList() : QList<FileName>()
{
}

FileNameList::~FileNameList()
{
}

void FileNameList::generateDiskNames()
{
  FileName *fn=first();
  while (fn)
  {
    fn->generateDiskNames();
    fn=next();
  }
}

131
int FileNameList::compareItems(QCollection::Item item1, QCollection::Item item2)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
132 133 134
{
  FileName *f1=(FileName *)item1;
  FileName *f2=(FileName *)item2;
135 136
  //printf("FileNameList::compareItems `%s'<->`%s'\n",
  //    f1->fileName(),f2->fileName());
137
  return Config_getBool("FULL_PATH_NAMES") ?
Dimitri van Heesch's avatar
Dimitri van Heesch committed
138 139
         qstricmp(f1->fullName(),f2->fullName()) :
         qstricmp(f1->fileName(),f2->fileName());
Dimitri van Heesch's avatar
Dimitri van Heesch committed
140 141 142 143 144 145
}

FileNameListIterator::FileNameListIterator(const FileNameList &fnlist) :
  QListIterator<FileName>(fnlist)
{
}
146 147 148 149 150 151 152 153 154 155 156

static bool getCaseSenseNames()
{
  static bool caseSenseNames = Config_getBool("CASE_SENSE_NAMES");
  return caseSenseNames;
}

FileNameDict::FileNameDict(uint size) : QDict<FileName>(size,getCaseSenseNames()) 
{
}