entry.cpp 9.08 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
 *
5
 * Copyright (C) 1997-2003 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
 *
 */

#include "entry.h"
19
#include "util.h"
20
#include "section.h"
Dimitri van Heesch's avatar
Dimitri van Heesch committed
21

22
int Entry::num=0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
23 24 25

Entry::Entry()
{
26
  num++;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
27 28
  //printf("New Entry %d\n",num);
  parent=0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
29
  section = EMPTY_SEC;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
30 31 32 33
  sublist = new QList<Entry>;
  sublist->setAutoDelete(TRUE);
  extends = new QList<BaseInfo>;
  extends->setAutoDelete(TRUE);
34
  groups = new QList<Grouping>;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
35
  groups->setAutoDelete(TRUE);
36
  anchors = new QList<SectionInfo>;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
37 38 39
  argList = new ArgumentList;
  argList->setAutoDelete(TRUE);
  //printf("Entry::Entry() tArgList=0\n");
40 41
  tArgLists = 0;
  //mtArgList = 0;
42
  mGrpId = -1;
43
  tagInfo = 0;
44
  sli = 0;
45
  relatesDup = FALSE;
46
  groupDocType = GROUPDOC_NORMAL;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
47 48 49 50 51
  reset();
}

Entry::Entry(const Entry &e)
{
52
  num++;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
53 54 55
  //printf("Copy New Entry %d\n",num);
  section     = e.section;
  protection  = e.protection;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
56
  mtype       = e.mtype;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
57
  stat        = e.stat;
58
  explicitExternal = e.explicitExternal;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
59 60 61 62 63
  virt        = e.virt;
  parent      = e.parent;
  type        = e.type.copy();
  name        = e.name.copy();
  args        = e.args.copy();
64
  bitfields   = e.bitfields.copy();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
65 66 67 68 69
  exception   = e.exception.copy();
  program     = e.program.copy();
  includeFile = e.includeFile.copy();
  includeName = e.includeFile.copy();
  doc         = e.doc.copy();
70 71
  docLine     = e.docLine;
  docFile     = e.docFile.copy();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
72
  relates     = e.relates.copy();
73
  relatesDup  = e.relatesDup;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
74
  brief       = e.brief.copy();
75 76
  briefLine   = e.briefLine;
  briefFile   = e.briefFile.copy();
77 78 79
  inbodyDocs  = e.inbodyDocs.copy();
  inbodyLine  = e.inbodyLine;
  inbodyFile  = e.inbodyFile.copy();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
80 81 82
  inside      = e.inside.copy();
  fileName    = e.fileName.copy();
  startLine   = e.startLine;
83
  mGrpId      = e.mGrpId;
84
  bodyLine    = e.bodyLine;
85
  endBodyLine = e.endBodyLine;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
86
  memSpec     = e.memSpec;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
87
  initializer = e.initializer;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
88
  initLines   = e.initLines;
89
  callGraph   = e.callGraph;
90 91 92
  //todoId      = e.todoId;
  //testId      = e.testId;
  //bugId       = e.bugId;
93
  tagInfo     = e.tagInfo;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
94 95 96 97
  sublist     = new QList<Entry>;
  sublist->setAutoDelete(TRUE);
  extends     = new QList<BaseInfo>;
  extends->setAutoDelete(TRUE);
98
  groups      = new QList<Grouping>;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
99
  groups->setAutoDelete(TRUE);
100
  anchors     = new QList<SectionInfo>;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
101 102
  argList     = new ArgumentList;
  argList->setAutoDelete(TRUE);
103
  tArgLists = 0;
104
  groupDocType = e.groupDocType;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

  // deep copy of the child entry list
  QListIterator<Entry> eli(*e.sublist);
  Entry *cur;
  for (;(cur=eli.current());++eli)
  {
    sublist->append(new Entry(*cur));
  }
  
  // deep copy base class list
  QListIterator<BaseInfo> bli(*e.extends);
  BaseInfo *bi;
  for (;(bi=bli.current());++bli)
  {
    extends->append(new BaseInfo(*bi));
  }
  
  // deep copy group list
123 124 125
  QListIterator<Grouping> gli(*e.groups);
  Grouping *g;
  for (;(g=gli.current());++gli)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
126
  {
127
    groups->append(new Grouping(*g));
Dimitri van Heesch's avatar
Dimitri van Heesch committed
128
  }
129
  
130 131
  QListIterator<SectionInfo> sli2(*e.anchors);
  SectionInfo *s;
132 133
  for (;(s=sli2.current());++sli2)
  {
134
    anchors->append(new SectionInfo(*s));
135
  }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
136 137 138 139 140 141 142 143 144 145 146 147

  // deep copy argument list
  QListIterator<Argument> ali(*e.argList);
  Argument *a;
  for (;(a=ali.current());++ali)
  {
    argList->append(new Argument(*a));
  }
  argList->constSpecifier    = e.argList->constSpecifier;
  argList->volatileSpecifier = e.argList->volatileSpecifier;
  argList->pureSpecifier     = e.argList->pureSpecifier;
  
148 149
  // deep copy template argument lists
  if (e.tArgLists)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
150
  {
151
    tArgLists = copyArgumentLists(e.tArgLists);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
152
  }
153 154

  // deep copy template argument list
155 156 157 158 159 160 161 162 163 164 165 166
  //if (e.mtArgList)
  //{
  //  mtArgList = new ArgumentList;
  //  mtArgList->setAutoDelete(TRUE);
  //  //printf("Entry::Entry(copy) new tArgList=%p\n",tArgList);
  //  QListIterator<Argument> mtali(*e.mtArgList);
  //  for (;(a=mtali.current());++mtali)
  //  {
  //    mtArgList->append(new Argument(*a));
  //    //printf("appending argument %s %s\n",a->type.data(),a->name.data());
  //  }
  //}
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
  if (e.sli)
  {
    sli = new QList<ListItemInfo>;
    sli->setAutoDelete(TRUE);
    QListIterator<ListItemInfo> slii(*e.sli);
    ListItemInfo *ili;
    for (slii.toFirst();(ili=slii.current());++slii)
    {
      sli->append(new ListItemInfo(*ili));
    }
  }
  else
  {
    sli=0;
  }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
182 183 184 185 186 187 188 189 190
}

