void buildDirectories() { // for each input file FileNameListIterator fnli(*Doxygen::inputNameList); FileName *fn; for (fnli.toFirst();(fn=fnli.current());++fnli) { FileNameIterator fni(*fn); FileDef *fd; for (;(fd=fni.current());++fni) { //printf("buildDirectories %s\n",fd->name().data()); if (fd->getReference().isEmpty() && !fd->isDocumentationFile()) { DirDef *dir; if ((dir=Doxygen::directories->find(fd->getPath()))==0) // new directory { dir = DirDef::mergeDirectoryInTree(fd->getPath()); } if (dir) dir->addFile(fd); } else { // do something for file imported via tag files. } } } //DirDef *root = new DirDef("root:"); // compute relations between directories => introduce container dirs. DirDef *dir; DirSDict::Iterator sdi(*Doxygen::directories); for (sdi.toFirst();(dir=sdi.current());++sdi) { //printf("New dir %s\n",dir->displayName().data()); QCString name = dir->name(); int i=name.findRev('/',name.length()-2); if (i>0) { DirDef *parent = Doxygen::directories->find(name.left(i+1)); //if (parent==0) parent=root; if (parent) { parent->addSubDir(dir); //printf("DirDef::addSubdir(): Adding subdir\n%s to\n%s\n", // dir->displayName().data(), parent->displayName().data()); } } } computeCommonDirPrefix(); }
void TagFileParser::addIncludes() { TagFileInfo *tfi = m_tagFileFiles.first(); while (tfi) { //printf("tag file tagName=%s path=%s name=%s\n",m_tagName.data(),tfi->path.data(),tfi->name.data()); FileName *fn = Doxygen::inputNameDict->find(tfi->name); if (fn) { //printf("found\n"); FileNameIterator fni(*fn); FileDef *fd; for (;(fd=fni.current());++fni) { //printf("input file path=%s name=%s\n",fd->getPath().data(),fd->name().data()); if (fd->getPath()==QCString(m_tagName+":"+tfi->path)) { //printf("found\n"); QListIterator<TagIncludeInfo> mii(tfi->includes); TagIncludeInfo *ii; for (;(ii=mii.current());++mii) { //printf("ii->name=`%s'\n",ii->name.data()); FileName *ifn = Doxygen::inputNameDict->find(ii->name); ASSERT(ifn!=0); if (ifn) { FileNameIterator ifni(*ifn); FileDef *ifd; for (;(ifd=ifni.current());++ifni) { //printf("ifd->getOutputFileBase()=%s ii->id=%s\n", // ifd->getOutputFileBase().data(),ii->id.data()); if (ifd->getOutputFileBase()==QCString(ii->id)) { fd->addIncludeDependency(ifd,ii->text,ii->isLocal,ii->isImported,FALSE); } } } } } } } tfi = m_tagFileFiles.next(); } }
FileDef *findFileDef(const FileNameDict *fnDict,const char *n,bool &ambig) { ambig=FALSE; if (n==0) return 0; const int maxAddrSize = 20; char addr[maxAddrSize]; qsnprintf(addr,maxAddrSize,"%p:",fnDict); QCString key = addr; key+=n; g_findFileDefCache.setAutoDelete(TRUE); FindFileCacheElem *cachedResult = g_findFileDefCache.find(key); //printf("key=%s cachedResult=%p\n",key.data(),cachedResult); if (cachedResult) { ambig = cachedResult->isAmbig; //printf("cached: fileDef=%p\n",cachedResult->fileDef); return cachedResult->fileDef; } else { cachedResult = new FindFileCacheElem(0,FALSE); } QCString name=QDir::cleanDirPath(n).utf8(); QCString path; int slashPos; FileName *fn; if (name.isEmpty()) goto exit; slashPos=QMAX(name.findRev('/'),name.findRev('\\')); if (slashPos!=-1) { path=name.left(slashPos+1); name=name.right(name.length()-slashPos-1); //printf("path=%s name=%s\n",path.data(),name.data()); } if (name.isEmpty()) goto exit; if ((fn=(*fnDict)[name])) { //printf("fn->count()=%d\n",fn->count()); if (fn->count()==1) { FileDef *fd = fn->getFirst(); #if defined(_WIN32) || defined(__MACOSX__) // Windows or MacOSX bool isSamePath = fd->getPath().right(path.length()).lower()==path.lower(); #else // Unix bool isSamePath = fd->getPath().right(path.length())==path; #endif if (path.isEmpty() || isSamePath) { cachedResult->fileDef = fd; g_findFileDefCache.insert(key,cachedResult); //printf("=1 ===> add to cache %p\n",fd); return fd; } } else // file name alone is ambiguous { int count=0; FileNameIterator fni(*fn); FileDef *fd; FileDef *lastMatch=0; QCString pathStripped = path; for (fni.toFirst();(fd=fni.current());++fni) { QCString fdStripPath = fd->getPath(); if (path.isEmpty() || fdStripPath.right(pathStripped.length())==pathStripped) { count++; lastMatch=fd; } } //printf(">1 ===> add to cache %p\n",fd); ambig=(count>1); cachedResult->isAmbig = ambig; cachedResult->fileDef = lastMatch; g_findFileDefCache.insert(key,cachedResult); return lastMatch; } } else { //printf("not found!\n"); } exit: //printf("0 ===> add to cache %p: %s\n",cachedResult,n); g_findFileDefCache.insert(key,cachedResult); //delete cachedResult; return 0; }