Fix for UBSan build
[platform/upstream/doxygen.git] / src / filename.cpp
1 /******************************************************************************
2  *
3  * $Id: filename.cpp,v 1.18 2001/03/19 19:27:40 root Exp $
4  *
5  * Copyright (C) 1997-2012 by Dimitri van Heesch.
6  *
7  * Permission to use, copy, modify, and distribute this software and its
8  * documentation under the terms of the GNU General Public License is hereby 
9  * granted. No representations are made about the suitability of this software 
10  * for any purpose. It is provided "as is" without express or implied warranty.
11  * See the GNU General Public License for more details.
12  *
13  * Documents produced by Doxygen are derivative works derived from the
14  * input used in their production; they are not affected by this license.
15  *
16  */
17
18 #include "filename.h"
19 #include "util.h"
20
21 FileName::FileName(const char *fn,const char *n) : FileList()
22 {
23   setAutoDelete(TRUE);
24   fName=fn;
25   name=n;
26 }
27
28 FileName::~FileName()
29 {
30 }
31
32
33 void FileName::generateDiskNames()
34 {
35   //QCString commonPrefix;
36   FileDef *fd=first();
37   int count=0;
38   while (fd) 
39   { 
40     if (!fd->isReference()) count++; 
41     fd=next(); 
42   }
43   if (count==1)
44   {
45     fd=first();
46     // skip references
47     while (fd && fd->isReference()) fd=next();
48     // name if unique, so diskname is simply the name
49     //printf("!!!!!!!! Unique disk name=%s for fd=%s\n",name.data(),fd->diskname.data());
50     fd->diskname=name.copy();
51   }
52   else if (count>1) // multiple occurrences of the same file name
53   {
54     //printf("Multiple occurrences of %s\n",name.data());
55     int i=0,j=0;
56     bool found=FALSE;
57     while (!found) // search for the common prefix of all paths
58     {
59       fd=first();
60       while (fd && fd->isReference()) fd=next();
61       char c=fd->path.at(i);
62       if (c=='/') j=i; // remember last position of dirname
63       fd=next();
64       while (fd && !found)
65       {
66         if (!fd->isReference())
67         {
68           //printf("i=%d j=%d fd->path=`%s' fd->name=`%s'\n",i,j,fd->path.left(i).data(),fd->name().data());
69           if (i==(int)fd->path.length())
70           {
71             //warning("Warning: Input file %s found multiple times!\n"
72             //        "         The generated documentation for this file may not be correct!\n",fd->absFilePath().data());
73             found=TRUE;
74           }
75           else if (fd->path[i]!=c)
76           {
77             found=TRUE;  
78           }
79         } 
80         fd=next();
81       }
82       i++;
83     }
84     fd=first();
85     while (fd)
86     {
87       //printf("fd->setName(%s)\n",(fd->path.right(fd->path.length()-j-1)+name).data());
88       if (!fd->isReference())
89       {
90         QCString prefix = fd->path.right(fd->path.length()-j-1);
91         fd->setName(prefix+name);
92         //printf("!!!!!!!! non unique disk name=%s for fd=%s\n",(prefix+name).data(),fd->diskname.data());
93         fd->diskname=prefix+name;
94       }
95       fd=next();
96     }
97   }
98 }
99
100 int FileName::compareItems(GCI item1, GCI item2)
101 {
102   FileName *f1=(FileName *)item1;
103   FileName *f2=(FileName *)item2;
104   return stricmp(f1->fileName(),f2->fileName());
105 }
106
107 FileNameIterator::FileNameIterator(const FileName &fname) :
108   QListIterator<FileDef>(fname)
109 {
110 }
111
112 FileNameList::FileNameList() : QList<FileName>()
113 {
114 }
115
116 FileNameList::~FileNameList()
117 {
118 }
119
120 void FileNameList::generateDiskNames()
121 {
122   FileName *fn=first();
123   while (fn)
124   {
125     fn->generateDiskNames();
126     fn=next();
127   }
128 }
129
130 int FileNameList::compareItems(GCI item1, GCI item2)
131 {
132   FileName *f1=(FileName *)item1;
133   FileName *f2=(FileName *)item2;
134   //printf("FileNameList::compareItems `%s'<->`%s'\n",
135   //    f1->fileName(),f2->fileName());
136   return Config_getBool("FULL_PATH_NAMES") ?
137          stricmp(f1->fullName(),f2->fullName()) :
138          stricmp(f1->fileName(),f2->fileName());
139 }
140
141 FileNameListIterator::FileNameListIterator(const FileNameList &fnlist) :
142   QListIterator<FileName>(fnlist)
143 {
144 }