Entry::~Entry()
{
  //printf("Deleting entry %d name %s type %x chilren %d\n",
  //       num,name.data(),section,sublist->count());
  delete sublist;
  delete extends;
  delete groups;
191
  delete anchors;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
192
  delete argList;
193 194
  delete tArgLists;
  //delete mtArgList;
195
  delete tagInfo;
196
  delete sli;
197
  num--;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
}

void Entry::addSubEntry(Entry *current)
{
  //printf("Entry %d with name %s type 0x%x added\n",
  //    current->num,current->name.data(),current->section);
  //printf("Entry::addSubEntry(%s) %p\n",current->name.data(),current->tArgList);
  current->parent=this;
  sublist->append(current);  
  
  //if (current->tArgList)
  //{
  //  Argument * a=current->tArgList->first();
  //  while (a)
  //  {
  //    printf("type=%s name=%s\n",a->type.data(),a->name.data());
  //    a=current->tArgList->next();
  //  }
  //}

}

void Entry::reset()
{
  name.resize(0);
  type.resize(0);
  args.resize(0);
225
  bitfields.resize(0);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
226 227
  exception.resize(0);
  program.resize(0);
228
  //body.resize(0);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
229 230 231
  includeFile.resize(0);
  includeName.resize(0);
  doc.resize(0);
232 233
  docFile.resize(0);
  docLine=-1;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
234
  relates.resize(0);
235
  relatesDup=FALSE;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
236
  brief.resize(0);
237 238
  briefFile.resize(0);
  briefLine=-1;
239 240 241
  inbodyDocs.resize(0);
  inbodyFile.resize(0);
  inbodyLine=-1;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
242 243
  inside.resize(0);
  fileName.resize(0);
244 245
  //scopeSpec.resize(0);
  //memberSpec.resize(0);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
246
  initializer.resize(0);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
247
  initLines = -1;
248
  startLine = 1;
249
  bodyLine = -1;
250
  endBodyLine = -1;
251
  mGrpId = -1;
252
  callGraph = FALSE;
253 254 255
  //todoId = 0;
  //testId = 0;
  //bugId = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
256
  section = EMPTY_SEC;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
257
  mtype   = Method;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
258 259 260
  virt    = Normal;
  stat    = FALSE;
  proto   = FALSE;
261
  explicitExternal = FALSE;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
262
  memSpec  = 0;
263
  subGrouping = TRUE;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
264
  protection = Public;
265
  groupDocType = GROUPDOC_NORMAL;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
266 267 268
  sublist->clear();
  extends->clear();
  groups->clear();
269
  anchors->clear();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
270
  argList->clear();
271
  if (tagInfo) { delete tagInfo; tagInfo=0; }
272
  if (tArgLists) { delete tArgLists; tArgLists=0; }
273
  if (sli) { delete sli; sli=0; }
274
  //if (mtArgList) { delete mtArgList; mtArgList=0; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
275 276 277 278 279 280 281 282 283
}


