From 4fbcced5545beefebab8fb570f960e59cc36f2fc Mon Sep 17 00:00:00 2001 From: Rene Brun <Rene.Brun@cern.ch> Date: Mon, 11 Sep 2000 06:19:57 +0000 Subject: [PATCH] Implement the functions FindObject, FindObjectAny and new functions FindFullPathname. git-svn-id: http://root.cern.ch/svn/root/trunk@618 27541ba8-7e3a-0410-8455-c3a389f83636 --- base/inc/TFolder.h | 5 +- base/src/TFolder.cxx | 118 ++++++++++++++++++++++++++++--------------- 2 files changed, 79 insertions(+), 44 deletions(-) diff --git a/base/inc/TFolder.h b/base/inc/TFolder.h index 2080afcd538..bb039cf91b9 100644 --- a/base/inc/TFolder.h +++ b/base/inc/TFolder.h @@ -1,4 +1,4 @@ -// @(#)root/base:$Name: $:$Id: TFolder.h,v 1.4 2000/09/06 09:29:20 brun Exp $ +// @(#)root/base:$Name: $:$Id: TFolder.h,v 1.5 2000/09/08 07:38:33 brun Exp $ // Author: Rene Brun 02/09/2000 /************************************************************************* @@ -46,11 +46,12 @@ public: virtual void Browse(TBrowser *b); virtual void Clear(Option_t *option=""); virtual void Copy(TObject &) { MayNotUse("Copy(TObject &)"); } + virtual const char *FindFullPathName(const char *name) const; + virtual const char *FindFullPathName(TObject *obj) const; virtual TObject *FindObject(const char *name) const; virtual TObject *FindObject(TObject *obj) const; virtual TObject *FindObjectAny(const char *name) const; TCollection *GetListOfFolders() const { return fFolders; } - virtual const char *GetPath() const; Bool_t IsFolder() const { return kTRUE; } Bool_t IsOwner() const { return fIsOwner; } virtual void ls(Option_t *option=""); // *MENU* diff --git a/base/src/TFolder.cxx b/base/src/TFolder.cxx index 18e21c12447..0b5347f5648 100644 --- a/base/src/TFolder.cxx +++ b/base/src/TFolder.cxx @@ -1,4 +1,4 @@ -// @(#)root/base:$Name: $:$Id: TFolder.cxx,v 1.4 2000/09/06 09:29:20 brun Exp $ +// @(#)root/base:$Name: $:$Id: TFolder.cxx,v 1.5 2000/09/08 07:38:33 brun Exp $ // Author: Rene Brun 02/09/2000 /************************************************************************* @@ -82,9 +82,15 @@ #include "TFolder.h" #include "TBrowser.h" #include "TROOT.h" +#include "TClass.h" #include "TError.h" #include "TRegexp.h" +const int kMAXDEPTH = 64; +static const char *d[kMAXDEPTH]; +static Int_t level = -1; +static char path[512]; + ClassImp(TFolder) //______________________________________________________________________________ @@ -177,6 +183,56 @@ void TFolder::Clear(Option_t *option) } + +//______________________________________________________________________________ +const char *TFolder::FindFullPathName(const char *name) const +{ +// return the full pathname corresponding to subpath name +// The returned path will be re-used by the next call to GetPath(). + + TObject *obj = FindObject(name); + if (obj || !fFolders) { + level++; + d[level] = GetName(); + path[0] = '/'; + path[1] = 0; + for (Int_t l=0;l<=level;l++) { + strcat(path,"/"); + strcat(path,d[l]); + } + strcat(path,"/"); + strcat(path,name); + level = -1; + return path; + } + if (name[0] == '/') return 0; + TIter next(fFolders); + TFolder *folder; + const char *found; + level++; + d[level] = GetName(); + while ((obj=next())) { + if (!obj->InheritsFrom(TFolder::Class())) continue; + if (obj->IsA() == TClass::Class()) continue; + folder = (TFolder*)obj; + found = folder->FindFullPathName(name); + if (found) return found; + } + level--; + return 0; +} + + +//______________________________________________________________________________ +const char *TFolder::FindFullPathName(TObject *obj) const +{ +// return the full pathname corresponding to subpath name +// The returned path will be re-used by the next call to GetPath(). + + Error("FindFullPathname","Not yet implemented"); + return 0; +} + //______________________________________________________________________________ TObject *TFolder::FindObject(TObject *) const { @@ -203,7 +259,14 @@ TObject *TFolder::FindObject(const char *name) const // name if (name == 0) return 0; - if (name[0] == '/') return gROOT->GetRootFolder()->FindObject(name+1); + if (name[0] == '/') { + if (name[1] == '/') { + if (!strstr(name,"//root/")) return 0; + return gROOT->GetRootFolder()->FindObject(name+7); + } else { + return gROOT->GetRootFolder()->FindObject(name+1); + } + } char cname[1024]; strcpy(cname,name); TObject *obj; @@ -218,60 +281,31 @@ TObject *TFolder::FindObject(const char *name) const } } + //______________________________________________________________________________ TObject *TFolder::FindObjectAny(const char *name) const { // return a pointer to the first object with name starting at this folder + TObject *obj = FindObject(name); + if (obj || !fFolders) return obj; + +// if (!obj->InheritsFrom(TFolder::Class())) continue; + if (name[0] == '/') return 0; TIter next(fFolders); - TObject *obj; TFolder *folder; + TObject *found; + d[level] = GetName(); while ((obj=next())) { if (!obj->InheritsFrom(TFolder::Class())) continue; + if (obj->IsA() == TClass::Class()) continue; folder = (TFolder*)obj; - return folder->FindObjectAny(name); + found = folder->FindObjectAny(name); + if (found) return found; } return 0; } -//______________________________________________________________________________ -const char *TFolder::GetPath() const -{ -// Returns the full path of the folder. E.g. file://root/dir1/dir2. -// The returned path will be re-used by the next call to GetPath(). - - static char *path = 0; - const int kMAXDEPTH = 128; - const TFolder *d[kMAXDEPTH]; - const TFolder *cur = this; - int depth = 0, len = 0; - - d[depth++] = cur; - len = strlen(cur->GetName()) + 1; // +1 for the / - -// while (cur->fMother && depth < kMAXDEPTH) { -// cur = (TFolder *)cur->fMother; -// d[depth++] = cur; -// len += strlen(cur->GetName()) + 1; -// } - - if (path) delete [] path; - path = new char[len+2]; - - for (int i = depth-1; i >= 0; i--) { - if (i == depth-1) { // file or TROOT name - strcpy(path, d[i]->GetName()); - strcat(path, ":"); - if (i == 0) strcat(path, "/"); - } else { - strcat(path, "/"); - strcat(path, d[i]->GetName()); - } - } - - return path; -} - //______________________________________________________________________________ void TFolder::ls(Option_t *option) { -- GitLab