int Entry::getSize()
{
  int size=sizeof(Entry);
  size+=type.length()+1;
  size+=name.length()+1;
  size+=args.length()+1;
284
  size+=bitfields.length()+1;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
285 286 287 288 289
  size+=exception.length()+1;
  size+=program.length()+1;
  size+=includeFile.length()+1;
  size+=includeName.length()+1;
  size+=doc.length()+1;
290
  size+=docFile.length()+1;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
291 292
  size+=relates.length()+1;
  size+=brief.length()+1;
293
  size+=briefFile.length()+1;
294 295
  size+=inbodyDocs.length()+1;
  size+=inbodyFile.length()+1;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
296 297
  size+=inside.length()+1;
  size+=fileName.length()+1;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
298
  size+=initializer.length()+1;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
299 300 301 302 303 304 305
  BaseInfo *bi=extends->first();
  while (bi)
  {
    size+=sizeof(QLNode);
    size+=bi->name.length()+1+sizeof(bi->prot)+sizeof(bi->virt);
    bi=extends->next(); 
  }
306 307
  Grouping *g=groups->first();
  while (g)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
308 309
  {
    size+=sizeof(QLNode);
310 311 312
    size+=g->groupname.length()+1;
    size+=sizeof(g->pri);
    g=groups->next();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
313 314 315 316 317 318 319 320
  }
  Entry *e=sublist->first();
  while (e)
  {
    size+=e->getSize();
    e=sublist->next();
  }
  Argument *a=argList->first();
321
  while (a)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
322 323 324 325 326 327 328
  {
    size+=sizeof(Argument);
    size+=a->type.length()+1
         +a->name.length()+1
         +a->defval.length()+1;
    a=argList->next();
  }
329
  if (tArgLists)
330
  {
331 332
    ArgumentList *al=tArgLists->first();
    while (al)
333
    {
334 335 336 337 338 339 340 341 342 343 344
      size+=sizeof(ArgumentList);
      a=al->first();
      while (a)
      {
        size+=sizeof(Argument);
        size+=a->type.length()+1
          +a->name.length()+1
          +a->defval.length()+1;
        a=al->next();
      }
      al=tArgLists->next();
345 346
    }
  }
347 348 349 350 351 352 353 354 355 356 357 358
  //if (mtArgList)
  //{
  //  a=mtArgList->first();
  //  while (e)
  //  {
  //    size+=sizeof(Argument);
  //    size+=a->type.length()+1
  //      +a->name.length()+1
  //      +a->defval.length()+1;
  //    a=mtArgList->next();
  //  }
  //}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
359 360
  return size;
}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375

/*! the argument list is documented if one of its
 *  arguments is documented 
 */
bool ArgumentList::hasDocumentation() const
{
  bool hasDocs=FALSE;
  ArgumentListIterator ali(*this);
  Argument *a;
  for (ali.toFirst();!hasDocs && (a=ali.current());++ali)
  {
    hasDocs = hasDocs || a->hasDocumentation(); 
  }
  return hasDocs;
}
376 377 378 379 380 381 382 383 384 385 386 387 388 389

void Entry::addSpecialListItem(const char *listName,int itemId)
{
  if (sli==0)
  {
    sli = new QList<ListItemInfo>;
    sli->setAutoDelete(TRUE);
  }
  ListItemInfo *ili=new ListItemInfo;
  ili->type = listName;
  ili->itemId = itemId;
  sli->append(ili);
}